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
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
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)
{
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)) {
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;
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)
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;
}