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 + -
显示快捷键?