void QWidget::setIconText( const QString &iconText ) { createTLExtra(); extra->topextra->iconText = iconText; // XXX XSetIconName( x11Display(), winId(), iconText.utf8() ); // XXX XSetWMIconName( x11Display(), winId(), qstring_to_xtp(iconText) ); }
void QWidget::setCaption( const QString &caption ) { if ( extra && extra->topextra && extra->topextra->caption == caption ) return; // for less flicker createTLExtra(); extra->topextra->caption = caption; qwsDisplay()->setCaption(this, caption); QEvent e( QEvent::CaptionChange ); QApplication::sendEvent( this, &e ); }
void QWidget::setBaseSize( int basew, int baseh ) { createTLExtra(); QTLWExtra* x = extra->topextra; if ( x->basew == basew && x->baseh == baseh ) return; x->basew = basew; x->baseh = baseh; if ( testWFlags(WType_TopLevel) ) { // XXX } }
void QWidget::setSizeIncrement( int w, int h ) { createTLExtra(); QTLWExtra* x = extra->topextra; if ( x->incw == w && x->inch == h ) return; x->incw = w; x->inch = h; if ( testWFlags(WType_TopLevel) ) { // XXX ... } }
void QWidget::setIcon( const QPixmap &unscaledPixmap ) { if ( extra && extra->topextra ) { delete extra->topextra->icon; extra->topextra->icon = 0; } else { createTLExtra(); } QBitmap mask; if ( unscaledPixmap.isNull() ) { } else { QImage unscaledIcon = unscaledPixmap.convertToImage(); QPixmap pixmap; #ifndef QT_NO_IMAGE_SMOOTHSCALE pixmap.convertFromImage( unscaledIcon.smoothScale( 16, 16 ) ); #else pixmap.convertFromImage( unscaledIcon ); #endif extra->topextra->icon = new QPixmap( pixmap ); mask = pixmap.mask() ? *pixmap.mask() : pixmap.createHeuristicMask(); } // XXX }
void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool /*destroyOldWindow*/) { Q_Q(QWidget); Qt::WindowType type = q->windowType(); // Make sure the WindowTitleHint is on if any of the title bar hints are set // Note: This might be moved to cross-platform QWidgetPrivate::adjustFlags() if ( !(data.window_flags & Qt::CustomizeWindowHint) && ( (data.window_flags & Qt::WindowSystemMenuHint) || (data.window_flags & Qt::WindowContextHelpButtonHint) || (data.window_flags & Qt::WindowMinimizeButtonHint) || (data.window_flags & Qt::WindowMaximizeButtonHint) || (data.window_flags & Qt::WindowCloseButtonHint) ) ) { data.window_flags |= Qt::WindowTitleHint; } // Decoration plugins on QWS don't support switching on the close button on its own if (data.window_flags & Qt::WindowCloseButtonHint) data.window_flags |= Qt::WindowSystemMenuHint; Qt::WindowFlags flags = data.window_flags; data.alloc_region_index = -1; // we don't have a "Drawer" window type if (type == Qt::Drawer) { type = Qt::Widget; flags &= ~Qt::WindowType_Mask; } 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::SplashScreen || type == Qt::ToolTip); #ifndef QT_NO_WARNING_OUTPUT static bool toolWarningShown = false; if (!toolWarningShown && type == Qt::Tool && !(flags & Qt::FramelessWindowHint)) { qWarning("Qt for Embedded Linux " QT_VERSION_STR " does not support tool windows with frames.\n" "This behavior will change in a later release. To ensure compatibility with\n" "future versions, use (Qt::Tool | Qt::FramelessWindowHint)."); toolWarningShown = true; } #endif WId id; QWSDisplay* dpy = QWidget::qwsDisplay(); if (!window) // always initialize initializeWindow = true; // use the size of the primary screen to determine the default window size QList<QScreen *> screens = qt_screen->subScreens(); if (screens.isEmpty()) screens.append(qt_screen); int sw = screens[0]->width(); int sh = screens[0]->height(); if (desktop) { // desktop widget dialog = popup = false; // force these flags off data.crect.setRect(0, 0, sw, sh); } else if (topLevel && !q->testAttribute(Qt::WA_Resized)) { int width = sw / 2; int height = 4 * sh / 10; if (extra) { width = qMax(qMin(width, extra->maxw), extra->minw); height = qMax(qMin(height, extra->maxh), extra->minh); } data.crect.setSize(QSize(width, height)); } if (window) { // override the old window id = window; setWinId(window); } else if (desktop) { // desktop widget id = (WId)-2; // id = root window #if 0 QWidget *otherDesktop = q->find(id); // is there another desktop? if (otherDesktop && otherDesktop->testWFlags(Qt::WPaintDesktop)) { otherDesktop->d_func()->setWinId(0); // remove id from widget mapper setWinId(id); // make sure otherDesktop is otherDesktop->d_func()->setWinId(id); // found first } else #endif { setWinId(id); } } else { id = topLevel ? dpy->takeId() : takeLocalId(); setWinId(id); // set widget id/handle + hd } bool hasFrame = true; if (topLevel) { if (desktop || popup || tool || q->testAttribute(Qt::WA_DontShowOnScreen)) hasFrame = false; else hasFrame = !(flags & Qt::FramelessWindowHint); } if (desktop) { q->setAttribute(Qt::WA_WState_Visible); } else if (topLevel) { // set X cursor //QCursor *oc = QApplication::overrideCursor(); if (initializeWindow) { //XXX XDefineCursor(dpy, winid, oc ? oc->handle() : cursor().handle()); } QWidget::qwsDisplay()->nameRegion(q->internalWinId(), q->objectName(), q->windowTitle()); } if (topLevel) { createTLExtra(); QTLWExtra *topextra = extra->topextra; #ifndef QT_NO_QWS_MANAGER if (hasFrame) { // get size of wm decoration and make the old crect the new frect QRect cr = data.crect; QRegion r = QApplication::qwsDecoration().region(q, cr) | cr; QRect br(r.boundingRect()); topextra->frameStrut.setCoords(cr.x() - br.x(), cr.y() - br.y(), br.right() - cr.right(), br.bottom() - cr.bottom()); if (!q->testAttribute(Qt::WA_Moved) || topextra->posFromMove) data.crect.translate(topextra->frameStrut.left(), topextra->frameStrut.top()); if (!topData()->qwsManager) { topData()->qwsManager = new QWSManager(q); if((q->data->window_state & ~Qt::WindowActive) == Qt::WindowMaximized) topData()->qwsManager->maximize(); } } else if (topData()->qwsManager) { delete topData()->qwsManager; topData()->qwsManager = 0; data.crect.translate(-topextra->frameStrut.left(), -topextra->frameStrut.top()); topextra->frameStrut.setCoords(0, 0, 0, 0); } #endif if (!topextra->caption.isEmpty()) setWindowTitle_helper(topextra->caption); //XXX If we are session managed, inform the window manager about it } else { if (extra && extra->topextra) { // already allocated due to reparent? extra->topextra->frameStrut.setCoords(0, 0, 0, 0); } //updateRequestedRegion(mapToGlobal(QPoint(0,0))); } }
void QWidget::setWindowState(uint newstate) { in_show_maximized = 1; bool resized = testWFlags( WState_Resized ); uint oldstate = effectiveState(widget_state); widget_state &= ~(WState_Minimized | WState_Maximized | WState_FullScreen); if (newstate & WindowMinimized) widget_state |= WState_Minimized; if (newstate & WindowMaximized) widget_state |= WState_Maximized; if (newstate & WindowFullScreen) widget_state |= WState_FullScreen; uint state = effectiveState(widget_state); bool needShow = FALSE; if (isTopLevel() && state != oldstate) { createTLExtra(); if ( oldstate == 0 ) { //normal topData()->normalGeometry = geometry(); } else if ( oldstate == WState_FullScreen ) { reparent( 0, topData()->savedFlags, QPoint(0,0) ); needShow = isVisible(); } else if ( oldstate == WState_Minimized ) { needShow = TRUE; } if ( state == WState_Minimized ) { //### not ideal... hide(); needShow = FALSE; } else if ( state == WState_FullScreen ) { needShow = needShow || isVisible(); topData()->savedFlags = getWFlags(); reparent( 0, WType_TopLevel | WStyle_Customize | WStyle_NoBorder | // preserve some widget flags (getWFlags() & 0xffff0000), QPoint( 0, 0)); const QRect screen = qApp->desktop()->screenGeometry( qApp->desktop()->screenNumber( this ) ); move( screen.topLeft() ); resize( screen.size() ); if ( !resized ) clearWState( WState_Resized ); raise(); } else if ( state == WState_Maximized ) { #ifndef QT_NO_QWS_MANAGER if ( extra && extra->topextra && extra->topextra->qwsManager ) extra->topextra->qwsManager->maximize(); else #endif setGeometry( qt_maxWindowRect ); if ( !resized ) clearWState( WState_Resized ); } else { //normal QRect r = topData()->normalGeometry; if ( r.width() >= 0 ) { topData()->normalGeometry = QRect(0,0,-1,-1); setGeometry( r ); } } } in_show_maximized = 0; if (needShow) show(); if (newstate & WindowActive) setActiveWindow(); QEvent e(QEvent::WindowStateChange); QApplication::sendEvent(this, &e); }
void QWidget::create( WId window, bool initializeWindow, bool /*destroyOldWindow*/) { if ( testWState(WState_Created) && window == 0 ) return; setWState( WState_Created ); // set created flag if ( !parentWidget() || parentWidget()->isDesktop() ) setWFlags( WType_TopLevel ); // top-level widget alloc_region_index = -1; alloc_region_revision = -1; isSettingGeometry = FALSE; overlapping_children = -1; bool topLevel = testWFlags(WType_TopLevel); bool popup = testWFlags(WType_Popup); bool dialog = testWFlags(WType_Dialog); bool desktop = testWFlags(WType_Desktop); WId id; QWSDisplay* dpy = qwsDisplay(); if ( !window ) // always initialize initializeWindow = TRUE; if ( popup ) { setWFlags(WStyle_Tool); // a popup is a tool window setWFlags(WStyle_StaysOnTop); // a popup stays on top } if ( topLevel && parentWidget() ) { // if our parent has WStyle_StaysOnTop, so must we QWidget *ptl = parentWidget()->topLevelWidget(); if ( ptl && ptl->testWFlags( WStyle_StaysOnTop ) ) setWFlags(WStyle_StaysOnTop); } int sw = dpy->width(); int sh = dpy->height(); if ( dialog || popup || desktop ) { // these are top-level, too topLevel = TRUE; setWFlags( WType_TopLevel ); } if ( desktop ) { // desktop widget dialog = popup = FALSE; // force these flags off crect.setRect( 0, 0, sw, sh ); } else if ( topLevel ) { // calc pos/size from screen crect.setRect( 0, 0, sw/2, 4*sh/10 ); } else { // child widget crect.setRect( 0, 0, 100, 30 ); } if ( window ) { // override the old window id = window; setWinId( window ); } else if ( desktop ) { // desktop widget id = (WId)-2; // id = root window QWidget *otherDesktop = find( id ); // is there another desktop? if ( otherDesktop && otherDesktop->testWFlags(WPaintDesktop) ) { otherDesktop->setWinId( 0 ); // remove id from widget mapper setWinId( id ); // make sure otherDesktop is otherDesktop->setWinId( id ); // found first } else { setWinId( id ); } } else { id = topLevel ? dpy->takeId() : takeLocalId(); setWinId( id ); // set widget id/handle + hd } if ( !topLevel ) { if ( !testWFlags(WStyle_Customize) ) setWFlags( WStyle_NormalBorder | WStyle_Title | WStyle_MinMax | WStyle_SysMenu ); } else if ( !(desktop || popup) ) { if ( testWFlags(WStyle_Customize) ) { // customize top-level widget if ( testWFlags(WStyle_NormalBorder) ) { // XXX ... } else { if ( !testWFlags(WStyle_DialogBorder) ) { // XXX ... } } if ( testWFlags(WStyle_Tool) ) { // XXX ... } } else { // normal top-level widget setWFlags( WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WStyle_MinMax ); } } alloc_region_dirty=FALSE; paintable_region_dirty=FALSE; if ( !initializeWindow ) { // do no initialization } else if ( popup ) { // popup widget } else if ( topLevel && !desktop ) { // top-level widget QWidget *p = parentWidget(); // real parent if (p) p = p->topLevelWidget(); if ( testWFlags(WStyle_DialogBorder) || testWFlags(WStyle_StaysOnTop) || testWFlags(WStyle_Dialog) || testWFlags(WStyle_Tool) ) { // XXX ... } // find the real client leader, i.e. a toplevel without parent while ( p && p->parentWidget()) { p = p->parentWidget()->topLevelWidget(); } // XXX ... } if ( initializeWindow ) { } setWState( WState_MouseTracking ); setMouseTracking( FALSE ); // also sets event mask if ( desktop ) { setWState( WState_Visible ); } else if ( topLevel ) { // set X cursor //QCursor *oc = QApplication::overrideCursor(); if ( initializeWindow ) { //XXX XDefineCursor( dpy, winid, oc ? oc->handle() : cursor().handle() ); } setWState( WState_OwnCursor ); #ifndef QT_NO_WIDGET_TOPEXTRA qwsDisplay()->nameRegion( winId(), name(""), caption() ); #else qwsDisplay()->nameRegion( winId(), name(""), QString::null ); #endif } if ( topLevel ) { #if !defined(QT_NO_WIDGET_TOPEXTRA) && !defined(QT_NO_QWS_MANAGER) createTLExtra(); #endif #ifndef QT_NO_QWS_MANAGER if ( testWFlags(WStyle_DialogBorder) || testWFlags(WStyle_NormalBorder)) { // get size of wm decoration QRegion r = QApplication::qwsDecoration().region(this, crect); QRect br( r.boundingRect() ); crect.moveBy( crect.x()-br.x(), crect.y()-br.y() ); extra->topextra->fleft = crect.x()-br.x(); extra->topextra->ftop = crect.y()-br.y(); extra->topextra->fright = br.right()-crect.right(); extra->topextra->fbottom = br.bottom()-crect.bottom(); topData()->qwsManager = new QWSManager(this); } else if ( topData()->qwsManager ) { delete topData()->qwsManager; topData()->qwsManager = 0; crect.moveBy( -extra->topextra->fleft, -extra->topextra->ftop ); extra->topextra->fleft = extra->topextra->ftop = extra->topextra->fright = extra->topextra->fbottom = 0; } #endif // declare the widget's object name as window role qt_fbdpy->addProperty(id,QT_QWS_PROPERTY_WINDOWNAME); qt_fbdpy->setProperty(id,QT_QWS_PROPERTY_WINDOWNAME,0,name()); // If we are session managed, inform the window manager about it if ( extra && !extra->mask.isNull() ) { req_region = extra->mask; req_region.translate(crect.x(),crect.y()); req_region &= crect; //??? this is optional } else { req_region = crect; } req_region = qt_screen->mapToDevice( req_region, QSize(qt_screen->width(), qt_screen->height()) ); } else { if ( extra && extra->topextra ) { // already allocated due to reparent? extra->topextra->fleft = 0; extra->topextra->ftop = 0; extra->topextra->fright = 0; extra->topextra->fbottom = 0; } //updateRequestedRegion( mapToGlobal(QPoint(0,0)) ); } }