dont drag/maximize windows from different desktops

--the last active window codepath provides a way to
drag and maximize/restore the last active window. This
should not occur when the last active window is not
in the current desktop and activity.

BUG:414089
FIXED-IN:0.9.5
pull/9/head
Michail Vourlakos 5 years ago
parent 63ed290593
commit 6b5f4a952a

@ -146,6 +146,10 @@ bool AbstractWindowInterface::isRegisteredPlasmaPanel(const WindowId &wid)
return m_plasmaPanels.contains(wid); return m_plasmaPanels.contains(wid);
} }
bool AbstractWindowInterface::inCurrentDesktopActivity(const WindowInfoWrap &winfo) const
{
return (winfo.isValid() && winfo.isOnDesktop(currentDesktop()) && winfo.isOnActivity(currentActivity()));
}
//! Register Latte Ignored Windows in order to NOT be tracked //! Register Latte Ignored Windows in order to NOT be tracked
void AbstractWindowInterface::registerIgnoredWindow(WindowId wid) void AbstractWindowInterface::registerIgnoredWindow(WindowId wid)

@ -113,6 +113,8 @@ public:
virtual WindowId winIdFor(QString appId, QRect geometry) const = 0; virtual WindowId winIdFor(QString appId, QRect geometry) const = 0;
virtual AppData appDataFor(WindowId wid) const = 0; virtual AppData appDataFor(WindowId wid) const = 0;
bool inCurrentDesktopActivity(const WindowInfoWrap &winfo) const;
bool isIgnored(const WindowId &wid); bool isIgnored(const WindowId &wid);
bool isRegisteredPlasmaPanel(const WindowId &wid); bool isRegisteredPlasmaPanel(const WindowId &wid);

