From 072e748adbdab1d51b240b9983ce82b213b66f18 Mon Sep 17 00:00:00 2001 From: Jeremy Katz Date: Thu, 1 Oct 2009 14:08:11 +0200 Subject: Enable qws/qvfb use for multiple users on one machine Task-number: QTBUG-1711 Reviewed-by: Paul --- src/gui/embedded/qscreenvfb_qws.cpp | 8 +++----- src/gui/embedded/qsoundqss_qws.cpp | 11 ++++++----- src/gui/embedded/qvfbhdr.h | 19 ++++++++++++++++--- src/gui/embedded/qwscommand_qws_p.h | 2 -- src/gui/kernel/qapplication_qws.cpp | 18 +++++++----------- tools/qvfb/qvfb.cpp | 7 ++++--- tools/qvfb/qvfbprotocol.cpp | 6 ++++-- tools/qvfb/qvfbshmem.cpp | 8 +++----- 8 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/gui/embedded/qscreenvfb_qws.cpp b/src/gui/embedded/qscreenvfb_qws.cpp index 19d4fa8..d71336d 100644 --- a/src/gui/embedded/qscreenvfb_qws.cpp +++ b/src/gui/embedded/qscreenvfb_qws.cpp @@ -196,7 +196,7 @@ bool QVFbScreen::connect(const QString &displaySpec) if (displayArgs.contains(QLatin1String("Gray"))) grayscale = true; - key_t key = ftok(QByteArray(QT_VFB_MOUSE_PIPE).replace("%1", QByteArray::number(displayId)), 'b'); + key_t key = ftok(QT_VFB_MOUSE_PIPE(displayId).toLocal8Bit(), 'b'); if (key == -1) return false; @@ -330,8 +330,7 @@ void QVFbScreen::disconnect() bool QVFbScreen::initDevice() { #ifndef QT_NO_QWS_MOUSE_QVFB - const QString mouseDev = QString::fromLatin1(QT_VFB_MOUSE_PIPE) - .arg(displayId); + const QString mouseDev = QT_VFB_MOUSE_PIPE(displayId); d_ptr->mouse = new QVFbMouseHandler(QLatin1String("QVFbMouse"), mouseDev); qwsServer->setDefaultMouse("None"); if (d_ptr->mouse) @@ -339,8 +338,7 @@ bool QVFbScreen::initDevice() #endif #if !defined(QT_NO_QWS_KBD_QVFB) && !defined(QT_NO_QWS_KEYBOARD) - const QString keyboardDev = QString::fromLatin1(QT_VFB_KEYBOARD_PIPE) - .arg(displayId); + const QString keyboardDev = QT_VFB_KEYBOARD_PIPE(displayId); d_ptr->keyboard = new QVFbKeyboardHandler(keyboardDev); qwsServer->setDefaultKeyboard("None"); #endif diff --git a/src/gui/embedded/qsoundqss_qws.cpp b/src/gui/embedded/qsoundqss_qws.cpp index 6bac8dc..b859be5 100644 --- a/src/gui/embedded/qsoundqss_qws.cpp +++ b/src/gui/embedded/qsoundqss_qws.cpp @@ -67,6 +67,8 @@ #include +#include + extern int errno; QT_BEGIN_NAMESPACE @@ -79,7 +81,6 @@ QT_BEGIN_NAMESPACE static int sound_speed = 44100; #ifndef QT_NO_QWS_SOUNDSERVER extern int qws_display_id; -#define SOUND_PIPE "/tmp/.qt_soundserver-%1" #endif static char *zeroMem = 0; @@ -708,7 +709,7 @@ protected: #ifndef QT_NO_QWS_SOUNDSERVER QWSSoundServerSocket::QWSSoundServerSocket(QObject *parent) : - QWSServerSocket(QString::fromLatin1(SOUND_PIPE).arg(qws_display_id), parent) + QWSServerSocket(QT_VFB_SOUND_PIPE(qws_display_id), parent) { connect(this, SIGNAL(newConnection()), this, SLOT(newConnection())); } @@ -716,7 +717,7 @@ QWSSoundServerSocket::QWSSoundServerSocket(QObject *parent) : #ifdef QT3_SUPPORT QWSSoundServerSocket::QWSSoundServerSocket(QObject *parent, const char *name) : - QWSServerSocket(QString::fromLatin1(SOUND_PIPE).arg(qws_display_id), parent) + QWSServerSocket(QT_VFB_SOUND_PIPE(qws_display_id), parent) { if (name) setObjectName(QString::fromAscii(name)); @@ -1395,7 +1396,7 @@ void QWSSoundServer::translateSoundCompleted( int, int sid ) QWSSoundClient::QWSSoundClient(QObject* parent) : QWSSocket(parent) { - connectToLocalFile(QString::fromLatin1(SOUND_PIPE).arg(qws_display_id)); + connectToLocalFile(QT_VFB_SOUND_PIPE(qws_display_id)); QObject::connect(this,SIGNAL(readyRead()), this,SLOT(tryReadCommand())); if( state() == QWS_SOCK_BASE::ConnectedState ) QTimer::singleShot(1, this, SIGNAL(connected())); @@ -1409,7 +1410,7 @@ QWSSoundClient::~QWSSoundClient( ) void QWSSoundClient::reconnect() { - connectToLocalFile(QString::fromLatin1(SOUND_PIPE).arg(qws_display_id)); + connectToLocalFile(QT_VFB_SOUND_PIPE(qws_display_id)); if( state() == QWS_SOCK_BASE::ConnectedState ) emit connected(); else emit error( QTcpSocket::ConnectionRefusedError ); } diff --git a/src/gui/embedded/qvfbhdr.h b/src/gui/embedded/qvfbhdr.h index 73e08e0..f02286e 100644 --- a/src/gui/embedded/qvfbhdr.h +++ b/src/gui/embedded/qvfbhdr.h @@ -52,9 +52,22 @@ QT_BEGIN_NAMESPACE QT_MODULE(Gui) -#define QT_VFB_MOUSE_PIPE "/tmp/.qtvfb_mouse-%1" -#define QT_VFB_KEYBOARD_PIPE "/tmp/.qtvfb_keyboard-%1" -#define QT_VFB_MAP "/tmp/.qtvfb_map-%1" +#ifndef QT_QWS_TEMP_DIR +#define QT_QWS_TEMP_DIR "/tmp" +#endif + +#define QT_VFB_DATADIR(DISPLAY) QString("%1/qtembedded-%2-%3") \ + .arg(QT_QWS_TEMP_DIR).arg(getuid()).arg(DISPLAY) + +#define QT_VFB_MOUSE_PIPE(DISPLAY) QT_VFB_DATADIR(DISPLAY) \ + .append("/qtvfb_mouse") +#define QT_VFB_KEYBOARD_PIPE(DISPLAY) QT_VFB_DATADIR(DISPLAY) \ + .append("/qtvfb_keyboard") +#define QT_VFB_MAP(DISPLAY) QT_VFB_DATADIR(DISPLAY) \ + .append("/qtvfb_map") +#define QT_VFB_SOUND_PIPE(DISPLAY) QT_VFB_DATADIR(DISPLAY) \ + .append("/qt_soundserver") +#define QTE_PIPE "QtEmbedded" struct QVFbHeader { diff --git a/src/gui/embedded/qwscommand_qws_p.h b/src/gui/embedded/qwscommand_qws_p.h index d92c6af..f986a9d 100644 --- a/src/gui/embedded/qwscommand_qws_p.h +++ b/src/gui/embedded/qwscommand_qws_p.h @@ -75,8 +75,6 @@ QT_BEGIN_NAMESPACE QT_MODULE(Gui) -#define QTE_PIPE "QtEmbedded-%1" - class QRect; /********************************************************************* diff --git a/src/gui/kernel/qapplication_qws.cpp b/src/gui/kernel/qapplication_qws.cpp index e9284f7..01c64f1 100644 --- a/src/gui/kernel/qapplication_qws.cpp +++ b/src/gui/kernel/qapplication_qws.cpp @@ -110,6 +110,8 @@ #include #include +#include + #ifndef QT_NO_QWS_MULTIPROCESS #ifdef QT_NO_QSHM #include @@ -199,14 +201,9 @@ QString qws_dataDir() static QString result; if (!result.isEmpty()) return result; - QByteArray dataDir; -#ifdef QT_QWS_TEMP_DIR - dataDir = QT_QWS_TEMP_DIR; -#else - dataDir = "/tmp"; -#endif - dataDir += "/qtembedded-"; - dataDir += QByteArray::number(qws_display_id); + result = QT_VFB_DATADIR(qws_display_id); + QByteArray dataDir = result.toLocal8Bit(); + if (QT_MKDIR(dataDir, 0700)) { if (errno != EEXIST) { qFatal("Cannot create Qt for Embedded Linux data directory: %s", dataDir.constData()); @@ -227,16 +224,15 @@ QString qws_dataDir() if ((buf.st_mode & 0677) != 0600) qFatal("Qt for Embedded Linux data directory has incorrect permissions: %s", dataDir.constData()); #endif - dataDir += '/'; - result = QString::fromLocal8Bit(dataDir); + result.append("/"); return result; } // Get the filename of the pipe Qt for Embedded Linux uses for server/client comms Q_GUI_EXPORT QString qws_qtePipeFilename() { - return (qws_dataDir() + QString::fromLatin1(QTE_PIPE).arg(qws_display_id)); + return (qws_dataDir().append(QTE_PIPE)); } static void setMaxWindowRect(const QRect &rect) diff --git a/tools/qvfb/qvfb.cpp b/tools/qvfb/qvfb.cpp index 879fb6b..6119419 100644 --- a/tools/qvfb/qvfb.cpp +++ b/tools/qvfb/qvfb.cpp @@ -41,6 +41,7 @@ #include "qvfb.h" #include "qvfbview.h" +#include "qvfbhdr.h" #ifdef Q_WS_X11 #include "qvfbx11view.h" #endif @@ -134,7 +135,7 @@ static const char *red_off_led_xpm[] = { static bool copyButtonConfiguration(const QString &prefix, int displayId) { - const QString destDir = QString(QLatin1String("/tmp/qtembedded-%1/")).arg(displayId); + const QString destDir = QT_VFB_DATADIR(displayId); const QFileInfo src(prefix + QLatin1String("defaultbuttons.conf")); const QFileInfo dst(destDir + QLatin1String("defaultbuttons.conf")); unlink(dst.absoluteFilePath().toLatin1().constData()); @@ -351,9 +352,9 @@ void QVFb::init( int display_id, int pw, int ph, int d, int r, const QString& sk ph += 2; // avoid scrollbar scroller->show(); // delete defaultbuttons.conf if it was left behind... - unlink(QFileInfo(QString("/tmp/qtembedded-%1/defaultbuttons.conf").arg(view->displayId())).absoluteFilePath().toLatin1().constData()); + unlink(QFileInfo(QT_VFB_DATADIR(view->displayId()).append("/defaultbuttons.conf")).absoluteFilePath().toLatin1().constData()); if (secondaryView) - unlink(QFileInfo(QString("/tmp/qtembedded-%1/defaultbuttons.conf").arg(view->displayId()+1)).absoluteFilePath().toLatin1().constData()); + unlink(QFileInfo(QT_VFB_DATADIR(view->displayId() + 1).append("/defaultbuttons.conf")).absoluteFilePath().toLatin1().constData()); } view->setRate(refreshRate); if (secondaryView) { diff --git a/tools/qvfb/qvfbprotocol.cpp b/tools/qvfb/qvfbprotocol.cpp index b09ed0e..df6c110 100644 --- a/tools/qvfb/qvfbprotocol.cpp +++ b/tools/qvfb/qvfbprotocol.cpp @@ -56,6 +56,8 @@ #include #endif +#include "qvfbshmem.h" + QT_BEGIN_NAMESPACE QVFbViewProtocol::QVFbViewProtocol(int display_id, QObject *parent) : @@ -90,7 +92,7 @@ static int openPipe(const char *fileName) QVFbKeyPipeProtocol::QVFbKeyPipeProtocol(int display_id) : QVFbKeyProtocol(display_id) { - fileName = QString(QT_VFB_KEYBOARD_PIPE).arg(display_id); + fileName = QT_VFB_KEYBOARD_PIPE(display_id); fd = openPipe(fileName.toLocal8Bit().constData()); if (fd == -1) @@ -119,7 +121,7 @@ void QVFbKeyPipeProtocol::sendKeyboardData(QString unicode, int keycode, QVFbMousePipe::QVFbMousePipe(int display_id) : QVFbMouseProtocol(display_id) { - fileName = QString(QT_VFB_MOUSE_PIPE).arg(display_id); + fileName = QT_VFB_MOUSE_PIPE(display_id); fd = openPipe(fileName.toLocal8Bit().constData()); if (fd == -1) diff --git a/tools/qvfb/qvfbshmem.cpp b/tools/qvfb/qvfbshmem.cpp index 0d2b3ca..8c4cdb9 100644 --- a/tools/qvfb/qvfbshmem.cpp +++ b/tools/qvfb/qvfbshmem.cpp @@ -44,8 +44,6 @@ #include "qvfbshmem.h" #include "qvfbhdr.h" -#define QTE_PIPE "QtEmbedded-%1" - #include #include @@ -71,7 +69,7 @@ QT_BEGIN_NAMESPACE // live. static QString qws_dataDir(int qws_display_id) { - QByteArray dataDir = QString("/tmp/qtembedded-%1").arg(qws_display_id).toLocal8Bit(); + QByteArray dataDir = QT_VFB_DATADIR(qws_display_id).toLocal8Bit(); if (mkdir(dataDir, 0700)) { if (errno != EEXIST) { qFatal("Cannot create Qt for Embedded Linux data directory: %s", dataDir.constData()); @@ -151,6 +149,8 @@ QShMemViewProtocol::QShMemViewProtocol(int displayid, const QSize &s, } } + displayPipe = qws_dataDir(displayid).append(QTE_PIPE); + kh = new QVFbKeyPipeProtocol(displayid); /* should really depend on receiving qt version, but how can one tell? */ @@ -209,8 +209,6 @@ QShMemViewProtocol::QShMemViewProtocol(int displayid, const QSize &s, hdr->brightness = 255; hdr->windowId = 0; - displayPipe = qws_dataDir(displayid) + QString(QTE_PIPE).arg(displayid); - displayPiped = displayPipe + 'd'; -- cgit v0.12