VirtualBox

Changeset 14578 in vbox for trunk/src


Ignore:
Timestamp:
Nov 25, 2008 3:30:32 PM (16 years ago)
Author:
vboxsync
Message:

Fe/Qt4: Systray: First implementation for IPC handling.

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

Legend:

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

    r14540 r14578  
    119119        ChangeGUILanguageEventType,
    120120#if defined (VBOX_GUI_WITH_SYSTRAY)
    121         ChangeGUITrayIconEventType,
     121        CanShowTrayIconEventType,
     122        ChangeTrayIconEventType,
    122123#endif
    123124        AddVDMUrlsEventType
     
    152153    static const char* GUI_LastVMSelected;
    153154    static const char* GUI_InfoDlgState;
     155#ifdef VBOX_GUI_WITH_SYSTRAY
     156    static const char* GUI_TrayIconWinID;
     157#endif
    154158};
    155159
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxGlobal.h

    r14540 r14578  
    391391
    392392#ifdef VBOX_GUI_WITH_SYSTRAY
    393 class VBoxChangeGUITrayIconEvent : public QEvent
    394 {
    395 public:
    396     VBoxChangeGUITrayIconEvent (bool aEnabled)
    397         : QEvent ((QEvent::Type) VBoxDefs::ChangeGUITrayIconEventType)
     393class VBoxCanShowTrayIconEvent : public QEvent
     394{
     395public:
     396    VBoxCanShowTrayIconEvent (bool aCanShow)
     397        : QEvent ((QEvent::Type) VBoxDefs::CanShowTrayIconEventType)
     398        , mCanShow (aCanShow)
     399        {}
     400
     401    const bool mCanShow;
     402};
     403
     404class VBoxChangeTrayIconEvent : public QEvent
     405{
     406public:
     407    VBoxChangeTrayIconEvent (bool aEnabled)
     408        : QEvent ((QEvent::Type) VBoxDefs::ChangeTrayIconEventType)
    398409        , mEnabled (aEnabled)
    399410        {}
     
    470481    QWidget *mainWindow() const { return mMainWindow; }
    471482
    472 
    473483    bool isVMConsoleProcess() const { return !vmUuid.isNull(); }
     484#ifdef VBOX_GUI_WITH_SYSTRAY
     485    bool isTrayIcon() const;
     486    bool trayIconInstall();
     487#endif
    474488    QUuid managedVMUuid() const { return vmUuid; }
    475489
     
    938952    void snapshotChanged (const VBoxSnapshotEvent &e);
    939953#ifdef VBOX_GUI_WITH_SYSTRAY
    940     void systrayIconChanged (const VBoxChangeGUITrayIconEvent &e);
     954    void trayIconCanShow (const VBoxCanShowTrayIconEvent &e);
     955    void trayIconChanged (const VBoxChangeTrayIconEvent &e);
    941956#endif
    942957
     
    980995    QUuid vmUuid;
    981996
     997#ifdef VBOX_GUI_WITH_SYSTRAY
     998    bool mIsTrayIcon;           /* Is current instance responsible for tray icon? */
     999#endif
    9821000    QThread *mMediaEnumThread;
    9831001    VBoxMediaList mMediaList;
  • trunk/src/VBox/Frontends/VirtualBox4/include/VBoxSelectorWnd.h

    r14509 r14578  
    133133    void snapshotChanged (const VBoxSnapshotEvent &e);
    134134#ifdef VBOX_GUI_WITH_SYSTRAY
    135     void systrayIconChanged (const VBoxChangeGUITrayIconEvent &e);
     135    void trayIconCanShow (const VBoxCanShowTrayIconEvent &e);
     136    void trayIconChanged (const VBoxChangeTrayIconEvent &e);
    136137#endif
    137138
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxDefs.cpp

    r14046 r14578  
    4545const char* VBoxDefs::GUI_LastVMSelected = "GUI/LastVMSelected";
    4646const char* VBoxDefs::GUI_InfoDlgState = "GUI/InfoDlgState";
     47#ifdef VBOX_GUI_WITH_SYSTRAY
     48const char* VBoxDefs::GUI_TrayIconWinID = "GUI/TrayIconWinID";
     49#endif
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxGlobal.cpp

    r14540 r14578  
    654654    VBoxCallback (VBoxGlobal &aGlobal)
    655655        : mGlobal (aGlobal)
    656         , mIsRegDlgOwner (false), mIsUpdDlgOwner (false)
     656        , mIsRegDlgOwner (false)
     657        , mIsUpdDlgOwner (false)
     658#ifdef VBOX_GUI_WITH_SYSTRAY
     659        , mIsTrayIconOwner (false)
     660#endif
    657661    {
    658662#if defined (Q_OS_WIN32)
     
    763767                    return S_OK;
    764768                }
    765 
     769#ifdef VBOX_GUI_WITH_SYSTRAY
     770                if (sKey == VBoxDefs::GUI_TrayIconWinID)
     771                {
     772                    if (mIsTrayIconOwner)
     773                    {
     774                        if (sVal.isEmpty() ||
     775                            sVal == QString ("%1")
     776                                .arg ((qulonglong) vboxGlobal().mainWindow()->winId()))
     777                            *allowChange = TRUE;
     778                        else
     779                            *allowChange = FALSE;
     780                    }
     781                    else
     782                        *allowChange = TRUE;
     783                    return S_OK;
     784                }
     785#endif
    766786                /* try to set the global setting to check its syntax */
    767787                VBoxGlobalSettings gs (false /* non-null */);
     
    831851                if (sKey == "GUI/LanguageID")
    832852                    QApplication::postEvent (&mGlobal, new VBoxChangeGUILanguageEvent (sVal));
    833             #ifdef VBOX_GUI_WITH_SYSTRAY
     853#ifdef VBOX_GUI_WITH_SYSTRAY
     854                if (sKey == VBoxDefs::GUI_TrayIconWinID)
     855                {
     856                    if (sVal.isEmpty())
     857                    {
     858                        mIsTrayIconOwner = false;
     859                        QApplication::postEvent (&mGlobal, new VBoxCanShowTrayIconEvent (true));
     860                    }
     861                    else if (sVal == QString ("%1")
     862                             .arg ((qulonglong) vboxGlobal().mainWindow()->winId()))
     863                    {
     864                        mIsTrayIconOwner = true;
     865                        QApplication::postEvent (&mGlobal, new VBoxCanShowTrayIconEvent (true));
     866                    }
     867                    else
     868                        QApplication::postEvent (&mGlobal, new VBoxCanShowTrayIconEvent (false));
     869                }
    834870                if (sKey == "GUI/TrayIcon/Enabled")
    835                     QApplication::postEvent (&mGlobal, new VBoxChangeGUITrayIconEvent ((sVal.toLower() == "true") ? true : false));
    836             #endif
     871                    QApplication::postEvent (&mGlobal, new VBoxChangeTrayIconEvent ((sVal.toLower() == "true") ? true : false));
     872#endif
    837873
    838874                mMutex.lock();
     
    920956    bool mIsRegDlgOwner;
    921957    bool mIsUpdDlgOwner;
     958#ifdef VBOX_GUI_WITH_SYSTRAY
     959    bool mIsTrayIconOwner;
     960#endif
    922961
    923962#if defined (Q_OS_WIN32)
     
    11891228    , mSelectorWnd (NULL), mConsoleWnd (NULL)
    11901229    , mMainWindow (NULL)
     1230#ifdef VBOX_GUI_WITH_SYSTRAY
     1231    , mIsTrayIcon (false)
     1232#endif
    11911233#ifdef VBOX_WITH_REGISTRATION
    11921234    , mRegDlg (NULL)
     
    13571399    return *mConsoleWnd;
    13581400}
     1401
     1402#ifdef VBOX_GUI_WITH_SYSTRAY
     1403
     1404/**
     1405 *  Returns true if the current instance is responsible of showing/handling
     1406 *  the tray icon.
     1407 */
     1408bool VBoxGlobal::isTrayIcon() const
     1409{
     1410    return mIsTrayIcon;
     1411}
     1412
     1413/**
     1414 *  Tries to install the tray icon using the current instance (singleton).
     1415 *  Returns true on success, false on failure.
     1416 */
     1417bool VBoxGlobal::trayIconInstall()
     1418{
     1419    if (false == QSystemTrayIcon::isSystemTrayAvailable())
     1420        return false;
     1421
     1422    AssertMsg (vboxGlobal().mainWindow(),
     1423               ("Main window must not be null for systray!"));
     1424
     1425    mVBox.SetExtraData (VBoxDefs::GUI_TrayIconWinID,
     1426                        QString ("%1").arg ((qulonglong) vboxGlobal().mainWindow()->winId()));
     1427
     1428    /* The first process which can grab this "mutex" will win ->
     1429     * It will be the tray icon menu then. */
     1430    if (mVBox.isOk())
     1431    {
     1432        mIsTrayIcon = true;
     1433        emit trayIconChanged (*(new VBoxChangeTrayIconEvent (vboxGlobal().settings().trayIconEnabled())));
     1434    }
     1435
     1436    return mIsTrayIcon;
     1437}
     1438
     1439#endif
    13591440
    13601441/**
     
    50485129        }
    50495130#ifdef VBOX_GUI_WITH_SYSTRAY
    5050         case VBoxDefs::ChangeGUITrayIconEventType:
    5051         {
    5052             emit systrayIconChanged (*(VBoxChangeGUITrayIconEvent *) e);
     5131        case VBoxDefs::CanShowTrayIconEventType:
     5132        {
     5133            emit trayIconCanShow (*(VBoxCanShowTrayIconEvent *) e);
    50535134            return true;
    50545135        }
     5136        case VBoxDefs::ChangeTrayIconEventType:
     5137        {
     5138            emit trayIconChanged (*(VBoxChangeTrayIconEvent *) e);
     5139            return true;
     5140        }
    50555141#endif
    5056 
    50575142        default:
    50585143            break;
  • trunk/src/VBox/Frontends/VirtualBox4/src/VBoxSelectorWnd.cpp

    r14509 r14578  
    675675             this, SLOT (snapshotChanged (const VBoxSnapshotEvent &)));
    676676#ifdef VBOX_GUI_WITH_SYSTRAY
    677     connect (&vboxGlobal(), SIGNAL (systrayIconChanged (const VBoxChangeGUITrayIconEvent &)),
    678              this, SLOT (systrayIconChanged (const VBoxChangeGUITrayIconEvent &)));
     677    connect (&vboxGlobal(), SIGNAL (trayIconCanShow (const VBoxCanShowTrayIconEvent &)),
     678             this, SLOT (trayIconCanShow (const VBoxCanShowTrayIconEvent &)));
     679    connect (&vboxGlobal(), SIGNAL (trayIconChanged (const VBoxChangeTrayIconEvent &)),
     680             this, SLOT (trayIconChanged (const VBoxChangeTrayIconEvent &)));
    679681#endif
    680682
    681683    /* bring the VM list to the focus */
    682684    mVMListView->setFocus();
    683 
    684 #ifdef VBOX_GUI_WITH_SYSTRAY
    685     mTrayIcon->trayIconShow (settings.trayIconEnabled());
    686 #endif
    687685}
    688686
     
    10851083
    10861084#ifdef VBOX_GUI_WITH_SYSTRAY
    1087     mTrayIcon->refresh();
     1085    if (vboxGlobal().isTrayIcon())
     1086        mTrayIcon->refresh();
    10881087#endif
    10891088}
     
    13191318
    13201319#ifdef VBOX_GUI_WITH_SYSTRAY
    1321     mTrayIcon->retranslateUi();
    1322     mTrayIcon->refresh();
     1320    if (vboxGlobal().isTrayIcon())
     1321    {
     1322        mTrayIcon->retranslateUi();
     1323        mTrayIcon->refresh();
     1324    }
    13231325#endif
    13241326}
     
    16131615#ifdef VBOX_GUI_WITH_SYSTRAY
    16141616
    1615 void VBoxSelectorWnd::systrayIconChanged (const VBoxChangeGUITrayIconEvent &aEvent)
     1617void VBoxSelectorWnd::trayIconCanShow (const VBoxCanShowTrayIconEvent &aEvent)
     1618{
     1619    emit trayIconChanged (VBoxChangeTrayIconEvent (vboxGlobal().settings().trayIconEnabled()));
     1620}
     1621
     1622void VBoxSelectorWnd::trayIconChanged (const VBoxChangeTrayIconEvent &aEvent)
    16161623{
    16171624    mTrayIcon->trayIconShow (aEvent.mEnabled);
     
    16721679    connect (mShowSelectorAction, SIGNAL (triggered()), mParent, SLOT (showWindow()));
    16731680    connect (mHideSystrayMenuAction, SIGNAL (triggered()), this, SLOT (trayIconShow()));
    1674 
    1675     VBoxGlobalSettings settings = vboxGlobal().settings();
    1676     trayIconShow (settings.trayIconEnabled());
    16771681}
    16781682
    16791683VBoxTrayIcon::~VBoxTrayIcon ()
    16801684{
    1681     hide();
     1685    /* Erase dialog handle in config file. */
     1686    if (vboxGlobal().isTrayIcon())
     1687    {
     1688        vboxGlobal().virtualBox().SetExtraData (VBoxDefs::GUI_TrayIconWinID,
     1689                                                QString::null);
     1690        hide();
     1691    }
    16821692}
    16831693
     
    17151725void VBoxTrayIcon::showSubMenu ()
    17161726{
     1727    if (!mActive)
     1728        return;
     1729
    17171730    VBoxVMItem* pItem = NULL;
    17181731    QMenu *pMenu = NULL;
    17191732    QVariant vID;
    1720 
    1721     if (!mActive)
    1722         return;
    17231733
    17241734    if ((pMenu = qobject_cast<QMenu*>(sender())))
     
    18341844void VBoxTrayIcon::hideSubMenu ()
    18351845{
     1846    if (!mActive)
     1847        return;
     1848
    18361849    VBoxVMItem* pItem = NULL;
    18371850    QVariant vID;
    1838 
    1839     if (!mActive)
    1840         return;
    18411851
    18421852    if (QMenu *pMenu = qobject_cast<QMenu*>(sender()))
     
    19281938void VBoxTrayIcon::trayIconShow (bool aShow)
    19291939{
    1930     if (false == QSystemTrayIcon::isSystemTrayAvailable())
    1931         return;
    1932 
    1933     mActive = aShow;   
     1940    mActive = aShow;
    19341941    if (mActive)
    19351942    {
  • trunk/src/VBox/Frontends/VirtualBox4/src/main.cpp

    r14198 r14578  
    374374                vboxGlobal().startEnumeratingMedia();
    375375                vboxGlobal().setMainWindow (&vboxGlobal().selectorWnd());
     376#ifdef VBOX_GUI_WITH_SYSTRAY
     377                if (   vboxGlobal().trayIconInstall()
     378                    && vboxGlobal().isTrayIcon())
     379                {
     380                    /* Nothing to do here yet. */
     381                }
     382#endif
    376383                vboxGlobal().selectorWnd().show();
    377384#ifdef VBOX_WITH_REGISTRATION_REQUEST
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