void UIMachineView::setDesktopGeometry(DesktopGeo geometry, int aWidth, int aHeight) { switch (geometry) { case DesktopGeo_Fixed: m_desktopGeometryType = DesktopGeo_Fixed; if (aWidth != 0 && aHeight != 0) m_desktopGeometry = QSize(aWidth, aHeight); else m_desktopGeometry = QSize(0, 0); storeConsoleSize(0, 0); break; case DesktopGeo_Automatic: m_desktopGeometryType = DesktopGeo_Automatic; m_desktopGeometry = QSize(0, 0); storeConsoleSize(0, 0); break; case DesktopGeo_Any: m_desktopGeometryType = DesktopGeo_Any; m_desktopGeometry = QSize(0, 0); break; default: AssertMsgFailed(("Invalid desktop geometry type %d\n", geometry)); m_desktopGeometryType = DesktopGeo_Invalid; } }
void UIMachineViewFullscreen::sltPerformGuestResize(const QSize &toSize) { if (m_bIsGuestAutoresizeEnabled && uisession()->isGuestSupportsGraphics()) { /* Get machine window: */ QMainWindow *pMachineWindow = machineWindowWrapper() && machineWindowWrapper()->machineWindow() ? qobject_cast<QMainWindow*>(machineWindowWrapper()->machineWindow()) : 0; /* If this slot is invoked directly then use the passed size otherwise get * the available size for the guest display. We assume here that centralWidget() * contains this view only and gives it all available space: */ QSize newSize(toSize.isValid() ? toSize : pMachineWindow ? pMachineWindow->centralWidget()->size() : QSize()); AssertMsg(newSize.isValid(), ("Size should be valid!\n")); /* Do not send the same hints as we already have: */ if ((newSize.width() == storedConsoleSize().width()) && (newSize.height() == storedConsoleSize().height())) return; /* We only actually send the hint if either an explicit new size was given * (e.g. if the request was triggered directly by a console resize event) or * if no explicit size was specified but a resize is flagged as being needed * (e.g. the autoresize was just enabled and the console was resized while it was disabled). */ if (toSize.isValid() || m_fShouldWeDoResize) { /* Remember the new size: */ storeConsoleSize(newSize.width(), newSize.height()); /* Send new size-hint to the guest: */ session().GetConsole().GetDisplay().SetVideoModeHint(newSize.width(), newSize.height(), 0, screenId()); } /* We had requested resize now, rejecting other accident requests: */ m_fShouldWeDoResize = false; } }
bool UIMachineViewFullscreen::event(QEvent *pEvent) { switch (pEvent->type()) { case VBoxDefs::ResizeEventType: { /* Some situations require framebuffer resize events to be ignored at all, * leaving machine-window, machine-view and framebuffer sizes preserved: */ if (uisession()->isGuestResizeIgnored()) return true; /* We are starting to perform machine-view resize, * we should temporary ignore other if they are trying to be: */ bool fWasMachineWindowResizeIgnored = isMachineWindowResizeIgnored(); setMachineWindowResizeIgnored(true); /* Get guest resize-event: */ UIResizeEvent *pResizeEvent = static_cast<UIResizeEvent*>(pEvent); /* Perform framebuffer resize: */ frameBuffer()->resizeEvent(pResizeEvent); /* Reapply maximum size restriction for machine-view: */ setMaximumSize(sizeHint()); /* Store the new size to prevent unwanted resize hints being sent back: */ storeConsoleSize(pResizeEvent->width(), pResizeEvent->height()); /* Perform machine-view resize: */ resize(pResizeEvent->width(), pResizeEvent->height()); /* May be we have to restrict minimum size? */ maybeRestrictMinimumSize(); /* Let our toplevel widget calculate its sizeHint properly: */ QCoreApplication::sendPostedEvents(0, QEvent::LayoutRequest); #ifdef Q_WS_MAC machineLogic()->updateDockIconSize(screenId(), pResizeEvent->width(), pResizeEvent->height()); #endif /* Q_WS_MAC */ /* Update machine-view sliders: */ updateSliders(); /* Report to the VM thread that we finished resizing: */ session().GetConsole().GetDisplay().ResizeCompleted(screenId()); /* We are finishing to perform machine-view resize: */ setMachineWindowResizeIgnored(fWasMachineWindowResizeIgnored); /* We also recalculate the desktop geometry if this is determined * automatically. In fact, we only need this on the first resize, * but it is done every time to keep the code simpler. */ calculateDesktopGeometry(); /* Emit a signal about guest was resized: */ emit resizeHintDone(); /* Unlock after processing guest resize event: */ if (m_pSyncBlocker && m_pSyncBlocker->isRunning()) m_pSyncBlocker->quit(); pEvent->accept(); return true; } default: break; } return UIMachineView::event(pEvent); }
bool UIMachineViewScale::event(QEvent *pEvent) { switch (pEvent->type()) { case VBoxDefs::ResizeEventType: { /* Some situations require framebuffer resize events to be ignored at all, * leaving machine-window, machine-view and framebuffer sizes preserved: */ if (uisession()->isGuestResizeIgnored()) return true; /* We are starting to perform machine-view resize, * we should temporary ignore other if they are trying to be: */ bool fWasMachineWindowResizeIgnored = isMachineWindowResizeIgnored(); setMachineWindowResizeIgnored(true); /* Get guest resize-event: */ UIResizeEvent *pResizeEvent = static_cast<UIResizeEvent*>(pEvent); /* Perform framebuffer resize: */ frameBuffer()->setScaledSize(size()); frameBuffer()->resizeEvent(pResizeEvent); /* Store the new size to prevent unwanted resize hints being sent back: */ storeConsoleSize(pResizeEvent->width(), pResizeEvent->height()); /* Let our toplevel widget calculate its sizeHint properly: */ QCoreApplication::sendPostedEvents(0, QEvent::LayoutRequest); #ifdef Q_WS_MAC machineLogic()->updateDockIconSize(screenId(), pResizeEvent->width(), pResizeEvent->height()); #endif /* Q_WS_MAC */ /* Report to the VM thread that we finished resizing: */ session().GetConsole().GetDisplay().ResizeCompleted(screenId()); /* We are finishing to perform machine-view resize: */ setMachineWindowResizeIgnored(fWasMachineWindowResizeIgnored); /* We also recalculate the desktop geometry if this is determined * automatically. In fact, we only need this on the first resize, * but it is done every time to keep the code simpler. */ calculateDesktopGeometry(); /* Emit a signal about guest was resized: */ emit resizeHintDone(); pEvent->accept(); return true; } case VBoxDefs::RepaintEventType: { UIRepaintEvent *pPaintEvent = static_cast<UIRepaintEvent*>(pEvent); QSize scaledSize = frameBuffer()->scaledSize(); double xRatio = (double)scaledSize.width() / frameBuffer()->width(); double yRatio = (double)scaledSize.height() / frameBuffer()->height(); AssertMsg(contentsX() == 0, ("This can't be, else notify Dsen!\n")); AssertMsg(contentsY() == 0, ("This can't be, else notify Dsen!\n")); /* Make sure we update always a bigger rectangle than requested to * catch all rounding errors. (use 1 time the ratio factor and * round down on top/left, but round up for the width/height) */ viewport()->update((int)(pPaintEvent->x() * xRatio) - ((int)xRatio) - 1, (int)(pPaintEvent->y() * yRatio) - ((int)yRatio) - 1, (int)(pPaintEvent->width() * xRatio) + ((int)xRatio + 2) * 2, (int)(pPaintEvent->height() * yRatio) + ((int)yRatio + 2) * 2); pEvent->accept(); return true; } default: break; } return UIMachineView::event(pEvent); }