modernize: Use auto where the type is clear from context
[quassel.git] / src / uisupport / graphicalui.cpp
index 19a28c2..2042fef 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2012 by the Quassel Project                        *
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This contains code from KStatusNotifierItem, part of the KDE libs     *
 #ifdef Q_WS_X11
 #  include <QX11Info>
 #endif
-#ifdef HAVE_KDE
-#  include <KWindowInfo>
-#  include <KWindowSystem>
-#endif
 
-GraphicalUi *GraphicalUi::_instance = 0;
-QWidget *GraphicalUi::_mainWidget = 0;
+QWidget *GraphicalUi::_mainWidget = nullptr;
 QHash<QString, ActionCollection *> GraphicalUi::_actionCollections;
-ContextMenuActionProvider *GraphicalUi::_contextMenuActionProvider = 0;
-ToolBarActionProvider *GraphicalUi::_toolBarActionProvider = 0;
-UiStyle *GraphicalUi::_uiStyle = 0;
-bool GraphicalUi::_onAllDesktops = false;
+ContextMenuActionProvider *GraphicalUi::_contextMenuActionProvider = nullptr;
+ToolBarActionProvider *GraphicalUi::_toolBarActionProvider = nullptr;
+UiStyle *GraphicalUi::_uiStyle = nullptr;
+
 
-GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent)
+GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent), Singleton<GraphicalUi>(this)
 {
-    Q_ASSERT(!_instance);
-    _instance = this;
+    Q_INIT_RESOURCE(pics);
+    Q_INIT_RESOURCE(hicolor_icons);
+#ifdef EMBED_DATA
+    Q_INIT_RESOURCE(icons);
+    Q_INIT_RESOURCE(iconthemes);
+#endif
 
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
     _dwTickCount = 0;
 #endif
+#ifdef Q_OS_MAC
+    GetFrontProcess(&_procNum);
+#endif
 }
 
 
 void GraphicalUi::init()
 {
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
     mainWidget()->installEventFilter(this);
 #endif
 }