@ -655,12 +655,6 @@ WindowInfoWrap Windows::infoFor(const WindowId &wid) const
//! Windows Criteria Functions //! Windows Criteria Functions
bool Windows::inCurrentDesktopActivity(const WindowInfoWrap &winfo)
{
return (winfo.isValid() && winfo.isOnDesktop(m_wm->currentDesktop()) && winfo.isOnActivity(m_wm->currentActivity()));
}
bool Windows::intersects(Latte::View *view, const WindowInfoWrap &winfo) bool Windows::intersects(Latte::View *view, const WindowInfoWrap &winfo)
{ {
return (!winfo.isMinimized() && !winfo.isShaded() && winfo.geometry().intersects(view->absoluteGeometry())); return (!winfo.isMinimized() && !winfo.isShaded() && winfo.geometry().intersects(view->absoluteGeometry()));
@ -873,7 +867,7 @@ void Windows::updateHints(Latte::View *view)
existsFaultyWindow = true; existsFaultyWindow = true;
} }
if (winfo.isPlasmaDesktop() || !inCurrentDesktopActivity(winfo) || m_wm->isRegisteredPlasmaPanel(winfo.wid())) { if (winfo.isPlasmaDesktop() || !m_wm->inCurrentDesktopActivity(winfo) || m_wm->isRegisteredPlasmaPanel(winfo.wid())) {
continue; continue;
} }
@ -930,7 +924,7 @@ void Windows::updateHints(Latte::View *view)
WindowId mainWindowId = activeInfo.isChildWindow() ? activeInfo.parentId() : activeWinId; WindowId mainWindowId = activeInfo.isChildWindow() ? activeInfo.parentId() : activeWinId;
for (const auto &winfo : m_windows) { for (const auto &winfo : m_windows) {
if (winfo.isPlasmaDesktop() || !inCurrentDesktopActivity(winfo) || m_wm->isRegisteredPlasmaPanel(winfo.wid())) { if (winfo.isPlasmaDesktop() || !m_wm->inCurrentDesktopActivity(winfo) || m_wm->isRegisteredPlasmaPanel(winfo.wid())) {
continue; continue;
} }
@ -1015,7 +1009,7 @@ void Windows::updateHints(Latte::Layout::GenericLayout *layout) {
existsFaultyWindow = true; existsFaultyWindow = true;
} }
if (winfo.isPlasmaDesktop() || !inCurrentDesktopActivity(winfo) || m_wm->isRegisteredPlasmaPanel(winfo.wid())) { if (winfo.isPlasmaDesktop() || !m_wm->inCurrentDesktopActivity(winfo) || m_wm->isRegisteredPlasmaPanel(winfo.wid())) {
continue; continue;
} }

@ -158,7 +158,6 @@ private:
void setActiveWindowScheme(Latte::Layout::GenericLayout *layout, WindowSystem::SchemeColors *scheme); void setActiveWindowScheme(Latte::Layout::GenericLayout *layout, WindowSystem::SchemeColors *scheme);
//! Windows //! Windows
bool inCurrentDesktopActivity(const WindowInfoWrap &winfo);
bool intersects(Latte::View *view, const WindowInfoWrap &winfo); bool intersects(Latte::View *view, const WindowInfoWrap &winfo);
bool isActive(const WindowInfoWrap &winfo); bool isActive(const WindowInfoWrap &winfo);
bool isActiveInViewScreen(Latte::View *view, const WindowInfoWrap &winfo); bool isActiveInViewScreen(Latte::View *view, const WindowInfoWrap &winfo);

@ -517,6 +517,7 @@ bool WaylandInterface::windowCanBeDragged(WindowId wid) const
return (winfo.isValid() return (winfo.isValid()
&& w->isMovable() && w->isMovable()
&& !winfo.isMinimized() && !winfo.isMinimized()
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop()); && !winfo.isPlasmaDesktop());
} }
@ -532,6 +533,7 @@ bool WaylandInterface::windowCanBeMaximized(WindowId wid) const
return (winfo.isValid() return (winfo.isValid()
&& w->isMaximizeable() && w->isMaximizeable()
&& !winfo.isMinimized() && !winfo.isMinimized()
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop()); && !winfo.isPlasmaDesktop());
} }
@ -559,7 +561,9 @@ void WaylandInterface::requestClose(WindowId wid) const
void WaylandInterface::requestMoveWindow(WindowId wid, QPoint from) const void WaylandInterface::requestMoveWindow(WindowId wid, QPoint from) const
{ {
if (windowCanBeDragged(wid)) { WindowInfoWrap wInfo = requestInfo(wid);
if (windowCanBeDragged(wid) && inCurrentDesktopActivity(wInfo)) {
auto w = windowFor(wid); auto w = windowFor(wid);
if (w && isValidWindow(w)) { if (w && isValidWindow(w)) {
@ -599,8 +603,9 @@ void WaylandInterface::requestToggleKeepAbove(WindowId wid) const
void WaylandInterface::requestToggleMinimized(WindowId wid) const void WaylandInterface::requestToggleMinimized(WindowId wid) const
{ {
auto w = windowFor(wid); auto w = windowFor(wid);
WindowInfoWrap wInfo = requestInfo(wid);
if (w && isValidWindow(w)) { if (w && isValidWindow(w) && inCurrentDesktopActivity(wInfo)) {
#if KF5_VERSION_MINOR >= 52 #if KF5_VERSION_MINOR >= 52
if (!m_currentDesktop.isEmpty()) { if (!m_currentDesktop.isEmpty()) {
w->requestEnterVirtualDesktop(m_currentDesktop); w->requestEnterVirtualDesktop(m_currentDesktop);
@ -613,8 +618,9 @@ void WaylandInterface::requestToggleMinimized(WindowId wid) const
void WaylandInterface::requestToggleMaximized(WindowId wid) const void WaylandInterface::requestToggleMaximized(WindowId wid) const
{ {
auto w = windowFor(wid); auto w = windowFor(wid);
WindowInfoWrap wInfo = requestInfo(wid);
if (w && isValidWindow(w) && windowCanBeMaximized(wid)) { if (w && isValidWindow(w) && windowCanBeMaximized(wid) && inCurrentDesktopActivity(wInfo)) {
#if KF5_VERSION_MINOR >= 52 #if KF5_VERSION_MINOR >= 52
if (!m_currentDesktop.isEmpty()) { if (!m_currentDesktop.isEmpty()) {
w->requestEnterVirtualDesktop(m_currentDesktop); w->requestEnterVirtualDesktop(m_currentDesktop);

@ -409,6 +409,7 @@ bool XWindowInterface::windowCanBeDragged(WindowId wid) const
return (winfo.isValid() return (winfo.isValid()
&& info.actionSupported(NET::ActionMove) && info.actionSupported(NET::ActionMove)
&& !winfo.isMinimized() && !winfo.isMinimized()
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop()); && !winfo.isPlasmaDesktop());
} }
@ -424,6 +425,7 @@ bool XWindowInterface::windowCanBeMaximized(WindowId wid) const
return (winfo.isValid() return (winfo.isValid()
&& !winfo.isMinimized() && !winfo.isMinimized()
&& info.actionSupported(NET::ActionMax) && info.actionSupported(NET::ActionMax)
&& inCurrentDesktopActivity(winfo)
&& !winfo.isPlasmaDesktop()); && !winfo.isPlasmaDesktop());
} }
@ -468,7 +470,7 @@ void XWindowInterface::requestMoveWindow(WindowId wid, QPoint from) const
{ {
WindowInfoWrap wInfo = requestInfo(wid); WindowInfoWrap wInfo = requestInfo(wid);
if (!wInfo.isValid() || wInfo.isPlasmaDesktop()) { if (!wInfo.isValid() || wInfo.isPlasmaDesktop() || !inCurrentDesktopActivity(wInfo)) {
return; return;
} }
@ -531,7 +533,7 @@ void XWindowInterface::requestToggleMinimized(WindowId wid) const
{ {
WindowInfoWrap wInfo = requestInfo(wid); WindowInfoWrap wInfo = requestInfo(wid);
if (!wInfo.isValid() || wInfo.isPlasmaDesktop()) { if (!wInfo.isValid() || wInfo.isPlasmaDesktop() || !inCurrentDesktopActivity(wInfo)) {
return; return;
} }
@ -550,11 +552,12 @@ void XWindowInterface::requestToggleMinimized(WindowId wid) const
void XWindowInterface::requestToggleMaximized(WindowId wid) const void XWindowInterface::requestToggleMaximized(WindowId wid) const
{ {
if (!windowCanBeMaximized(wid)) { WindowInfoWrap wInfo = requestInfo(wid);
if (!windowCanBeMaximized(wid) || !inCurrentDesktopActivity(wInfo)) {
return; return;
} }
WindowInfoWrap wInfo = requestInfo(wid);
bool restore = wInfo.isMaxHoriz() && wInfo.isMaxVert(); bool restore = wInfo.isMaxHoriz() && wInfo.isMaxVert();
if (wInfo.isMinimized()) { if (wInfo.isMinimized()) {

Loading…
Cancel
Save