VirtualBox

Changeset 69858 in vbox


Ignore:
Timestamp:
Nov 28, 2017 10:56:02 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
119303
Message:

FE/Qt bugref:8939. MacOS 'dock icon preview menu' is correctly updated as new screens are added/removed

Location:
trunk/src/VBox/Frontends/VirtualBox/src/runtime
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp

    r69789 r69858  
    783783    foreach (UIMachineWindow *pMachineWindow, machineWindows())
    784784        pMachineWindow->showInNecessaryMode();
     785
     786#ifdef VBOX_WS_MAC
     787    /* Update dock: */
     788    updateDock();
     789#endif
    785790}
    786791
     
    833838    , m_pDockIconPreview(0)
    834839    , m_pDockPreviewSelectMonitorGroup(0)
     840    , m_pDockSettingsMenuSeparator(0)
    835841    , m_DockIconPreviewMonitor(0)
    836842#endif /* VBOX_WS_MAC */
     
    12531259    pDockSettingsMenu->addAction(pDockIconDisableOverlay);
    12541260
    1255     /* Monitor selection if there are more than one monitor */
    1256     int cGuestScreens = machine().GetMonitorCount();
    1257     if (cGuestScreens > 1)
    1258     {
    1259         pDockSettingsMenu->addSeparator();
    1260         m_DockIconPreviewMonitor = qMin(gEDataManager->realtimeDockIconUpdateMonitor(vboxGlobal().managedVMUuid()),
    1261                                         cGuestScreens - 1);
     1261    /* If we have more than one visible window: */
     1262    const QList<int> visibleWindowsList = uisession()->listOfVisibleWindows();
     1263    const int cVisibleGuestScreens = visibleWindowsList.size();
     1264    if (cVisibleGuestScreens > 1)
     1265    {
     1266        /* Add separator: */
     1267        m_pDockSettingsMenuSeparator = pDockSettingsMenu->addSeparator();
     1268
     1269        int extraDataUpdateMonitor = gEDataManager->realtimeDockIconUpdateMonitor(vboxGlobal().managedVMUuid());
     1270        if (visibleWindowsList.contains(extraDataUpdateMonitor))
     1271            m_DockIconPreviewMonitor = extraDataUpdateMonitor;
     1272        else
     1273            m_DockIconPreviewMonitor = visibleWindowsList.at(cVisibleGuestScreens - 1);
     1274
    12621275        m_pDockPreviewSelectMonitorGroup = new QActionGroup(this);
    1263         for (int i = 0; i < cGuestScreens; ++i)
     1276
     1277        /* And dock preview actions: */
     1278        for (int i = 0; i < cVisibleGuestScreens; ++i)
    12641279        {
    12651280            QAction *pAction = new QAction(m_pDockPreviewSelectMonitorGroup);
    12661281            pAction->setCheckable(true);
    1267             pAction->setData(i);
    1268             if (m_DockIconPreviewMonitor == i)
     1282            pAction->setData(visibleWindowsList.at(i));
     1283            if (m_DockIconPreviewMonitor == visibleWindowsList.at(i))
    12691284                pAction->setChecked(true);
    12701285        }
     
    12971312    setDockIconPreviewEnabled(fEnabled);
    12981313    updateDockOverlay();
     1314}
     1315
     1316void UIMachineLogic::updateDock()
     1317{
     1318    QMenu *pDockSettingsMenu = actionPool()->action(UIActionIndexRT_M_Dock_M_DockSettings)->menu();
     1319    /* Clean the previous preview actions: */
     1320    if (m_pDockPreviewSelectMonitorGroup)
     1321    {
     1322        QList<QAction*> previewActions = m_pDockPreviewSelectMonitorGroup->actions();
     1323        foreach (QAction *pAction, previewActions)
     1324        {
     1325            pDockSettingsMenu->removeAction(pAction);
     1326            m_pDockPreviewSelectMonitorGroup->removeAction(pAction);
     1327            delete pAction;
     1328        }
     1329    }
     1330    const QList<int> visibleWindowsList = uisession()->listOfVisibleWindows();
     1331    const int cVisibleGuestScreens = visibleWindowsList.size();
     1332    if (cVisibleGuestScreens > 1)
     1333    {
     1334        if (!m_pDockPreviewSelectMonitorGroup)
     1335            m_pDockPreviewSelectMonitorGroup = new QActionGroup(this);
     1336        /* Only if currently selected monitor for icon preview is not enabled: */
     1337        if (!visibleWindowsList.contains(m_DockIconPreviewMonitor))
     1338        {
     1339            int iExtraDataUpdateMonitor = gEDataManager->realtimeDockIconUpdateMonitor(vboxGlobal().managedVMUuid());
     1340            if (visibleWindowsList.contains(iExtraDataUpdateMonitor))
     1341                m_DockIconPreviewMonitor = iExtraDataUpdateMonitor;
     1342            else
     1343                m_DockIconPreviewMonitor = visibleWindowsList.at(cVisibleGuestScreens - 1);
     1344        }
     1345        if (!m_pDockSettingsMenuSeparator)
     1346            m_pDockSettingsMenuSeparator = pDockSettingsMenu->addSeparator();
     1347        for (int i = 0; i < cVisibleGuestScreens; ++i)
     1348        {
     1349            QAction *pAction = new QAction(m_pDockPreviewSelectMonitorGroup);
     1350            pAction->setCheckable(true);
     1351            pAction->setData(visibleWindowsList.at(i));
     1352            pAction->setText(QApplication::translate("UIActionPool", "Preview Monitor %1").arg(pAction->data().toInt() + 1));
     1353            if (m_DockIconPreviewMonitor == visibleWindowsList.at(i))
     1354                pAction->setChecked(true);
     1355        }
     1356        pDockSettingsMenu->addActions(m_pDockPreviewSelectMonitorGroup->actions());
     1357        connect(m_pDockPreviewSelectMonitorGroup, SIGNAL(triggered(QAction*)),
     1358                this, SLOT(sltDockPreviewMonitorChanged(QAction*)));
     1359    }
     1360    else
     1361    {
     1362        m_DockIconPreviewMonitor = 0;
     1363        /* Remove the seperator as well: */
     1364        if (m_pDockSettingsMenuSeparator)
     1365        {
     1366            pDockSettingsMenu->removeAction(m_pDockSettingsMenuSeparator);
     1367            delete m_pDockSettingsMenuSeparator;
     1368            m_pDockSettingsMenuSeparator = 0;
     1369        }
     1370    }
    12991371}
    13001372#endif /* VBOX_WS_MAC */
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h

    r69500 r69858  
    225225#ifdef VBOX_WS_MAC
    226226    virtual void prepareDock();
     227    virtual void updateDock();
    227228#endif /* VBOX_WS_MAC */
    228229#ifdef VBOX_WITH_DEBUGGER_GUI
     
    406407    UIDockIconPreview *m_pDockIconPreview;
    407408    QActionGroup *m_pDockPreviewSelectMonitorGroup;
     409    QAction *m_pDockSettingsMenuSeparator;
    408410    int m_DockIconPreviewMonitor;
    409411#endif /* VBOX_WS_MAC */
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp

    r69824 r69858  
    20762076}
    20772077
     2078QList<int> UISession::listOfVisibleWindows() const
     2079{
     2080    QList<int> visibleWindows;
     2081    for (int i = 0; i < m_monitorVisibilityVector.size(); ++i)
     2082        if (m_monitorVisibilityVector.at(i))
     2083            visibleWindows.push_back(i);
     2084    return visibleWindows;
     2085}
     2086
    20782087void UISession::loadVMSettings()
    20792088{
  • trunk/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h

    r69500 r69858  
    274274    /** Returns VM's effective paravirtualization provider. */
    275275    KParavirtProvider paraVirtProvider() const { return m_paraVirtProvider; }
     276
     277    /** Returns the list of visible guest windows. */
     278    QList<int> listOfVisibleWindows() const;
    276279
    277280signals:
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette