Compare commits

...

3 commits

Author SHA1 Message Date
Simon Ser
1ab4582577 Upgrade wlroots to v0.19 2025-04-10 18:09:42 +02:00
Simon Ser
dc96bb3165 cage: remove global server listeners on shutdown 2025-04-10 18:09:42 +02:00
Simon Ser
09eeddb76b seat: destroy keyboard groups on shutdown
These are not destroyed automatically because they are entirely
managed by the compositor.
2025-04-10 18:09:42 +02:00
5 changed files with 36 additions and 8 deletions

16
cage.c
View file

@ -454,7 +454,7 @@ main(int argc, char *argv[])
goto end;
}
struct wlr_presentation *presentation = wlr_presentation_create(server.wl_display, server.backend);
struct wlr_presentation *presentation = wlr_presentation_create(server.wl_display, server.backend, 2);
if (!presentation) {
wlr_log(WLR_ERROR, "Unable to create the presentation interface");
ret = 1;
@ -596,11 +596,25 @@ main(int argc, char *argv[])
wl_display_run(server.wl_display);
#if CAGE_HAS_XWAYLAND
if (xwayland) {
wl_list_remove(&server.new_xwayland_surface.link);
}
wlr_xwayland_destroy(xwayland);
wlr_xcursor_manager_destroy(xcursor_manager);
#endif
wl_display_destroy_clients(server.wl_display);
wl_list_remove(&server.new_virtual_pointer.link);
wl_list_remove(&server.new_virtual_keyboard.link);
wl_list_remove(&server.output_manager_apply.link);
wl_list_remove(&server.output_manager_test.link);
wl_list_remove(&server.xdg_toplevel_decoration.link);
wl_list_remove(&server.new_xdg_toplevel.link);
wl_list_remove(&server.new_xdg_popup.link);
wl_list_remove(&server.new_idle_inhibitor_v1.link);
wl_list_remove(&server.new_output.link);
wl_list_remove(&server.output_layout_change.link);
end:
if (pid != 0)
app_ret = cleanup_primary_client(pid);

View file

@ -35,7 +35,7 @@ if is_freebsd
)
endif
wlroots = dependency('wlroots-0.18', fallback: ['wlroots', 'wlroots'])
wlroots = dependency('wlroots-0.19', fallback: ['wlroots', 'wlroots'])
wayland_protos = dependency('wayland-protocols', version: '>=1.14')
wayland_server = dependency('wayland-server')
xkbcommon = dependency('xkbcommon')

17
seat.c
View file

@ -380,6 +380,16 @@ cleanup:
free(cg_group);
}
static void
keyboard_group_destroy(struct cg_keyboard_group *keyboard_group)
{
wl_list_remove(&keyboard_group->key.link);
wl_list_remove(&keyboard_group->modifiers.link);
wlr_keyboard_group_destroy(keyboard_group->wlr_group);
wl_list_remove(&keyboard_group->link);
free(keyboard_group);
}
static void
handle_new_keyboard(struct cg_seat *seat, struct wlr_keyboard *keyboard, bool virtual)
{
@ -893,6 +903,11 @@ seat_destroy(struct cg_seat *seat)
wl_list_remove(&seat->request_start_drag.link);
wl_list_remove(&seat->start_drag.link);
struct cg_keyboard_group *keyboard_group, *keyboard_group_tmp;
wl_list_for_each_safe(keyboard_group, keyboard_group_tmp, &seat->keyboard_groups, link) {
keyboard_group_destroy(keyboard_group);
}
// Destroying the wlr seat will trigger the destroy handler on our seat,
// which will in turn free it.
wlr_seat_destroy(seat->seat);
@ -922,7 +937,7 @@ seat_set_focus(struct cg_seat *seat, struct cg_view *view)
#if CAGE_HAS_XWAYLAND
if (view->type == CAGE_XWAYLAND_VIEW) {
struct cg_xwayland_view *xwayland_view = xwayland_view_from_view(view);
if (!wlr_xwayland_or_surface_wants_focus(xwayland_view->xwayland_surface)) {
if (!wlr_xwayland_surface_override_redirect_wants_focus(xwayland_view->xwayland_surface)) {
return;
}
}

View file

@ -128,11 +128,10 @@ static void
get_geometry(struct cg_view *view, int *width_out, int *height_out)
{
struct cg_xdg_shell_view *xdg_shell_view = xdg_shell_view_from_view(view);
struct wlr_box geom;
struct wlr_xdg_surface *xdg_surface = xdg_shell_view->xdg_toplevel->base;
wlr_xdg_surface_get_geometry(xdg_shell_view->xdg_toplevel->base, &geom);
*width_out = geom.width;
*height_out = geom.height;
*width_out = xdg_surface->geometry.width;
*height_out = xdg_surface->geometry.height;
}
static bool

View file

@ -92,7 +92,7 @@ maximize(struct cg_view *view, int output_width, int output_height)
struct cg_xwayland_view *xwayland_view = xwayland_view_from_view(view);
wlr_xwayland_surface_configure(xwayland_view->xwayland_surface, view->lx, view->ly, output_width,
output_height);
wlr_xwayland_surface_set_maximized(xwayland_view->xwayland_surface, true);
wlr_xwayland_surface_set_maximized(xwayland_view->xwayland_surface, true, true);
}
static void