]> git.mdlowis.com Git - proto/labwc.git/commitdiff
xwayland: handle set_override_redirect events
authorJohan Malm <jgm323@gmail.com>
Tue, 3 May 2022 18:44:31 +0000 (19:44 +0100)
committerJohan Malm <johanmalm@users.noreply.github.com>
Tue, 3 May 2022 19:45:30 +0000 (20:45 +0100)
This is needed to allow X11 applications to create surfaces as
non-override_redirect and then change them to override_redirect later

Without this gitk-menus and rofi are treated as xwayland-views with
associated server-side-decoration and forced positioning.

include/labwc.h
src/xwayland-unmanaged.c
src/xwayland.c

index a06b7d4824c9646ed05f0a20c440581126390efa..147358783b19319010fad7ddb454793650bb182b 100644 (file)
@@ -333,6 +333,7 @@ struct view {
        struct wl_listener set_title;
        struct wl_listener set_app_id;          /* class on xwayland */
        struct wl_listener set_decorations;     /* xwayland only */
+       struct wl_listener override_redirect;   /* xwayland only */
        struct wl_listener new_popup;           /* xdg-shell only */
 };
 
@@ -371,8 +372,9 @@ void xdg_surface_new(struct wl_listener *listener, void *data);
 
 #if HAVE_XWAYLAND
 void xwayland_surface_new(struct wl_listener *listener, void *data);
-void xwayland_unmanaged_create(struct server *server,
+struct xwayland_unmanaged *xwayland_unmanaged_create(struct server *server,
        struct wlr_xwayland_surface *xsurface);
+void unmanaged_handle_map(struct wl_listener *listener, void *data);
 #endif
 
 void view_set_activated(struct view *view, bool activated);
index 3c37dfd23c9a073bbbb8ea21721a77da50370cf9..917b1313c1a5805e48d56aa66d3f2d8d08a851b1 100644 (file)
@@ -38,7 +38,7 @@ parent_view(struct server *server, struct wlr_xwayland_surface *surface)
        return NULL;
 }
 
-static void
+void
 unmanaged_handle_map(struct wl_listener *listener, void *data)
 {
        struct xwayland_unmanaged *unmanaged =
@@ -108,7 +108,7 @@ unmanaged_handle_destroy(struct wl_listener *listener, void *data)
        free(unmanaged);
 }
 
-void
+struct xwayland_unmanaged *
 xwayland_unmanaged_create(struct server *server,
                          struct wlr_xwayland_surface *xsurface)
 {
@@ -126,4 +126,5 @@ xwayland_unmanaged_create(struct server *server,
        unmanaged->unmap.notify = unmanaged_handle_unmap;
        wl_signal_add(&xsurface->events.destroy, &unmanaged->destroy);
        unmanaged->destroy.notify = unmanaged_handle_destroy;
+       return unmanaged;
 }
index 986803be33366d79342b0de396df8ad6570ca530..3d20e4f8f950fa25932d2dcf6853cb582fad0093 100644 (file)
@@ -104,9 +104,17 @@ handle_destroy(struct wl_listener *listener, void *data)
        /* Remove XWayland specific handlers */
        wl_list_remove(&view->map.link);
        wl_list_remove(&view->unmap.link);
+       wl_list_remove(&view->request_move.link);
+       wl_list_remove(&view->request_resize.link);
        wl_list_remove(&view->request_configure.link);
+       wl_list_remove(&view->request_activate.link);
+       wl_list_remove(&view->request_minimize.link);
        wl_list_remove(&view->request_maximize.link);
        wl_list_remove(&view->request_fullscreen.link);
+       wl_list_remove(&view->set_title.link);
+       wl_list_remove(&view->set_app_id.link);
+       wl_list_remove(&view->set_decorations.link);
+       wl_list_remove(&view->override_redirect.link);
        wl_list_remove(&view->destroy.link);
 
        /* And finally destroy / free the view */
@@ -236,6 +244,25 @@ handle_set_decorations(struct wl_listener *listener, void *data)
        view_set_decorations(view, want_deco(view));
 }
 
+static void
+handle_override_redirect(struct wl_listener *listener, void *data)
+{
+       struct view *view = wl_container_of(listener, view, override_redirect);
+       struct wlr_xwayland_surface *xsurface = data;
+       struct server *server = view->server;
+       bool mapped = xsurface->mapped;
+       if (mapped) {
+               handle_unmap(&view->unmap, NULL);
+       }
+       handle_destroy(&view->destroy, view);
+       xsurface->data = NULL;
+       struct xwayland_unmanaged *unmanaged =
+               xwayland_unmanaged_create(server, xsurface);
+       if (mapped) {
+               unmanaged_handle_map(&unmanaged->map, xsurface);
+       }
+}
+
 static void
 top_left_edge_boundary_check(struct view *view)
 {
@@ -428,5 +455,9 @@ xwayland_surface_new(struct wl_listener *listener, void *data)
        wl_signal_add(&xsurface->events.set_decorations,
                        &view->set_decorations);
 
+       view->override_redirect.notify = handle_override_redirect;
+       wl_signal_add(&xsurface->events.set_override_redirect,
+                       &view->override_redirect);
+
        wl_list_insert(&view->server->views, &view->link);
 }