X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fgraphicalui.cpp;h=fb4a2c7fdbfe7baee1102ce300e1040cb0d8efac;hp=83b0ce5be871fab60d097663e966fdc0c14ae0a3;hb=f18d6c40cd704e26734a77b371ae2c4a284bee38;hpb=04315f46a16fc3627218377071e008b6b9744992 diff --git a/src/uisupport/graphicalui.cpp b/src/uisupport/graphicalui.cpp index 83b0ce5b..fb4a2c7f 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 * @@ -31,12 +31,11 @@ #ifdef Q_WS_X11 # include #endif -#ifdef HAVE_KDE +#ifdef HAVE_KDE4 # include # include #endif -GraphicalUi *GraphicalUi::_instance = 0; QWidget *GraphicalUi::_mainWidget = 0; QHash GraphicalUi::_actionCollections; ContextMenuActionProvider *GraphicalUi::_contextMenuActionProvider = 0; @@ -44,20 +43,35 @@ ToolBarActionProvider *GraphicalUi::_toolBarActionProvider = 0; UiStyle *GraphicalUi::_uiStyle = 0; bool GraphicalUi::_onAllDesktops = false; +namespace { + +GraphicalUi *_instance{nullptr}; + +} + + +GraphicalUi *GraphicalUi::instance() { + return _instance; +} + + GraphicalUi::GraphicalUi(QObject *parent) : AbstractUi(parent) { Q_ASSERT(!_instance); _instance = this; -#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 } @@ -137,7 +151,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 +160,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,7 +183,7 @@ bool GraphicalUi::checkMainWidgetVisibility(bool perform) return true; } -#elif defined(HAVE_KDE) && defined(Q_WS_X11) +#elif defined(HAVE_KDE4) && 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(); @@ -261,7 +278,7 @@ void GraphicalUi::minimizeRestore(bool show) void GraphicalUi::activateMainWidget() { -#ifdef HAVE_KDE +#ifdef HAVE_KDE4 # ifdef Q_WS_X11 KWindowInfo info = KWindowSystem::windowInfo(mainWidget()->winId(), NET::WMDesktop | NET::WMFrameExtents); if (_onAllDesktops) { @@ -282,7 +299,7 @@ void GraphicalUi::activateMainWidget() KWindowSystem::forceActiveWindow(mainWidget()->winId()); # endif -#else /* HAVE_KDE */ +#else /* HAVE_KDE4 */ #ifdef Q_WS_X11 // Bypass focus stealing prevention @@ -296,23 +313,31 @@ 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 -#endif /* HAVE_KDE */ +#endif /* HAVE_KDE4 */ } void GraphicalUi::hideMainWidget() { -#if defined(HAVE_KDE) && defined(Q_WS_X11) +#if defined(HAVE_KDE4) && 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 }