diff --git a/cage.c b/cage.c index 8f14746..40a675d 100644 --- a/cage.c +++ b/cage.c @@ -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); diff --git a/output.c b/output.c index 5ccc939..7c00ddf 100644 --- a/output.c +++ b/output.c @@ -66,6 +66,26 @@ update_output_manager_config(struct cg_server *server) wlr_output_manager_v1_set_configuration(server->output_manager_v1, config); } +static void +update_cursor_map_to_output(struct cg_server *server) +{ + struct cg_output *only_enabled_output = NULL; + struct cg_output *output; + wl_list_for_each (output, &server->outputs, link) { + if (!only_enabled_output && output->wlr_output->enabled) { + only_enabled_output = output; + } else { + only_enabled_output = NULL; + } + } + + if (only_enabled_output) { + wlr_cursor_map_to_output(server->seat->cursor, only_enabled_output->wlr_output); + } else { + wlr_cursor_map_to_output(server->seat->cursor, NULL); + } +} + static inline void output_layout_add_auto(struct cg_output *output) { @@ -111,6 +131,7 @@ output_enable(struct cg_output *output) output_layout_add_auto(output); } + update_cursor_map_to_output(output->server); update_output_manager_config(output->server); } @@ -182,6 +203,7 @@ handle_output_commit(struct wl_listener *listener, void *data) * - always update output manager configuration even if the output is now disabled */ if (event->state->committed & OUTPUT_CONFIG_UPDATED) { + update_cursor_map_to_output(output->server); update_output_manager_config(output->server); } } @@ -193,6 +215,7 @@ handle_output_request_state(struct wl_listener *listener, void *data) struct wlr_output_event_request_state *event = data; if (wlr_output_commit_state(output->wlr_output, event->state)) { + update_cursor_map_to_output(output->server); update_output_manager_config(output->server); } } @@ -203,6 +226,7 @@ handle_output_layout_change(struct wl_listener *listener, void *data) struct cg_server *server = wl_container_of(listener, server, output_layout_change); view_position_all(server); + update_cursor_map_to_output(server); update_output_manager_config(server); } @@ -330,6 +354,7 @@ handle_new_output(struct wl_listener *listener, void *data) } view_position_all(output->server); + update_cursor_map_to_output(output->server); update_output_manager_config(output->server); } diff --git a/seat.c b/seat.c index cdf8798..9acbdd3 100644 --- a/seat.c +++ b/seat.c @@ -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);