VirtualBox

Changeset 14908 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Dec 2, 2008 3:03:52 PM (16 years ago)
Author:
vboxsync
Message:

Fe/Qt4: Systray: Final implementation for now; it uses a separate process for the tray icon. Disabled tray icon menu by default.

Location:
trunk/src/VBox/Frontends/VirtualBox4
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxDefs.h

    r14706 r14908  
    120120#if defined (VBOX_GUI_WITH_SYSTRAY)
    121121        CanShowTrayIconEventType,
    122         ChangeTrayIconEventType,
     122        ShowTrayIconEventType,
     123        TrayIconChangeEventType,
     124        MainWindowCountChangeEventType,
    123125#endif
    124126        AddVDMUrlsEventType
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxGlobal.h

    r14706 r14908  
    391391
    392392#ifdef VBOX_GUI_WITH_SYSTRAY
     393class VBoxMainWindowCountChangeEvent : public QEvent
     394{
     395public:
     396    VBoxMainWindowCountChangeEvent (int aCount)
     397        : QEvent ((QEvent::Type) VBoxDefs::MainWindowCountChangeEventType)
     398        , mCount (aCount)
     399        {}
     400
     401    const int mCount;
     402};
     403
    393404class VBoxCanShowTrayIconEvent : public QEvent
    394405{
     
    402413};
    403414
     415class VBoxShowTrayIconEvent : public QEvent
     416{
     417public:
     418    VBoxShowTrayIconEvent (bool aShow)
     419        : QEvent ((QEvent::Type) VBoxDefs::ShowTrayIconEventType)
     420        , mShow (aShow)
     421        {}
     422
     423    const bool mShow;
     424};
     425
    404426class VBoxChangeTrayIconEvent : public QEvent
    405427{
    406428public:
    407     VBoxChangeTrayIconEvent (bool aEnabled)
    408         : QEvent ((QEvent::Type) VBoxDefs::ChangeTrayIconEventType)
    409         , mEnabled (aEnabled)
     429    VBoxChangeTrayIconEvent (bool aChanged)
     430        : QEvent ((QEvent::Type) VBoxDefs::TrayIconChangeEventType)
     431        , mChanged (aChanged)
    410432        {}
    411433
    412     const bool mEnabled;
     434    const bool mChanged;
    413435};
    414436#endif
     
    483505    bool isVMConsoleProcess() const { return !vmUuid.isNull(); }
    484506#ifdef VBOX_GUI_WITH_SYSTRAY
    485     bool hasTrayIcon() const;
    486507    bool isTrayMenu() const;
     508    void setTrayMenu(bool aIsTrayMenu);
     509    void trayIconShowSelector();
    487510    bool trayIconInstall();
    488511#endif
     
    956979    void snapshotChanged (const VBoxSnapshotEvent &e);
    957980#ifdef VBOX_GUI_WITH_SYSTRAY
     981    void mainWindowCountChanged (const VBoxMainWindowCountChangeEvent &e);
    958982    void trayIconCanShow (const VBoxCanShowTrayIconEvent &e);
     983    void trayIconShow (const VBoxShowTrayIconEvent &e);
    959984    void trayIconChanged (const VBoxChangeTrayIconEvent &e);
    960985#endif
     
    10001025
    10011026#ifdef VBOX_GUI_WITH_SYSTRAY
    1002     bool mHasTrayIcon;          /* Is current instance responsible for tray icon? */
    10031027    bool mIsTrayMenu;           /* Tray icon active/desired? */
    10041028#endif
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSelectorWnd.h

    r14907 r14908  
    131131    void snapshotChanged (const VBoxSnapshotEvent &e);
    132132#ifdef VBOX_GUI_WITH_SYSTRAY
     133    void mainWindowCountChanged (const VBoxMainWindowCountChangeEvent &aEvent);
    133134    void trayIconCanShow (const VBoxCanShowTrayIconEvent &e);
     135    void trayIconShow (const VBoxShowTrayIconEvent &e);
    134136    void trayIconChanged (const VBoxChangeTrayIconEvent &e);
    135137#endif
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxGlobal.cpp

    r14818 r14908  
    864864                    QApplication::postEvent (&mGlobal, new VBoxChangeGUILanguageEvent (sVal));
    865865#ifdef VBOX_GUI_WITH_SYSTRAY
     866                if (sKey == "GUI/MainWindowCount")
     867                    QApplication::postEvent (&mGlobal, new VBoxMainWindowCountChangeEvent (sVal.toInt()));
    866868                if (sKey == VBoxDefs::GUI_TrayIconWinID)
    867869                {
     
    12441246    , mUpdDlg (NULL)
    12451247#ifdef VBOX_GUI_WITH_SYSTRAY
    1246     , mHasTrayIcon (false)
    12471248    , mIsTrayMenu (false)
    12481249#endif
     
    14151416
    14161417/**
    1417  *  Returns true if the current instance is responsible of showing/handling
    1418  *  the tray icon.
    1419  */
    1420 bool VBoxGlobal::hasTrayIcon() const
    1421 {
    1422     return mHasTrayIcon;
    1423 }
    1424 
    1425 /**
    14261418 *  Returns true if the current instance a systray menu only (started with
    14271419 *  "-systray" parameter).
     
    14291421bool VBoxGlobal::isTrayMenu() const
    14301422{
    1431     return (mHasTrayIcon && mIsTrayMenu);
     1423    return mIsTrayMenu;
     1424}
     1425
     1426void VBoxGlobal::setTrayMenu(bool aIsTrayMenu)
     1427{
     1428    mIsTrayMenu = aIsTrayMenu;
     1429}
     1430
     1431/**
     1432 *  Spawns a new selector window (process).
     1433 */
     1434void VBoxGlobal::trayIconShowSelector()
     1435{
     1436    /* Get the path to the executable. */
     1437    char path [RTPATH_MAX];
     1438    RTPathAppPrivateArch (path, RTPATH_MAX);
     1439    size_t sz = strlen (path);
     1440    path [sz++] = RTPATH_DELIMITER;
     1441    path [sz] = 0;
     1442    char *cmd = path + sz;
     1443    sz = RTPATH_MAX - sz;
     1444
     1445    int rc = 0;
     1446    RTPROCESS pid = NIL_RTPROCESS;
     1447    RTENV env = RTENV_DEFAULT;
     1448
     1449    const char VirtualBox_exe[] = "VirtualBox" HOSTSUFF_EXE;
     1450    Assert (sz >= sizeof (VirtualBox_exe));
     1451    strcpy (cmd, VirtualBox_exe);
     1452# ifdef RT_OS_WINDOWS /** @todo drop this once the RTProcCreate bug has been fixed */
     1453    const char * args[] = {path, 0 };
     1454# else
     1455    const char * args[] = {path, 0 };
     1456# endif
     1457    rc = RTProcCreate (path, args, env, 0, &pid);
     1458    if (RT_FAILURE (rc))
     1459        LogRel(("Systray: Failed to start new selector window! Path=%s, rc=%Rrc\n", path, rc));
    14321460}
    14331461
    14341462/**
    14351463 *  Tries to install the tray icon using the current instance (singleton).
    1436  *  Returns true on success, false on failure.
     1464 *  Returns true if this instance is the tray icon, false if not.
    14371465 */
    14381466bool VBoxGlobal::trayIconInstall()
    14391467{
    1440     bool bActive = mIsTrayMenu;
    1441     if (false == bActive)
    1442         bActive = vboxGlobal().settings().trayIconEnabled();
     1468    int rc = 0;
     1469    QString strTrayWinID = mVBox.GetExtraData (VBoxDefs::GUI_TrayIconWinID);
     1470    if (false == strTrayWinID.isEmpty())
     1471    {
     1472        /* Check if current tray icon is alive by writing some bogus value. */
     1473        mVBox.SetExtraData (VBoxDefs::GUI_TrayIconWinID, "0");
     1474        if (mVBox.isOk())
     1475        {
     1476            /* Current tray icon died - clean up. */
     1477            mVBox.SetExtraData (VBoxDefs::GUI_TrayIconWinID, NULL);
     1478            strTrayWinID.clear();
     1479        }
     1480    }
    14431481
    14441482    /* Is there already a tray icon or is tray icon not active? */
    1445     QString strTrayWinID = mVBox.GetExtraData (VBoxDefs::GUI_TrayIconWinID);
    1446     if (   (bActive == false)
    1447         || (QSystemTrayIcon::isSystemTrayAvailable() == false)
    1448         || (strTrayWinID.isEmpty() == false))
    1449     {
    1450         return false;
    1451     }
    1452 
    1453     int rc = 0;
    1454     if (isVMConsoleProcess())
    1455     {
    1456         // Spawn new selector window instance
    1457 
    1458         // Get the path to the executable
     1483    if (   (mIsTrayMenu == false)
     1484        && (vboxGlobal().settings().trayIconEnabled())
     1485        && (QSystemTrayIcon::isSystemTrayAvailable())
     1486        && (strTrayWinID.isEmpty()))
     1487    {
     1488        /* Get the path to the executable. */
    14591489        char path [RTPATH_MAX];
    14601490        RTPathAppPrivateArch (path, RTPATH_MAX);
     
    14711501        Assert (sz >= sizeof (VirtualBox_exe));
    14721502        strcpy (cmd, VirtualBox_exe);
    1473 # ifdef RT_OS_WINDOWS /** @todo drop this once the RTProcCreate bug has been fixed */
     1503    # ifdef RT_OS_WINDOWS /** @todo drop this once the RTProcCreate bug has been fixed */
    14741504        const char * args[] = {path, "-systray", 0 };
    1475 # else
     1505    # else
    14761506        const char * args[] = {path, "-systray", 0 };
    1477 # endif
     1507    # endif
    14781508        rc = RTProcCreate (path, args, env, 0, &pid);
    14791509        if (RT_FAILURE (rc))
    14801510        {
    1481             LogRel(("Failed to start systray window! Path=%s, rc=%Rrc\n", path, rc));
     1511            LogRel(("Systray: Failed to start systray window! Path=%s, rc=%Rrc\n", path, rc));
    14821512            return false;
    14831513        }
    14841514    }
    1485     else
     1515
     1516    if (mIsTrayMenu)
    14861517    {
    14871518        // Use this selector for displaying the tray icon
     
    14931524        if (mVBox.isOk())
    14941525        {
    1495             mHasTrayIcon = true;
    1496             emit trayIconChanged (*(new VBoxChangeTrayIconEvent (vboxGlobal().settings().trayIconEnabled())));
    1497         }
    1498     }
    1499 
    1500     return mHasTrayIcon;
     1526            emit trayIconShow (*(new VBoxShowTrayIconEvent (true)));
     1527            return true;
     1528        }
     1529    }
     1530
     1531    return false;
    15011532}
    15021533
     
    52045235        }
    52055236#ifdef VBOX_GUI_WITH_SYSTRAY
     5237        case VBoxDefs::MainWindowCountChangeEventType:
     5238
     5239            emit mainWindowCountChanged (*(VBoxMainWindowCountChangeEvent *) e);
     5240            return true;
     5241
    52065242        case VBoxDefs::CanShowTrayIconEventType:
    52075243        {
     
    52095245            return true;
    52105246        }
    5211         case VBoxDefs::ChangeTrayIconEventType:
     5247        case VBoxDefs::ShowTrayIconEventType:
     5248        {
     5249            emit trayIconShow (*(VBoxShowTrayIconEvent *) e);
     5250            return true;
     5251        }
     5252        case VBoxDefs::TrayIconChangeEventType:
    52125253        {
    52135254            emit trayIconChanged (*(VBoxChangeTrayIconEvent *) e);
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxGlobalSettings.cpp

    r14455 r14908  
    6060    languageId  = QString::null;
    6161    maxGuestRes = "auto";
    62     trayIconEnabled = true;
     62    trayIconEnabled = false;
    6363}
    6464
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSelectorWnd.cpp

    r14907 r14908  
    680680             this, SLOT (snapshotChanged (const VBoxSnapshotEvent &)));
    681681#ifdef VBOX_GUI_WITH_SYSTRAY
     682    connect (&vboxGlobal(), SIGNAL (mainWindowCountChanged (const VBoxMainWindowCountChangeEvent &)),
     683             this, SLOT (mainWindowCountChanged (const VBoxMainWindowCountChangeEvent &)));
    682684    connect (&vboxGlobal(), SIGNAL (trayIconCanShow (const VBoxCanShowTrayIconEvent &)),
    683685             this, SLOT (trayIconCanShow (const VBoxCanShowTrayIconEvent &)));
     686    connect (&vboxGlobal(), SIGNAL (trayIconShow (const VBoxShowTrayIconEvent &)),
     687             this, SLOT (trayIconShow (const VBoxShowTrayIconEvent &)));
    684688    connect (&vboxGlobal(), SIGNAL (trayIconChanged (const VBoxChangeTrayIconEvent &)),
    685689             this, SLOT (trayIconChanged (const VBoxChangeTrayIconEvent &)));
     
    10871091
    10881092#ifdef VBOX_GUI_WITH_SYSTRAY
    1089     if (vboxGlobal().hasTrayIcon())
     1093    if (vboxGlobal().isTrayMenu())
    10901094        mTrayIcon->refresh();
    10911095#endif
     
    11311135        case QSystemTrayIcon::DoubleClick:
    11321136
    1133             showWindow();
     1137            vboxGlobal().trayIconShowSelector();
    11341138            break;
    11351139
     
    11881192{
    11891193#ifdef VBOX_GUI_WITH_SYSTRAY
     1194    /* Needed for breaking out of the while() loop in main(). */
    11901195    if (vboxGlobal().isTrayMenu())
    1191     {
    1192         hide();
    1193         if (vboxGlobal().mainWindowCount() == 0)
    1194         {
    1195             emit closing();
    1196             QMainWindow::closeEvent (aEvent);
    1197         }
    1198         else aEvent->ignore();
    1199     }
    1200     else
    1201     {
     1196        vboxGlobal().setTrayMenu (false);
    12021197#endif
    1203         emit closing();
    1204         QMainWindow::closeEvent (aEvent);
    1205 #ifdef VBOX_GUI_WITH_SYSTRAY
    1206     }
    1207 #endif
     1198
     1199    emit closing();
     1200    QMainWindow::closeEvent (aEvent);
    12081201}
    12091202
     
    13281321
    13291322#ifdef VBOX_GUI_WITH_SYSTRAY
    1330     if (vboxGlobal().hasTrayIcon())
     1323    if (vboxGlobal().isTrayMenu())
    13311324    {
    13321325        mTrayIcon->retranslateUi();
     
    16381631#ifdef VBOX_GUI_WITH_SYSTRAY
    16391632
     1633void VBoxSelectorWnd::mainWindowCountChanged (const VBoxMainWindowCountChangeEvent &aEvent)
     1634{
     1635    if (vboxGlobal().isTrayMenu() && aEvent.mCount <= 1)
     1636        fileExit();
     1637}
     1638
    16401639void VBoxSelectorWnd::trayIconCanShow (const VBoxCanShowTrayIconEvent &aEvent)
    16411640{
     
    16431642}
    16441643
     1644void VBoxSelectorWnd::trayIconShow (const VBoxShowTrayIconEvent &aEvent)
     1645{
     1646    if (vboxGlobal().isTrayMenu() && mTrayIcon)
     1647        mTrayIcon->trayIconShow (aEvent.mShow);
     1648}
     1649
    16451650void VBoxSelectorWnd::trayIconChanged (const VBoxChangeTrayIconEvent &aEvent)
    16461651{
    1647     if (mTrayIcon)
    1648         mTrayIcon->trayIconShow (aEvent.mEnabled);
     1652    /* Not used yet. */
    16491653}
    16501654
     
    19621966void VBoxTrayIcon::trayIconShow (bool aShow)
    19631967{
    1964     if (!vboxGlobal().hasTrayIcon())
     1968    if (!vboxGlobal().isTrayMenu())
    19651969        return;
    19661970
     
    19731977    setVisible (mActive);
    19741978
    1975     if (!mActive && vboxGlobal().isTrayMenu())
     1979    if (!mActive)
     1980    {
     1981        VBoxGlobalSettings s = vboxGlobal().settings();
     1982        s.setTrayIconEnabled (false);
     1983        s.save(vboxGlobal().virtualBox());
    19761984        mParent->fileExit();
     1985    }
    19771986}
    19781987
  • trunk/src/VBox/Frontends/VirtualBox4/src/main.cpp

    r14831 r14908  
    363363                vboxGlobal().setMainWindow (&vboxGlobal().consoleWnd());
    364364#ifdef VBOX_GUI_WITH_SYSTRAY
    365                 if (   vboxGlobal().trayIconInstall()
    366                     && vboxGlobal().hasTrayIcon())
     365                if (vboxGlobal().trayIconInstall())
    367366                {
    368367                    /* Nothing to do here yet. */
     
    380379                vboxGlobal().setMainWindow (&vboxGlobal().selectorWnd());
    381380#ifdef VBOX_GUI_WITH_SYSTRAY
    382                 if (   vboxGlobal().trayIconInstall()
    383                     && vboxGlobal().hasTrayIcon())
     381                if (vboxGlobal().trayIconInstall())
    384382                {
    385383                    /* Nothing to do here yet. */
     
    395393                vboxGlobal().showUpdateDialog (false /* aForce */);
    396394#endif
    397                 rc = a.exec();
     395#ifdef VBOX_GUI_WITH_SYSTRAY
     396                do
     397                {
     398#endif
     399                    rc = a.exec();
     400#ifdef VBOX_GUI_WITH_SYSTRAY
     401                } while (vboxGlobal().isTrayMenu());
     402#endif
    398403            }
    399404        }
Note: See TracChangeset for help on using the changeset viewer.

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