diff --git a/data/waybox.sh b/data/waybox.sh index cb87f34..23c2391 100644 --- a/data/waybox.sh +++ b/data/waybox.sh @@ -94,7 +94,7 @@ export WB_RC_XML if which dbus-launch >/dev/null 2>&1; then - DBUS_LANCH="dbus-launch --exit-with-session" + DBUS_LAUNCH="dbus-launch --exit-with-session" fi # No need to export these to Waybox diff --git a/include/waybox/server.h b/include/waybox/server.h index 249424f..c154445 100644 --- a/include/waybox/server.h +++ b/include/waybox/server.h @@ -71,8 +71,13 @@ struct wb_server { struct wl_listener gamma_control_set_gamma; struct wl_listener new_layer_surface; - struct wl_listener new_xdg_surface; struct wl_listener new_xdg_decoration; +#if WLR_CHECK_VERSION(0, 18, 0) + struct wl_listener new_xdg_popup; + struct wl_listener new_xdg_toplevel; +#else + struct wl_listener new_xdg_surface; +#endif struct wl_listener new_input; struct wl_listener new_output; diff --git a/meson.build b/meson.build index 6b1bf90..04efe56 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'Waybox', 'c', - version: '0.2.2', + version: '0.2.3', license: 'MIT', meson_version: '>=0.52.0', default_options: [ diff --git a/waybox/config.c b/waybox/config.c index 2e7ce9c..821fc03 100644 --- a/waybox/config.c +++ b/waybox/config.c @@ -1,3 +1,4 @@ +#include #include #include diff --git a/waybox/decoration.c b/waybox/decoration.c index e3eb2ad..155a6cc 100644 --- a/waybox/decoration.c +++ b/waybox/decoration.c @@ -31,8 +31,10 @@ static void handle_new_xdg_toplevel_decoration(struct wl_listener *listener, voi wl_signal_add(&toplevel_decoration->events.request_mode, &decoration->request_mode); decoration->mode_destroy.notify = free_xdg_decoration_mode; wl_signal_add(&toplevel_decoration->events.destroy, &decoration->mode_destroy); - /* For some reason, a lot of clients don't emit the request_mode signal. */ +#if !WLR_CHECK_VERSION (0, 18, 0) + /* In older versions, this had to be explicitly called for some window decorations to work. */ handle_xdg_decoration_mode(&decoration->request_mode, toplevel_decoration); +#endif } void init_xdg_decoration(struct wb_server *server) { diff --git a/waybox/server.c b/waybox/server.c index 96e7f62..0f74026 100644 --- a/waybox/server.c +++ b/waybox/server.c @@ -45,7 +45,11 @@ bool wb_create_backend(struct wb_server* server) { server->compositor = wlr_compositor_create(server->wl_display, 5, server->renderer); server->subcompositor = wlr_subcompositor_create(server->wl_display); +#if WLR_CHECK_VERSION(0, 18, 0) + server->output_layout = wlr_output_layout_create(server->wl_display); +#else server->output_layout = wlr_output_layout_create(); +#endif server->seat = wb_seat_create(server); server->cursor = wb_cursor_create(server); @@ -116,9 +120,9 @@ bool wb_terminate(struct wb_server* server) { wl_list_remove(&server->new_xdg_decoration.link); /* wb_decoration_destroy */ deinit_config(server->config); wl_display_destroy_clients(server->wl_display); + wlr_output_layout_destroy(server->output_layout); wl_display_destroy(server->wl_display); wb_seat_destroy(server->seat); - wlr_output_layout_destroy(server->output_layout); wlr_scene_node_destroy(&server->scene->tree.node); wlr_log(WLR_INFO, "%s", _("Display destroyed")); diff --git a/waybox/xdg_shell.c b/waybox/xdg_shell.c index 4f00f68..bdf244d 100644 --- a/waybox/xdg_shell.c +++ b/waybox/xdg_shell.c @@ -156,15 +156,13 @@ static void xdg_toplevel_destroy(struct wl_listener *listener, void *data) { wl_list_remove(&toplevel->destroy.link); wl_list_remove(&toplevel->new_popup.link); - if (toplevel->xdg_toplevel->base->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { - wl_list_remove(&toplevel->request_fullscreen.link); - wl_list_remove(&toplevel->request_minimize.link); - wl_list_remove(&toplevel->request_maximize.link); - wl_list_remove(&toplevel->request_move.link); - wl_list_remove(&toplevel->request_resize.link); - wl_list_remove(&toplevel->link); - } + wl_list_remove(&toplevel->request_fullscreen.link); + wl_list_remove(&toplevel->request_minimize.link); + wl_list_remove(&toplevel->request_maximize.link); + wl_list_remove(&toplevel->request_move.link); + wl_list_remove(&toplevel->request_resize.link); + wl_list_remove(&toplevel->link); free(toplevel); } @@ -313,74 +311,93 @@ static void handle_new_popup(struct wl_listener *listener, void *data) { wlr_xdg_popup_unconstrain_from_box(popup, &output_toplevel_box); } -static void handle_new_xdg_surface(struct wl_listener *listener, void *data) { - /* This event is raised when wlr_xdg_shell receives a new xdg surface from a - * client, either a toplevel (application window) or popup. */ - struct wb_server *server = - wl_container_of(listener, server, new_xdg_surface); - struct wlr_xdg_surface *xdg_surface = data; - +static void handle_new_xdg_popup(struct wl_listener *listener, void *data) { /* We must add xdg popups to the scene graph so they get rendered. The * wlroots scene graph provides a helper for this, but to use it we must * provide the proper parent scene node of the xdg popup. To enable this, * we always set the user data field of xdg_surfaces to the corresponding * scene node. */ - if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { - struct wlr_xdg_surface *parent = wlr_xdg_surface_try_from_wlr_surface( - xdg_surface->popup->parent); - if (parent != NULL) { - - struct wlr_scene_tree *parent_tree = parent->data; - xdg_surface->data = wlr_scene_xdg_surface_create( - parent_tree, xdg_surface); - } - /* The scene graph doesn't currently unconstrain popups, so keep going */ - /* return; */ + struct wlr_xdg_popup *xdg_popup = data; + struct wlr_xdg_surface *parent = wlr_xdg_surface_try_from_wlr_surface( + xdg_popup->parent); + if (parent != NULL) { + struct wlr_scene_tree *parent_tree = parent->data; + xdg_popup->base->data = wlr_scene_xdg_surface_create( + parent_tree, xdg_popup->base); } - if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_NONE) - return; +} - /* Allocate a wb_toplevel for this surface */ +static void handle_new_xdg_toplevel(struct wl_listener *listener, void *data) { + struct wb_server *server = +#if WLR_CHECK_VERSION (0, 18,0) + wl_container_of(listener, server, new_xdg_toplevel); +#else + wl_container_of(listener, server, new_xdg_surface); +#endif + struct wlr_xdg_toplevel *xdg_toplevel = data; + + /* Allocate a wb_toplevel for this toplevel */ struct wb_toplevel *toplevel = calloc(1, sizeof(struct wb_toplevel)); toplevel->server = server; - toplevel->xdg_toplevel = xdg_surface->toplevel; + toplevel->xdg_toplevel = xdg_toplevel; /* Listen to the various events it can emit */ toplevel->map.notify = xdg_toplevel_map; - wl_signal_add(&xdg_surface->surface->events.map, &toplevel->map); + wl_signal_add(&xdg_toplevel->base->surface->events.map, &toplevel->map); toplevel->unmap.notify = xdg_toplevel_unmap; - wl_signal_add(&xdg_surface->surface->events.unmap, &toplevel->unmap); + wl_signal_add(&xdg_toplevel->base->surface->events.unmap, &toplevel->unmap); toplevel->destroy.notify = xdg_toplevel_destroy; - wl_signal_add(&xdg_surface->events.destroy, &toplevel->destroy); +#if WLR_CHECK_VERSION (0, 18, 0) + wl_signal_add(&xdg_toplevel->events.destroy, &toplevel->destroy); +#else + wl_signal_add(&xdg_toplevel->base->events.destroy, &toplevel->destroy); +#endif toplevel->new_popup.notify = handle_new_popup; - wl_signal_add(&xdg_surface->events.new_popup, &toplevel->new_popup); + wl_signal_add(&xdg_toplevel->base->events.new_popup, &toplevel->new_popup); + toplevel->scene_tree = wlr_scene_xdg_surface_create( + &toplevel->server->scene->tree, xdg_toplevel->base); + toplevel->scene_tree->node.data = toplevel; + xdg_toplevel->base->data = toplevel->scene_tree; + + toplevel->request_fullscreen.notify = xdg_toplevel_request_fullscreen; + wl_signal_add(&xdg_toplevel->events.request_fullscreen, &toplevel->request_fullscreen); + toplevel->request_maximize.notify = xdg_toplevel_request_maximize; + wl_signal_add(&xdg_toplevel->events.request_maximize, &toplevel->request_maximize); + toplevel->request_minimize.notify = xdg_toplevel_request_minimize; + wl_signal_add(&xdg_toplevel->events.request_minimize, &toplevel->request_minimize); + toplevel->request_move.notify = xdg_toplevel_request_move; + wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move); + toplevel->request_resize.notify = xdg_toplevel_request_resize; + wl_signal_add(&xdg_toplevel->events.request_resize, &toplevel->request_resize); + + wl_list_insert(&toplevel->server->toplevels, &toplevel->link); +} + +#if !WLR_CHECK_VERSION(0, 18, 0) +static void handle_new_xdg_surface(struct wl_listener *listener, void *data) { + struct wlr_xdg_surface *xdg_surface = data; + + if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_POPUP) { + handle_new_xdg_popup(listener, xdg_surface->popup); + } if (xdg_surface->role == WLR_XDG_SURFACE_ROLE_TOPLEVEL) { - toplevel->scene_tree = wlr_scene_xdg_surface_create( - &toplevel->server->scene->tree, toplevel->xdg_toplevel->base); - toplevel->scene_tree->node.data = toplevel; - xdg_surface->data = toplevel->scene_tree; - - struct wlr_xdg_toplevel *xdg_toplevel = toplevel->xdg_toplevel; - toplevel->request_fullscreen.notify = xdg_toplevel_request_fullscreen; - wl_signal_add(&xdg_toplevel->events.request_fullscreen, &toplevel->request_fullscreen); - toplevel->request_maximize.notify = xdg_toplevel_request_maximize; - wl_signal_add(&xdg_toplevel->events.request_maximize, &toplevel->request_maximize); - toplevel->request_minimize.notify = xdg_toplevel_request_minimize; - wl_signal_add(&xdg_toplevel->events.request_minimize, &toplevel->request_minimize); - toplevel->request_move.notify = xdg_toplevel_request_move; - wl_signal_add(&xdg_toplevel->events.request_move, &toplevel->request_move); - toplevel->request_resize.notify = xdg_toplevel_request_resize; - wl_signal_add(&xdg_toplevel->events.request_resize, &toplevel->request_resize); - - wl_list_insert(&toplevel->server->toplevels, &toplevel->link); + handle_new_xdg_toplevel(listener, xdg_surface->toplevel); } } +#endif void init_xdg_shell(struct wb_server *server) { /* xdg-shell version 3 */ server->xdg_shell = wlr_xdg_shell_create(server->wl_display, 3); +#if WLR_CHECK_VERSION (0, 18, 0) + server->new_xdg_popup.notify = handle_new_xdg_popup; + wl_signal_add(&server->xdg_shell->events.new_popup, &server->new_xdg_popup); + server->new_xdg_toplevel.notify = handle_new_xdg_toplevel; + wl_signal_add(&server->xdg_shell->events.new_toplevel, &server->new_xdg_toplevel); +#else server->new_xdg_surface.notify = handle_new_xdg_surface; wl_signal_add(&server->xdg_shell->events.new_surface, &server->new_xdg_surface); +#endif }