void UIMachineWindowFullscreen::handleNativeNotification(const QString &strNativeNotificationName) { /* Make sure this method is only used for ML and next: */ AssertReturnVoid(vboxGlobal().osRelease() > MacOSXRelease_Lion); /* Log all arrived notifications: */ LogRel(("UIMachineWindowFullscreen::handleNativeNotification: Notification '%s' received.\n", strNativeNotificationName.toAscii().constData())); /* Handle 'NSWindowWillEnterFullScreenNotification' notification: */ if (strNativeNotificationName == "NSWindowWillEnterFullScreenNotification") { LogRel(("UIMachineWindowFullscreen::handleNativeNotification: " "Native fullscreen mode about to enter, notifying listener...\n")); emit sigNotifyAboutNativeFullscreenWillEnter(); } /* Handle 'NSWindowDidEnterFullScreenNotification' notification: */ else if (strNativeNotificationName == "NSWindowDidEnterFullScreenNotification") { /* Mark window transition complete: */ m_fIsInFullscreenTransition = false; LogRel(("UIMachineWindowFullscreen::handleNativeNotification: " "Native fullscreen mode entered, notifying listener...\n")); /* Update console's display viewport and 3D overlay: */ machineView()->updateViewport(); emit sigNotifyAboutNativeFullscreenDidEnter(); } /* Handle 'NSWindowWillExitFullScreenNotification' notification: */ else if (strNativeNotificationName == "NSWindowWillExitFullScreenNotification") { LogRel(("UIMachineWindowFullscreen::handleNativeNotification: " "Native fullscreen mode about to exit, notifying listener...\n")); emit sigNotifyAboutNativeFullscreenWillExit(); } /* Handle 'NSWindowDidExitFullScreenNotification' notification: */ else if (strNativeNotificationName == "NSWindowDidExitFullScreenNotification") { /* Mark window transition complete: */ m_fIsInFullscreenTransition = false; LogRel(("UIMachineWindowFullscreen::handleNativeNotification: " "Native fullscreen mode exited, notifying listener...\n")); /* Update console's display viewport and 3D overlay: */ machineView()->updateViewport(); emit sigNotifyAboutNativeFullscreenDidExit(); } /* Handle 'NSWindowDidFailToEnterFullScreenNotification' notification: */ else if (strNativeNotificationName == "NSWindowDidFailToEnterFullScreenNotification") { /* Mark window transition complete: */ m_fIsInFullscreenTransition = false; LogRel(("UIMachineWindowFullscreen::handleNativeNotification: " "Native fullscreen mode fail to enter, notifying listener...\n")); emit sigNotifyAboutNativeFullscreenFailToEnter(); } }
void UIMachineWindowNormal::normalizeGeometry(bool fAdjustPosition) { #ifndef VBOX_GUI_WITH_CUSTOMIZATIONS1 /* Skip if maximized: */ if (isMaximized()) return; /* Calculate client window offsets: */ QRect frGeo = frameGeometry(); const QRect geo = geometry(); const int dl = geo.left() - frGeo.left(); const int dt = geo.top() - frGeo.top(); const int dr = frGeo.right() - geo.right(); const int db = frGeo.bottom() - geo.bottom(); /* Get the best size w/o scroll-bars: */ QSize sh = sizeHint(); /* If guest-screen auto-resize is not enabled * or the guest-additions doesn't support graphics * we should take scroll-bars size-hints into account: */ if (!machineView()->isGuestAutoresizeEnabled() || !uisession()->isGuestSupportsGraphics()) { if (machineView()->verticalScrollBar()->isVisible()) sh -= QSize(machineView()->verticalScrollBar()->sizeHint().width(), 0); if (machineView()->horizontalScrollBar()->isVisible()) sh -= QSize(0, machineView()->horizontalScrollBar()->sizeHint().height()); } /* Resize the frame to fit the contents: */ sh -= size(); frGeo.setRight(frGeo.right() + sh.width()); frGeo.setBottom(frGeo.bottom() + sh.height()); /* Adjust position if necessary: */ if (fAdjustPosition) frGeo = VBoxGlobal::normalizeGeometry(frGeo, gpDesktop->overallAvailableRegion()); /* Finally, set the frame geometry: */ VBoxGlobal::setTopLevelGeometry(this, frGeo.left() + dl, frGeo.top() + dt, frGeo.width() - dl - dr, frGeo.height() - dt - db); #else /* VBOX_GUI_WITH_CUSTOMIZATIONS1 */ /* Customer request: There should no be * machine-window resize/move on machine-view resize: */ Q_UNUSED(fAdjustPosition); #endif /* VBOX_GUI_WITH_CUSTOMIZATIONS1 */ }
void UIMachineWindowSeamless::cleanupMachineView() { /* Do not cleanup machine view if it is not present: */ if (!machineView()) return; UIMachineView::destroy(m_pMachineView); m_pMachineView = 0; }
bool UIMachineWindowScale::winEvent(MSG *pMessage, long *pResult) { /* Try to keep aspect ratio during window resize if: * 1. machine view exists and 2. event-type is WM_SIZING and 3. shift key is NOT pressed: */ if (machineView() && pMessage->message == WM_SIZING && !(QApplication::keyboardModifiers() & Qt::ShiftModifier)) { double dAspectRatio = machineView()->aspectRatio(); if (dAspectRatio) { RECT *pRect = reinterpret_cast<RECT*>(pMessage->lParam); switch (pMessage->wParam) { case WMSZ_LEFT: case WMSZ_RIGHT: { pRect->bottom = pRect->top + (double)(pRect->right - pRect->left) / dAspectRatio; break; } case WMSZ_TOP: case WMSZ_BOTTOM: { pRect->right = pRect->left + (double)(pRect->bottom - pRect->top) * dAspectRatio; break; } case WMSZ_BOTTOMLEFT: case WMSZ_BOTTOMRIGHT: { pRect->bottom = pRect->top + (double)(pRect->right - pRect->left) / dAspectRatio; break; } case WMSZ_TOPLEFT: case WMSZ_TOPRIGHT: { pRect->top = pRect->bottom - (double)(pRect->right - pRect->left) / dAspectRatio; break; } default: break; } } } /* Call to base-class: */ return UIMachineWindow::winEvent(pMessage, pResult); }
void UIMachineWindow::sendMachineViewSizeHint() { /* Send machine-view size-hint to the guest: */ machineView()->resendSizeHint(); }
void UIMachineWindow::adjustMachineViewSize() { /* We need to adjust guest-screen size if necessary: */ machineView()->adjustGuestScreenSize(); }
void UIMachineWindowNormal::loadSettings() { /* Call to base-class: */ UIMachineWindow::loadSettings(); /* Get machine: */ CMachine m = machine(); /* Load extra-data settings: */ { /* Load window position settings: */ QString strPositionAddress = m_uScreenId == 0 ? QString("%1").arg(GUI_LastNormalWindowPosition) : QString("%1%2").arg(GUI_LastNormalWindowPosition).arg(m_uScreenId); QStringList strPositionSettings = m.GetExtraDataStringList(strPositionAddress); bool ok = !strPositionSettings.isEmpty(), max = false; int x = 0, y = 0, w = 0, h = 0; if (ok && strPositionSettings.size() > 0) x = strPositionSettings[0].toInt(&ok); else ok = false; if (ok && strPositionSettings.size() > 1) y = strPositionSettings[1].toInt(&ok); else ok = false; if (ok && strPositionSettings.size() > 2) w = strPositionSettings[2].toInt(&ok); else ok = false; if (ok && strPositionSettings.size() > 3) h = strPositionSettings[3].toInt(&ok); else ok = false; if (ok && strPositionSettings.size() > 4) max = strPositionSettings[4] == GUI_LastWindowState_Max; QRect ar = ok ? QApplication::desktop()->availableGeometry(QPoint(x, y)) : QApplication::desktop()->availableGeometry(this); /* If previous parameters were read correctly: */ if (ok) { /* If previous machine state is SAVED: */ if (m.GetState() == KMachineState_Saved) { /* Restore window size and position: */ m_normalGeometry = QRect(x, y, w, h); setGeometry(m_normalGeometry); } /* If previous machine state was not SAVED: */ else { /* Restore only window position: */ m_normalGeometry = QRect(x, y, width(), height()); setGeometry(m_normalGeometry); if (machineView()) machineView()->normalizeGeometry(false); } /* Maximize if needed: */ if (max) setWindowState(windowState() | Qt::WindowMaximized); } else { /* Normalize view early to the optimal size: */ if (machineView()) machineView()->normalizeGeometry(true); /* Move newly created window to the screen center: */ m_normalGeometry = geometry(); m_normalGeometry.moveCenter(ar.center()); setGeometry(m_normalGeometry); } /* Normalize view to the optimal size: */ if (machineView()) #ifdef Q_WS_X11 QTimer::singleShot(0, machineView(), SLOT(sltNormalizeGeometry())); #else /* Q_WS_X11 */ machineView()->normalizeGeometry(true); #endif } /* Load availability settings: */ { /* USB Stuff: */ const CUSBController &usbController = m.GetUSBController(); if ( usbController.isNull() || !usbController.GetEnabled() || !usbController.GetProxyAvailable()) { /* Hide USB menu: */ indicatorsPool()->indicator(UIIndicatorIndex_USBDevices)->setHidden(true); } else { /* Toggle USB LED: */ indicatorsPool()->indicator(UIIndicatorIndex_USBDevices)->setState( usbController.GetEnabled() ? KDeviceActivity_Idle : KDeviceActivity_Null); } } /* Load global settings: */ { VBoxGlobalSettings settings = vboxGlobal().settings(); menuBar()->setHidden(settings.isFeatureActive("noMenuBar")); statusBar()->setHidden(settings.isFeatureActive("noStatusBar")); if (statusBar()->isHidden()) m_pIdleTimer->stop(); } }
void UIMachineWindowSeamless::sltUpdateMiniToolBarMask() { if (m_pMiniToolBar && machineView()) setMask(qobject_cast<UIMachineViewSeamless*>(machineView())->lastVisibleRegion()); }
void UIMachineWindowSeamless::setMask(const QRegion &constRegion) { /* Could be unused under Mac: */ Q_UNUSED(constRegion); #ifndef Q_WS_MAC /* Copy mask: */ QRegion region = constRegion; /* Shift region if left spacer width is NOT zero or top spacer height is NOT zero: */ if (m_pLeftSpacer->geometry().width() || m_pTopSpacer->geometry().height()) region.translate(m_pLeftSpacer->geometry().width(), m_pTopSpacer->geometry().height()); /* Take into account mini tool-bar region: */ if (m_pMiniToolBar) { /* Move mini-toolbar region to mini-toolbar position: */ QRegion toolBarRegion(m_pMiniToolBar->rect()); toolBarRegion.translate(QPoint(m_pMiniToolBar->x(), m_pMiniToolBar->y())); /* Include mini-toolbar region into common one: */ region += toolBarRegion; } #endif /* !Q_WS_MAC */ #if defined (Q_WS_WIN) # if 0 /* This code is disabled for a long time already, need analisys... */ QRegion difference = m_prevRegion.subtract(region); /* Region offset calculation */ int fleft = 0, ftop = 0; /* Visible region calculation */ HRGN newReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(newReg, region.handle(), 0, RGN_COPY); OffsetRgn(newReg, fleft, ftop); /* Invisible region calculation */ HRGN diffReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(diffReg, difference.handle(), 0, RGN_COPY); OffsetRgn(diffReg, fleft, ftop); /* Set the current visible region and clean the previous */ SetWindowRgn(winId(), newReg, FALSE); RedrawWindow(0, 0, diffReg, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); if (machineView()) RedrawWindow(machineView()->viewport()->winId(), 0, 0, RDW_INVALIDATE); m_prevRegion = region; # endif /* This code is disabled for a long time already, need analisys... */ UIMachineWindow::setMask(region); #elif defined (Q_WS_MAC) # if defined (VBOX_GUI_USE_QUARTZ2D) if (vboxGlobal().vmRenderMode() == Quartz2DMode) { /* If we are using the Quartz2D backend we have to trigger a repaint only. * All the magic clipping stuff is done in the paint engine. */ ::darwinWindowInvalidateShape(m_pMachineView->viewport()); } # endif /* VBOX_GUI_USE_QUARTZ2D */ # if 0 /* This code is disabled for a long time already, need analisys... */ /* This is necessary to avoid the flicker by an mask update. * See http://lists.apple.com/archives/Carbon-development/2001/Apr/msg01651.html for the hint. * There *must* be a better solution. */ // if (!region.isEmpty()) // region |= QRect(0, 0, 1, 1); // /* Save the current region for later processing in the darwin event handler. */ // mCurrRegion = region; // /* We repaint the screen before the ReshapeCustomWindow command. Unfortunately // * this command flushes a copy of the backbuffer to the screen after the new // * mask is set. This leads into a misplaced drawing of the content. Currently // * no alternative to this and also this is not 100% perfect. */ // repaint(); // qApp->processEvents(); // /* Now force the reshaping of the window. This is definitely necessary. */ // ReshapeCustomWindow(reinterpret_cast<WindowPtr>(winId())); // UIMachineWindow::setMask(region); // HIWindowInvalidateShadow(::darwinToWindowRef(mConsole->viewport())); # endif /* This code is disabled for a long time already, need analisys... */ #else /* !Q_WS_MAC */ UIMachineWindow::setMask(region); #endif }
void UIMachineWindowSeamless::setMask(const QRegion &constRegion) { QRegion region = constRegion; /* Shift region if left spacer width is NOT zero or top spacer height is NOT zero: */ if (m_pLeftSpacer->geometry().width() || m_pTopSpacer->geometry().height()) region.translate(m_pLeftSpacer->geometry().width(), m_pTopSpacer->geometry().height()); #if 0 // TODO: Is it really needed now? /* The global mask shift cause of toolbars and such things. */ region.translate(mMaskShift.width(), mMaskShift.height()); #endif /* Mini tool-bar: */ #ifndef Q_WS_MAC if (m_pMiniToolBar) { /* Get mini-toolbar mask: */ QRegion toolBarRegion(m_pMiniToolBar->mask()); /* Move mini-toolbar mask to mini-toolbar position: */ toolBarRegion.translate(QPoint(m_pMiniToolBar->x(), m_pMiniToolBar->y())); /* Including mini tool-bar mask: */ region += toolBarRegion; } #endif /* Q_WS_MAC */ #if 0 // TODO: Is it really needed now? /* Restrict the drawing to the available space on the screen. * (The &operator is better than the previous used -operator, * because this excludes space around the real screen also. * This is necessary for the mac.) */ region &= mStrictedRegion; #endif #ifdef Q_WS_WIN QRegion difference = m_prevRegion.subtract(region); /* Region offset calculation */ int fleft = 0, ftop = 0; /* Visible region calculation */ HRGN newReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(newReg, region.handle(), 0, RGN_COPY); OffsetRgn(newReg, fleft, ftop); /* Invisible region calculation */ HRGN diffReg = CreateRectRgn(0, 0, 0, 0); CombineRgn(diffReg, difference.handle(), 0, RGN_COPY); OffsetRgn(diffReg, fleft, ftop); /* Set the current visible region and clean the previous */ SetWindowRgn(winId(), newReg, FALSE); RedrawWindow(0, 0, diffReg, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); RedrawWindow(machineView()->viewport()->winId(), 0, 0, RDW_INVALIDATE); m_prevRegion = region; #elif defined (Q_WS_MAC) # if defined (VBOX_GUI_USE_QUARTZ2D) if (vboxGlobal().vmRenderMode() == VBoxDefs::Quartz2DMode) { /* If we are using the Quartz2D backend we have to trigger * an repaint only. All the magic clipping stuff is done * in the paint engine. */ ::darwinWindowInvalidateShape(m_pMachineView->viewport()); } else # endif { /* This is necessary to avoid the flicker by an mask update. * See http://lists.apple.com/archives/Carbon-development/2001/Apr/msg01651.html * for the hint. * There *must* be a better solution. */ if (!region.isEmpty()) region |= QRect (0, 0, 1, 1); // /* Save the current region for later processing in the darwin event handler. */ // mCurrRegion = region; // /* We repaint the screen before the ReshapeCustomWindow command. Unfortunately // * this command flushes a copy of the backbuffer to the screen after the new // * mask is set. This leads into a misplaced drawing of the content. Currently // * no alternative to this and also this is not 100% perfect. */ // repaint(); // qApp->processEvents(); // /* Now force the reshaping of the window. This is definitely necessary. */ // ReshapeCustomWindow (reinterpret_cast <WindowPtr> (winId())); QMainWindow::setMask(region); // HIWindowInvalidateShadow (::darwinToWindowRef (mConsole->viewport())); } #else QMainWindow::setMask(region); #endif }