From 97332cc8cfb4103d99ff3700f9fcc07e53ac4347 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Mon, 27 May 2019 18:56:24 +0300 Subject: [PATCH] introduce Display and Icon for WindowInfoWrap --- app/CMakeLists.txt | 21 ++++++++++--------- app/wm/abstractwindowinterface.h | 1 + app/wm/waylandinterface.cpp | 15 ++++++++++++++ app/wm/waylandinterface.h | 1 + app/wm/windowinfowrap.h | 35 ++++++++++++++++++++++++++++++++ app/wm/windowstracker.cpp | 1 + app/wm/xwindowinterface.cpp | 30 +++++++++++++++++++++++---- app/wm/xwindowinterface.h | 1 + 8 files changed, 91 insertions(+), 14 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index c6eeb4ee7..c8fbf8b00 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -33,22 +33,23 @@ target_link_libraries(latte-dock Qt5::DBus Qt5::Quick Qt5::Qml - KF5::I18n + KF5::Activities + KF5::Archive + KF5::CoreAddons + KF5::Crash KF5::DBusAddons KF5::Declarative - KF5::CoreAddons KF5::GuiAddons KF5::GlobalAccel - KF5::Archive - KF5::Crash - KF5::XmlGui - KF5::Plasma - KF5::PlasmaQuick - KF5::Activities + KF5::I18n + KF5::IconThemes KF5::Notifications - KF5::NewStuff - KF5::QuickAddons + KF5::NewStuff + KF5::QuickAddons + KF5::Plasma + KF5::PlasmaQuick KF5::WaylandClient + KF5::XmlGui ) if(HAVE_X11) diff --git a/app/wm/abstractwindowinterface.h b/app/wm/abstractwindowinterface.h index 31b6af56e..a0ea184a0 100644 --- a/app/wm/abstractwindowinterface.h +++ b/app/wm/abstractwindowinterface.h @@ -99,6 +99,7 @@ public: virtual void requestToggleMaximized(WindowId wid) const = 0; virtual void requestMoveWindow(WindowId wid, QPoint from) const = 0; virtual bool windowCanBeDragged(WindowId wid) const = 0; + virtual QIcon iconFor(WindowId wid) const = 0; virtual WindowId winIdFor(QString appId, QRect geometry) const = 0; Latte::Corona *corona(); diff --git a/app/wm/waylandinterface.cpp b/app/wm/waylandinterface.cpp index ce393d8e9..4ef14fb24 100644 --- a/app/wm/waylandinterface.cpp +++ b/app/wm/waylandinterface.cpp @@ -356,6 +356,8 @@ WindowInfoWrap WaylandInterface::requestInfoActive() const winfoWrap.setHasSkipTaskbar(w->skipTaskbar()); + winfoWrap.setDisplay(w->title()); + return winfoWrap; } @@ -424,6 +426,18 @@ KWayland::Client::PlasmaWindow *WaylandInterface::windowFor(WindowId wid) const return *it; } +QIcon WaylandInterface::iconFor(WindowId wid) const +{ + auto window = windowFor(wid); + + if (window) { + return window->icon(); + } + + + return QIcon(); +} + WindowId WaylandInterface::winIdFor(QString appId, QRect geometry) const { auto it = std::find_if(m_windowManagement->windows().constBegin(), m_windowManagement->windows().constEnd(), [&appId, &geometry](PlasmaWindow * w) noexcept { @@ -522,6 +536,7 @@ void WaylandInterface::windowCreatedProxy(KWayland::Client::PlasmaWindow *w) }); connect(w, SIGNAL(activeChanged()), mapper, SLOT(map()) ); + connect(w, SIGNAL(titleChanged()), mapper, SLOT(map()) ); connect(w, SIGNAL(fullscreenChanged()), mapper, SLOT(map()) ); connect(w, SIGNAL(geometryChanged()), mapper, SLOT(map()) ); connect(w, SIGNAL(maximizedChanged()), mapper, SLOT(map()) ); diff --git a/app/wm/waylandinterface.h b/app/wm/waylandinterface.h index 1d795a79d..f3691145a 100644 --- a/app/wm/waylandinterface.h +++ b/app/wm/waylandinterface.h @@ -83,6 +83,7 @@ public: void requestToggleMaximized(WindowId wid) const override; void requestMoveWindow(WindowId wid, QPoint from) const override; bool windowCanBeDragged(WindowId wid) const; + QIcon iconFor(WindowId wid) const; WindowId winIdFor(QString appId, QRect geometry) const override; void setEdgeStateFor(QWindow *view, bool active) const override; diff --git a/app/wm/windowinfowrap.h b/app/wm/windowinfowrap.h index 34073217b..65ecace32 100644 --- a/app/wm/windowinfowrap.h +++ b/app/wm/windowinfowrap.h @@ -23,6 +23,7 @@ // Qt #include +#include #include #include @@ -119,6 +120,12 @@ public: inline QRect geometry() const noexcept; inline void setGeometry(const QRect &geometry) noexcept; + inline QString display() const noexcept; + inline void setDisplay(const QString &display) noexcept; + + inline QIcon icon() const noexcept; + inline void setIcon(const QIcon &icon) noexcept; + inline WindowId wid() const noexcept; inline void setWid(WindowId wid) noexcept; @@ -136,6 +143,10 @@ private: bool m_isPlasmaDesktop : 1; bool m_isKeepAbove: 1; bool m_hasSkipTaskbar: 1; + + QString m_display; + + QIcon m_icon; }; // BEGIN: definitions @@ -153,6 +164,8 @@ inline WindowInfoWrap &WindowInfoWrap::operator=(WindowInfoWrap &&rhs) noexcept m_isPlasmaDesktop = rhs.m_isPlasmaDesktop; m_isKeepAbove = rhs.m_isKeepAbove; m_hasSkipTaskbar = rhs.m_hasSkipTaskbar; + m_display = rhs.m_display; + m_icon = rhs.m_icon; return *this; } @@ -170,6 +183,8 @@ inline WindowInfoWrap &WindowInfoWrap::operator=(const WindowInfoWrap &rhs) noex m_isPlasmaDesktop = rhs.m_isPlasmaDesktop; m_isKeepAbove = rhs.m_isKeepAbove; m_hasSkipTaskbar = rhs.m_hasSkipTaskbar; + m_display = rhs.m_display; + m_icon = rhs.m_icon; return *this; } @@ -293,6 +308,26 @@ inline void WindowInfoWrap::setHasSkipTaskbar(bool skipTaskbar) noexcept m_hasSkipTaskbar = skipTaskbar; } +inline QString WindowInfoWrap::display() const noexcept +{ + return m_display; +} + +inline void WindowInfoWrap::setDisplay(const QString &display) noexcept +{ + m_display = display; +} + +inline QIcon WindowInfoWrap::icon() const noexcept +{ + return m_icon; +} + +inline void WindowInfoWrap::setIcon(const QIcon &icon) noexcept +{ + m_icon = icon; +} + inline QRect WindowInfoWrap::geometry() const noexcept { return m_geometry; diff --git a/app/wm/windowstracker.cpp b/app/wm/windowstracker.cpp index d488c6934..d2ea334a3 100644 --- a/app/wm/windowstracker.cpp +++ b/app/wm/windowstracker.cpp @@ -453,6 +453,7 @@ void WindowsTracker::updateHints(Latte::View *view) if (isActiveInViewScreen(view, winfo)) { m_views[view].lastActiveWindow = winfo.wid(); + qDebug() << " a w d :: " << winfo.display(); foundActiveInCurScreen = true; activeWinId = winfo.wid(); } diff --git a/app/wm/xwindowinterface.cpp b/app/wm/xwindowinterface.cpp index adef8d277..9ea914137 100644 --- a/app/wm/xwindowinterface.cpp +++ b/app/wm/xwindowinterface.cpp @@ -33,6 +33,7 @@ // KDE #include #include +#include // X11 #include @@ -278,10 +279,12 @@ bool XWindowInterface::isOnCurrentActivity(WindowId wid) const WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const { - const KWindowInfo winfo{wid.value(), NET::WMFrameExtents + const KWindowInfo winfo{wid.value(),NET::WMFrameExtents | NET::WMWindowType | NET::WMGeometry - | NET::WMState}; + | NET::WMState + | NET::WMName + | NET::WMVisibleName}; WindowInfoWrap winfoWrap; @@ -297,6 +300,7 @@ WindowInfoWrap XWindowInterface::requestInfo(WindowId wid) const winfoWrap.setGeometry(winfo.frameGeometry()); winfoWrap.setIsKeepAbove(winfo.hasState(NET::KeepAbove)); winfoWrap.setHasSkipTaskbar(winfo.hasState(NET::SkipTaskbar)); + winfoWrap.setDisplay(winfo.visibleName()); } else if (m_desktopId == wid) { winfoWrap.setIsValid(true); winfoWrap.setIsPlasmaDesktop(true); @@ -340,6 +344,18 @@ void XWindowInterface::requestActivate(WindowId wid) const KWindowSystem::activateWindow(wid.toInt()); } +QIcon XWindowInterface::iconFor(WindowId wid) const +{ + QIcon icon; + + icon.addPixmap(KWindowSystem::icon(wid.value(), KIconLoader::SizeSmall, KIconLoader::SizeSmall, false)); + icon.addPixmap(KWindowSystem::icon(wid.value(), KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium, false)); + icon.addPixmap(KWindowSystem::icon(wid.value(), KIconLoader::SizeMedium, KIconLoader::SizeMedium, false)); + icon.addPixmap(KWindowSystem::icon(wid.value(), KIconLoader::SizeLarge, KIconLoader::SizeLarge, false)); + + return icon; +} + WindowId XWindowInterface::winIdFor(QString appId, QRect geometry) const { return activeWindow(); @@ -437,12 +453,18 @@ void XWindowInterface::windowChangedProxy(WId wid, NET::Properties prop1, NET::P //! accept only the following NET:Properties changed signals //! NET::WMState, NET::WMGeometry, NET::ActiveWindow - if (!((prop1 & NET::WMState) || (prop1 & NET::WMGeometry) || (prop1 & NET::ActiveWindow))) { + if ( !(prop1 & NET::WMState) + && !(prop1 & NET::WMGeometry) + && !(prop1 & NET::ActiveWindow) + && !(prop1 & (NET::WMName | NET::WMVisibleName)) ) { return; } //! when only WMState changed we can whitelist the acceptable states - if ((prop1 & NET::WMState) && !(prop1 & NET::WMGeometry) && !(prop1 & NET::ActiveWindow)) { + if ((prop1 & NET::WMState) + && !(prop1 & NET::WMGeometry) + && !(prop1 & NET::ActiveWindow) + && !(prop1 & NET::WMVisibleName)) { KWindowInfo info(wid, NET::WMState); if (info.valid()) { diff --git a/app/wm/xwindowinterface.h b/app/wm/xwindowinterface.h index 3e209b950..9ff4637ab 100644 --- a/app/wm/xwindowinterface.h +++ b/app/wm/xwindowinterface.h @@ -66,6 +66,7 @@ public: void requestToggleMaximized(WindowId wid) const override; void requestMoveWindow(WindowId wid, QPoint from) const override; bool windowCanBeDragged(WindowId wid) const override; + QIcon iconFor(WindowId wid) const override; WindowId winIdFor(QString appId, QRect geometry) const override; void setEdgeStateFor(QWindow *view, bool active) const override;