From ff2b81a4f94d9384647fd6d69ef13dcbf07ac586 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Wed, 31 Jul 2019 16:44:43 +0300 Subject: [PATCH] introduce windowCanBeMaximized --trying to avoid interacting with windows that DO NOT allow it --- app/wm/abstractwindowinterface.h | 1 + app/wm/tracker/lastactivewindow.cpp | 4 ++++ app/wm/waylandinterface.cpp | 17 ++++++++++++++++- app/wm/waylandinterface.h | 3 ++- app/wm/xwindowinterface.cpp | 20 ++++++++++++++++++++ app/wm/xwindowinterface.h | 1 + 6 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/wm/abstractwindowinterface.h b/app/wm/abstractwindowinterface.h index 3f1bf2481..b36077923 100644 --- a/app/wm/abstractwindowinterface.h +++ b/app/wm/abstractwindowinterface.h @@ -109,6 +109,7 @@ public: virtual void requestToggleMaximized(WindowId wid) const = 0; virtual bool windowCanBeDragged(WindowId wid) const = 0; + virtual bool windowCanBeMaximized(WindowId wid) const = 0; virtual QIcon iconFor(WindowId wid) const = 0; virtual WindowId winIdFor(QString appId, QRect geometry) const = 0; diff --git a/app/wm/tracker/lastactivewindow.cpp b/app/wm/tracker/lastactivewindow.cpp index e4a5eab0b..80ea445ae 100644 --- a/app/wm/tracker/lastactivewindow.cpp +++ b/app/wm/tracker/lastactivewindow.cpp @@ -391,6 +391,10 @@ void LastActiveWindow::requestClose() void LastActiveWindow::requestMove(Latte::View *fromView, int localX, int localY) { + if (!canBeDragged()) { + return; + } + QPoint globalPoint{fromView->x() + localX, fromView->y() + localY}; m_wm->requestMoveWindow(m_winId, globalPoint); diff --git a/app/wm/waylandinterface.cpp b/app/wm/waylandinterface.cpp index b6b03b0c8..b5da825ad 100644 --- a/app/wm/waylandinterface.cpp +++ b/app/wm/waylandinterface.cpp @@ -523,6 +523,21 @@ bool WaylandInterface::windowCanBeDragged(WindowId wid) const return false; } +bool WaylandInterface::windowCanBeMaximized(WindowId wid) const +{ + auto w = windowFor(wid); + + if (w && isValidWindow(w)) { + WindowInfoWrap winfo = requestInfo(wid); + return (winfo.isValid() + && w->isMaximizeable() + && !winfo.isMinimized() + && !winfo.isPlasmaDesktop()); + } + + return false; +} + void WaylandInterface::releaseMouseEventFor(WindowId wid) const { // this isnt really needed under wayland @@ -604,7 +619,7 @@ void WaylandInterface::requestToggleMaximized(WindowId wid) const { auto w = windowFor(wid); - if (w && isValidWindow(w)) { + if (w && isValidWindow(w) && windowCanBeMaximized(wid)) { #if KF5_VERSION_MINOR >= 52 if (!m_currentDesktop.isEmpty()) { w->requestEnterVirtualDesktop(m_currentDesktop); diff --git a/app/wm/waylandinterface.h b/app/wm/waylandinterface.h index 51068ddca..ee2fa10a9 100644 --- a/app/wm/waylandinterface.h +++ b/app/wm/waylandinterface.h @@ -86,7 +86,8 @@ public: void requestToggleMinimized(WindowId wid) const override; void requestToggleMaximized(WindowId wid) const override; - bool windowCanBeDragged(WindowId wid) const; + bool windowCanBeDragged(WindowId wid) const override; + bool windowCanBeMaximized(WindowId wid) const override; QIcon iconFor(WindowId wid) const; WindowId winIdFor(QString appId, QRect geometry) const override; diff --git a/app/wm/xwindowinterface.cpp b/app/wm/xwindowinterface.cpp index 312dd2b93..d9a93763d 100644 --- a/app/wm/xwindowinterface.cpp +++ b/app/wm/xwindowinterface.cpp @@ -397,6 +397,7 @@ QUrl XWindowInterface::windowUrl(WindowId wid) const bool XWindowInterface::windowCanBeDragged(WindowId wid) const { KWindowInfo info(wid.value(), 0, NET::WM2AllowedActions); + if (info.valid()) { WindowInfoWrap winfo = requestInfo(wid); return (winfo.isValid() @@ -408,6 +409,21 @@ bool XWindowInterface::windowCanBeDragged(WindowId wid) const return false; } +bool XWindowInterface::windowCanBeMaximized(WindowId wid) const +{ + KWindowInfo info(wid.value(), 0, NET::WM2AllowedActions); + + if (info.valid()) { + WindowInfoWrap winfo = requestInfo(wid); + return (winfo.isValid() + && !winfo.isMinimized() + && info.actionSupported(NET::ActionMax) + && !winfo.isPlasmaDesktop()); + } + + return false; +} + void XWindowInterface::releaseMouseEventFor(WindowId wid) const { auto connection = QX11Info::connection(); @@ -550,6 +566,10 @@ void XWindowInterface::requestToggleMinimized(WindowId wid) const void XWindowInterface::requestToggleMaximized(WindowId wid) const { + if (!windowCanBeMaximized(wid)) { + return; + } + WindowInfoWrap wInfo = requestInfo(wid); bool restore = wInfo.isMaxHoriz() && wInfo.isMaxVert(); diff --git a/app/wm/xwindowinterface.h b/app/wm/xwindowinterface.h index 4ad3e6b9c..a52ecbb61 100644 --- a/app/wm/xwindowinterface.h +++ b/app/wm/xwindowinterface.h @@ -71,6 +71,7 @@ public: void requestToggleMaximized(WindowId wid) const override; bool windowCanBeDragged(WindowId wid) const override; + bool windowCanBeMaximized(WindowId wid) const override; QIcon iconFor(WindowId wid) const override; WindowId winIdFor(QString appId, QRect geometry) const override;