void QWidget::setWindowState(Qt::WindowStates newstate) { Q_D(QWidget); Qt::WindowStates oldstate = windowState(); if (oldstate == newstate) return; if (isWindow() && !testAttribute(Qt::WA_WState_Created)) create(); data->window_state = newstate; data->in_set_window_state = 1; Qt::WindowState newEffectiveState = effectiveState(newstate); Qt::WindowState oldEffectiveState = effectiveState(oldstate); if (isWindow() && newEffectiveState != oldEffectiveState) { // Ensure the initial size is valid, since we store it as normalGeometry below. if (!testAttribute(Qt::WA_Resized) && !isVisible()) adjustSize(); d->createTLExtra(); if (oldEffectiveState == Qt::WindowNoState) d->topData()->normalGeometry = geometry(); Q_ASSERT(windowHandle()); windowHandle()->setWindowState(newEffectiveState); } data->in_set_window_state = 0; if (newstate & Qt::WindowActive) activateWindow(); QWindowStateChangeEvent e(oldstate); QApplication::sendEvent(this, &e); }
void QWidget::setWindowState(Qt::WindowStates newstate) { Q_D(QWidget); Qt::WindowStates oldstate = windowState(); if (oldstate == newstate) return; if (isWindow() && !testAttribute(Qt::WA_WState_Created)) create(); data->window_state = newstate; data->in_set_window_state = 1; bool needShow = false; Qt::WindowStates newEffectiveState = effectiveState(newstate); Qt::WindowStates oldEffectiveState = effectiveState(oldstate); if (isWindow() && newEffectiveState != oldEffectiveState) { d->createTLExtra(); if (oldEffectiveState == Qt::WindowNoState) { //normal d->topData()->normalGeometry = geometry(); } else if (oldEffectiveState == Qt::WindowFullScreen) { setParent(0, d->topData()->savedFlags); needShow = true; } else if (oldEffectiveState == Qt::WindowMinimized) { needShow = true; } if (newEffectiveState == Qt::WindowMinimized) { //### not ideal... hide(); needShow = false; } else if (newEffectiveState == Qt::WindowFullScreen) { d->topData()->savedFlags = windowFlags(); setParent(0, Qt::FramelessWindowHint | (windowFlags() & Qt::WindowStaysOnTopHint)); d->setFullScreenSize_helper(); raise(); needShow = true; } else if (newEffectiveState == Qt::WindowMaximized) { createWinId(); d->setMaxWindowState_helper(); } else { //normal QRect r = d->topData()->normalGeometry; if (r.width() >= 0) { d->topData()->normalGeometry = QRect(0,0,-1,-1); setGeometry(r); } } } data->in_set_window_state = 0; if (needShow) show(); if (newstate & Qt::WindowActive) activateWindow(); QWindowStateChangeEvent e(oldstate); QApplication::sendEvent(this, &e); }
void QWidgetWindow::handleWindowStateChangedEvent(QWindowStateChangeEvent *event) { // QWindow does currently not know 'active'. Qt::WindowStates eventState = event->oldState(); Qt::WindowStates widgetState = m_widget->windowState(); if (widgetState & Qt::WindowActive) eventState |= Qt::WindowActive; // Determine the new widget state, remember maximized/full screen // during minimized. switch (windowState()) { case Qt::WindowNoState: widgetState &= ~(Qt::WindowMinimized | Qt::WindowMaximized | Qt::WindowFullScreen); break; case Qt::WindowMinimized: widgetState |= Qt::WindowMinimized; break; case Qt::WindowMaximized: if (effectiveState(widgetState) == Qt::WindowNoState) if (QTLWExtra *tle = m_widget->d_func()->maybeTopData()) tle->normalGeometry = m_widget->geometry(); widgetState |= Qt::WindowMaximized; widgetState &= ~(Qt::WindowMinimized | Qt::WindowFullScreen); break; case Qt::WindowFullScreen: if (effectiveState(widgetState) == Qt::WindowNoState) if (QTLWExtra *tle = m_widget->d_func()->maybeTopData()) tle->normalGeometry = m_widget->geometry(); widgetState |= Qt::WindowFullScreen; widgetState &= ~(Qt::WindowMinimized); break; case Qt::WindowActive: // Not handled by QWindow break; } // Sent event if the state changed (that is, it is not triggered by // QWidget::setWindowState(), which also sends an event to the widget). if (widgetState != int(m_widget->data->window_state)) { m_widget->data->window_state = widgetState; QWindowStateChangeEvent widgetEvent(eventState); QGuiApplication::sendSpontaneousEvent(m_widget, &widgetEvent); } }
// Store normal geometry used for saving application settings. void QWidgetWindow::updateNormalGeometry() { QTLWExtra *tle = m_widget->d_func()->maybeTopData(); if (!tle) return; // Ask platform window, default to widget geometry. QRect normalGeometry; if (const QPlatformWindow *pw = handle()) normalGeometry = pw->normalGeometry(); if (!normalGeometry.isValid() && effectiveState(m_widget->windowState()) == Qt::WindowNoState) normalGeometry = m_widget->geometry(); if (normalGeometry.isValid()) tle->normalGeometry = normalGeometry; }
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); }