From: Johan Malm Date: Sat, 4 Jun 2022 12:20:40 +0000 (+0100) Subject: xwayland-unmanaged: prepare for handling more events X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=9dcabbcfdd7f775bd76f1acc805b1eb5daa6e60a;p=proto%2Flabwc.git xwayland-unmanaged: prepare for handling more events Sway handles some xwayland events that labwc still does not. This commit just starts to rig up some handlers for these with log messages if they are caught. - set_geometry: try to handle, but cannot find an application that uses it, so is untested. - request_activate - just log caught event - override_redirect - just log caught event --- diff --git a/include/labwc.h b/include/labwc.h index 079585ed..9ae30149 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -338,6 +338,11 @@ struct view { struct wl_listener set_decorations; /* xwayland only */ struct wl_listener override_redirect; /* xwayland only */ struct wl_listener new_popup; /* xdg-shell only */ + + /* Not (yet) implemented */ +/* struct wl_listener set_role; */ +/* struct wl_listener set_window_type; */ +/* struct wl_listener set_hints; */ }; #if HAVE_XWAYLAND @@ -347,11 +352,15 @@ struct xwayland_unmanaged { struct wl_list link; int lx, ly; + struct wl_listener request_activate; struct wl_listener request_configure; +/* struct wl_listener request_fullscreen; */ struct wl_listener commit; + struct wl_listener set_geometry; struct wl_listener map; struct wl_listener unmap; struct wl_listener destroy; + struct wl_listener override_redirect; }; #endif diff --git a/src/xwayland-unmanaged.c b/src/xwayland-unmanaged.c index 0eb0e1cf..57f2de3f 100644 --- a/src/xwayland-unmanaged.c +++ b/src/xwayland-unmanaged.c @@ -22,6 +22,21 @@ unmanaged_handle_commit(struct wl_listener *listener, void *data) unmanaged->ly = xsurface->y; } +static void +unmanaged_handle_set_geometry(struct wl_listener *listener, void *data) +{ + wlr_log(WLR_INFO, "handling set_geometry"); + struct xwayland_unmanaged *unmanaged = + wl_container_of(listener, unmanaged, commit); + struct wlr_xwayland_surface *xsurface = unmanaged->xwayland_surface; + + if (xsurface->x != unmanaged->lx || xsurface->y != unmanaged->ly) { + wlr_log(WLR_DEBUG, "xwayland-unmanaged surface has moved"); + unmanaged->lx = xsurface->x; + unmanaged->ly = xsurface->y; + } +} + void unmanaged_handle_map(struct wl_listener *listener, void *data) { @@ -35,6 +50,9 @@ unmanaged_handle_map(struct wl_listener *listener, void *data) wl_signal_add(&xsurface->surface->events.commit, &unmanaged->commit); unmanaged->commit.notify = unmanaged_handle_commit; + wl_signal_add(&xsurface->events.set_geometry, &unmanaged->set_geometry); + unmanaged->set_geometry.notify = unmanaged_handle_set_geometry; + unmanaged->lx = xsurface->x; unmanaged->ly = xsurface->y; if (wlr_xwayland_or_surface_wants_focus(xsurface)) { @@ -55,6 +73,7 @@ unmanaged_handle_unmap(struct wl_listener *listener, void *data) wl_container_of(listener, unmanaged, unmap); struct wlr_xwayland_surface *xsurface = unmanaged->xwayland_surface; wl_list_remove(&unmanaged->link); + wl_list_remove(&unmanaged->set_geometry.link); wl_list_remove(&unmanaged->commit.link); struct seat *seat = &unmanaged->server->seat; @@ -94,6 +113,18 @@ unmanaged_handle_destroy(struct wl_listener *listener, void *data) free(unmanaged); } +static void +unmanaged_handle_override_redirect(struct wl_listener *listener, void *data) +{ + wlr_log(WLR_INFO(stderr, "override_redirect not handled\n"); +} + +static void +unmanaged_handle_request_activate(struct wl_listener *listener, void *data) +{ + wlr_log(WLR_INFO(stderr, "request_activate not handled\n"); +} + struct xwayland_unmanaged * xwayland_unmanaged_create(struct server *server, struct wlr_xwayland_surface *xsurface) @@ -112,5 +143,14 @@ 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; + + wl_signal_add(&xsurface->events.set_override_redirect, + &unmanaged->override_redirect); + unmanaged->override_redirect.notify = unmanaged_handle_override_redirect; + + wl_signal_add(&xsurface->events.request_activate, + &unmanaged->request_activate); + unmanaged->request_activate.notify = unmanaged_handle_request_activate; + return unmanaged; }