void QWidgetPrivate::repaint_sys(const QRegion &rgn) { if (data.in_destructor) return; Q_Q(QWidget); if (q->testAttribute(Qt::WA_StaticContents)) { if (!extra) createExtra(); extra->staticContentsSize = data.crect.size(); } QRegion toBePainted(rgn); toBePainted &= clipRect(); clipToEffectiveMask(toBePainted); if (toBePainted.isEmpty()) return; // Nothing to repaint. #ifndef QT_NO_PAINT_DEBUG bool flushed = QWidgetBackingStore::flushPaint(q, toBePainted); #endif drawWidget(q, toBePainted, QPoint(), QWidgetPrivate::DrawAsRoot | QWidgetPrivate::DrawPaintOnScreen, 0); #ifndef QT_NO_PAINT_DEBUG if (flushed) QWidgetBackingStore::unflushPaint(q, toBePainted); #endif if (!q->testAttribute(Qt::WA_PaintOutsidePaintEvent) && q->paintingActive()) qWarning("QWidget::repaint: It is dangerous to leave painters active on a widget outside of the PaintEvent"); }
void QWidget::setBackgroundPixmapDirect( const QPixmap &pixmap ) { QPixmap old; if ( extra && extra->bg_pix ) old = *extra->bg_pix; if ( !allow_null_pixmaps && pixmap.isNull() ) { // XXX XSetWindowBackground( x11Display(), winId(), bg_col.pixel() ); if ( extra && extra->bg_pix ) { delete extra->bg_pix; extra->bg_pix = 0; } } else { QPixmap pm = pixmap; if (!pm.isNull()) { if ( pm.depth() == 1 && QPixmap::defaultDepth() > 1 ) { pm = QPixmap( pixmap.size() ); bitBlt( &pm, 0, 0, &pixmap, 0, 0, pm.width(), pm.height() ); } } if ( extra && extra->bg_pix ) delete extra->bg_pix; else createExtra(); extra->bg_pix = new QPixmap( pm ); // XXX XSetWindowBackgroundPixmap( x11Display(), winId(), pm.handle() ); } }
void QWidget::setMaximumSize( int maxw, int maxh ) { #if defined(QT_CHECK_RANGE) if ( maxw > QWIDGETSIZE_MAX || maxh > QWIDGETSIZE_MAX ) { qWarning("QWidget::setMaximumSize: (%s/%s) " "The largest allowed size is (%d,%d)", name( "unnamed" ), className(), QWIDGETSIZE_MAX, QWIDGETSIZE_MAX ); maxw = QMIN( maxw, QWIDGETSIZE_MAX ); maxh = QMIN( maxh, QWIDGETSIZE_MAX ); } if ( maxw < 0 || maxh < 0 ) { qWarning("QWidget::setMaximumSize: (%s/%s) Negative sizes (%d,%d) " "are not possible", name( "unnamed" ), className(), maxw, maxh ); maxw = QMAX( maxw, 0 ); maxh = QMAX( maxh, 0 ); } #endif createExtra(); if ( extra->maxw == maxw && extra->maxh == maxh ) return; extra->maxw = maxw; extra->maxh = maxh; if ( maxw < width() || maxh < height() ) resize( QMIN(maxw,width()), QMIN(maxh,height()) ); if ( testWFlags(WType_TopLevel) ) { // XXX } updateGeometry(); }
void QWidget::setMinimumSize( int minw, int minh ) { if ( !qt_maxWindowRect.isEmpty() ) { // This is really just a work-around. Layout shouldn't be asking // for minimum sizes bigger than the screen. if ( minw > qt_maxWindowRect.width() ) minw = qt_maxWindowRect.width(); if ( minh > qt_maxWindowRect.height() ) minh = qt_maxWindowRect.height(); } #if defined(QT_CHECK_RANGE) if ( minw < 0 || minh < 0 ) qWarning("QWidget::setMinimumSize: The smallest allowed size is (0,0)"); #endif createExtra(); if ( extra->minw == minw && extra->minh == minh ) return; extra->minw = minw; extra->minh = minh; if ( minw > width() || minh > height() ) resize( QMAX(minw,width()), QMAX(minh,height()) ); if ( testWFlags(WType_TopLevel) ) { // XXX } updateGeometry(); }
void QWidget::setCursor( const QCursor &cursor ) { createExtra(); delete extra->curs; extra->curs = new QCursor(cursor); setWState( WState_OwnCursor ); if ( isVisible() ) updateCursor( paintableRegion() ); }
void QWidget::setMask( const QRegion& region ) { createExtra(); if ( region == extra->mask ) return; alloc_region_dirty = TRUE; extra->mask = region; if ( isTopLevel() ) { if ( !region.isNull() ) { req_region = extra->mask; req_region.translate(crect.x(),crect.y()); //###expensive? req_region &= crect; //??? this is optional } else req_region = QRegion(crect); req_region = qt_screen->mapToDevice( req_region, QSize(qt_screen->width(), qt_screen->height()) ); } if ( isVisible() ) { if ( isTopLevel() ) { QRegion rgn( req_region ); #ifndef QT_NO_QWS_MANAGER if ( extra && extra->topextra && extra->topextra->qwsManager ) { QRegion wmr = extra->topextra->qwsManager->region(); wmr = qt_screen->mapToDevice( wmr, QSize(qt_screen->width(), qt_screen->height()) ); rgn += wmr; } #endif qwsDisplay()->requestRegion(winId(), rgn); } else { updateRequestedRegion( mapToGlobal(QPoint(0,0)) ); parentWidget()->paintable_region_dirty = TRUE; parentWidget()->repaint(geometry()); paint_children( parentWidget(),geometry(),TRUE ); } } }
void QWidgetPrivate::create_sys(WId window, bool /* initializeWindow */, bool destroyOldWindow) { Q_Q(QWidget); Qt::WindowType type = q->windowType(); Qt::WindowFlags &flags = data.window_flags; QWidget *parentWidget = q->parentWidget(); bool topLevel = (flags & Qt::Window); bool popup = (type == Qt::Popup); bool dialog = (type == Qt::Dialog || type == Qt::Sheet || (flags & Qt::MSWindowsFixedSizeDialogHint)); bool desktop = (type == Qt::Desktop); //bool tool = (type == Qt::Tool || type == Qt::Drawer); if (popup) flags |= Qt::WindowStaysOnTopHint; // a popup stays on top TRect clientRect = static_cast<CEikAppUi*>(S60->appUi())->ClientRect(); int sw = clientRect.Width(); int sh = clientRect.Height(); if (desktop) { TSize screenSize = S60->screenDevice()->SizeInPixels(); data.crect.setRect(0, 0, screenSize.iWidth, screenSize.iHeight); q->setAttribute(Qt::WA_DontShowOnScreen); } else if (topLevel && !q->testAttribute(Qt::WA_Resized)){ int width = sw; int height = sh; if (extra) { width = qMax(qMin(width, extra->maxw), extra->minw); height = qMax(qMin(height, extra->maxh), extra->minh); } data.crect.setSize(QSize(width, height)); } CCoeControl *const destroyw = destroyOldWindow ? data.winid : 0; createExtra(); if (window) { setWinId(window); TRect tr = window->Rect(); data.crect.setRect(tr.iTl.iX, tr.iTl.iY, tr.Width(), tr.Height()); } else if (topLevel) { if (!q->testAttribute(Qt::WA_Moved) && !q->testAttribute(Qt::WA_DontShowOnScreen)) data.crect.moveTopLeft(QPoint(clientRect.iTl.iX, clientRect.iTl.iY)); QScopedPointer<QSymbianControl> control( q_check_ptr(new QSymbianControl(q)) ); QT_TRAP_THROWING(control->ConstructL(true, desktop)); control->SetMopParent(static_cast<CEikAppUi*>(S60->appUi())); // Symbian windows are always created in an inactive state // We perform this assignment for the case where the window is being re-created // as a result of a call to setParent_sys, on either this widget or one of its // ancestors. extra->activated = 0; if (!desktop) { TInt stackingFlags; if ((q->windowType() & Qt::Popup) == Qt::Popup) { stackingFlags = ECoeStackFlagRefusesAllKeys | ECoeStackFlagRefusesFocus; } else { stackingFlags = ECoeStackFlagStandard; } control->MakeVisible(false); QT_TRAP_THROWING(control->ControlEnv()->AppUi()->AddToStackL(control.data(), ECoeStackPriorityDefault, stackingFlags)); // Avoid keyboard focus to a hidden window. control->setFocusSafely(false); RDrawableWindow *const drawableWindow = control->DrawableWindow(); // Request mouse move events. drawableWindow->PointerFilter(EPointerFilterEnterExit | EPointerFilterMove | EPointerFilterDrag, 0); drawableWindow->EnableVisibilityChangeEvents(); } q->setAttribute(Qt::WA_WState_Created); int x, y, w, h; data.crect.getRect(&x, &y, &w, &h); control->SetRect(TRect(TPoint(x, y), TSize(w, h))); // We wait until the control is fully constructed before calling setWinId, because // this generates a WinIdChanged event. setWinId(control.take()); if (!desktop) s60UpdateIsOpaque(); // must be called after setWinId() } else if (q->testAttribute(Qt::WA_NativeWindow) || paintOnScreen()) { // create native child widget QScopedPointer<QSymbianControl> control( q_check_ptr(new QSymbianControl(q)) ); QT_TRAP_THROWING(control->ConstructL(!parentWidget)); // Symbian windows are always created in an inactive state // We perform this assignment for the case where the window is being re-created // as a result of a call to setParent_sys, on either this widget or one of its // ancestors. extra->activated = 0; TInt stackingFlags; if ((q->windowType() & Qt::Popup) == Qt::Popup) { stackingFlags = ECoeStackFlagRefusesAllKeys | ECoeStackFlagRefusesFocus; } else { stackingFlags = ECoeStackFlagStandard; } control->MakeVisible(false); QT_TRAP_THROWING(control->ControlEnv()->AppUi()->AddToStackL(control.data(), ECoeStackPriorityDefault, stackingFlags)); // Avoid keyboard focus to a hidden window. control->setFocusSafely(false); q->setAttribute(Qt::WA_WState_Created); int x, y, w, h; data.crect.getRect(&x, &y, &w, &h); control->SetRect(TRect(TPoint(x, y), TSize(w, h))); RDrawableWindow *const drawableWindow = control->DrawableWindow(); // Request mouse move events. drawableWindow->PointerFilter(EPointerFilterEnterExit | EPointerFilterMove | EPointerFilterDrag, 0); drawableWindow->EnableVisibilityChangeEvents(); if (q->isVisible() && q->testAttribute(Qt::WA_Mapped)) { activateSymbianWindow(control.data()); control->MakeVisible(true); } // We wait until the control is fully constructed before calling setWinId, because // this generates a WinIdChanged event. setWinId(control.take()); } if (destroyw) { destroyw->ControlEnv()->AppUi()->RemoveFromStack(destroyw); // Delay deletion of the control in case this function is called in the // context of a CONE event handler such as // CCoeControl::ProcessPointerEventL QMetaObject::invokeMethod(q, "_q_delayedDestroy", Qt::QueuedConnection, Q_ARG(WId, destroyw)); } if (q->testAttribute(Qt::WA_AcceptTouchEvents)) registerTouchWindow(); }