VirtualBox

Changeset 14652 in vbox


Ignore:
Timestamp:
Nov 26, 2008 4:05:08 PM (16 years ago)
Author:
vboxsync
Message:

Fe/Qt4: Systray: Now gets started through an own process; should solve the redundant systray icons as well. Reverted some changes for having an instance of the selector window in a pure console session as well.

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

Legend:

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

    r14578 r14652  
    483483    bool isVMConsoleProcess() const { return !vmUuid.isNull(); }
    484484#ifdef VBOX_GUI_WITH_SYSTRAY
    485     bool isTrayIcon() const;
     485    bool hasTrayIcon() const;
     486    bool isTrayMenu() const;
    486487    bool trayIconInstall();
    487488#endif
     
    996997
    997998#ifdef VBOX_GUI_WITH_SYSTRAY
    998     bool mIsTrayIcon;           /* Is current instance responsible for tray icon? */
     999    bool mHasTrayIcon;          /* Is current instance responsible for tray icon? */
     1000    bool mIsTrayMenu;           /* Tray icon active/desired? */
    9991001#endif
    10001002    QThread *mMediaEnumThread;
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSelectorWnd.h

    r14578 r14652  
    6161    virtual ~VBoxSelectorWnd();
    6262
    63     bool startMachine (const QUuid &aId);
    64 
    6563signals:
    6664
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxGlobal.cpp

    r14629 r14652  
    8888#include <iprt/file.h>
    8989#include <iprt/ldr.h>
     90
     91#ifdef VBOX_GUI_WITH_SYSTRAY
     92#include <iprt/process.h>
     93
     94#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2)
     95#define HOSTSUFF_EXE ".exe"
     96#else /* !RT_OS_WINDOWS */
     97#define HOSTSUFF_EXE ""
     98#endif /* !RT_OS_WINDOWS */
     99#endif
    90100
    91101#if defined (Q_WS_X11)
     
    941951    void postEvent (QEvent *e)
    942952    {
    943 #ifndef VBOX_GUI_WITH_SYSTRAY
    944         // If not using a systray menu, we don't post events if we are in the VM
    945         // execution console mode, to save some CPU ticks (so far, there was no
    946         // need to handle VirtualBox callback events in the execution console
    947         // mode
     953        // currently, we don't post events if we are in the VM execution
     954        // console mode, to save some CPU ticks (so far, there was no need
     955        // to handle VirtualBox callback events in the execution console mode)
    948956        if (!mGlobal.isVMConsoleProcess())
    949 #endif
    950957            QApplication::postEvent (&mGlobal, e);
    951958    }
     
    12351242    , mUpdDlg (NULL)
    12361243#ifdef VBOX_GUI_WITH_SYSTRAY
    1237     , mIsTrayIcon (false)
     1244    , mHasTrayIcon (false)
     1245    , mIsTrayMenu (false)
    12381246#endif
    12391247    , mMediaEnumThread (NULL)
     
    13481356VBoxSelectorWnd &VBoxGlobal::selectorWnd()
    13491357{
     1358#if defined (VBOX_GUI_SEPARATE_VM_PROCESS)
     1359    AssertMsg (!vboxGlobal().isVMConsoleProcess(),
     1360               ("Must NOT be a VM console process"));
     1361#endif
     1362
    13501363    Assert (mValid);
    13511364
     
    14031416 *  the tray icon.
    14041417 */
    1405 bool VBoxGlobal::isTrayIcon() const
    1406 {
    1407     return mIsTrayIcon;
     1418bool VBoxGlobal::hasTrayIcon() const
     1419{
     1420    return mHasTrayIcon;
     1421}
     1422
     1423/**
     1424 *  Returns true if the current instance a systray menu only (started with
     1425 *  "-systray" parameter).
     1426 */
     1427bool VBoxGlobal::isTrayMenu() const
     1428{
     1429    return (mHasTrayIcon && mIsTrayMenu);
    14081430}
    14091431
     
    14141436bool VBoxGlobal::trayIconInstall()
    14151437{
    1416     if (false == QSystemTrayIcon::isSystemTrayAvailable())
     1438    bool bActive = mIsTrayMenu;
     1439    if (false == bActive)
     1440        bActive = vboxGlobal().settings().trayIconEnabled();
     1441
     1442    if (   bActive
     1443        && (false == QSystemTrayIcon::isSystemTrayAvailable())
     1444        && (false == mVBox.GetExtraData (VBoxDefs::GUI_TrayIconWinID).isEmpty()))
     1445    {
    14171446        return false;
    1418 
    1419     AssertMsg (&vboxGlobal().selectorWnd(),
    1420                ("Selector window must not be null for systray!"));
    1421 
    1422     mVBox.SetExtraData (VBoxDefs::GUI_TrayIconWinID,
    1423                         QString ("%1").arg ((qulonglong) vboxGlobal().selectorWnd().winId()));
    1424 
    1425     /* The first process which can grab this "mutex" will win ->
    1426      * It will be the tray icon menu then. */
    1427     if (mVBox.isOk())
    1428     {
    1429         mIsTrayIcon = true;
    1430         emit trayIconChanged (*(new VBoxChangeTrayIconEvent (vboxGlobal().settings().trayIconEnabled())));
    1431     }
    1432 
    1433     return mIsTrayIcon;
     1447    }
     1448
     1449    int rc = 0;
     1450    if (isVMConsoleProcess())
     1451    {
     1452        // Spawn new selector window instance
     1453
     1454        // Get the path to the executable
     1455        char path [RTPATH_MAX];
     1456        RTPathAppPrivateArch (path, RTPATH_MAX);
     1457        size_t sz = strlen (path);
     1458        path [sz++] = RTPATH_DELIMITER;
     1459        path [sz] = 0;
     1460        char *cmd = path + sz;
     1461        sz = RTPATH_MAX - sz;
     1462
     1463        RTPROCESS pid = NIL_RTPROCESS;
     1464        RTENV env = RTENV_DEFAULT;
     1465
     1466        const char VirtualBox_exe[] = "VirtualBox" HOSTSUFF_EXE;
     1467        Assert (sz >= sizeof (VirtualBox_exe));
     1468        strcpy (cmd, VirtualBox_exe);
     1469# ifdef RT_OS_WINDOWS /** @todo drop this once the RTProcCreate bug has been fixed */
     1470        const char * args[] = {path, "-systray", 0 };
     1471# else
     1472        const char * args[] = {path, "-systray", 0 };
     1473# endif
     1474        rc = RTProcCreate (path, args, env, 0, &pid);
     1475        if (RT_FAILURE (rc))
     1476        {
     1477            LogRel(("Failed to start systray window! rc=%Rrc\n", rc));
     1478            return false;
     1479        }
     1480    }
     1481    else
     1482    {
     1483        // Use this selector for displaying the tray icon
     1484        mVBox.SetExtraData (VBoxDefs::GUI_TrayIconWinID,
     1485                            QString ("%1").arg ((qulonglong) vboxGlobal().mainWindow()->winId()));
     1486
     1487        /* The first process which can grab this "mutex" will win ->
     1488         * It will be the tray icon menu then. */
     1489        if (mVBox.isOk())
     1490        {
     1491            mHasTrayIcon = true;
     1492            emit trayIconChanged (*(new VBoxChangeTrayIconEvent (vboxGlobal().settings().trayIconEnabled())));
     1493        }
     1494    }
     1495
     1496    return mHasTrayIcon;
    14341497}
    14351498
     
    53865449            }
    53875450        }
     5451#ifdef VBOX_GUI_WITH_SYSTRAY
     5452        else if (!::strcmp (arg, "-systray"))
     5453        {
     5454            mIsTrayMenu = true;
     5455        }
     5456#endif
    53885457        else if (!::strcmp (arg, "-comment"))
    53895458        {
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSelectorWnd.cpp

    r14629 r14652  
    714714    /* Delete systray menu object */
    715715    delete mTrayIcon;
     716    mTrayIcon = NULL;
    716717#endif
    717718
     
    911912#if defined (VBOX_GUI_SEPARATE_VM_PROCESS)
    912913
     914    AssertMsg (!vboxGlobal().isVMConsoleProcess(),
     915               ("Must NOT be a VM console process"));
     916
    913917    /* just switch to the VM window if it already exists */
    914918    if (item->canSwitchTo())
     
    10801084
    10811085#ifdef VBOX_GUI_WITH_SYSTRAY
    1082     if (vboxGlobal().isTrayIcon())
     1086    if (vboxGlobal().hasTrayIcon())
    10831087        mTrayIcon->refresh();
    10841088#endif
     
    11911195void VBoxSelectorWnd::closeEvent (QCloseEvent *aEvent)
    11921196{
    1193     emit closing();
    1194     return QMainWindow::closeEvent (aEvent);
     1197#ifdef VBOX_GUI_WITH_SYSTRAY
     1198    if (vboxGlobal().isTrayMenu())
     1199    {
     1200        hide();
     1201    }
     1202    else
     1203    {
     1204#endif
     1205        emit closing();
     1206        QMainWindow::closeEvent (aEvent);
     1207#ifdef VBOX_GUI_WITH_SYSTRAY
     1208    }
     1209#endif
    11951210}
    11961211
     
    13151330
    13161331#ifdef VBOX_GUI_WITH_SYSTRAY
    1317     if (vboxGlobal().isTrayIcon())
     1332    if (vboxGlobal().hasTrayIcon())
    13181333    {
    13191334        mTrayIcon->retranslateUi();
     
    16191634void VBoxSelectorWnd::trayIconChanged (const VBoxChangeTrayIconEvent &aEvent)
    16201635{
    1621     mTrayIcon->trayIconShow (aEvent.mEnabled);
     1636    if (mTrayIcon)
     1637        mTrayIcon->trayIconShow (aEvent.mEnabled);
    16221638}
    16231639
     
    19351951void VBoxTrayIcon::trayIconShow (bool aShow)
    19361952{
     1953    if (!vboxGlobal().hasTrayIcon())
     1954        return;
     1955
    19371956    mActive = aShow;
    19381957    if (mActive)
     
    19421961    }
    19431962    setVisible (mActive);
     1963
     1964    if (!mActive && vboxGlobal().isTrayMenu())
     1965        mParent->fileExit();
    19441966}
    19451967
  • trunk/src/VBox/Frontends/VirtualBox4/src/main.cpp

    r14629 r14652  
    361361            if (vboxGlobal().isVMConsoleProcess())
    362362            {
     363                vboxGlobal().setMainWindow (&vboxGlobal().consoleWnd());
    363364#ifdef VBOX_GUI_WITH_SYSTRAY
    364                 /* Keep selector window in memory (hidden) because we need it for
    365                  * the systray menu. */
    366                 vboxGlobal().startEnumeratingMedia();
    367                 vboxGlobal().selectorWnd();
    368                 vboxGlobal().setMainWindow (&vboxGlobal().consoleWnd());
    369365                if (   vboxGlobal().trayIconInstall()
    370                     && vboxGlobal().isTrayIcon())
     366                    && vboxGlobal().hasTrayIcon())
    371367                {
    372368                    /* Nothing to do here yet. */
    373369                }
    374 #else
    375                 vboxGlobal().setMainWindow (&vboxGlobal().consoleWnd());
    376370#endif
    377371                if (vboxGlobal().startMachine (vboxGlobal().managedVMUuid()))
     
    389383#ifdef VBOX_GUI_WITH_SYSTRAY
    390384                if (   vboxGlobal().trayIconInstall()
    391                     && vboxGlobal().isTrayIcon())
     385                    && vboxGlobal().hasTrayIcon())
    392386                {
    393387                    /* Nothing to do here yet. */
    394388                }
    395 #endif
    396                 vboxGlobal().selectorWnd().show();
     389
     390                if (false == vboxGlobal().isTrayMenu())
     391#endif
     392                    vboxGlobal().selectorWnd().show();
    397393#ifdef VBOX_WITH_REGISTRATION_REQUEST
    398394                vboxGlobal().showRegistrationDialog (false /* aForce */);
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