📄 qwidget_qws.cpp
字号:
void QWidgetPrivate::stackUnder_sys(QWidget*){ Q_Q(QWidget); if (QWidget *p = q->parentWidget()) { setDirtyOpaqueRegion(); p->d_func()->invalidateBuffer(q->geometry()); }}void QWidgetPrivate::moveSurface(QWindowSurface *surface, const QPoint &offset){ QWSWindowSurface *s = static_cast<QWSWindowSurface*>(surface); if (!s->move(offset)) s->invalidateBuffer(); QWSDisplay::instance()->moveRegion(s->winId(), offset.x(), offset.y());}void QWidgetPrivate::setGeometry_sys(int x, int y, int w, int h, bool isMove){ Q_Q(QWidget); if (extra) { // any size restrictions? w = qMin(w,extra->maxw); h = qMin(h,extra->maxh); w = qMax(w,extra->minw); h = qMax(h,extra->minh); } QPoint oldp = q->geometry().topLeft(); QSize olds = q->size(); QRect r(x, y, w, h); bool isResize = olds != r.size(); isMove = oldp != r.topLeft(); //### why do we have isMove as a parameter? // We only care about stuff that changes the geometry, or may // cause the window manager to change its state if (r.size() == olds && oldp == r.topLeft()) return; if (!data.in_set_window_state) { q->data->window_state &= ~Qt::WindowMaximized; q->data->window_state &= ~Qt::WindowFullScreen; if (q->isWindow()) topData()->normalGeometry = QRect(0, 0, -1, -1); } QPoint oldPos = q->pos(); data.crect = r; if ((q->windowType() == Qt::Desktop)) return; bool inTransaction = false; QTLWExtra *topextra = q->window()->d_func()->maybeTopData(); if (topextra) { inTransaction = topextra->inPaintTransaction; topextra->inPaintTransaction = true; } if (q->isVisible()) { bool toplevelMove = false; QWSWindowSurface *surface = 0; if (q->isWindow()) { //### ConfigPending not implemented, do we need it? //setAttribute(Qt::WA_WState_ConfigPending); const QWidgetBackingStore *bs = maybeBackingStore(); if (bs) surface = static_cast<QWSWindowSurface*>(bs->windowSurface); if (isMove && !isResize && surface) { const QPoint offset(x - oldp.x(), y - oldp.y()); moveSurface(surface, offset); toplevelMove = true; //server moves window, but we must send moveEvent, which might trigger painting#ifdef Q_BACKINGSTORE_SUBSURFACES QList<QWindowSurface*> surfaces = bs->subSurfaces; for (int i = 0; i < surfaces.size(); ++i) moveSurface(surfaces.at(i), offset);#endif } else { updateFrameStrut(); } } //### must have frame geometry correct before sending move/resize events if (isMove) { QMoveEvent e(q->pos(), oldPos); QApplication::sendEvent(q, &e); } if (isResize) { QResizeEvent e(r.size(), olds); QApplication::sendEvent(q, &e); } if (!toplevelMove) { if (q->isWindow()) { if (surface) surface->setGeometry(q->frameGeometry()); else invalidateBuffer(q->rect()); //####ifdef Q_BACKINGSTORE_SUBSURFACES // XXX: should not resize subsurfaces. Children within a layout // will be resized automatically while children with a static // geometry should get a new clip region instead. const QRect clipRect = q->geometry(); QWidgetBackingStore *bs = maybeBackingStore(); QList<QWindowSurface*> surfaces = bs->subSurfaces; for (int i = 0; i < surfaces.size(); ++i) { QWSWindowSurface *s = static_cast<QWSWindowSurface*>(surfaces.at(i)); QRect srect = s->geometry(); s->setGeometry(clipRect & srect); }#endif }#ifdef Q_BACKINGSTORE_SUBSURFACES // XXX: merge this case with the isWindow() case else if (maybeTopData() && maybeTopData()->windowSurface) { QWSWindowSurface *surface; surface = static_cast<QWSWindowSurface*>(q->windowSurface()); if (isMove && !isResize) { moveSurface(surface, QPoint(x - oldp.x(), y - oldp.y())); } else { const QPoint p = q->mapToGlobal(QPoint()); surface->setGeometry(QRect(p, QSize(w, h))); } }#endif else { if (isMove && !isResize) { moveRect(QRect(oldPos, olds), x - oldPos.x(), y - oldPos.y()); } else { q->parentWidget()->d_func()->invalidateBuffer(QRect(oldPos, olds)); invalidateBuffer(q->rect()); //TODO: handle static contents } } } } else { // not visible if (isMove && q->pos() != oldPos) q->setAttribute(Qt::WA_PendingMoveEvent, true); if (isResize) q->setAttribute(Qt::WA_PendingResizeEvent, true); } if (topextra) topextra->inPaintTransaction = inTransaction;}void QWidgetPrivate::setConstraints_sys(){}QScreen* QWidgetPrivate::getScreen() const{ Q_Q(const QWidget); const QList<QScreen*> subScreens = qt_screen->subScreens(); if (subScreens.isEmpty()) return qt_screen; const int screen = QApplication::desktop()->screenNumber(q); return qt_screen->subScreens().at(screen < 0 ? 0 : screen);}void QWidgetPrivate::scroll_sys(int dx, int dy){ Q_Q(QWidget); scrollChildren(dx, dy); scrollRect(q->rect(), dx, dy);}void QWidgetPrivate::scroll_sys(int dx, int dy, const QRect &r){ scrollRect(r, dx, dy);}int QWidget::metric(PaintDeviceMetric m) const{ Q_D(const QWidget); int val; if (m == PdmWidth) { val = data->crect.width(); } else if (m == PdmWidthMM) { const QScreen *screen = d->getScreen(); val = data->crect.width() * screen->physicalWidth() / screen->width(); } else if (m == PdmHeight) { val = data->crect.height(); } else if (m == PdmHeightMM) { const QScreen *screen = d->getScreen(); val = data->crect.height() * screen->physicalHeight() / screen->height(); } else if (m == PdmDepth) { return qwsDisplay()->depth(); } else if (m == PdmDpiX || m == PdmPhysicalDpiX) { const QScreen *screen = d->getScreen(); return qRound(screen->width() / double(screen->physicalWidth() / 25.4)); } else if (m == PdmDpiY || m == PdmPhysicalDpiY) { const QScreen *screen = d->getScreen(); return qRound(screen->height() / double(screen->physicalHeight() / 25.4)); } else { val = QPaintDevice::metric(m);// XXX } return val;}void QWidgetPrivate::createSysExtra(){}void QWidgetPrivate::deleteSysExtra(){}void QWidgetPrivate::createTLSysExtra(){ extra->topextra->backingStore = 0;}void QWidgetPrivate::deleteTLSysExtra(){ delete extra->topextra->backingStore; extra->topextra->backingStore = 0;}void QWidgetPrivate::registerDropSite(bool on){ Q_UNUSED(on);}QRegion QWidgetPrivate::localRequestedRegion() const{ Q_Q(const QWidget); QRegion r(q->rect()); if (extra && !extra->mask.isEmpty()) r &= extra->mask; return r;}QRegion QWidgetPrivate::localAllocatedRegion() const{ Q_Q(const QWidget); QWidgetBackingStore *wbs = q->window()->d_func()->maybeBackingStore(); QWindowSurface *ws = wbs ? wbs->windowSurface : 0; if (!ws) return QRegion(); QRegion r = static_cast<QWSWindowSurface*>(ws)->clipRegion(); if (!q->isWindow()) { QPoint off = q->mapTo(q->window(), QPoint()); r &= localRequestedRegion().translated(off); r.translate(-off); } return r;}inline bool QRect::intersects(const QRect &r) const{ return (qMax(x1, r.x1) <= qMin(x2, r.x2) && qMax(y1, r.y1) <= qMin(y2, r.y2));}void QWidget::setMask(const QRegion& region){ Q_D(QWidget); d->createExtra(); if (region == d->extra->mask) return; QRegion parentR; if (!isWindow()) parentR = d->extra->mask.isEmpty() ? QRegion(rect()) : d->extra->mask ; d->extra->mask = region; if (isVisible()) { if (isWindow()) { d->data.fstrut_dirty = true; d->invalidateBuffer(rect()); QWindowSurface *surface = d->extra->topextra->backingStore->windowSurface; if (surface) { // QWSWindowSurface::setGeometry() returns without doing anything // if old geom == new geom. Therefore, we need to reset the old value. surface->QWindowSurface::setGeometry(QRect()); surface->setGeometry(frameGeometry()); } } else { parentR += d->extra->mask; parentWidget()->update(parentR.translated(geometry().topLeft())); update(); } }}void QWidget::setMask(const QBitmap &bitmap){ setMask(QRegion(bitmap));}void QWidget::clearMask(){ setMask(QRegion());}void QWidgetPrivate::updateFrameStrut(){ Q_Q(QWidget); if(!q->isVisible() || (q->windowType() == Qt::Desktop)) { data.fstrut_dirty = q->isVisible(); return; }#ifndef QT_NO_QWS_MANAGER if (extra && extra->topextra && extra->topextra->qwsManager) { QTLWExtra *topextra = extra->topextra; const QRect oldFrameStrut = topextra->frameStrut; const QRect contents = data.crect; QRegion r = localRequestedRegion().translated(contents.topLeft()); r += extra->topextra->qwsManager->region(); const QRect frame = r.boundingRect(); topextra->frameStrut.setCoords(contents.left() - frame.left(), contents.top() - frame.top(), frame.right() - contents.right(), frame.bottom() - contents.bottom()); topextra->qwsManager->repaintRegion(QDecoration::All, QDecoration::Normal); }#endif data.fstrut_dirty = false;}#ifndef QT_NO_CURSORvoid QWidgetPrivate::updateCursor() const{ Q_Q(const QWidget); if (QApplication::overrideCursor()) return; if (qt_last_x && (!QWidget::mouseGrabber() || QWidget::mouseGrabber() == q) && qt_last_cursor != (WId)q->cursor().handle()) { const QPoint pos(*qt_last_x, *qt_last_y); const QPoint offset = q->mapToGlobal(QPoint()); if (!localAllocatedRegion().contains(pos - offset)) return; const QWidget *w = q->childAt(q->mapFromGlobal(pos)); if (!w || w->cursor().handle() == q->cursor().handle()) QWidget::qwsDisplay()->selectCursor(const_cast<QWidget*>(q), q->cursor().handle()); }}#endifvoid QWidget::setWindowOpacity(qreal level){ if (!isWindow()) return; Q_D(QWidget); level = qBound(qreal(0), level, qreal(1)); uchar opacity = uchar(level * 255); d->topData()->opacity = opacity; d->createWinId(); qwsDisplay()->setOpacity(data->winid, opacity);}qreal QWidget::windowOpacity() const{ return isWindow() ? ((QWidget*)this)->d_func()->topData()->opacity / 255.0 : 1.0;}//static QSingleCleanupHandler<QWSPaintEngine> qt_paintengine_cleanup_handler;//static QWSPaintEngine *qt_widget_paintengine = 0;/*! Returns the widget's paint engine.*/QPaintEngine *QWidget::paintEngine() const{ qWarning("QWidget::paintEngine: Should no longer be called"); return 0; //##### @@@// if (!qt_widget_paintengine) {// qt_widget_paintengine = new QRasterPaintEngine();// qt_paintengine_cleanup_handler.set(&qt_widget_paintengine);// }// if (qt_widget_paintengine->isActive()) {// if (d->extraPaintEngine)// return d->extraPaintEngine;// const_cast<QWidget *>(this)->d_func()->extraPaintEngine = new QRasterPaintEngine();// return d->extraPaintEngine;// }// return qt_widget_paintengine;}void QWidgetPrivate::setModal_sys(){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -