x11: Fix client area lookup with pending move resize

If there's a pending move resize, Window::output() won't be updated
until geometry updated are unlocked. We need to use moveResizeOutput()
instead.
master
Vlad Zahorodnii 2 years ago
parent 074a4fd286
commit 18870f67cc

@ -756,7 +756,7 @@ bool X11Window::manage(xcb_window_t w, bool isMapped)
// Placement needs to be after setting size // Placement needs to be after setting size
workspace()->placement()->place(this, area); workspace()->placement()->place(this, area);
// The client may have been moved to another screen, update placement area. // The client may have been moved to another screen, update placement area.
area = workspace()->clientArea(PlacementArea, this); area = workspace()->clientArea(PlacementArea, this, moveResizeOutput());
dontKeepInArea = true; dontKeepInArea = true;
placementDone = true; placementDone = true;
} }
@ -3726,11 +3726,11 @@ void X11Window::getWmNormalHints()
if ((!isSpecialWindow() || isToolbar()) && !isFullScreen()) { if ((!isSpecialWindow() || isToolbar()) && !isFullScreen()) {
// try to keep the window in its xinerama screen if possible, // try to keep the window in its xinerama screen if possible,
// if that fails at least keep it visible somewhere // if that fails at least keep it visible somewhere
QRectF area = workspace()->clientArea(MovementArea, this); QRectF area = workspace()->clientArea(MovementArea, this, moveResizeOutput());
if (area.contains(origClientGeometry)) { if (area.contains(origClientGeometry)) {
keepInArea(area); keepInArea(area);
} }
area = workspace()->clientArea(WorkArea, this); area = workspace()->clientArea(WorkArea, this, moveResizeOutput());
if (area.contains(origClientGeometry)) { if (area.contains(origClientGeometry)) {
keepInArea(area); keepInArea(area);
} }
@ -3940,7 +3940,7 @@ void X11Window::configureRequest(int value_mask, qreal rx, qreal ry, qreal rw, q
GeometryUpdatesBlocker blocker(this); GeometryUpdatesBlocker blocker(this);
move(new_pos); move(new_pos);
resize(requestedFrameSize); resize(requestedFrameSize);
QRectF area = workspace()->clientArea(WorkArea, this); QRectF area = workspace()->clientArea(WorkArea, this, moveResizeOutput());
if (!from_tool && (!isSpecialWindow() || isToolbar()) && !isFullScreen() if (!from_tool && (!isSpecialWindow() || isToolbar()) && !isFullScreen()
&& area.contains(origClientGeometry)) { && area.contains(origClientGeometry)) {
keepInArea(area); keepInArea(area);
@ -3976,11 +3976,11 @@ void X11Window::configureRequest(int value_mask, qreal rx, qreal ry, qreal rw, q
if (!from_tool && (!isSpecialWindow() || isToolbar()) && !isFullScreen()) { if (!from_tool && (!isSpecialWindow() || isToolbar()) && !isFullScreen()) {
// try to keep the window in its xinerama screen if possible, // try to keep the window in its xinerama screen if possible,
// if that fails at least keep it visible somewhere // if that fails at least keep it visible somewhere
QRectF area = workspace()->clientArea(MovementArea, this); QRectF area = workspace()->clientArea(MovementArea, this, moveResizeOutput());
if (area.contains(origClientGeometry)) { if (area.contains(origClientGeometry)) {
keepInArea(area); keepInArea(area);
} }
area = workspace()->clientArea(WorkArea, this); area = workspace()->clientArea(WorkArea, this, moveResizeOutput());
if (area.contains(origClientGeometry)) { if (area.contains(origClientGeometry)) {
keepInArea(area); keepInArea(area);
} }
@ -4285,7 +4285,7 @@ void X11Window::maximize(MaximizeMode mode)
if (isElectricBorderMaximizing()) { if (isElectricBorderMaximizing()) {
clientArea = workspace()->clientArea(MaximizeArea, this, Cursors::self()->mouse()->pos()); clientArea = workspace()->clientArea(MaximizeArea, this, Cursors::self()->mouse()->pos());
} else { } else {
clientArea = workspace()->clientArea(MaximizeArea, this, moveResizeGeometry().center()); clientArea = workspace()->clientArea(MaximizeArea, this, moveResizeOutput());
} }
MaximizeMode old_mode = max_mode; MaximizeMode old_mode = max_mode;
@ -4588,7 +4588,7 @@ void X11Window::setFullScreen(bool set, bool user)
if (info->fullscreenMonitors().isSet()) { if (info->fullscreenMonitors().isSet()) {
moveResize(fullscreenMonitorsArea(info->fullscreenMonitors())); moveResize(fullscreenMonitorsArea(info->fullscreenMonitors()));
} else { } else {
moveResize(workspace()->clientArea(FullScreenArea, this)); moveResize(workspace()->clientArea(FullScreenArea, this, moveResizeOutput()));
} }
} else { } else {
Q_ASSERT(!fullscreenGeometryRestore().isNull()); Q_ASSERT(!fullscreenGeometryRestore().isNull());
@ -4650,7 +4650,7 @@ bool X11Window::doStartInteractiveMoveResize()
// This reportedly improves smoothness of the moveresize operation, // This reportedly improves smoothness of the moveresize operation,
// something with Enter/LeaveNotify events, looks like XFree performance problem or something *shrug* // something with Enter/LeaveNotify events, looks like XFree performance problem or something *shrug*
// (https://lists.kde.org/?t=107302193400001&r=1&w=2) // (https://lists.kde.org/?t=107302193400001&r=1&w=2)
QRectF r = workspace()->clientArea(FullArea, this); QRectF r = workspace()->clientArea(FullArea, this, moveResizeOutput());
m_moveResizeGrabWindow.create(Xcb::toXNative(r), XCB_WINDOW_CLASS_INPUT_ONLY, 0, nullptr, kwinApp()->x11RootWindow()); m_moveResizeGrabWindow.create(Xcb::toXNative(r), XCB_WINDOW_CLASS_INPUT_ONLY, 0, nullptr, kwinApp()->x11RootWindow());
m_moveResizeGrabWindow.map(); m_moveResizeGrabWindow.map();
m_moveResizeGrabWindow.raise(); m_moveResizeGrabWindow.raise();

Loading…
Cancel
Save