qapplication_qws.cpp
来自「QT 开发环境里面一个很重要的文件」· C++ 代码 · 共 2,229 行 · 第 1/5 页
CPP
2,229 行
if (offset.isNull()) return; region_offset = offset; region_offset_window = window; for (int i = 0; i < queue.size(); ++i) { QWSEvent *e = queue.at(i); if (e->type == QWSEvent::RegionModified) { QWSRegionModifiedEvent *re = static_cast<QWSRegionModifiedEvent *>(e); if (!re->simpleData.is_ack && region_offset_window == re->window()) {// qDebug("Rgn Adjust b %d, %d", region_offset.x(), region_offset.y()); translateExpose(re, region_offset); } } } if (region_event && region_offset_window == region_event->window()) {// qDebug("Rgn Adjust c %d, %d", region_offset.x(), region_offset.y()); translateExpose(region_event, region_offset); }}#endif#ifndef QT_NO_QWS_MULTIPROCESSvoid QWSDisplay::Data::connectToPipe(){ Q_ASSERT(csocket); const QString pipe = qws_qtePipeFilename(); int i = 0; while (!csocket->connectToLocalFile(pipe)) { if (++i > 5) { qWarning("No Qtopia Core server appears to be running."); qWarning("If you want to run this program as a server,"); qWarning("add the \"-qws\" command-line option."); exit(1); } sleep(1); }}void QWSDisplay::Data::waitForConnection(){ connected_event = 0; for (int i = 0; i < 5; i++) { fillQueue(); if (connected_event) return; csocket->flush(); csocket->waitForReadyRead(1000); } csocket->flush(); if (!connected_event) qFatal("Did not receive a connection event from the qws server");}#if 0void QWSDisplay::Data::waitForRegionAck(){ for (;;) { fillQueue(); if (region_ack) break;#ifndef QT_NO_QWS_MULTIPROCESS if (csocket) { csocket->flush(); csocket->waitForReadyRead(1000); if (csocket->state() != QAbstractSocket::ConnectedState) return; }#endif } queue.prepend(region_ack); region_ack = 0;}#endif#endif // QT_NO_QWS_MULTIPROCESSvoid QWSDisplay::Data::waitForCreation(){ fillQueue();#ifndef QT_NO_QWS_MULTIPROCESS while (unused_identifiers.count() == 0) { if (csocket) { csocket->flush(); csocket->waitForReadyRead(1000); } fillQueue(); }#endif}#ifndef QT_NO_COPvoid QWSDisplay::Data::waitForQCopResponse(){ for (;;) { fillQueue(); if (qcop_response) break;#ifndef QT_NO_QWS_MULTIPROCESS if (csocket) { csocket->flush(); csocket->waitForReadyRead(1000); }#endif } queue.prepend(qcop_response); qcop_response = 0;}#endif/*! \class QWSDisplay qwsdisplay_qws.h \brief The QWSDisplay class provides a display for QWS; it is an internal class. \internal \ingroup qws*/QWSDisplay::QWSDisplay(){ d = new Data(0, qws_single_process);}QWSDisplay::~QWSDisplay(){ delete d; delete lock; lock = 0;}bool QWSDisplay::grabbed(){ return lock->locked();}void QWSDisplay::grab(){ lock->lock(QLock::Read);}void QWSDisplay::grab(bool write){ lock->lock(write ? QLock::Write : QLock::Read);}void QWSDisplay::ungrab(){ lock->unlock();}#if 0QWSRegionManager *QWSDisplay::regionManager() const{ return d->rgnMan;}#endifbool QWSDisplay::eventPending() const{#ifndef QT_NO_QWS_MULTIPROCESS d->flush();#endif d->fillQueue(); return d->queueNotEmpty();}/* Caller must delete return value! */QWSEvent *QWSDisplay::getEvent(){ d->fillQueue(); Q_ASSERT(d->queueNotEmpty()); QWSEvent* e = d->dequeue(); return e;}uchar* QWSDisplay::frameBuffer() const { return qt_screen->base(); }int QWSDisplay::width() const { return qt_screen->width(); }int QWSDisplay::height() const { return qt_screen->height(); }int QWSDisplay::depth() const { return qt_screen->depth(); }int QWSDisplay::pixmapDepth() const { return qt_screen->pixmapDepth(); }bool QWSDisplay::supportsDepth(int depth) const { return qt_screen->supportsDepth(depth); }uchar *QWSDisplay::sharedRam() const { return d->sharedRam; }int QWSDisplay::sharedRamSize() const { return d->sharedRamSize; }void QWSDisplay::addProperty(int winId, int property){ QWSAddPropertyCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.property = property; d->sendCommand(cmd);}void QWSDisplay::setProperty(int winId, int property, int mode, const QByteArray &data){ QWSSetPropertyCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.property = property; cmd.simpleData.mode = mode; cmd.setData(data.constData(), data.size()); d->sendCommand(cmd);}void QWSDisplay::setProperty(int winId, int property, int mode, const char * data){ QWSSetPropertyCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.property = property; cmd.simpleData.mode = mode; cmd.setData(data, strlen(data)); d->sendCommand(cmd);}void QWSDisplay::removeProperty(int winId, int property){ QWSRemovePropertyCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.property = property; d->sendCommand(cmd);}/* It is the caller's responsibility to delete[] \a data. */bool QWSDisplay::getProperty(int winId, int property, char *&data, int &len){ QWSGetPropertyCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.property = property; d->sendCommand(cmd); getPropertyLen = -2; getPropertyData = 0; while (getPropertyLen == -2) qApp->processEvents(); //########## USE an ACK event instead. That's dangerous! len = getPropertyLen; data = getPropertyData; getPropertyLen = -2; getPropertyData = 0; return len != -1;}void QWSDisplay::setAltitude(int winId, int alt, bool fixed){ QWSChangeAltitudeCommand cmd;#ifdef QT_DEBUG memset(cmd.simpleDataPtr, 0, sizeof(cmd.simpleData)); //shut up Valgrind#endif cmd.simpleData.windowid = winId; cmd.simpleData.altitude = QWSChangeAltitudeCommand::Altitude(alt); cmd.simpleData.fixed = fixed; if (d->directServerConnection()) { qwsServer->d_func()->set_altitude(&cmd); } else { d->sendSynchronousCommand(cmd); }}void QWSDisplay::setOpacity(int winId, int opacity){ QWSSetOpacityCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.opacity = opacity; if (d->directServerConnection()) { qwsServer->d_func()->set_opacity(&cmd); } else { d->sendCommand(cmd); }}void QWSDisplay::requestFocus(int winId, bool get){ QWSRequestFocusCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.flag = get; if (d->directServerConnection()) qwsServer->d_func()->request_focus(&cmd); else d->sendCommand(cmd);}void QWSDisplay::setIdentity(const QString &appName){ QWSIdentifyCommand cmd; cmd.setId(appName, QWSDisplay::Data::clientLock ? QWSDisplay::Data::clientLock->id() : -1 ); if (d->directServerConnection()) qwsServer->d_func()->set_identity(&cmd); else d->sendCommand(cmd);}void QWSDisplay::nameRegion(int winId, const QString& n, const QString &c){ QWSRegionNameCommand cmd; cmd.simpleData.windowid = winId; cmd.setName(n, c); if (d->directServerConnection()) qwsServer->d_func()->name_region(&cmd); else d->sendCommand(cmd);}void QWSDisplay::requestRegion(int winId, const QString &surfaceKey, const QByteArray &surfaceData, const QRegion ®ion){ if (d->directServerConnection()) { qwsServer->d_func()->request_region(winId, surfaceKey, surfaceData, region); } else { QWSRegionCommand cmd; cmd.setData(winId, surfaceKey, surfaceData, region); d->sendSynchronousCommand(cmd); }}void QWSDisplay::repaintRegion(int winId, bool opaque, QRegion r){ if (d->directServerConnection()) { qwsServer->d_func()->repaint_region(winId, opaque, r); } else { QVector<QRect> ra = r.rects(); /* for (int i = 0; i < ra.size(); i++) { QRect r(ra[i]); qDebug("rect: %d %d %d %d", r.x(), r.y(), r.right(), r.bottom()); } */ QWSRepaintRegionCommand cmd; /* XXX QWSRegionCommand is padded out in a compiler dependent way. Zeroed out to avoid valgrind reporting uninitialized memory usage. */#ifdef QT_DEBUG memset(cmd.simpleDataPtr, 0, sizeof(cmd.simpleData)); //shut up Valgrind#endif cmd.simpleData.windowid = winId; cmd.simpleData.opaque = opaque; cmd.simpleData.nrectangles = ra.count(); cmd.setData(reinterpret_cast<const char *>(ra.constData()), ra.count() * sizeof(QRect), false); d->sendSynchronousCommand(cmd); }}void QWSDisplay::moveRegion(int winId, int dx, int dy){ QWSRegionMoveCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.dx = dx; cmd.simpleData.dy = dy; if (d->directServerConnection()) { qwsServer->d_func()->move_region(&cmd); } else { d->sendSynchronousCommand(cmd); }// d->offsetPendingExpose(winId, QPoint(cmd.simpleData.dx, cmd.simpleData.dy));}void QWSDisplay::destroyRegion(int winId){ QWSRegionDestroyCommand cmd; cmd.simpleData.windowid = winId; if (d->directServerConnection()) { qwsServer->d_func()->destroy_region(&cmd); } else { d->sendCommand(cmd); }}#ifndef QT_NO_QWS_INPUTMETHODSvoid QWSDisplay::sendIMUpdate(int type, int winId, int widgetid){ QWSIMUpdateCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.widgetid = widgetid; cmd.simpleData.type = type; if (d->directServerConnection()) { qwsServer->d_func()->im_update(&cmd); } else { d->sendCommand(cmd); }}void QWSDisplay::sendIMResponse(int winId, int property, const QVariant &result){ QWSIMResponseCommand cmd; cmd.simpleData.windowid = winId; cmd.simpleData.property = property; cmd.setResult(result); if (d->directServerConnection()) { qwsServer->d_func()->im_response(&cmd); } else { d->sendCommand(cmd); }}void QWSDisplay::resetIM(){ sendIMUpdate(QWSInputMethod::Reset, -1, -1);}void QWSDisplay::sendIMMouseEvent(int index, bool isPress){ QWSIMMouseCommand cmd; cmd.simpleData.index = index; cmd.simpleData.state = isPress ? QWSServer::MousePress : QWSServer::MouseRelease; if (d->directServerConnection()) { qwsServer->d_func()->send_im_mouse(&cmd); } else { d->sendCommand(cmd); }}#endifint QWSDisplay::takeId(){ return d->takeId();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?