void UIMachineWindowFullscreen::sltEnterNativeFullscreen(UIMachineWindow *pMachineWindow) { /* Make sure this slot is called only under ML and next: */ AssertReturnVoid(vboxGlobal().osRelease() > MacOSXRelease_Lion); /* Make sure it is NULL or 'this' window passed: */ if (pMachineWindow && pMachineWindow != this) return; /* Make sure this window has fullscreen logic: */ UIMachineLogicFullscreen *pFullscreenLogic = qobject_cast<UIMachineLogicFullscreen*>(machineLogic()); AssertPtrReturnVoid(pFullscreenLogic); /* Make sure this window should be shown and mapped to host-screen: */ if (!uisession()->isScreenVisible(m_uScreenId) || !pFullscreenLogic->hasHostScreenForGuestScreen(m_uScreenId)) return; /* Mark window 'transitioned to fullscreen': */ m_fIsInFullscreenTransition = true; /* Enter native fullscreen mode if necessary: */ if ( (pFullscreenLogic->screensHaveSeparateSpaces() || m_uScreenId == 0) && !darwinIsInFullscreenMode(this)) darwinToggleFullscreenMode(this); }
void UIMachineWindowFullscreen::placeOnScreen() { /* Get corresponding host-screen: */ const int iHostScreen = qobject_cast<UIMachineLogicFullscreen*>(machineLogic())->hostScreenForGuestScreen(m_uScreenId); /* And corresponding working area: */ const QRect workingArea = vboxGlobal().screenGeometry(iHostScreen); #if defined(Q_WS_WIN) || defined(Q_WS_X11) /* Set appropriate geometry for window: */ resize(workingArea.size()); move(workingArea.topLeft()); /* If there is a mini-toolbar: */ if (m_pMiniToolBar) { /* Set appropriate geometry for mini-toolbar: */ m_pMiniToolBar->resize(workingArea.size()); m_pMiniToolBar->move(workingArea.topLeft()); } #elif defined(Q_WS_MAC) /* Make sure this window has fullscreen logic: */ UIMachineLogicFullscreen *pFullscreenLogic = qobject_cast<UIMachineLogicFullscreen*>(machineLogic()); AssertPtrReturnVoid(pFullscreenLogic); /* Move window to the appropriate position: */ move(workingArea.topLeft()); /* Resize window to the appropriate size on Lion and previous: */ if (vboxGlobal().osRelease() <= MacOSXRelease_Lion) resize(workingArea.size()); /* Resize window to the appropriate size on ML and next * only if that screen has no own user-space: */ else if (!pFullscreenLogic->screensHaveSeparateSpaces() && m_uScreenId != 0) resize(workingArea.size()); else { /* Load normal geometry first of all: */ QRect geo = gEDataManager->machineWindowGeometry(UIVisualStateType_Normal, m_uScreenId, vboxGlobal().managedVMUuid()); /* If normal geometry is null => use frame-buffer size: */ if (geo.isNull()) { const UIFrameBuffer *pFrameBuffer = uisession()->frameBuffer(m_uScreenId); geo = QRect(QPoint(0, 0), QSize(pFrameBuffer->width(), pFrameBuffer->height()).boundedTo(workingArea.size())); } /* If frame-buffer size is null => use default size: */ if (geo.isNull()) geo = QRect(QPoint(0, 0), QSize(800, 600).boundedTo(workingArea.size())); /* Move window to the center of working-area: */ geo.moveCenter(workingArea.center()); setGeometry(geo); } #endif /* Q_WS_MAC */ }
void UIMachineWindowFullscreen::prepareVisualState() { /* Call to base-class: */ UIMachineWindow::prepareVisualState(); /* The background has to go black: */ QPalette palette(centralWidget()->palette()); palette.setColor(centralWidget()->backgroundRole(), Qt::black); centralWidget()->setPalette(palette); centralWidget()->setAutoFillBackground(true); setAutoFillBackground(true); #if defined(Q_WS_WIN) || defined(Q_WS_X11) /* Prepare mini-toolbar: */ prepareMiniToolbar(); #endif /* Q_WS_WIN || Q_WS_X11 */ #ifdef Q_WS_MAC /* Native fullscreen stuff on ML and next: */ if (vboxGlobal().osRelease() > MacOSXRelease_Lion) { /* Make sure this window has fullscreen logic: */ UIMachineLogicFullscreen *pFullscreenLogic = qobject_cast<UIMachineLogicFullscreen*>(machineLogic()); AssertPtrReturnVoid(pFullscreenLogic); /* Enable fullscreen support for every screen which requires it: */ if (pFullscreenLogic->screensHaveSeparateSpaces() || m_uScreenId == 0) darwinEnableFullscreenSupport(this); /* Enable transience support for other screens: */ else darwinEnableTransienceSupport(this); /* Register to native fullscreen notifications: */ UICocoaApplication::instance()->registerToNotificationOfWindow("NSWindowWillEnterFullScreenNotification", this, UIMachineWindow::handleNativeNotification); UICocoaApplication::instance()->registerToNotificationOfWindow("NSWindowDidEnterFullScreenNotification", this, UIMachineWindow::handleNativeNotification); UICocoaApplication::instance()->registerToNotificationOfWindow("NSWindowWillExitFullScreenNotification", this, UIMachineWindow::handleNativeNotification); UICocoaApplication::instance()->registerToNotificationOfWindow("NSWindowDidExitFullScreenNotification", this, UIMachineWindow::handleNativeNotification); UICocoaApplication::instance()->registerToNotificationOfWindow("NSWindowDidFailToEnterFullScreenNotification", this, UIMachineWindow::handleNativeNotification); } #endif /* Q_WS_MAC */ }
void UIMachineWindowFullscreen::sltExitNativeFullscreen(UIMachineWindow *pMachineWindow) { /* Make sure this slot is called only under ML and next: */ AssertReturnVoid(vboxGlobal().osRelease() > MacOSXRelease_Lion); /* Make sure it is NULL or 'this' window passed: */ if (pMachineWindow && pMachineWindow != this) return; /* Make sure this window has fullscreen logic: */ UIMachineLogicFullscreen *pFullscreenLogic = qobject_cast<UIMachineLogicFullscreen*>(machineLogic()); AssertPtrReturnVoid(pFullscreenLogic); /* Mark window 'transitioned from fullscreen': */ m_fIsInFullscreenTransition = true; /* Exit native fullscreen mode if necessary: */ if ( (pFullscreenLogic->screensHaveSeparateSpaces() || m_uScreenId == 0) && darwinIsInFullscreenMode(this)) darwinToggleFullscreenMode(this); }
void UIMachineWindowFullscreen::placeOnScreen() { /* Make sure this window has fullscreen logic: */ UIMachineLogicFullscreen *pFullscreenLogic = qobject_cast<UIMachineLogicFullscreen*>(machineLogic()); AssertPtrReturnVoid(pFullscreenLogic); /* Get corresponding host-screen: */ const int iHostScreen = pFullscreenLogic->hostScreenForGuestScreen(m_uScreenId); /* And corresponding working area: */ const QRect workingArea = vboxGlobal().screenGeometry(iHostScreen); Q_UNUSED(workingArea); #if defined(VBOX_WS_MAC) /* Move window to the appropriate position: */ move(workingArea.topLeft()); /* Resize window to the appropriate size on Lion and previous: */ if (vboxGlobal().osRelease() <= MacOSXRelease_Lion) resize(workingArea.size()); /* Resize window to the appropriate size on ML and next if it's screen has no own user-space: */ else if (!pFullscreenLogic->screensHaveSeparateSpaces() && m_uScreenId != 0) resize(workingArea.size()); else { /* Load normal geometry first of all: */ QRect geo = gEDataManager->machineWindowGeometry(UIVisualStateType_Normal, m_uScreenId, vboxGlobal().managedVMUuid()); /* If normal geometry is null => use frame-buffer size: */ if (geo.isNull()) { const UIFrameBuffer *pFrameBuffer = uisession()->frameBuffer(m_uScreenId); geo = QRect(QPoint(0, 0), QSize(pFrameBuffer->width(), pFrameBuffer->height()).boundedTo(workingArea.size())); } /* If normal geometry still null => use default size: */ if (geo.isNull()) geo = QRect(QPoint(0, 0), QSize(800, 600).boundedTo(workingArea.size())); /* Move window to the center of working-area: */ geo.moveCenter(workingArea.center()); setGeometry(geo); } #elif defined(VBOX_WS_WIN) # if QT_VERSION >= 0x050000 /* Map window onto required screen: */ windowHandle()->setScreen(qApp->screens().at(iHostScreen)); # endif /* QT_VERSION >= 0x050000 */ /* Set appropriate window size: */ resize(workingArea.size()); # if QT_VERSION < 0x050000 /* Move window onto required screen: */ move(workingArea.topLeft()); # endif /* QT_VERSION < 0x050000 */ #elif defined(VBOX_WS_X11) /* Determine whether we should use the native full-screen mode: */ const bool fUseNativeFullScreen = VBoxGlobal::supportsFullScreenMonitorsProtocolX11() && !gEDataManager->legacyFullscreenModeRequested(); if (fUseNativeFullScreen) { /* Tell recent window managers which host-screen this window should be mapped to: */ VBoxGlobal::setFullScreenMonitorX11(this, pFullscreenLogic->hostScreenForGuestScreen(m_uScreenId)); } /* Set appropriate window geometry: */ resize(workingArea.size()); move(workingArea.topLeft()); #else # warning "port me" #endif }