X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fgraphicalui.cpp;h=33b0d87b9f9d35df8abd98d1479e4a0453b3bc6d;hp=83b0ce5be871fab60d097663e966fdc0c14ae0a3;hb=219d124b5000b39d90482f575b6ceb838c037ebc;hpb=4a5065255e652dd0c301bac0db41b7afb777ef49 diff --git a/src/uisupport/graphicalui.cpp b/src/uisupport/graphicalui.cpp index 83b0ce5b..33b0d87b 100644 --- a/src/uisupport/graphicalui.cpp +++ b/src/uisupport/graphicalui.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2013 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 * @@ -24,50 +24,51 @@ #include "graphicalui.h" #include "actioncollection.h" -#include "uisettings.h" #include "contextmenuactionprovider.h" #include "toolbaractionprovider.h" +#include "uisettings.h" #ifdef Q_WS_X11 -# include +# include #endif -#ifdef HAVE_KDE -# include -# include -#endif - -GraphicalUi *GraphicalUi::_instance = 0; -QWidget *GraphicalUi::_mainWidget = 0; -QHash GraphicalUi::_actionCollections; -ContextMenuActionProvider *GraphicalUi::_contextMenuActionProvider = 0; -ToolBarActionProvider *GraphicalUi::_toolBarActionProvider = 0; -UiStyle *GraphicalUi::_uiStyle = 0; -bool GraphicalUi::_onAllDesktops = false; -GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent) -{ - Q_ASSERT(!_instance); - _instance = this; +QWidget* GraphicalUi::_mainWidget = nullptr; +QHash GraphicalUi::_actionCollections; +ContextMenuActionProvider* GraphicalUi::_contextMenuActionProvider = nullptr; +ToolBarActionProvider* GraphicalUi::_toolBarActionProvider = nullptr; +UiStyle* GraphicalUi::_uiStyle = nullptr; + +GraphicalUi::GraphicalUi(QObject* parent) + : AbstractUi(parent) + , Singleton(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 } - -ActionCollection *GraphicalUi::actionCollection(const QString &category, const QString &translatedCategory) +ActionCollection* GraphicalUi::actionCollection(const QString& category, const QString& translatedCategory) { 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); @@ -80,53 +81,45 @@ ActionCollection *GraphicalUi::actionCollection(const QString &category, const Q return coll; } - -QHash GraphicalUi::actionCollections() +QHash GraphicalUi::actionCollections() { return _actionCollections; } - void GraphicalUi::loadShortcuts() { - foreach(ActionCollection *coll, actionCollections()) - coll->readSettings(); + foreach (ActionCollection* coll, actionCollections()) + coll->readSettings(); } - void GraphicalUi::saveShortcuts() { ShortcutSettings s; s.clear(); - foreach(ActionCollection *coll, actionCollections()) - coll->writeSettings(); + foreach (ActionCollection* coll, actionCollections()) + coll->writeSettings(); } - -void GraphicalUi::setMainWidget(QWidget *widget) +void GraphicalUi::setMainWidget(QWidget* widget) { _mainWidget = widget; } - -void GraphicalUi::setContextMenuActionProvider(ContextMenuActionProvider *provider) +void GraphicalUi::setContextMenuActionProvider(ContextMenuActionProvider* provider) { _contextMenuActionProvider = provider; } - -void GraphicalUi::setToolBarActionProvider(ToolBarActionProvider *provider) +void GraphicalUi::setToolBarActionProvider(ToolBarActionProvider* provider) { _toolBarActionProvider = provider; } - -void GraphicalUi::setUiStyle(UiStyle *style) +void GraphicalUi::setUiStyle(UiStyle* style) { _uiStyle = style; } - void GraphicalUi::disconnectedFromCore() { _contextMenuActionProvider->disconnectedFromCore(); @@ -134,10 +127,9 @@ void GraphicalUi::disconnectedFromCore() AbstractUi::disconnectedFromCore(); } - -bool GraphicalUi::eventFilter(QObject *obj, QEvent *event) +bool GraphicalUi::eventFilter(QObject* obj, QEvent* event) { -#ifdef Q_WS_WIN +#ifdef Q_OS_WIN if (obj == mainWidget() && event->type() == QEvent::ActivationChange) { _dwTickCount = GetTickCount(); } @@ -145,111 +137,40 @@ bool GraphicalUi::eventFilter(QObject *obj, QEvent *event) return AbstractUi::eventFilter(obj, 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 + bool needsActivation{true}; + +#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 :) if (GetTickCount() - _dwTickCount < 300) { // we were active in the last 300ms -> hide it - if (perform) - minimizeRestore(false); - return false; - } - else { - if (perform) - minimizeRestore(true); - 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 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; + needsActivation = false; } #else - - if (!mainWidget()->isVisible() || mainWidget()->isMinimized() || !mainWidget()->isActiveWindow()) { - if (perform) - minimizeRestore(true); - return true; - } - else { - if (perform) - minimizeRestore(false); - return false; + if (mainWidget()->isVisible() && !mainWidget()->isMinimized() && mainWidget()->isActiveWindow()) { + needsActivation = false; } - #endif - return true; + if (perform) { + minimizeRestore(needsActivation); + } + return needsActivation; } - bool GraphicalUi::isMainWidgetVisible() { return !instance()->checkMainWidgetVisibility(false); } - void GraphicalUi::minimizeRestore(bool show) { if (show) @@ -258,32 +179,8 @@ void GraphicalUi::minimizeRestore(bool show) hideMainWidget(); } - 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,26 +193,25 @@ 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 } - void GraphicalUi::toggleMainWidget() { instance()->checkMainWidgetVisibility(true);