From dc274ae1b3f7960fdbff194f8f098d797c7e792b Mon Sep 17 00:00:00 2001 From: cutefishd Date: Fri, 30 Apr 2021 09:57:54 +0800 Subject: [PATCH] Refactor activity --- src/activity.cpp | 68 +++++++++++++++++++++++++++++++++++++++++------- src/activity.h | 5 ++++ 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/activity.cpp b/src/activity.cpp index 8d4a530..4e4a7af 100644 --- a/src/activity.cpp +++ b/src/activity.cpp @@ -29,6 +29,10 @@ #include #include +static const QStringList blockList = {"cutefish-launcher", + "cutefish-desktop", + "cutefish-statusbar"}; + Activity::Activity(QObject *parent) : QObject(parent) , m_cApps(CApplications::self()) @@ -55,20 +59,53 @@ void Activity::close() NETRootInfo(QX11Info::connection(), NET::CloseWindow).closeWindowRequest(KWindowSystem::activeWindow()); } +bool Activity::isAcceptableWindow(quint64 wid) +{ + QFlags ignoreList; + ignoreList |= NET::DesktopMask; + ignoreList |= NET::DockMask; + ignoreList |= NET::SplashMask; + ignoreList |= NET::ToolbarMask; + ignoreList |= NET::MenuMask; + ignoreList |= NET::PopupMenuMask; + ignoreList |= NET::NotificationMask; + + KWindowInfo info(wid, NET::WMWindowType | NET::WMState, NET::WM2TransientFor | NET::WM2WindowClass); + + if (!info.valid()) + return false; + + if (NET::typeMatchesMask(info.windowType(NET::AllTypesMask), ignoreList)) + return false; + + if (info.hasState(NET::SkipTaskbar) || info.hasState(NET::SkipPager)) + return false; + + // WM_TRANSIENT_FOR hint not set - normal window + WId transFor = info.transientFor(); + if (transFor == 0 || transFor == wid || transFor == (WId) QX11Info::appRootWindow()) + return true; + + info = KWindowInfo(transFor, NET::WMWindowType); + + QFlags normalFlag; + normalFlag |= NET::NormalMask; + normalFlag |= NET::DialogMask; + normalFlag |= NET::UtilityMask; + + return !NET::typeMatchesMask(info.windowType(NET::AllTypesMask), normalFlag); +} + void Activity::onActiveWindowChanged() { KWindowInfo info(KWindowSystem::activeWindow(), NET::WMState | NET::WMVisibleName, NET::WM2WindowClass); - // Skip... - if (info.windowClassClass() == "cutefish-launcher" || - info.windowClassClass() == "cutefish-desktop" || - info.windowClassClass() == "cutefish-statusbar") { - m_title.clear(); - m_icon.clear(); - emit titleChanged(); - emit iconChanged(); + if (!isAcceptableWindow(KWindowSystem::activeWindow()) + || blockList.contains(info.windowClassClass())) { + clearTitle(); + clearIcon(); return; } @@ -91,8 +128,19 @@ void Activity::onActiveWindowChanged() if (title != m_title) { m_title = title; emit titleChanged(); - m_icon.clear(); - emit iconChanged(); + clearIcon(); } } } + +void Activity::clearTitle() +{ + m_title.clear(); + emit titleChanged(); +} + +void Activity::clearIcon() +{ + m_icon.clear(); + emit iconChanged(); +} diff --git a/src/activity.h b/src/activity.h index 6cec4d9..2f751b9 100644 --- a/src/activity.h +++ b/src/activity.h @@ -37,9 +37,14 @@ public: Q_INVOKABLE void close(); + bool isAcceptableWindow(quint64 wid); + private slots: void onActiveWindowChanged(); + void clearTitle(); + void clearIcon(); + signals: void titleChanged(); void iconChanged();