bool UIMachineView::event(QEvent *pEvent) { switch (pEvent->type()) { case VBoxDefs::RepaintEventType: { UIRepaintEvent *pPaintEvent = static_cast<UIRepaintEvent*>(pEvent); viewport()->update(pPaintEvent->x() - contentsX(), pPaintEvent->y() - contentsY(), pPaintEvent->width(), pPaintEvent->height()); return true; } #ifdef Q_WS_MAC /* Event posted OnShowWindow: */ case VBoxDefs::ShowWindowEventType: { /* Dunno what Qt3 thinks a window that has minimized to the dock should be - it is not hidden, * neither is it minimized. OTOH it is marked shown and visible, but not activated. * This latter isn't of much help though, since at this point nothing is marked activated. * I might have overlooked something, but I'm buggered what if I know what. So, I'll just always * show & activate the stupid window to make it get out of the dock when the user wishes to show a VM: */ window()->show(); window()->activateWindow(); return true; } #endif /* Q_WS_MAC */ #ifdef VBOX_WITH_VIDEOHWACCEL case VBoxDefs::VHWACommandProcessType: { m_pFrameBuffer->doProcessVHWACommand(pEvent); return true; } #endif /* VBOX_WITH_VIDEOHWACCEL */ default: break; } return QAbstractScrollArea::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); }