]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xwayland: fix issue with panel getting stuck offscreen
authorJohn Lindgren <john@jlindgren.net>
Tue, 28 Nov 2023 05:38:18 +0000 (00:38 -0500)
committerJohan Malm <johanmalm@users.noreply.github.com>
Thu, 21 Dec 2023 06:01:46 +0000 (06:01 +0000)
For unknown reasons, XWayland surfaces that are completely offscreen
seem not to generate commit events. In rare cases, this can prevent an
offscreen window from moving onscreen (since we wait for a commit event
that never occurs). As a workaround, move offscreen surfaces
immediately.

This fixes an issue that I can reproduce by having qmpanel displayed on
a (larger) external monitor, then undocking the laptop so that qmpanel
requests a simultaneous move+resize to the (smaller) laptop display.

src/xwayland.c

index 30277c0608d948c3bf4f32f8d33dae2cb642c4fd..b109b1f37fe9fc6029fd0bc4ef6179eff31b10bc 100644 (file)
@@ -311,9 +311,20 @@ xwayland_view_configure(struct view *view, struct wlr_box geo)
        wlr_xwayland_surface_configure(xwayland_surface_from_view(view),
                geo.x, geo.y, geo.width, geo.height);
 
+       /*
+        * For unknown reasons, XWayland surfaces that are completely
+        * offscreen seem not to generate commit events. In rare cases,
+        * this can prevent an offscreen window from moving onscreen
+        * (since we wait for a commit event that never occurs). As a
+        * workaround, move offscreen surfaces immediately.
+        */
+       bool is_offscreen = !wlr_box_empty(&view->current) &&
+               !wlr_output_layout_intersects(view->server->output_layout, NULL,
+                       &view->current);
+
        /* If not resizing, process the move immediately */
-       if (view->current.width == geo.width
-                       && view->current.height == geo.height) {
+       if (is_offscreen || (view->current.width == geo.width
+                       && view->current.height == geo.height)) {
                view->current.x = geo.x;
                view->current.y = geo.y;
                view_moved(view);