qapplication_qws.cpp

来自「QT 开发环境里面一个很重要的文件」· C++ 代码 · 共 2,229 行 · 第 1/5 页

CPP
2,229
字号
bool QWSDisplay::initLock(const QString &filename, bool create){    if (!lock) {        lock = new QLock(filename, 'd', create);        if (!lock->isValid()) {            delete lock;            lock = 0;            return false;        }    }    return true;}void QWSDisplay::setSelectionOwner(int winId, const QTime &time){    QWSSetSelectionOwnerCommand cmd;    cmd.simpleData.windowid = winId;    cmd.simpleData.hour = time.hour();    cmd.simpleData.minute = time.minute();    cmd.simpleData.sec = time.second();    cmd.simpleData.ms = time.msec();    d->sendCommand(cmd);}void QWSDisplay::convertSelection(int winId, int selectionProperty, const QString &mimeTypes){#ifdef QT_NO_QWS_PROPERTIES    Q_UNUSED(mimeTypes);#else    // ### we need the atom/property thingy like in X here    addProperty(winId, QT_QWS_PROPERTY_CONVERTSELECTION);    setProperty(winId, QT_QWS_PROPERTY_CONVERTSELECTION,                 int(QWSPropertyManager::PropReplace), mimeTypes.toLatin1());#endif    QWSConvertSelectionCommand cmd;    cmd.simpleData.requestor = winId;    cmd.simpleData.selection = selectionProperty;    cmd.simpleData.mimeTypes = QT_QWS_PROPERTY_CONVERTSELECTION;    d->sendCommand(cmd);}void QWSDisplay::defineCursor(int id, const QBitmap &curs, const QBitmap &mask,                            int hotX, int hotY){    QImage cursImg = curs.toImage();    QImage maskImg = mask.toImage();    QWSDefineCursorCommand cmd;    cmd.simpleData.width = curs.width();    cmd.simpleData.height = curs.height();    cmd.simpleData.hotX = hotX;    cmd.simpleData.hotY = hotY;    cmd.simpleData.id = id;    // must copy each scanline since there might be gaps between them    const int height = curs.height();    const int width = curs.width();    const int dst_bpl = (width + 7) / 8;    int dataLen = dst_bpl * height;    uchar *data = new uchar[dataLen*2];    uchar *dst = data;    int src_bpl = cursImg.bytesPerLine();    const uchar *cursSrc = cursImg.bits();    for (int i = 0; i < height; ++i) {        memcpy(dst, cursSrc + i*src_bpl, dst_bpl);        dst += dst_bpl;    }    src_bpl = maskImg.bytesPerLine();    const uchar *maskSrc = maskImg.bits();    for (int i = 0; i < height; ++i) {        memcpy(dst, maskSrc + i*src_bpl, dst_bpl);        dst += dst_bpl;    }    cmd.setData(reinterpret_cast<char*>(data), dataLen*2);    delete [] data;    d->sendCommand(cmd);}void QWSDisplay::destroyCursor(int id){    QWSDefineCursorCommand cmd;    cmd.simpleData.width = 0;    cmd.simpleData.height = 0;    cmd.simpleData.hotX = 0;    cmd.simpleData.hotY = 0;    cmd.simpleData.id = id;    cmd.setData(0, 0);    d->sendCommand(cmd);}#ifndef QT_NO_SOUNDvoid QWSDisplay::playSoundFile(const QString& f){    QWSPlaySoundCommand cmd;    cmd.setFileName(f);    d->sendCommand(cmd);}#endif#ifndef QT_NO_COPvoid QWSDisplay::registerChannel(const QString& channel){    QWSQCopRegisterChannelCommand reg;    reg.setChannel(channel);    qt_fbdpy->d->sendCommand(reg);}void QWSDisplay::sendMessage(const QString &channel, const QString &msg,                   const QByteArray &data){    QWSQCopSendCommand com;    com.setMessage(channel, msg, data);    qt_fbdpy->d->sendCommand(com);}void QWSDisplay::flushCommands(){    qt_fbdpy->d->flushCommands();}/*  caller deletes result*/QWSQCopMessageEvent* QWSDisplay::waitForQCopResponse(){    qt_fbdpy->d->waitForQCopResponse();    QWSQCopMessageEvent *e = static_cast<QWSQCopMessageEvent*>(qt_fbdpy->d->dequeue());    Q_ASSERT(e->type == QWSEvent::QCopMessage);    return e;}#endifvoid QWSDisplay::setWindowCaption(QWidget *w, const QString &c){    if (w->isWindow()) {        nameRegion(w->internalWinId(), w->objectName(), c);        static_cast<QETWidget *>(w)->repaintDecoration(qApp->desktop()->rect(), true);    }}void QWSDisplay::selectCursor(QWidget *w, unsigned int cursId){    if (cursId != qt_last_cursor)    {        QWidget *top = w->window();        qt_last_cursor = cursId;        QWSSelectCursorCommand cmd;        cmd.simpleData.windowid = top->internalWinId();        cmd.simpleData.id = cursId;        d->sendCommand(cmd);        d->flush();    }}void QWSDisplay::setCursorPosition(int x, int y){    QWSPositionCursorCommand cmd;    cmd.simpleData.newX = x;    cmd.simpleData.newY = y;    d->sendCommand(cmd);    d->flush();}void QWSDisplay::grabMouse(QWidget *w, bool grab){    QWidget *top = w->window();    QWSGrabMouseCommand cmd;#ifdef QT_DEBUG    memset(cmd.simpleDataPtr, 0, sizeof(cmd.simpleData)); //shut up Valgrind#endif    cmd.simpleData.windowid = top->winId();    cmd.simpleData.grab = grab;    d->sendCommand(cmd);    d->flush();}void QWSDisplay::grabKeyboard(QWidget *w, bool grab){    QWidget *top = w->window();    QWSGrabKeyboardCommand cmd;#ifdef QT_DEBUG    memset(cmd.simpleDataPtr, 0, sizeof(cmd.simpleData)); //shut up Valgrind#endif    cmd.simpleData.windowid = top->winId();    cmd.simpleData.grab = grab;    d->sendCommand(cmd);    d->flush();}QList<QWSWindowInfo> QWSDisplay::windowList(){    QList<QWSWindowInfo> ret;    if(d->directServerConnection()) {        QList<QWSInternalWindowInfo*> * qin=QWSServer::windowList();        for (int i = 0; i < qin->count(); ++i) {            QWSInternalWindowInfo * qwi = qin->at(i);            QWSWindowInfo tmp;            tmp.winid = qwi->winid;            tmp.clientid = qwi->clientid;            tmp.name = QString(qwi->name);            ret.append(tmp);        }        qDeleteAll(*qin);        delete qin;    }    return ret;}int QWSDisplay::windowAt(const QPoint &p){    //### currently only implemented for the server process    int ret = 0;    if(d->directServerConnection()) {        QWSWindow *win = qwsServer->windowAt(p);        if (win)            return win->winId();    }    return ret;}void QWSDisplay::setRawMouseEventFilter(void (*filter)(QWSMouseEvent *)){    if (qt_fbdpy)        qt_fbdpy->d->setMouseFilter(filter);}#ifdef QT_QWS_DYNAMIC_TRANSFORMATION#ifdef QT_QWS_TRANSFORMEDextern void qws_setScreenTransformation(int);extern void qws_mapPixmaps(bool from);#endifvoid QWSDisplay::setTransformation(int t){#ifdef QT_QWS_TRANSFORMED    QApplicationPrivate *ap = QApplicationPrivate::instance();    const QRect maxWindowRect = ap->maxWindowRect(qt_screen);    bool isFullScreen = maxWindowRect == QRect(0, 0, qt_screen->width(), qt_screen->height());    QPixmapCache::clear();    QFontCache::instance->clear();    qws_mapPixmaps(true);    qws_setScreenTransformation(t);    qws_mapPixmaps(false);    if (qt_fbdpy->d_func()->directServerConnection()) {        qwsServer->d_func()->resetEngine();        qwsServer->d_func()->refresh();    }    QSize olds = qApp->desktop()->size();    qApp->desktop()->resize(qt_screen->width(), qt_screen->height());    // ## why post the resize event?    qApp->postEvent(qApp->desktop(), new QResizeEvent(qApp->desktop()->size(), olds));    emit QApplication::desktop()->resized(0);    QWidgetList  list = QApplication::topLevelWidgets();    for (int i = list.size()-1; i >= 0; --i) {        QWidget *w = (QWidget*)list[i];        if ((w->windowType() == Qt::Desktop)) {            //nothing        } else if (w->testAttribute(Qt::WA_WState_FullScreen)) {            w->resize(qt_screen->width(), qt_screen->height());        } else {            QETWidget *etw = static_cast<QETWidget*>(w);            etw->updateRegion();            if (etw->isVisible()) {                etw->repaintHierarchy(etw->geometry(), true);                etw->repaintDecoration(qApp->desktop()->rect(), true);            }        }    }    // only update the mwr if it is full screen.    if (isFullScreen) {        QApplicationPriate *ap = QApplicationPrivate::instance();        ap->setMaxWindowRect(qt_screen,                             QRect(0,0, qt_screen->width(), qt_screen->height()));    }#endif}#endifstatic bool qt_try_modal(QWidget *, QWSEvent *);/*****************************************************************************  qt_init() - initializes Qt/FB *****************************************************************************/static void qt_set_qws_resources(){    if (QApplication::desktopSettingsAware())        QApplicationPrivate::qws_apply_settings();    if (appFont)        QApplication::setFont(QFont(appFont));    if (appBGCol || appBTNCol || appFGCol) {        (void) QApplication::style();  // trigger creation of application style and system palettes        QColor btn;        QColor bg;        QColor fg;        if (appBGCol)            bg = QColor(appBGCol);        else            bg = QApplicationPrivate::sys_pal->color(QPalette::Window);        if (appFGCol)            fg = QColor(appFGCol);        else            fg = QApplicationPrivate::sys_pal->color(QPalette::WindowText);        if (appBTNCol)            btn = QColor(appBTNCol);        else            btn = QApplicationPrivate::sys_pal->color(QPalette::Button);        int h,s,v;        fg.getHsv(&h,&s,&v);        QColor base = Qt::white;        bool bright_mode = false;        if (v >= 255-50) {            base = btn.dark(150);            bright_mode = true;        }        QPalette pal(fg, btn, btn.light(), btn.dark(), btn.dark(150), fg, Qt::white, base, bg);        if (bright_mode) {            pal.setColor(QPalette::HighlightedText, base);            pal.setColor(QPalette::Highlight, Qt::white);        } else {            pal.setColor(QPalette::HighlightedText, Qt::white);            pal.setColor(QPalette::Highlight, Qt::darkBlue);        }        QColor disabled((fg.red()   + btn.red())  / 2,                        (fg.green() + btn.green())/ 2,                        (fg.blue()  + btn.blue()) / 2);        pal.setColorGroup(QPalette::Disabled, disabled, btn, btn.light(125),                          btn.dark(), btn.dark(150), disabled, Qt::white, Qt::white, bg);        if (bright_mode) {            pal.setColor(QPalette::Disabled, QPalette::HighlightedText, base);            pal.setColor(QPalette::Disabled, QPalette::Highlight, Qt::white);        } else {            pal.setColor(QPalette::Disabled, QPalette::HighlightedText, Qt::white);            pal.setColor(QPalette::Disabled, QPalette::Highlight, Qt::darkBlue);        }        QApplicationPrivate::setSystemPalette(pal);    }}void QApplicationPrivate::initializeWidgetPaletteHash(){}/*! \internal    apply the settings to the application*/bool QApplicationPrivate::qws_apply_settings(){#ifndef QT_NO_SETTINGS    QSettings settings(QSettings::UserScope, QLatin1String("Trolltech"));    settings.beginGroup(QLatin1String("Qt"));    QStringList strlist;    int i;    QPalette pal(Qt::black);    int groupCount = 0;    strlist = settings.value(QLatin1String("Palette/active")).toStringList();    if (strlist.count() == QPalette::NColorRoles) {        ++groupCount;        for (i = 0; i < QPalette::NColorRoles; i++)            pal.setColor(QPalette::Active, (QPalette::ColorRole) i,                         QColor(strlist[i]));    }    strlist = settings.value(QLatin1String("Palette/inactive")).toStringList();    if (strlist.count() == QPalette::NColorRoles) {        ++groupCount;        for (i = 0; i < QPalette::NColorRoles; i++)            pal.setColor(QPalette::Inactive, (QPalette::ColorRole) i,                         QColor(strlist[i]));    }    strlist = settings.value(QLatin1String("Palette/disabled")).toStringList();    if (strlist.count() == QPalette::NColorRoles) {        ++groupCount;        for (i = 0; i < QPalette::NColorRoles; i++)            pal.setColor(QPalette::Disabled, (QPalette::ColorRole) i,                         QColor(strlist[i]));    }    if (groupCount == QPalette::NColorGroups)        QApplicationPrivate::setSystemPalette(pal);    if (!qt_app_has_font) {        QFont font(QApplication::font());        QString str = settings.value(QLatin1String("font")).toString();        if (!str.isEmpty()) {            font.fromString(str);            if (font != QApplication::font())                QApplication::setFont(font);        }    }    // read library (ie. plugin) path list    QString libpathkey =        QString(QLatin1String("%1.%2/libraryPath"))        .arg(QT_VERSION >> 16)        .arg((QT_VERSION & 0xff00) >> 8);    QStringList pathlist = settings.value(libpathkey).toString().split(QLatin1Char(':'));#ifndef QT_NO_LIBRARY    if (! pathlist.isEmpty()) {        QStringList::ConstIterator it = pathlist.constBegin();        while (it != pathlist.constEnd())            QApplication::addLibraryPath(*it++);    }#endif    // read new QStyle    QString stylename = settings.value(QLatin1String("style")).toString();    if (QCoreApplication::startingUp()) {        if (!stylename.isEmpty() && !QApplicationPrivate::styleOverride)            QApplicationPrivate::styleOverride = new QString(stylename);    } else {        QApplication::setStyle(stylename);    }    int num =        settings.value(QLatin1String("doubleClickInterval"),                       QApplication::doubleClickInterval()).toInt();    QApplication::setDoubleClickInterval(num);    num =        settings.value(QLatin1String("cursorFlashTime"),

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?