QShMemViewProtocol::QShMemViewProtocol(int displayid, const QSize &s, int d, QObject *parent) : QVFbViewProtocol(displayid, parent), hdr(0), dataCache(0), lockId(-1), windowId(0) { int w = s.width(); int h = s.height(); QString username = "******"; const char *logname = getenv("LOGNAME"); if ( logname ) username = logname; qws_dataDir(displayid); { QString oldPipe = "/tmp/qtembedded-" + username + "/" + QString("QtEmbedded-%1").arg(displayid); QLock oldPipeLock(oldPipe, 'd', false); if (oldPipeLock.isValid()) { perror("QShMemViewProtocol::QShMemViewProtocol"); qFatal("Cannot create lock file as an old version of QVFb has " "opened %s. Close other QVFb and try again", oldPipe.toLatin1().constData()); } } displayPipe = QTE_PIPE_QVFB(displayid); kh = new QVFbKeyPipeProtocol(displayid); /* should really depend on receiving qt version, but how can one tell? */ mh = new QVFbMousePipe(displayid); QString mousePipe = mh->pipeName(); key_t key = ftok(mousePipe.toLatin1().constData(), 'b'); int bpl; if (d < 8) bpl = (w * d + 7) / 8; else bpl = w * ((d + 7) / 8); displaySize = bpl * h; unsigned char *data; uint data_offset_value = sizeof(QVFbHeader); int dataSize = bpl * h + data_offset_value; shmId = shmget(key, dataSize, IPC_CREAT | 0600); if (shmId != -1) data = (unsigned char *)shmat(shmId, 0, 0); else { struct shmid_ds shm; shmctl(shmId, IPC_RMID, &shm); shmId = shmget(key, dataSize, IPC_CREAT | 0600); if (shmId == -1) { perror("QShMemViewProtocol::QShMemViewProtocol"); qFatal("Cannot get shared memory 0x%08x", key); } data = (unsigned char *)shmat(shmId, 0, 0); } if ((long)data == -1) { delete kh; delete mh; perror("QShMemViewProtocol::QShMemViewProtocol"); qFatal("Cannot attach to shared memory %d",shmId); } dataCache = (unsigned char *)malloc(displaySize); memset(dataCache, 0, displaySize); memset(data+sizeof(QVFbHeader), 0, displaySize); hdr = (QVFbHeader *)data; hdr->width = w; hdr->height = h; hdr->depth = d; hdr->linestep = bpl; hdr->dataoffset = data_offset_value; hdr->update = QRect(); hdr->dirty = 0; hdr->numcols = 0; hdr->viewerVersion = QT_VERSION; hdr->brightness = 255; hdr->windowId = 0; displayPiped = displayPipe + 'd'; mRefreshTimer = new QTimer(this); connect(mRefreshTimer, SIGNAL(timeout()), this, SLOT(flushChanges())); }
QT_BEGIN_NAMESPACE QMMapViewProtocol::QMMapViewProtocol(int displayid, const QSize &s, int d, QObject *parent) : QVFbViewProtocol(displayid, parent), hdr(0), dataCache(0), windowId(0) { switch (d) { case 1: case 4: case 8: case 12: case 15: case 16: case 18: case 24: case 32: break; default: qFatal("Unsupported bit depth %d\n", d); } fileName = QString("/tmp/.qtvfb_map-%1").arg(displayid); int w = s.width(); int h = s.height(); kh = new QVFbKeyPipeProtocol(displayid); mh = new QVFbMouseLinuxTP(displayid); int bpl; if (d < 8) bpl = (w * d + 7) / 8; else bpl = w * ((d + 7) / 8); displaySize = bpl * h; unsigned char *data; uint data_offset_value = sizeof(QVFbHeader); const int page_size = getpagesize(); if (data_offset_value % page_size) data_offset_value += page_size - (data_offset_value % page_size); dataSize = bpl * h + data_offset_value; unlink(fileName.toLocal8Bit().data()); fd = ::open( fileName.toLocal8Bit().data(), O_CREAT|O_RDWR, 0666 ); ::lseek(fd, dataSize, SEEK_SET); ::write(fd, "\0", 1); if (fd < 0) { data = (unsigned char *)-1; } else { // might need to do something about size? data = (unsigned char *)mmap(NULL, dataSize, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); if (data == MAP_FAILED) data = (unsigned char *)-1; } if ( (long)data == -1 ){ delete kh; delete mh; qFatal( "Cannot attach to mapped file %s", fileName.toLocal8Bit().data()); } dataCache = (unsigned char *)malloc(displaySize); memset(dataCache, 0, displaySize); memset(data+sizeof(QVFbHeader), 0, displaySize); hdr = (QVFbHeader *)data; hdr->width = w; hdr->height = h; hdr->depth = d; hdr->linestep = bpl; hdr->numcols = 0; hdr->dataoffset = data_offset_value; hdr->update = QRect(); hdr->brightness = 255; hdr->windowId = 0; mRefreshTimer = new QTimer(this); connect(mRefreshTimer, SIGNAL(timeout()), this, SLOT(flushChanges())); }