@@ -67,7 +69,7 @@ ActionCollection *GraphicalUi::actionCollection(const QString &category, const Q
 {
     if (_actionCollections.contains(category))
         return _actionCollections.value(category);
-    ActionCollection *coll = new ActionCollection(_mainWidget);
+    auto *coll = new ActionCollection(_mainWidget);
 
     if (!translatedCategory.isEmpty())
         coll->setProperty("Category", translatedCategory);
@@ -137,7 +139,7 @@ void GraphicalUi::disconnectedFromCore()
 
 bool GraphicalUi::eventFilter(QObject *obj, QEvent *event)
 {
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
     if (obj == mainWidget() && event->type() == QEvent::ActivationChange) {
         _dwTickCount = GetTickCount();
     }
@@ -146,11 +148,14 @@ bool GraphicalUi::eventFilter(QObject *obj, QEvent *event)
 }
 
 
+// NOTE: Window activation stuff seems to work just fine in Plasma 5 without requiring X11 hacks.
+// TODO: Evaluate cleaning all this up once we can get rid of Qt4/KDE4
+
 // Code taken from KStatusNotifierItem for handling minimize/restore
 
 bool GraphicalUi::checkMainWidgetVisibility(bool perform)
 {
-#ifdef Q_WS_WIN
+#ifdef Q_OS_WIN
     // the problem is that we lose focus when the systray icon is activated
     // and we don't know the former active window
     // therefore we watch for activation event and use our stopwatch :)
@@ -166,65 +171,6 @@ bool GraphicalUi::checkMainWidgetVisibility(bool perform)
         return true;
     }
 
-#elif defined(HAVE_KDE) && defined(Q_WS_X11)
-    KWindowInfo info1 = KWindowSystem::windowInfo(mainWidget()->winId(), NET::XAWMState | NET::WMState | NET::WMDesktop);
-    // mapped = visible (but possibly obscured)
-    bool mapped = (info1.mappingState() == NET::Visible) && !info1.isMinimized();
-
-    //    - not mapped -> show, raise, focus
-    //    - mapped
-    //        - obscured -> raise, focus
-    //        - not obscured -> hide
-    //info1.mappingState() != NET::Visible -> window on another desktop?
-    if (!mapped) {
-        if (perform)
-            minimizeRestore(true);
-        return true;
-    }
-    else {
-        QListIterator<WId> it(KWindowSystem::stackingOrder());
-        it.toBack();
-        while (it.hasPrevious()) {
-            WId id = it.previous();
-            if (id == mainWidget()->winId())
-                break;
-
-            KWindowInfo info2 = KWindowSystem::windowInfo(id, NET::WMDesktop | NET::WMGeometry | NET::XAWMState | NET::WMState | NET::WMWindowType);
-
-            if (info2.mappingState() != NET::Visible)
-                continue;  // not visible on current desktop -> ignore
-
-            if (!info2.geometry().intersects(mainWidget()->geometry()))
-                continue;  // not obscuring the window -> ignore
-
-            if (!info1.hasState(NET::KeepAbove) && info2.hasState(NET::KeepAbove))
-                continue;  // obscured by window kept above -> ignore
-
-            NET::WindowType type = info2.windowType(NET::NormalMask | NET::DesktopMask
-                | NET::DockMask | NET::ToolbarMask | NET::MenuMask | NET::DialogMask
-                | NET::OverrideMask | NET::TopMenuMask | NET::UtilityMask | NET::SplashMask);
-
-            if (type == NET::Dock || type == NET::TopMenu)
-                continue;  // obscured by dock or topmenu -> ignore
-
-            if (perform) {
-                KWindowSystem::raiseWindow(mainWidget()->winId());
-                KWindowSystem::activateWindow(mainWidget()->winId());
-            }
-            return true;
-        }
-
-        //not on current desktop?
-        if (!info1.isOnCurrentDesktop()) {
-            if (perform)
-                KWindowSystem::activateWindow(mainWidget()->winId());
-            return true;
-        }
-
-        if (perform)
-            minimizeRestore(false);  // hide
-        return false;
-    }
 #else
 
     if (!mainWidget()->isVisible() || mainWidget()->isMinimized() || !mainWidget()->isActiveWindow()) {
@@ -261,29 +207,6 @@ void GraphicalUi::minimizeRestore(bool show)
 
 void GraphicalUi::activateMainWidget()
 {
-#ifdef HAVE_KDE
-#  ifdef Q_WS_X11
-    KWindowInfo info = KWindowSystem::windowInfo(mainWidget()->winId(), NET::WMDesktop | NET::WMFrameExtents);
-    if (_onAllDesktops) {
-        KWindowSystem::setOnAllDesktops(mainWidget()->winId(), true);
-    }
-    else {
-        KWindowSystem::setCurrentDesktop(info.desktop());
-    }
-
-    mainWidget()->move(info.frameGeometry().topLeft()); // avoid placement policies
-    mainWidget()->show();
-    mainWidget()->raise();
-    KWindowSystem::raiseWindow(mainWidget()->winId());
-    KWindowSystem::activateWindow(mainWidget()->winId());
-#  else
-    mainWidget()->show();
-    KWindowSystem::raiseWindow(mainWidget()->winId());
-    KWindowSystem::forceActiveWindow(mainWidget()->winId());
-#  endif
-
-#else /* HAVE_KDE */
-
 #ifdef Q_WS_X11
     // Bypass focus stealing prevention
     QX11Info::setAppUserTime(QX11Info::appTime());
@@ -296,23 +219,24 @@ void GraphicalUi::activateMainWidget()
 
     // this does not actually work on all platforms... and causes more evil than good
     // mainWidget()->move(mainWidget()->frameGeometry().topLeft()); // avoid placement policies
+#ifdef Q_OS_MAC
+    SetFrontProcess(&instance()->_procNum);
+#else
     mainWidget()->show();
     mainWidget()->raise();
     mainWidget()->activateWindow();
-
-#endif /* HAVE_KDE */
+#endif
 }
 
 
 void GraphicalUi::hideMainWidget()
 {
-#if defined(HAVE_KDE) && defined(Q_WS_X11)
-    KWindowInfo info = KWindowSystem::windowInfo(mainWidget()->winId(), NET::WMDesktop | NET::WMFrameExtents);
-    _onAllDesktops = info.onAllDesktops();
-#endif
-
     if (instance()->isHidingMainWidgetAllowed())
+#ifdef Q_OS_MAC
+        ShowHideProcess(&instance()->_procNum, false);
+#else
         mainWidget()->hide();
+#endif
 }