From c006717910e5f30ca65645f701541dfa176c1392 Mon Sep 17 00:00:00 2001 From: Ryan Dwyer Date: Thu, 18 Oct 2018 21:20:00 +1000 Subject: [PATCH] Minor refactor of input manager The input manager is a singleton object. Passing the sway_input_manager argument to each of its functions is unnecessary, while removing the argument makes it obvious to the caller that it's a singleton. This patch removes the argument and makes the input manager use server.input instead. On a similar note: * sway_input_manager.server is removed in favour of using the server global. * seat.input is removed because it can get it from server.input. Due to a circular dependency, creating seat0 is now done directly in server_init rather than in input_manager_create. This is because creating seats must be done after server.input is set. Lastly, it now stores the default seat name using a constant and removes a second reference to seat0 (in input_manager_get_default_seat). --- include/sway/input/input-manager.h | 29 +++-------- include/sway/input/seat.h | 4 +- sway/commands.c | 4 +- sway/commands/border.c | 2 +- sway/commands/input.c | 2 +- sway/commands/move.c | 2 +- sway/commands/scratchpad.c | 2 +- sway/commands/swap.c | 2 +- sway/config.c | 3 +- sway/criteria.c | 2 +- sway/debug-tree.c | 2 +- sway/desktop/layer_shell.c | 8 +-- sway/desktop/output.c | 2 +- sway/desktop/render.c | 4 +- sway/desktop/transaction.c | 4 +- sway/desktop/xwayland.c | 11 ++-- sway/input/cursor.c | 20 +++---- sway/input/input-manager.c | 83 ++++++++++++------------------ sway/input/keyboard.c | 2 +- sway/input/seat.c | 11 ++-- sway/ipc-json.c | 2 +- sway/ipc-server.c | 6 +-- sway/server.c | 4 +- sway/tree/container.c | 16 +++--- sway/tree/output.c | 4 +- sway/tree/root.c | 8 +-- sway/tree/view.c | 16 +++--- sway/tree/workspace.c | 10 ++-- 28 files changed, 116 insertions(+), 149 deletions(-) diff --git a/include/sway/input/input-manager.h b/include/sway/input/input-manager.h index b7073006..219aa9ba 100644 --- a/include/sway/input/input-manager.h +++ b/include/sway/input/input-manager.h @@ -7,12 +7,6 @@ #include "sway/config.h" #include "list.h" -/** - * The global singleton input manager - * TODO: make me not a global - */ -extern struct sway_input_manager *input_manager; - struct sway_input_device { char *identifier; struct wlr_input_device *wlr_device; @@ -21,7 +15,6 @@ struct sway_input_device { }; struct sway_input_manager { - struct sway_server *server; struct wl_list devices; struct wl_list seats; @@ -36,30 +29,24 @@ struct sway_input_manager { struct sway_input_manager *input_manager_create(struct sway_server *server); -bool input_manager_has_focus(struct sway_input_manager *input, - struct sway_node *node); +bool input_manager_has_focus(struct sway_node *node); -void input_manager_set_focus(struct sway_input_manager *input, - struct sway_node *node); +void input_manager_set_focus(struct sway_node *node); -void input_manager_configure_xcursor(struct sway_input_manager *input); +void input_manager_configure_xcursor(void); -void input_manager_apply_input_config(struct sway_input_manager *input, - struct input_config *input_config); +void input_manager_apply_input_config(struct input_config *input_config); -void input_manager_apply_seat_config(struct sway_input_manager *input, - struct seat_config *seat_config); +void input_manager_apply_seat_config(struct seat_config *seat_config); -struct sway_seat *input_manager_get_default_seat( - struct sway_input_manager *input); +struct sway_seat *input_manager_get_default_seat(void); -struct sway_seat *input_manager_get_seat(struct sway_input_manager *input, - const char *seat_name); +struct sway_seat *input_manager_get_seat(const char *seat_name); /** * Gets the last seat the user interacted with */ -struct sway_seat *input_manager_current_seat(struct sway_input_manager *input); +struct sway_seat *input_manager_current_seat(void); struct input_config *input_device_get_config(struct sway_input_device *device); diff --git a/include/sway/input/seat.h b/include/sway/input/seat.h index e9f553f3..ef65810c 100644 --- a/include/sway/input/seat.h +++ b/include/sway/input/seat.h @@ -47,7 +47,6 @@ enum sway_seat_operation { struct sway_seat { struct wlr_seat *wlr_seat; struct sway_cursor *cursor; - struct sway_input_manager *input; bool has_focus; struct wl_list focus_stack; // list of containers in focus order @@ -89,8 +88,7 @@ struct sway_seat { struct wl_list link; // input_manager::seats }; -struct sway_seat *seat_create(struct sway_input_manager *input, - const char *seat_name); +struct sway_seat *seat_create(const char *seat_name); void seat_destroy(struct sway_seat *seat); diff --git a/sway/commands.c b/sway/commands.c index 8db1df01..d1275a1e 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -68,7 +68,7 @@ void apply_seat_config(struct seat_config *seat_config) { list_add(config->seat_configs, seat_config); } - input_manager_apply_seat_config(input_manager, seat_config); + input_manager_apply_seat_config(seat_config); } /* Keep alphabetized */ @@ -240,7 +240,7 @@ struct cmd_results *execute_command(char *_exec, struct sway_seat *seat, if (seat == NULL) { // passing a NULL seat means we just pick the default seat - seat = input_manager_get_default_seat(input_manager); + seat = input_manager_get_default_seat(); if (!sway_assert(seat, "could not find a seat to run the command on")) { return NULL; } diff --git a/sway/commands/border.c b/sway/commands/border.c index a50f7a1c..5b65148d 100644 --- a/sway/commands/border.c +++ b/sway/commands/border.c @@ -94,7 +94,7 @@ struct cmd_results *cmd_border(int argc, char **argv) { arrange_container(view->container); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); if (seat->cursor) { cursor_rebase(seat->cursor); } diff --git a/sway/commands/input.c b/sway/commands/input.c index 2889d47d..c50926a8 100644 --- a/sway/commands/input.c +++ b/sway/commands/input.c @@ -71,7 +71,7 @@ struct cmd_results *cmd_input(int argc, char **argv) { struct input_config *ic = store_input_config(config->handler_context.input_config); - input_manager_apply_input_config(input_manager, ic); + input_manager_apply_input_config(ic); } else { free_input_config(config->handler_context.input_config); } diff --git a/sway/commands/move.c b/sway/commands/move.c index cb7f6009..941b284a 100644 --- a/sway/commands/move.c +++ b/sway/commands/move.c @@ -103,7 +103,7 @@ static void workspace_focus_fullscreen(struct sway_workspace *workspace) { } struct sway_seat *seat; struct sway_workspace *focus_ws; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { focus_ws = seat_get_focused_workspace(seat); if (focus_ws == workspace) { struct sway_node *new_focus = diff --git a/sway/commands/scratchpad.c b/sway/commands/scratchpad.c index d8bae615..26f0e490 100644 --- a/sway/commands/scratchpad.c +++ b/sway/commands/scratchpad.c @@ -8,7 +8,7 @@ #include "sway/tree/workspace.h" static void scratchpad_toggle_auto(void) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_container *focus = seat_get_focused_container(seat); struct sway_workspace *ws = seat_get_focused_workspace(seat); diff --git a/sway/commands/swap.c b/sway/commands/swap.c index 8a6dfdbd..6062724d 100644 --- a/sway/commands/swap.c +++ b/sway/commands/swap.c @@ -108,7 +108,7 @@ static void container_swap(struct sway_container *con1, container_set_fullscreen(con2, false); } - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); struct sway_container *focus = seat_get_focused_container(seat); struct sway_workspace *vis1 = output_get_active_workspace(con1->workspace->output); diff --git a/sway/config.c b/sway/config.c index 89b89464..f683e7ab 100644 --- a/sway/config.c +++ b/sway/config.c @@ -151,8 +151,7 @@ static void destroy_removed_seats(struct sway_config *old_config, /* Also destroy seats that aren't present in new config */ if (new_config && list_seq_find(new_config->seat_configs, seat_name_cmp, seat_config->name) < 0) { - seat = input_manager_get_seat(input_manager, - seat_config->name); + seat = input_manager_get_seat(seat_config->name); seat_destroy(seat); } } diff --git a/sway/criteria.c b/sway/criteria.c index 575e8bcf..e00d638c 100644 --- a/sway/criteria.c +++ b/sway/criteria.c @@ -356,7 +356,7 @@ static enum criteria_token token_from_name(char *name) { * criteria is only executed once per view. */ static char *get_focused_prop(enum criteria_token token) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_container *focus = seat_get_focused_container(seat); if (!focus || !focus->view) { diff --git a/sway/debug-tree.c b/sway/debug-tree.c index 16b479f9..b3266241 100644 --- a/sway/debug-tree.c +++ b/sway/debug-tree.c @@ -140,7 +140,7 @@ void update_debug_tree(void) { cairo_t *cairo = cairo_create(surface); PangoContext *pango = pango_cairo_create_context(cairo); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_node *focus = seat_get_focus(seat); cairo_set_source_u32(cairo, 0x000000FF); diff --git a/sway/desktop/layer_shell.c b/sway/desktop/layer_shell.c index 269864d4..cabb07f5 100644 --- a/sway/desktop/layer_shell.c +++ b/sway/desktop/layer_shell.c @@ -211,7 +211,7 @@ void arrange_layers(struct sway_output *output) { } struct sway_seat *seat; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { seat_set_focus_layer(seat, topmost ? topmost->layer_surface : NULL); } } @@ -241,7 +241,7 @@ static void handle_output_destroy(struct wl_listener *listener, void *data) { wl_container_of(listener, sway_layer, output_destroy); // Determine if this layer is being used by an exclusive client. If it is, // try and find another layer owned by this client to pass focus to. - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); struct wl_client *client = wl_resource_get_client(sway_layer->layer_surface->resource); bool set_focus = seat->exclusive_client == client; @@ -299,7 +299,7 @@ static void unmap(struct sway_layer_surface *sway_layer) { output_damage_surface(output, sway_layer->geo.x, sway_layer->geo.y, sway_layer->layer_surface->surface, true); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); if (seat->focused_layer == sway_layer->layer_surface) { seat_set_focus_layer(seat, NULL); } @@ -370,7 +370,7 @@ void handle_layer_shell_surface(struct wl_listener *listener, void *data) { if (!layer_surface->output) { // Assign last active output struct sway_output *output = NULL; - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); if (seat) { struct sway_workspace *ws = seat_get_focused_workspace(seat); diff --git a/sway/desktop/output.c b/sway/desktop/output.c index fc52dd28..018a7285 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -235,7 +235,7 @@ static void scale_box(struct wlr_box *box, float scale) { } struct sway_workspace *output_get_active_workspace(struct sway_output *output) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_node *focus = seat_get_active_tiling_child(seat, &output->node); if (!focus) { return output->workspaces->items[0]; diff --git a/sway/desktop/render.c b/sway/desktop/render.c index 9b26c560..1a72f752 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -885,7 +885,7 @@ static void render_floating(struct sway_output *soutput, static void render_dropzones(struct sway_output *output, pixman_region32_t *damage) { struct sway_seat *seat; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { if (seat->operation == OP_MOVE_TILING && seat->op_target_node && node_get_output(seat->op_target_node) == output) { float color[4]; @@ -995,7 +995,7 @@ void output_render(struct sway_output *output, struct timespec *when, render_dropzones(output, damage); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_container *focus = seat_get_focused_container(seat); if (focus && focus->view) { render_view_popups(focus->view, output, damage, focus->alpha); diff --git a/sway/desktop/transaction.c b/sway/desktop/transaction.c index e717ee35..5dec279d 100644 --- a/sway/desktop/transaction.c +++ b/sway/desktop/transaction.c @@ -110,7 +110,7 @@ static void copy_workspace_state(struct sway_workspace *ws, list_cat(state->floating, ws->floating); list_cat(state->tiling, ws->tiling); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); state->focused = seat_get_focus(seat) == &ws->node; // Set focused_inactive_child to the direct tiling child @@ -153,7 +153,7 @@ static void copy_container_state(struct sway_container *container, list_cat(state->children, container->children); } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); state->focused = seat_get_focus(seat) == &container->node; if (!container->view) { diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 066556b8..58cb4d07 100644 --- a/sway/desktop/xwayland.c +++ b/sway/desktop/xwayland.c @@ -70,9 +70,8 @@ static void unmanaged_handle_map(struct wl_listener *listener, void *data) { desktop_damage_surface(xsurface->surface, surface->lx, surface->ly, true); if (wlr_xwayland_or_surface_wants_focus(xsurface)) { - struct sway_seat *seat = input_manager_current_seat(input_manager); - struct wlr_xwayland *xwayland = - seat->input->server->xwayland.wlr_xwayland; + struct sway_seat *seat = input_manager_current_seat(); + struct wlr_xwayland *xwayland = server.xwayland.wlr_xwayland; wlr_xwayland_set_seat(xwayland, seat->wlr_seat); seat_set_focus_surface(seat, xsurface->surface, false); } @@ -86,7 +85,7 @@ static void unmanaged_handle_unmap(struct wl_listener *listener, void *data) { wl_list_remove(&surface->link); wl_list_remove(&surface->commit.link); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); if (seat->wlr_seat->keyboard_state.focused_surface == xsurface->surface) { // Restore focus @@ -457,7 +456,7 @@ static void handle_request_move(struct wl_listener *listener, void *data) { if (!container_is_floating(view->container)) { return; } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); seat_begin_move_floating(seat, view->container, seat->last_button); } @@ -473,7 +472,7 @@ static void handle_request_resize(struct wl_listener *listener, void *data) { return; } struct wlr_xwayland_resize_event *e = data; - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); seat_begin_resize_floating(seat, view->container, seat->last_button, e->edges); } diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 756f2f8c..a07bc53b 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -680,7 +680,7 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor, static void handle_cursor_motion(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, motion); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_pointer_motion *event = data; wlr_cursor_move(cursor->cursor, event->device, event->delta_x, event->delta_y); @@ -692,7 +692,7 @@ static void handle_cursor_motion_absolute( struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, motion_absolute); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_pointer_motion_absolute *event = data; wlr_cursor_warp_absolute(cursor->cursor, event->device, event->x, event->y); cursor_send_pointer_motion(cursor, event->time_msec); @@ -970,7 +970,7 @@ void dispatch_cursor_button(struct sway_cursor *cursor, static void handle_cursor_button(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, button); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_pointer_button *event = data; dispatch_cursor_button(cursor, event->device, event->time_msec, event->button, event->state); @@ -1019,7 +1019,7 @@ static void dispatch_cursor_axis(struct sway_cursor *cursor, static void handle_cursor_axis(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, axis); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_pointer_axis *event = data; dispatch_cursor_axis(cursor, event); transaction_commit_dirty(); @@ -1027,7 +1027,7 @@ static void handle_cursor_axis(struct wl_listener *listener, void *data) { static void handle_touch_down(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_down); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_touch_down *event = data; struct sway_seat *seat = cursor->seat; @@ -1058,7 +1058,7 @@ static void handle_touch_down(struct wl_listener *listener, void *data) { static void handle_touch_up(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_up); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_touch_up *event = data; struct wlr_seat *seat = cursor->seat->wlr_seat; // TODO: fall back to cursor simulation if client has not bound to touch @@ -1068,7 +1068,7 @@ static void handle_touch_up(struct wl_listener *listener, void *data) { static void handle_touch_motion(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_motion); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_touch_motion *event = data; struct sway_seat *seat = cursor->seat; @@ -1132,7 +1132,7 @@ static void apply_mapping_from_region(struct wlr_input_device *device, static void handle_tool_axis(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_axis); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_tablet_tool_axis *event = data; struct sway_input_device *input_device = event->device->data; @@ -1156,7 +1156,7 @@ static void handle_tool_axis(struct wl_listener *listener, void *data) { static void handle_tool_tip(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_tip); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_tablet_tool_tip *event = data; dispatch_cursor_button(cursor, event->device, event->time_msec, BTN_LEFT, event->state == WLR_TABLET_TOOL_TIP_DOWN ? @@ -1166,7 +1166,7 @@ static void handle_tool_tip(struct wl_listener *listener, void *data) { static void handle_tool_button(struct wl_listener *listener, void *data) { struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_button); - wlr_idle_notify_activity(cursor->seat->input->server->idle, cursor->seat->wlr_seat); + wlr_idle_notify_activity(server.idle, cursor->seat->wlr_seat); struct wlr_event_tablet_tool_button *event = data; // TODO: the user may want to configure which tool buttons are mapped to // which simulated pointer buttons diff --git a/sway/input/input-manager.c b/sway/input/input-manager.c index 671f9a47..5be4143f 100644 --- a/sway/input/input-manager.c +++ b/sway/input/input-manager.c @@ -17,32 +17,28 @@ #include "list.h" #include "log.h" -static const char *default_seat = "seat0"; - -// TODO make me not global -struct sway_input_manager *input_manager; +#define DEFAULT_SEAT "seat0" struct input_config *current_input_config = NULL; struct seat_config *current_seat_config = NULL; -struct sway_seat *input_manager_current_seat(struct sway_input_manager *input) { +struct sway_seat *input_manager_current_seat(void) { struct sway_seat *seat = config->handler_context.seat; if (!seat) { - seat = input_manager_get_default_seat(input_manager); + seat = input_manager_get_default_seat(); } return seat; } -struct sway_seat *input_manager_get_seat( - struct sway_input_manager *input, const char *seat_name) { +struct sway_seat *input_manager_get_seat(const char *seat_name) { struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { if (strcmp(seat->wlr_seat->name, seat_name) == 0) { return seat; } } - return seat_create(input, seat_name); + return seat_create(seat_name); } char *input_device_get_identifier(struct wlr_input_device *device) { @@ -72,9 +68,9 @@ char *input_device_get_identifier(struct wlr_input_device *device) { } static struct sway_input_device *input_sway_device_from_wlr( - struct sway_input_manager *input, struct wlr_input_device *device) { + struct wlr_input_device *device) { struct sway_input_device *input_device = NULL; - wl_list_for_each(input_device, &input->devices, link) { + wl_list_for_each(input_device, &server.input->devices, link) { if (input_device->wlr_device == device) { return input_device; } @@ -82,9 +78,9 @@ static struct sway_input_device *input_sway_device_from_wlr( return NULL; } -static bool input_has_seat_configuration(struct sway_input_manager *input) { +static bool input_has_seat_configuration(void) { struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { struct seat_config *seat_config = seat_get_config(seat); if (seat_config) { return true; @@ -244,8 +240,7 @@ static void input_manager_libinput_config_pointer( static void handle_device_destroy(struct wl_listener *listener, void *data) { struct wlr_input_device *device = data; - struct sway_input_device *input_device = - input_sway_device_from_wlr(input_manager, device); + struct sway_input_device *input_device = input_sway_device_from_wlr(device); if (!sway_assert(input_device, "could not find sway device")) { return; @@ -255,7 +250,7 @@ static void handle_device_destroy(struct wl_listener *listener, void *data) { input_device->identifier); struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { seat_remove_device(seat, input_device); } @@ -297,9 +292,9 @@ static void handle_new_input(struct wl_listener *listener, void *data) { input_device->device_destroy.notify = handle_device_destroy; struct sway_seat *seat = NULL; - if (!input_has_seat_configuration(input)) { + if (!input_has_seat_configuration()) { wlr_log(WLR_DEBUG, "no seat configuration, using default seat"); - seat = input_manager_get_seat(input, default_seat); + seat = input_manager_get_seat(DEFAULT_SEAT); seat_add_device(seat, input_device); return; } @@ -364,7 +359,7 @@ void handle_virtual_keyboard(struct wl_listener *listener, void *data) { struct wlr_virtual_keyboard_v1 *keyboard = data; struct wlr_input_device *device = &keyboard->input_device; - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); // TODO: The user might want this on a different seat struct sway_input_device *input_device = @@ -387,21 +382,16 @@ void handle_virtual_keyboard(struct wl_listener *listener, void *data) { seat_add_device(seat, input_device); } -struct sway_input_manager *input_manager_create( - struct sway_server *server) { +struct sway_input_manager *input_manager_create(struct sway_server *server) { struct sway_input_manager *input = calloc(1, sizeof(struct sway_input_manager)); if (!input) { return NULL; } - input->server = server; wl_list_init(&input->devices); wl_list_init(&input->seats); - // create the default seat - input_manager_get_seat(input, default_seat); - input->new_input.notify = handle_new_input; wl_signal_add(&server->backend->events.new_input, &input->new_input); @@ -422,10 +412,9 @@ struct sway_input_manager *input_manager_create( return input; } -bool input_manager_has_focus(struct sway_input_manager *input, - struct sway_node *node) { +bool input_manager_has_focus(struct sway_node *node) { struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { if (seat_get_focus(seat) == node) { return true; } @@ -434,19 +423,17 @@ bool input_manager_has_focus(struct sway_input_manager *input, return false; } -void input_manager_set_focus(struct sway_input_manager *input, - struct sway_node *node) { +void input_manager_set_focus(struct sway_node *node) { struct sway_seat *seat; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { seat_set_focus(seat, node); } } -void input_manager_apply_input_config(struct sway_input_manager *input, - struct input_config *input_config) { +void input_manager_apply_input_config(struct input_config *input_config) { struct sway_input_device *input_device = NULL; bool wildcard = strcmp(input_config->identifier, "*") == 0; - wl_list_for_each(input_device, &input->devices, link) { + wl_list_for_each(input_device, &server.input->devices, link) { if (strcmp(input_device->identifier, input_config->identifier) == 0 || wildcard) { if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER || @@ -459,18 +446,17 @@ void input_manager_apply_input_config(struct sway_input_manager *input, } struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { seat_configure_device(seat, input_device); } } } } -void input_manager_apply_seat_config(struct sway_input_manager *input, - struct seat_config *seat_config) { +void input_manager_apply_seat_config(struct seat_config *seat_config) { wlr_log(WLR_DEBUG, "applying new seat config for seat %s", seat_config->name); - struct sway_seat *seat = input_manager_get_seat(input, seat_config->name); + struct sway_seat *seat = input_manager_get_seat(seat_config->name); if (!seat) { return; } @@ -480,10 +466,10 @@ void input_manager_apply_seat_config(struct sway_input_manager *input, // for every device, try to add it to a seat and if no seat has it // attached, add it to the fallback seats. struct sway_input_device *input_device = NULL; - wl_list_for_each(input_device, &input->devices, link) { + wl_list_for_each(input_device, &server.input->devices, link) { list_t *seat_list = create_list(); struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { struct seat_config *seat_config = seat_get_config(seat); if (!seat_config) { continue; @@ -496,7 +482,7 @@ void input_manager_apply_seat_config(struct sway_input_manager *input, } if (seat_list->length) { - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { bool attached = false; for (int i = 0; i < seat_list->length; ++i) { if (seat == seat_list->items[i]) { @@ -511,7 +497,7 @@ void input_manager_apply_seat_config(struct sway_input_manager *input, } } } else { - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { struct seat_config *seat_config = seat_get_config(seat); if (seat_config && seat_config->fallback == 1) { seat_add_device(seat, input_device); @@ -524,18 +510,17 @@ void input_manager_apply_seat_config(struct sway_input_manager *input, } } -void input_manager_configure_xcursor(struct sway_input_manager *input) { +void input_manager_configure_xcursor(void) { struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { seat_configure_xcursor(seat); } } -struct sway_seat *input_manager_get_default_seat( - struct sway_input_manager *input) { +struct sway_seat *input_manager_get_default_seat(void) { struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input->seats, link) { - if (strcmp(seat->wlr_seat->name, "seat0") == 0) { + wl_list_for_each(seat, &server.input->seats, link) { + if (strcmp(seat->wlr_seat->name, DEFAULT_SEAT) == 0) { return seat; } } diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 4427dabe..5c1e7ae6 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c @@ -211,7 +211,7 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) { struct wlr_input_device *wlr_device = keyboard->seat_device->input_device->wlr_device; char *device_identifier = input_device_get_identifier(wlr_device); - wlr_idle_notify_activity(seat->input->server->idle, wlr_seat); + wlr_idle_notify_activity(server.idle, wlr_seat); struct wlr_event_keyboard_key *event = data; bool input_inhibited = seat->exclusive_client != NULL; diff --git a/sway/input/seat.c b/sway/input/seat.c index d7733855..330b7bbe 100644 --- a/sway/input/seat.c +++ b/sway/input/seat.c @@ -95,8 +95,7 @@ static void seat_send_focus(struct sway_node *node, struct sway_seat *seat) { if (view && seat_is_input_allowed(seat, view->surface)) { #ifdef HAVE_XWAYLAND if (view->type == SWAY_VIEW_XWAYLAND) { - struct wlr_xwayland *xwayland = - seat->input->server->xwayland.wlr_xwayland; + struct wlr_xwayland *xwayland = server.xwayland.wlr_xwayland; wlr_xwayland_set_seat(xwayland, seat->wlr_seat); } #endif @@ -328,14 +327,13 @@ static void collect_focus_container_iter(struct sway_container *container, collect_focus_iter(&container->node, data); } -struct sway_seat *seat_create(struct sway_input_manager *input, - const char *seat_name) { +struct sway_seat *seat_create(const char *seat_name) { struct sway_seat *seat = calloc(1, sizeof(struct sway_seat)); if (!seat) { return NULL; } - seat->wlr_seat = wlr_seat_create(input->server->wl_display, seat_name); + seat->wlr_seat = wlr_seat_create(server.wl_display, seat_name); if (!sway_assert(seat->wlr_seat, "could not allocate seat")) { free(seat); return NULL; @@ -361,10 +359,9 @@ struct sway_seat *seat_create(struct sway_input_manager *input, wl_signal_add(&seat->wlr_seat->events.new_drag_icon, &seat->new_drag_icon); seat->new_drag_icon.notify = handle_new_drag_icon; - seat->input = input; wl_list_init(&seat->devices); - wl_list_insert(&input->seats, &seat->link); + wl_list_insert(&server.input->seats, &seat->link); return seat; } diff --git a/sway/ipc-json.c b/sway/ipc-json.c index 54d611f2..a29647ed 100644 --- a/sway/ipc-json.c +++ b/sway/ipc-json.c @@ -340,7 +340,7 @@ static void focus_inactive_children_iterator(struct sway_node *node, } json_object *ipc_json_describe_node(struct sway_node *node) { - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); bool focused = seat_get_focus(seat) == node; json_object *object = json_object_new_object(); diff --git a/sway/ipc-server.c b/sway/ipc-server.c index 63c95503..619d2aef 100644 --- a/sway/ipc-server.c +++ b/sway/ipc-server.c @@ -547,7 +547,7 @@ static void ipc_get_workspaces_callback(struct sway_workspace *workspace, json_object *workspace_json = ipc_json_describe_node(&workspace->node); // override the default focused indicator because // it's set differently for the get_workspaces reply - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); struct sway_workspace *focused_ws = seat_get_focused_workspace(seat); bool focused = workspace == focused_ws; json_object_object_del(workspace_json, "focused"); @@ -702,7 +702,7 @@ void ipc_client_handle_command(struct ipc_client *client) { { json_object *inputs = json_object_new_array(); struct sway_input_device *device = NULL; - wl_list_for_each(device, &input_manager->devices, link) { + wl_list_for_each(device, &server.input->devices, link) { json_object_array_add(inputs, ipc_json_describe_input(device)); } const char *json_string = json_object_to_json_string(inputs); @@ -716,7 +716,7 @@ void ipc_client_handle_command(struct ipc_client *client) { { json_object *seats = json_object_new_array(); struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { json_object_array_add(seats, ipc_json_describe_seat(seat)); } const char *json_string = json_object_to_json_string(seats); diff --git a/sway/server.c b/sway/server.c index 1fd7b7fa..23d42028 100644 --- a/sway/server.c +++ b/sway/server.c @@ -153,7 +153,9 @@ bool server_init(struct sway_server *server) { server->dirty_nodes = create_list(); server->transactions = create_list(); - input_manager = input_manager_create(server); + server->input = input_manager_create(server); + input_manager_get_default_seat(); // create seat0 + return true; } diff --git a/sway/tree/container.c b/sway/tree/container.c index edab7a17..b41e8dd4 100644 --- a/sway/tree/container.c +++ b/sway/tree/container.c @@ -200,7 +200,7 @@ static struct sway_container *container_at_tabbed(struct sway_node *parent, if (ly < box.y || ly > box.y + box.height) { return NULL; } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); list_t *children = node_get_children(parent); if (!children->length) { return NULL; @@ -234,7 +234,7 @@ static struct sway_container *container_at_stacked(struct sway_node *parent, if (ly < box.y || ly > box.y + box.height) { return NULL; } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); list_t *children = node_get_children(parent); // Title bars @@ -358,7 +358,7 @@ struct sway_container *container_at(struct sway_workspace *workspace, struct wlr_surface **surface, double *sx, double *sy) { struct sway_container *c; - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_container *focus = seat_get_focused_container(seat); bool is_floating = focus && container_is_floating_or_child(focus); // Focused view's popups @@ -651,7 +651,7 @@ void container_set_floating(struct sway_container *container, bool enable) { return; } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *workspace = container->workspace; if (enable) { @@ -843,7 +843,7 @@ bool container_has_urgent_child(struct sway_container *container) { void container_end_mouse_operation(struct sway_container *container) { struct sway_seat *seat; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { if (seat->op_container == container) { seat->op_target_node = NULL; // ensure tiling move doesn't apply seat_end_mouse_operation(seat); @@ -890,7 +890,7 @@ void container_set_fullscreen(struct sway_container *container, bool enable) { struct sway_seat *seat; struct sway_workspace *focus_ws; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { focus_ws = seat_get_focused_workspace(seat); if (focus_ws) { if (focus_ws == workspace) { @@ -1033,7 +1033,7 @@ void container_add_gaps(struct sway_container *c) { struct sway_view *view = c->view; if (!view) { struct sway_seat *seat = - input_manager_get_default_seat(input_manager); + input_manager_get_default_seat(); struct sway_container *focus = seat_get_focus_inactive_view(seat, &c->node); view = focus ? focus->view : NULL; @@ -1187,7 +1187,7 @@ void container_replace(struct sway_container *container, struct sway_container *container_split(struct sway_container *child, enum sway_container_layout layout) { - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); bool set_focus = (seat_get_focus(seat) == &child->node); struct sway_container *cont = container_create(NULL); diff --git a/sway/tree/output.c b/sway/tree/output.c index c3176325..524a64ab 100644 --- a/sway/tree/output.c +++ b/sway/tree/output.c @@ -83,7 +83,7 @@ void output_enable(struct sway_output *output, struct output_config *oc) { struct sway_workspace *ws = workspace_create(output, ws_name); // Set each seat's focus if not already set struct sway_seat *seat = NULL; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { if (!seat->has_focus) { seat_set_focus_workspace(seat, ws); } @@ -97,7 +97,7 @@ void output_enable(struct sway_output *output, struct output_config *oc) { } wl_signal_init(&output->events.destroy); - input_manager_configure_xcursor(input_manager); + input_manager_configure_xcursor(); wl_signal_add(&wlr_output->events.mode, &output->mode); wl_signal_add(&wlr_output->events.transform, &output->transform); diff --git a/sway/tree/root.c b/sway/tree/root.c index 6748e9c9..e5eb8f2a 100644 --- a/sway/tree/root.c +++ b/sway/tree/root.c @@ -67,7 +67,7 @@ void root_scratchpad_add_container(struct sway_container *con) { container_set_floating(con, true); container_detach(con); - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); if (parent) { arrange_container(parent); seat_set_focus(seat, seat_get_focus_inactive(seat, &parent->node)); @@ -89,7 +89,7 @@ void root_scratchpad_remove_container(struct sway_container *con) { } void root_scratchpad_show(struct sway_container *con) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *ws = seat_get_focused_workspace(seat); // If the current con or any of its parents are in fullscreen mode, we @@ -127,7 +127,7 @@ void root_scratchpad_show(struct sway_container *con) { } void root_scratchpad_hide(struct sway_container *con) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_node *focus = seat_get_focus(seat); struct sway_workspace *ws = con->workspace; @@ -210,7 +210,7 @@ void root_record_workspace_pid(pid_t pid) { wl_list_init(&pid_workspaces); } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *ws = seat_get_focused_workspace(seat); if (!ws) { wlr_log(WLR_DEBUG, "Bailing out, no workspace"); diff --git a/sway/tree/view.c b/sway/tree/view.c index 43a9d510..85afbb87 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -305,7 +305,7 @@ void view_request_activate(struct sway_view *view) { if (!ws) { // hidden scratchpad container return; } - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); switch (config->focus_on_window_activation) { case FOWA_SMART: @@ -443,7 +443,7 @@ void view_execute_criteria(struct sway_view *view) { } static struct sway_workspace *select_workspace(struct sway_view *view) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); // Check if there's any `assign` criteria for the view list_t *criterias = criteria_for_view(view, @@ -517,7 +517,7 @@ static struct sway_workspace *select_workspace(struct sway_view *view) { } static bool should_focus(struct sway_view *view) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_container *prev_con = seat_get_focused_container(seat); struct sway_workspace *prev_ws = seat_get_focused_workspace(seat); struct sway_workspace *map_ws = view->container->workspace; @@ -551,7 +551,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface, } view->surface = wlr_surface; - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *ws = select_workspace(view); struct sway_node *node = seat_get_focus_inactive(seat, &ws->node); struct sway_container *target_sibling = node->type == N_CONTAINER ? @@ -616,7 +616,7 @@ void view_map(struct sway_view *view, struct wlr_surface *wlr_surface, } if (should_focus(view)) { - input_manager_set_focus(input_manager, &view->container->node); + input_manager_set_focus(&view->container->node); } } @@ -645,7 +645,7 @@ void view_unmap(struct sway_view *view) { } struct sway_seat *seat; - wl_list_for_each(seat, &input_manager->seats, link) { + wl_list_for_each(seat, &server.input->seats, link) { if (config->mouse_warping == WARP_CONTAINER) { struct sway_node *node = seat_get_focus(seat); if (node && node->type == N_CONTAINER) { @@ -1106,7 +1106,7 @@ bool view_is_visible(struct sway_view *view) { return false; } // Check view isn't in a tabbed or stacked container on an inactive tab - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_container *con = view->container; while (con) { enum sway_container_layout layout = container_parent_layout(con); @@ -1138,7 +1138,7 @@ void view_set_urgent(struct sway_view *view, bool enable) { return; } if (enable) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); if (seat_get_focused_container(seat) == view->container) { return; } diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c index 2a00824d..e840219f 100644 --- a/sway/tree/workspace.c +++ b/sway/tree/workspace.c @@ -40,7 +40,7 @@ struct sway_output *workspace_get_initial_output(const char *name) { } } // Otherwise put it on the focused output - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *focus = seat_get_focused_workspace(seat); return focus->output; } @@ -287,7 +287,7 @@ static bool _workspace_by_name(struct sway_workspace *ws, void *data) { } struct sway_workspace *workspace_by_name(const char *name) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *current = seat_get_focused_workspace(seat); if (strcmp(name, "prev") == 0) { @@ -316,7 +316,7 @@ struct sway_workspace *workspace_by_name(const char *name) { */ static struct sway_workspace *workspace_output_prev_next_impl( struct sway_output *output, int dir) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *workspace = seat_get_focused_workspace(seat); int index = list_find(output->workspaces, workspace); @@ -368,7 +368,7 @@ struct sway_workspace *workspace_prev(struct sway_workspace *current) { bool workspace_switch(struct sway_workspace *workspace, bool no_auto_back_and_forth) { - struct sway_seat *seat = input_manager_current_seat(input_manager); + struct sway_seat *seat = input_manager_current_seat(); struct sway_workspace *active_ws = seat_get_focused_workspace(seat); if (!no_auto_back_and_forth && config->auto_back_and_forth @@ -619,7 +619,7 @@ void workspace_add_gaps(struct sway_workspace *ws) { return; } if (config->smart_gaps) { - struct sway_seat *seat = input_manager_get_default_seat(input_manager); + struct sway_seat *seat = input_manager_get_default_seat(); struct sway_container *focus = seat_get_focus_inactive_tiling(seat, ws); if (focus && !focus->view) {