Skip to content

x11: Fix "Move window to next screen" shortcut for maximized windows

With the recent AbstractOutput changes, Workspace::clientArea() overload that takes only the window and no additional output was changed to

return clientArea(opt, window, window->output());

prior to that, it had been looking up the output at the center of the frame geometry.

As it turns out, AbstractOutput::sendToOutput() blocks geometry updates, which in its turn means that Toplevel::output() will be updated only after geometry updates are unblocked. For the most part, it's not a big deal until you need to use Workspace::clientArea(opt, const Toplevel*)

Since the output won't be updated until geometry updates are unblocked, clientArea(opt, const Toplevel *) may return outdated info.

One could argue that we just simply need to update m_output similar to m_frameGeometry when geometry updates are blocked, but... it's not going to work on wayland! On Wayland, GeometryUpdatesBlocker is totally unnecessary. Even if a window is resized, m_frameGeometry will be left unchanged until the client repaints the window.

Instead, one need to pass the AbstractOutput to clientArea() if it's important.

This change makes X11Client::changeMaximize() query the MaximizeArea of the output containing the center of the move resize geometry, similar to what the XdgToplevelClient does.

BUG: 442534

Merge request reports