UIMachineWindowScale.cpp revision 8bf8c6b1914c9e7e60b1547888400668f1774497
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * VBox frontends: Qt GUI ("VirtualBox"):
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * UIMachineWindowScale class implementation
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * Copyright (C) 2010-2012 Oracle Corporation
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * available from http://www.virtualbox.org. This file is free software;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * you can redistribute it and/or modify it under the terms of the GNU
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * General Public License (GPL) as published by the Free Software
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync/* Qt includes: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* Q_WS_MAC */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync/* GUI includes: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* Q_WS_WIN */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* Q_WS_MAC */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync/* COM includes: */
8c445fc3caadda324a8225aeff14e69d576d9122vboxsyncUIMachineWindowScale::UIMachineWindowScale(UIMachineLogic *pMachineLogic, ulong uScreenId)
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync /* Popup main-menu if present: */
943753b96ed892c047b92ff6eb00bb100de8d6d2vboxsync QTimer::singleShot(0, m_pMainMenu, SLOT(sltSelectFirstAction()));
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Call to base-class: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Strict spacers to hide them, they are not necessary for scale-mode: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync m_pTopSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync m_pBottomSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync m_pLeftSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync m_pRightSpacer->changeSize(0, 0, QSizePolicy::Fixed, QSizePolicy::Fixed);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Call to base-class: */
94d8af34a7773eba6a53e3dcbf2b363a6639d867vboxsync#endif /* Q_WS_MAC */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Call to base-class: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Install the resize delegate for keeping the aspect ratio. */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Beta label? */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* Q_WS_MAC */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Call to base-class: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Load scale window settings: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Load extra-data settings: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync QString strPositionAddress = m_uScreenId == 0 ? QString("%1").arg(VBoxDefs::GUI_LastScaleWindowPosition) :
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync QString("%1%2").arg(VBoxDefs::GUI_LastScaleWindowPosition).arg(m_uScreenId);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync QStringList strPositionSettings = m.GetExtraDataStringList(strPositionAddress);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync bool ok = !strPositionSettings.isEmpty(), max = false;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync int x = 0, y = 0, w = 0, h = 0;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync else ok = false;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync else ok = false;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync else ok = false;
8c445fc3caadda324a8225aeff14e69d576d9122vboxsync else ok = false;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync max = strPositionSettings[4] == VBoxDefs::GUI_LastWindowState_Max;
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync QRect ar = ok ? QApplication::desktop()->availableGeometry(QPoint(x, y)) :
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* If previous parameters were read correctly: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Restore window size and position: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Maximize if needed: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync setWindowState(windowState() | Qt::WindowMaximized);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Resize to default size: */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync /* Move newly created window to the screen center: */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync /* Get machine: */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync /* Save extra-data settings: */
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync .arg(m_normalGeometry.x()).arg(m_normalGeometry.y())
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync .arg(m_normalGeometry.width()).arg(m_normalGeometry.height());
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync strWindowPosition += QString(",%1").arg(VBoxDefs::GUI_LastWindowState_Max);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync QString strPositionAddress = m_uScreenId == 0 ? QString("%1").arg(VBoxDefs::GUI_LastScaleWindowPosition) :
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync QString("%1%2").arg(VBoxDefs::GUI_LastScaleWindowPosition).arg(m_uScreenId);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync m.SetExtraData(strPositionAddress, strWindowPosition);
dc077b46399b3ef751ebd282053f0e9725518e1evboxsync /* Call to base-class: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Uninstall the resize delegate for keeping the aspect ratio. */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Call to base-class: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* Q_WS_MAC */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Cleanup menu: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Call to base-class: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Show window if we have to: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Else hide window: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync QResizeEvent *pResizeEvent = static_cast<QResizeEvent*>(pEvent);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Update debugger window position: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* VBOX_WITH_DEBUGGER_GUI */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync m_normalGeometry.moveTo(geometry().x(), geometry().y());
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Update debugger window position: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync#endif /* VBOX_WITH_DEBUGGER_GUI */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsyncbool UIMachineWindowScale::winEvent(MSG *pMessage, long *pResult)
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync /* Try to keep aspect ratio during window resize if:
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync * 1. machine view exists and 2. event-type is WM_SIZING and 3. shift key is NOT pressed: */
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (machineView() && pMessage->message == WM_SIZING && !(QApplication::keyboardModifiers() & Qt::ShiftModifier))
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync if (double dAspectRatio = machineView()->aspectRatio())
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync RECT *pRect = reinterpret_cast<RECT*>(pMessage->lParam);
73bef7f249418907cb1dc8dce51319772a3dbeeevboxsync pRect->bottom = pRect->top + (double)(pRect->right - pRect->left) / dAspectRatio;
case WMSZ_TOP:
case WMSZ_BOTTOM:
case WMSZ_BOTTOMLEFT:
case WMSZ_BOTTOMRIGHT:
case WMSZ_TOPLEFT:
case WMSZ_TOPRIGHT:
#ifdef Q_WS_MAC
return ::darwinIsWindowMaximized(this);
return isMaximized();