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 &region){    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 + -
显示快捷键?