mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	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).
This commit is contained in:
		
							parent
							
								
									5b8257b88f
								
							
						
					
					
						commit
						c006717910
					
				
					 28 changed files with 116 additions and 149 deletions
				
			
		| 
						 | 
					@ -7,12 +7,6 @@
 | 
				
			||||||
#include "sway/config.h"
 | 
					#include "sway/config.h"
 | 
				
			||||||
#include "list.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 {
 | 
					struct sway_input_device {
 | 
				
			||||||
	char *identifier;
 | 
						char *identifier;
 | 
				
			||||||
	struct wlr_input_device *wlr_device;
 | 
						struct wlr_input_device *wlr_device;
 | 
				
			||||||
| 
						 | 
					@ -21,7 +15,6 @@ struct sway_input_device {
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_input_manager {
 | 
					struct sway_input_manager {
 | 
				
			||||||
	struct sway_server *server;
 | 
					 | 
				
			||||||
	struct wl_list devices;
 | 
						struct wl_list devices;
 | 
				
			||||||
	struct wl_list seats;
 | 
						struct wl_list seats;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,30 +29,24 @@ struct sway_input_manager {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_input_manager *input_manager_create(struct sway_server *server);
 | 
					struct sway_input_manager *input_manager_create(struct sway_server *server);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool input_manager_has_focus(struct sway_input_manager *input,
 | 
					bool input_manager_has_focus(struct sway_node *node);
 | 
				
			||||||
		struct sway_node *node);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_set_focus(struct sway_input_manager *input,
 | 
					void input_manager_set_focus(struct sway_node *node);
 | 
				
			||||||
		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,
 | 
					void input_manager_apply_input_config(struct input_config *input_config);
 | 
				
			||||||
		struct input_config *input_config);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_apply_seat_config(struct sway_input_manager *input,
 | 
					void input_manager_apply_seat_config(struct seat_config *seat_config);
 | 
				
			||||||
		struct seat_config *seat_config);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_seat *input_manager_get_default_seat(
 | 
					struct sway_seat *input_manager_get_default_seat(void);
 | 
				
			||||||
		struct sway_input_manager *input);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_seat *input_manager_get_seat(struct sway_input_manager *input,
 | 
					struct sway_seat *input_manager_get_seat(const char *seat_name);
 | 
				
			||||||
		const char *seat_name);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Gets the last seat the user interacted with
 | 
					 * 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);
 | 
					struct input_config *input_device_get_config(struct sway_input_device *device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,6 @@ enum sway_seat_operation {
 | 
				
			||||||
struct sway_seat {
 | 
					struct sway_seat {
 | 
				
			||||||
	struct wlr_seat *wlr_seat;
 | 
						struct wlr_seat *wlr_seat;
 | 
				
			||||||
	struct sway_cursor *cursor;
 | 
						struct sway_cursor *cursor;
 | 
				
			||||||
	struct sway_input_manager *input;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool has_focus;
 | 
						bool has_focus;
 | 
				
			||||||
	struct wl_list focus_stack; // list of containers in focus order
 | 
						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 wl_list link; // input_manager::seats
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_seat *seat_create(struct sway_input_manager *input,
 | 
					struct sway_seat *seat_create(const char *seat_name);
 | 
				
			||||||
		const char *seat_name);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_destroy(struct sway_seat *seat);
 | 
					void seat_destroy(struct sway_seat *seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ void apply_seat_config(struct seat_config *seat_config) {
 | 
				
			||||||
		list_add(config->seat_configs, 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 */
 | 
					/* Keep alphabetized */
 | 
				
			||||||
| 
						 | 
					@ -240,7 +240,7 @@ struct cmd_results *execute_command(char *_exec, struct sway_seat *seat,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (seat == NULL) {
 | 
						if (seat == NULL) {
 | 
				
			||||||
		// passing a NULL seat means we just pick the default seat
 | 
							// 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")) {
 | 
							if (!sway_assert(seat, "could not find a seat to run the command on")) {
 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ struct cmd_results *cmd_border(int argc, char **argv) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	arrange_container(view->container);
 | 
						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) {
 | 
						if (seat->cursor) {
 | 
				
			||||||
		cursor_rebase(seat->cursor);
 | 
							cursor_rebase(seat->cursor);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,7 +71,7 @@ struct cmd_results *cmd_input(int argc, char **argv) {
 | 
				
			||||||
		struct input_config *ic =
 | 
							struct input_config *ic =
 | 
				
			||||||
			store_input_config(config->handler_context.input_config);
 | 
								store_input_config(config->handler_context.input_config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		input_manager_apply_input_config(input_manager, ic);
 | 
							input_manager_apply_input_config(ic);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		free_input_config(config->handler_context.input_config);
 | 
							free_input_config(config->handler_context.input_config);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +103,7 @@ static void workspace_focus_fullscreen(struct sway_workspace *workspace) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	struct sway_seat *seat;
 | 
						struct sway_seat *seat;
 | 
				
			||||||
	struct sway_workspace *focus_ws;
 | 
						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);
 | 
							focus_ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
		if (focus_ws == workspace) {
 | 
							if (focus_ws == workspace) {
 | 
				
			||||||
			struct sway_node *new_focus =
 | 
								struct sway_node *new_focus =
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,7 +8,7 @@
 | 
				
			||||||
#include "sway/tree/workspace.h"
 | 
					#include "sway/tree/workspace.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void scratchpad_toggle_auto(void) {
 | 
					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_container *focus = seat_get_focused_container(seat);
 | 
				
			||||||
	struct sway_workspace *ws = seat_get_focused_workspace(seat);
 | 
						struct sway_workspace *ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -108,7 +108,7 @@ static void container_swap(struct sway_container *con1,
 | 
				
			||||||
		container_set_fullscreen(con2, false);
 | 
							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_container *focus = seat_get_focused_container(seat);
 | 
				
			||||||
	struct sway_workspace *vis1 =
 | 
						struct sway_workspace *vis1 =
 | 
				
			||||||
		output_get_active_workspace(con1->workspace->output);
 | 
							output_get_active_workspace(con1->workspace->output);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,8 +151,7 @@ static void destroy_removed_seats(struct sway_config *old_config,
 | 
				
			||||||
		/* Also destroy seats that aren't present in new config */
 | 
							/* Also destroy seats that aren't present in new config */
 | 
				
			||||||
		if (new_config && list_seq_find(new_config->seat_configs,
 | 
							if (new_config && list_seq_find(new_config->seat_configs,
 | 
				
			||||||
				seat_name_cmp, seat_config->name) < 0) {
 | 
									seat_name_cmp, seat_config->name) < 0) {
 | 
				
			||||||
			seat = input_manager_get_seat(input_manager,
 | 
								seat = input_manager_get_seat(seat_config->name);
 | 
				
			||||||
				seat_config->name);
 | 
					 | 
				
			||||||
			seat_destroy(seat);
 | 
								seat_destroy(seat);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -356,7 +356,7 @@ static enum criteria_token token_from_name(char *name) {
 | 
				
			||||||
 * criteria is only executed once per view.
 | 
					 * criteria is only executed once per view.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static char *get_focused_prop(enum criteria_token token) {
 | 
					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);
 | 
						struct sway_container *focus = seat_get_focused_container(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!focus || !focus->view) {
 | 
						if (!focus || !focus->view) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,7 +140,7 @@ void update_debug_tree(void) {
 | 
				
			||||||
	cairo_t *cairo = cairo_create(surface);
 | 
						cairo_t *cairo = cairo_create(surface);
 | 
				
			||||||
	PangoContext *pango = pango_cairo_create_context(cairo);
 | 
						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);
 | 
						struct sway_node *focus = seat_get_focus(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cairo_set_source_u32(cairo, 0x000000FF);
 | 
						cairo_set_source_u32(cairo, 0x000000FF);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ void arrange_layers(struct sway_output *output) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_seat *seat;
 | 
						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);
 | 
							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);
 | 
							wl_container_of(listener, sway_layer, output_destroy);
 | 
				
			||||||
	// Determine if this layer is being used by an exclusive client. If it is,
 | 
						// 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.
 | 
						// 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 =
 | 
						struct wl_client *client =
 | 
				
			||||||
		wl_resource_get_client(sway_layer->layer_surface->resource);
 | 
							wl_resource_get_client(sway_layer->layer_surface->resource);
 | 
				
			||||||
	bool set_focus = seat->exclusive_client == client;
 | 
						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,
 | 
						output_damage_surface(output, sway_layer->geo.x, sway_layer->geo.y,
 | 
				
			||||||
		sway_layer->layer_surface->surface, true);
 | 
							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) {
 | 
						if (seat->focused_layer == sway_layer->layer_surface) {
 | 
				
			||||||
		seat_set_focus_layer(seat, NULL);
 | 
							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) {
 | 
						if (!layer_surface->output) {
 | 
				
			||||||
		// Assign last active output
 | 
							// Assign last active output
 | 
				
			||||||
		struct sway_output *output = NULL;
 | 
							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) {
 | 
							if (seat) {
 | 
				
			||||||
			struct sway_workspace *ws = seat_get_focused_workspace(seat);
 | 
								struct sway_workspace *ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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_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);
 | 
						struct sway_node *focus = seat_get_active_tiling_child(seat, &output->node);
 | 
				
			||||||
	if (!focus) {
 | 
						if (!focus) {
 | 
				
			||||||
		return output->workspaces->items[0];
 | 
							return output->workspaces->items[0];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -885,7 +885,7 @@ static void render_floating(struct sway_output *soutput,
 | 
				
			||||||
static void render_dropzones(struct sway_output *output,
 | 
					static void render_dropzones(struct sway_output *output,
 | 
				
			||||||
		pixman_region32_t *damage) {
 | 
							pixman_region32_t *damage) {
 | 
				
			||||||
	struct sway_seat *seat;
 | 
						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
 | 
							if (seat->operation == OP_MOVE_TILING && seat->op_target_node
 | 
				
			||||||
				&& node_get_output(seat->op_target_node) == output) {
 | 
									&& node_get_output(seat->op_target_node) == output) {
 | 
				
			||||||
			float color[4];
 | 
								float color[4];
 | 
				
			||||||
| 
						 | 
					@ -995,7 +995,7 @@ void output_render(struct sway_output *output, struct timespec *when,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	render_dropzones(output, damage);
 | 
						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);
 | 
						struct sway_container *focus = seat_get_focused_container(seat);
 | 
				
			||||||
	if (focus && focus->view) {
 | 
						if (focus && focus->view) {
 | 
				
			||||||
		render_view_popups(focus->view, output, damage, focus->alpha);
 | 
							render_view_popups(focus->view, output, damage, focus->alpha);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,7 +110,7 @@ static void copy_workspace_state(struct sway_workspace *ws,
 | 
				
			||||||
	list_cat(state->floating, ws->floating);
 | 
						list_cat(state->floating, ws->floating);
 | 
				
			||||||
	list_cat(state->tiling, ws->tiling);
 | 
						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;
 | 
						state->focused = seat_get_focus(seat) == &ws->node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set focused_inactive_child to the direct tiling child
 | 
						// 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);
 | 
							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;
 | 
						state->focused = seat_get_focus(seat) == &container->node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!container->view) {
 | 
						if (!container->view) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
						desktop_damage_surface(xsurface->surface, surface->lx, surface->ly, true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (wlr_xwayland_or_surface_wants_focus(xsurface)) {
 | 
						if (wlr_xwayland_or_surface_wants_focus(xsurface)) {
 | 
				
			||||||
		struct sway_seat *seat = input_manager_current_seat(input_manager);
 | 
							struct sway_seat *seat = input_manager_current_seat();
 | 
				
			||||||
		struct wlr_xwayland *xwayland =
 | 
							struct wlr_xwayland *xwayland = server.xwayland.wlr_xwayland;
 | 
				
			||||||
			seat->input->server->xwayland.wlr_xwayland;
 | 
					 | 
				
			||||||
		wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
 | 
							wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
 | 
				
			||||||
		seat_set_focus_surface(seat, xsurface->surface, false);
 | 
							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->link);
 | 
				
			||||||
	wl_list_remove(&surface->commit.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 ==
 | 
						if (seat->wlr_seat->keyboard_state.focused_surface ==
 | 
				
			||||||
			xsurface->surface) {
 | 
								xsurface->surface) {
 | 
				
			||||||
		// Restore focus
 | 
							// Restore focus
 | 
				
			||||||
| 
						 | 
					@ -457,7 +456,7 @@ static void handle_request_move(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	if (!container_is_floating(view->container)) {
 | 
						if (!container_is_floating(view->container)) {
 | 
				
			||||||
		return;
 | 
							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);
 | 
						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;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	struct wlr_xwayland_resize_event *e = data;
 | 
						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_begin_resize_floating(seat, view->container,
 | 
				
			||||||
			seat->last_button, e->edges);
 | 
								seat->last_button, e->edges);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -680,7 +680,7 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void handle_cursor_motion(struct wl_listener *listener, void *data) {
 | 
					static void handle_cursor_motion(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, motion);
 | 
						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;
 | 
						struct wlr_event_pointer_motion *event = data;
 | 
				
			||||||
	wlr_cursor_move(cursor->cursor, event->device,
 | 
						wlr_cursor_move(cursor->cursor, event->device,
 | 
				
			||||||
		event->delta_x, event->delta_y);
 | 
							event->delta_x, event->delta_y);
 | 
				
			||||||
| 
						 | 
					@ -692,7 +692,7 @@ static void handle_cursor_motion_absolute(
 | 
				
			||||||
		struct wl_listener *listener, void *data) {
 | 
							struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor =
 | 
						struct sway_cursor *cursor =
 | 
				
			||||||
		wl_container_of(listener, cursor, motion_absolute);
 | 
							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;
 | 
						struct wlr_event_pointer_motion_absolute *event = data;
 | 
				
			||||||
	wlr_cursor_warp_absolute(cursor->cursor, event->device, event->x, event->y);
 | 
						wlr_cursor_warp_absolute(cursor->cursor, event->device, event->x, event->y);
 | 
				
			||||||
	cursor_send_pointer_motion(cursor, event->time_msec);
 | 
						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) {
 | 
					static void handle_cursor_button(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, button);
 | 
						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;
 | 
						struct wlr_event_pointer_button *event = data;
 | 
				
			||||||
	dispatch_cursor_button(cursor, event->device,
 | 
						dispatch_cursor_button(cursor, event->device,
 | 
				
			||||||
			event->time_msec, event->button, event->state);
 | 
								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) {
 | 
					static void handle_cursor_axis(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, axis);
 | 
						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;
 | 
						struct wlr_event_pointer_axis *event = data;
 | 
				
			||||||
	dispatch_cursor_axis(cursor, event);
 | 
						dispatch_cursor_axis(cursor, event);
 | 
				
			||||||
	transaction_commit_dirty();
 | 
						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) {
 | 
					static void handle_touch_down(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_down);
 | 
						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 wlr_event_touch_down *event = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_seat *seat = cursor->seat;
 | 
						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) {
 | 
					static void handle_touch_up(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, touch_up);
 | 
						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_event_touch_up *event = data;
 | 
				
			||||||
	struct wlr_seat *seat = cursor->seat->wlr_seat;
 | 
						struct wlr_seat *seat = cursor->seat->wlr_seat;
 | 
				
			||||||
	// TODO: fall back to cursor simulation if client has not bound to touch
 | 
						// 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) {
 | 
					static void handle_touch_motion(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor =
 | 
						struct sway_cursor *cursor =
 | 
				
			||||||
		wl_container_of(listener, cursor, touch_motion);
 | 
							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 wlr_event_touch_motion *event = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_seat *seat = cursor->seat;
 | 
						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) {
 | 
					static void handle_tool_axis(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_axis);
 | 
						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 wlr_event_tablet_tool_axis *event = data;
 | 
				
			||||||
	struct sway_input_device *input_device = event->device->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) {
 | 
					static void handle_tool_tip(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_tip);
 | 
						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;
 | 
						struct wlr_event_tablet_tool_tip *event = data;
 | 
				
			||||||
	dispatch_cursor_button(cursor, event->device, event->time_msec,
 | 
						dispatch_cursor_button(cursor, event->device, event->time_msec,
 | 
				
			||||||
			BTN_LEFT, event->state == WLR_TABLET_TOOL_TIP_DOWN ?
 | 
								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) {
 | 
					static void handle_tool_button(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct sway_cursor *cursor = wl_container_of(listener, cursor, tool_button);
 | 
						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;
 | 
						struct wlr_event_tablet_tool_button *event = data;
 | 
				
			||||||
	// TODO: the user may want to configure which tool buttons are mapped to
 | 
						// TODO: the user may want to configure which tool buttons are mapped to
 | 
				
			||||||
	// which simulated pointer buttons
 | 
						// which simulated pointer buttons
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,32 +17,28 @@
 | 
				
			||||||
#include "list.h"
 | 
					#include "list.h"
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const char *default_seat = "seat0";
 | 
					#define DEFAULT_SEAT "seat0"
 | 
				
			||||||
 | 
					 | 
				
			||||||
// TODO make me not global
 | 
					 | 
				
			||||||
struct sway_input_manager *input_manager;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct input_config *current_input_config = NULL;
 | 
					struct input_config *current_input_config = NULL;
 | 
				
			||||||
struct seat_config *current_seat_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;
 | 
						struct sway_seat *seat = config->handler_context.seat;
 | 
				
			||||||
	if (!seat) {
 | 
						if (!seat) {
 | 
				
			||||||
		seat = input_manager_get_default_seat(input_manager);
 | 
							seat = input_manager_get_default_seat();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return seat;
 | 
						return seat;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_seat *input_manager_get_seat(
 | 
					struct sway_seat *input_manager_get_seat(const char *seat_name) {
 | 
				
			||||||
		struct sway_input_manager *input, const char *seat_name) {
 | 
					 | 
				
			||||||
	struct sway_seat *seat = NULL;
 | 
						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) {
 | 
							if (strcmp(seat->wlr_seat->name, seat_name) == 0) {
 | 
				
			||||||
			return seat;
 | 
								return seat;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return seat_create(input, seat_name);
 | 
						return seat_create(seat_name);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char *input_device_get_identifier(struct wlr_input_device *device) {
 | 
					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(
 | 
					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;
 | 
						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) {
 | 
							if (input_device->wlr_device == device) {
 | 
				
			||||||
			return input_device;
 | 
								return input_device;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -82,9 +78,9 @@ static struct sway_input_device *input_sway_device_from_wlr(
 | 
				
			||||||
	return NULL;
 | 
						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;
 | 
						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);
 | 
							struct seat_config *seat_config = seat_get_config(seat);
 | 
				
			||||||
		if (seat_config) {
 | 
							if (seat_config) {
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
| 
						 | 
					@ -244,8 +240,7 @@ static void input_manager_libinput_config_pointer(
 | 
				
			||||||
static void handle_device_destroy(struct wl_listener *listener, void *data) {
 | 
					static void handle_device_destroy(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct wlr_input_device *device = data;
 | 
						struct wlr_input_device *device = data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_input_device *input_device =
 | 
						struct sway_input_device *input_device = input_sway_device_from_wlr(device);
 | 
				
			||||||
		input_sway_device_from_wlr(input_manager, device);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!sway_assert(input_device, "could not find sway device")) {
 | 
						if (!sway_assert(input_device, "could not find sway device")) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					@ -255,7 +250,7 @@ static void handle_device_destroy(struct wl_listener *listener, void *data) {
 | 
				
			||||||
		input_device->identifier);
 | 
							input_device->identifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_seat *seat = NULL;
 | 
						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);
 | 
							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;
 | 
						input_device->device_destroy.notify = handle_device_destroy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_seat *seat = NULL;
 | 
						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");
 | 
							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);
 | 
							seat_add_device(seat, input_device);
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -364,7 +359,7 @@ void handle_virtual_keyboard(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct wlr_virtual_keyboard_v1 *keyboard = data;
 | 
						struct wlr_virtual_keyboard_v1 *keyboard = data;
 | 
				
			||||||
	struct wlr_input_device *device = &keyboard->input_device;
 | 
						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
 | 
						// TODO: The user might want this on a different seat
 | 
				
			||||||
	struct sway_input_device *input_device =
 | 
						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);
 | 
						seat_add_device(seat, input_device);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_input_manager *input_manager_create(
 | 
					struct sway_input_manager *input_manager_create(struct sway_server *server) {
 | 
				
			||||||
		struct sway_server *server) {
 | 
					 | 
				
			||||||
	struct sway_input_manager *input =
 | 
						struct sway_input_manager *input =
 | 
				
			||||||
		calloc(1, sizeof(struct sway_input_manager));
 | 
							calloc(1, sizeof(struct sway_input_manager));
 | 
				
			||||||
	if (!input) {
 | 
						if (!input) {
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	input->server = server;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_list_init(&input->devices);
 | 
						wl_list_init(&input->devices);
 | 
				
			||||||
	wl_list_init(&input->seats);
 | 
						wl_list_init(&input->seats);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// create the default seat
 | 
					 | 
				
			||||||
	input_manager_get_seat(input, default_seat);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	input->new_input.notify = handle_new_input;
 | 
						input->new_input.notify = handle_new_input;
 | 
				
			||||||
	wl_signal_add(&server->backend->events.new_input, &input->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;
 | 
						return input;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool input_manager_has_focus(struct sway_input_manager *input,
 | 
					bool input_manager_has_focus(struct sway_node *node) {
 | 
				
			||||||
		struct sway_node *node) {
 | 
					 | 
				
			||||||
	struct sway_seat *seat = NULL;
 | 
						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) {
 | 
							if (seat_get_focus(seat) == node) {
 | 
				
			||||||
			return true;
 | 
								return true;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -434,19 +423,17 @@ bool input_manager_has_focus(struct sway_input_manager *input,
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_set_focus(struct sway_input_manager *input,
 | 
					void input_manager_set_focus(struct sway_node *node) {
 | 
				
			||||||
		struct sway_node *node) {
 | 
					 | 
				
			||||||
	struct sway_seat *seat;
 | 
						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);
 | 
							seat_set_focus(seat, node);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_apply_input_config(struct sway_input_manager *input,
 | 
					void input_manager_apply_input_config(struct input_config *input_config) {
 | 
				
			||||||
		struct input_config *input_config) {
 | 
					 | 
				
			||||||
	struct sway_input_device *input_device = NULL;
 | 
						struct sway_input_device *input_device = NULL;
 | 
				
			||||||
	bool wildcard = strcmp(input_config->identifier, "*") == 0;
 | 
						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
 | 
							if (strcmp(input_device->identifier, input_config->identifier) == 0
 | 
				
			||||||
				|| wildcard) {
 | 
									|| wildcard) {
 | 
				
			||||||
			if (input_device->wlr_device->type == WLR_INPUT_DEVICE_POINTER ||
 | 
								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;
 | 
								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);
 | 
									seat_configure_device(seat, input_device);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_apply_seat_config(struct sway_input_manager *input,
 | 
					void input_manager_apply_seat_config(struct seat_config *seat_config) {
 | 
				
			||||||
		struct seat_config *seat_config) {
 | 
					 | 
				
			||||||
	wlr_log(WLR_DEBUG, "applying new seat config for seat %s",
 | 
						wlr_log(WLR_DEBUG, "applying new seat config for seat %s",
 | 
				
			||||||
		seat_config->name);
 | 
							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) {
 | 
						if (!seat) {
 | 
				
			||||||
		return;
 | 
							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
 | 
						// for every device, try to add it to a seat and if no seat has it
 | 
				
			||||||
	// attached, add it to the fallback seats.
 | 
						// attached, add it to the fallback seats.
 | 
				
			||||||
	struct sway_input_device *input_device = NULL;
 | 
						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();
 | 
							list_t *seat_list = create_list();
 | 
				
			||||||
		struct sway_seat *seat = NULL;
 | 
							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);
 | 
								struct seat_config *seat_config = seat_get_config(seat);
 | 
				
			||||||
			if (!seat_config) {
 | 
								if (!seat_config) {
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
| 
						 | 
					@ -496,7 +482,7 @@ void input_manager_apply_seat_config(struct sway_input_manager *input,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (seat_list->length) {
 | 
							if (seat_list->length) {
 | 
				
			||||||
			wl_list_for_each(seat, &input->seats, link) {
 | 
								wl_list_for_each(seat, &server.input->seats, link) {
 | 
				
			||||||
				bool attached = false;
 | 
									bool attached = false;
 | 
				
			||||||
				for (int i = 0; i < seat_list->length; ++i) {
 | 
									for (int i = 0; i < seat_list->length; ++i) {
 | 
				
			||||||
					if (seat == seat_list->items[i]) {
 | 
										if (seat == seat_list->items[i]) {
 | 
				
			||||||
| 
						 | 
					@ -511,7 +497,7 @@ void input_manager_apply_seat_config(struct sway_input_manager *input,
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} 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);
 | 
									struct seat_config *seat_config = seat_get_config(seat);
 | 
				
			||||||
				if (seat_config && seat_config->fallback == 1) {
 | 
									if (seat_config && seat_config->fallback == 1) {
 | 
				
			||||||
					seat_add_device(seat, input_device);
 | 
										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;
 | 
						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);
 | 
							seat_configure_xcursor(seat);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_seat *input_manager_get_default_seat(
 | 
					struct sway_seat *input_manager_get_default_seat(void) {
 | 
				
			||||||
		struct sway_input_manager *input) {
 | 
					 | 
				
			||||||
	struct sway_seat *seat = NULL;
 | 
						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, "seat0") == 0) {
 | 
							if (strcmp(seat->wlr_seat->name, DEFAULT_SEAT) == 0) {
 | 
				
			||||||
			return seat;
 | 
								return seat;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ static void handle_keyboard_key(struct wl_listener *listener, void *data) {
 | 
				
			||||||
	struct wlr_input_device *wlr_device =
 | 
						struct wlr_input_device *wlr_device =
 | 
				
			||||||
		keyboard->seat_device->input_device->wlr_device;
 | 
							keyboard->seat_device->input_device->wlr_device;
 | 
				
			||||||
	char *device_identifier = input_device_get_identifier(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;
 | 
						struct wlr_event_keyboard_key *event = data;
 | 
				
			||||||
	bool input_inhibited = seat->exclusive_client != NULL;
 | 
						bool input_inhibited = seat->exclusive_client != NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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)) {
 | 
						if (view && seat_is_input_allowed(seat, view->surface)) {
 | 
				
			||||||
#ifdef HAVE_XWAYLAND
 | 
					#ifdef HAVE_XWAYLAND
 | 
				
			||||||
		if (view->type == SWAY_VIEW_XWAYLAND) {
 | 
							if (view->type == SWAY_VIEW_XWAYLAND) {
 | 
				
			||||||
			struct wlr_xwayland *xwayland =
 | 
								struct wlr_xwayland *xwayland = server.xwayland.wlr_xwayland;
 | 
				
			||||||
				seat->input->server->xwayland.wlr_xwayland;
 | 
					 | 
				
			||||||
			wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
 | 
								wlr_xwayland_set_seat(xwayland, seat->wlr_seat);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -328,14 +327,13 @@ static void collect_focus_container_iter(struct sway_container *container,
 | 
				
			||||||
	collect_focus_iter(&container->node, data);
 | 
						collect_focus_iter(&container->node, data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sway_seat *seat_create(struct sway_input_manager *input,
 | 
					struct sway_seat *seat_create(const char *seat_name) {
 | 
				
			||||||
		const char *seat_name) {
 | 
					 | 
				
			||||||
	struct sway_seat *seat = calloc(1, sizeof(struct sway_seat));
 | 
						struct sway_seat *seat = calloc(1, sizeof(struct sway_seat));
 | 
				
			||||||
	if (!seat) {
 | 
						if (!seat) {
 | 
				
			||||||
		return NULL;
 | 
							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")) {
 | 
						if (!sway_assert(seat->wlr_seat, "could not allocate seat")) {
 | 
				
			||||||
		free(seat);
 | 
							free(seat);
 | 
				
			||||||
		return NULL;
 | 
							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);
 | 
						wl_signal_add(&seat->wlr_seat->events.new_drag_icon, &seat->new_drag_icon);
 | 
				
			||||||
	seat->new_drag_icon.notify = handle_new_drag_icon;
 | 
						seat->new_drag_icon.notify = handle_new_drag_icon;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	seat->input = input;
 | 
					 | 
				
			||||||
	wl_list_init(&seat->devices);
 | 
						wl_list_init(&seat->devices);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_list_insert(&input->seats, &seat->link);
 | 
						wl_list_insert(&server.input->seats, &seat->link);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return seat;
 | 
						return seat;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -340,7 +340,7 @@ static void focus_inactive_children_iterator(struct sway_node *node,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
json_object *ipc_json_describe_node(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;
 | 
						bool focused = seat_get_focus(seat) == node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	json_object *object = json_object_new_object();
 | 
						json_object *object = json_object_new_object();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -547,7 +547,7 @@ static void ipc_get_workspaces_callback(struct sway_workspace *workspace,
 | 
				
			||||||
	json_object *workspace_json = ipc_json_describe_node(&workspace->node);
 | 
						json_object *workspace_json = ipc_json_describe_node(&workspace->node);
 | 
				
			||||||
	// override the default focused indicator because
 | 
						// override the default focused indicator because
 | 
				
			||||||
	// it's set differently for the get_workspaces reply
 | 
						// 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);
 | 
						struct sway_workspace *focused_ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
	bool focused = workspace == focused_ws;
 | 
						bool focused = workspace == focused_ws;
 | 
				
			||||||
	json_object_object_del(workspace_json, "focused");
 | 
						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();
 | 
							json_object *inputs = json_object_new_array();
 | 
				
			||||||
		struct sway_input_device *device = NULL;
 | 
							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));
 | 
								json_object_array_add(inputs, ipc_json_describe_input(device));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		const char *json_string = json_object_to_json_string(inputs);
 | 
							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();
 | 
							json_object *seats = json_object_new_array();
 | 
				
			||||||
		struct sway_seat *seat = NULL;
 | 
							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));
 | 
								json_object_array_add(seats, ipc_json_describe_seat(seat));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		const char *json_string = json_object_to_json_string(seats);
 | 
							const char *json_string = json_object_to_json_string(seats);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,7 +153,9 @@ bool server_init(struct sway_server *server) {
 | 
				
			||||||
	server->dirty_nodes = create_list();
 | 
						server->dirty_nodes = create_list();
 | 
				
			||||||
	server->transactions = 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;
 | 
						return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,7 +200,7 @@ static struct sway_container *container_at_tabbed(struct sway_node *parent,
 | 
				
			||||||
	if (ly < box.y || ly > box.y + box.height) {
 | 
						if (ly < box.y || ly > box.y + box.height) {
 | 
				
			||||||
		return NULL;
 | 
							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);
 | 
						list_t *children = node_get_children(parent);
 | 
				
			||||||
	if (!children->length) {
 | 
						if (!children->length) {
 | 
				
			||||||
		return NULL;
 | 
							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) {
 | 
						if (ly < box.y || ly > box.y + box.height) {
 | 
				
			||||||
		return NULL;
 | 
							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);
 | 
						list_t *children = node_get_children(parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Title bars
 | 
						// Title bars
 | 
				
			||||||
| 
						 | 
					@ -358,7 +358,7 @@ struct sway_container *container_at(struct sway_workspace *workspace,
 | 
				
			||||||
		struct wlr_surface **surface, double *sx, double *sy) {
 | 
							struct wlr_surface **surface, double *sx, double *sy) {
 | 
				
			||||||
	struct sway_container *c;
 | 
						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);
 | 
						struct sway_container *focus = seat_get_focused_container(seat);
 | 
				
			||||||
	bool is_floating = focus && container_is_floating_or_child(focus);
 | 
						bool is_floating = focus && container_is_floating_or_child(focus);
 | 
				
			||||||
	// Focused view's popups
 | 
						// Focused view's popups
 | 
				
			||||||
| 
						 | 
					@ -651,7 +651,7 @@ void container_set_floating(struct sway_container *container, bool enable) {
 | 
				
			||||||
		return;
 | 
							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;
 | 
						struct sway_workspace *workspace = container->workspace;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (enable) {
 | 
						if (enable) {
 | 
				
			||||||
| 
						 | 
					@ -843,7 +843,7 @@ bool container_has_urgent_child(struct sway_container *container) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void container_end_mouse_operation(struct sway_container *container) {
 | 
					void container_end_mouse_operation(struct sway_container *container) {
 | 
				
			||||||
	struct sway_seat *seat;
 | 
						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) {
 | 
							if (seat->op_container == container) {
 | 
				
			||||||
			seat->op_target_node = NULL; // ensure tiling move doesn't apply
 | 
								seat->op_target_node = NULL; // ensure tiling move doesn't apply
 | 
				
			||||||
			seat_end_mouse_operation(seat);
 | 
								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_seat *seat;
 | 
				
			||||||
		struct sway_workspace *focus_ws;
 | 
							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);
 | 
								focus_ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
			if (focus_ws) {
 | 
								if (focus_ws) {
 | 
				
			||||||
				if (focus_ws == workspace) {
 | 
									if (focus_ws == workspace) {
 | 
				
			||||||
| 
						 | 
					@ -1033,7 +1033,7 @@ void container_add_gaps(struct sway_container *c) {
 | 
				
			||||||
		struct sway_view *view = c->view;
 | 
							struct sway_view *view = c->view;
 | 
				
			||||||
		if (!view) {
 | 
							if (!view) {
 | 
				
			||||||
			struct sway_seat *seat =
 | 
								struct sway_seat *seat =
 | 
				
			||||||
				input_manager_get_default_seat(input_manager);
 | 
									input_manager_get_default_seat();
 | 
				
			||||||
			struct sway_container *focus =
 | 
								struct sway_container *focus =
 | 
				
			||||||
				seat_get_focus_inactive_view(seat, &c->node);
 | 
									seat_get_focus_inactive_view(seat, &c->node);
 | 
				
			||||||
			view = focus ? focus->view : NULL;
 | 
								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,
 | 
					struct sway_container *container_split(struct sway_container *child,
 | 
				
			||||||
		enum sway_container_layout layout) {
 | 
							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);
 | 
						bool set_focus = (seat_get_focus(seat) == &child->node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_container *cont = container_create(NULL);
 | 
						struct sway_container *cont = container_create(NULL);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,7 +83,7 @@ void output_enable(struct sway_output *output, struct output_config *oc) {
 | 
				
			||||||
		struct sway_workspace *ws = workspace_create(output, ws_name);
 | 
							struct sway_workspace *ws = workspace_create(output, ws_name);
 | 
				
			||||||
		// Set each seat's focus if not already set
 | 
							// Set each seat's focus if not already set
 | 
				
			||||||
		struct sway_seat *seat = NULL;
 | 
							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) {
 | 
								if (!seat->has_focus) {
 | 
				
			||||||
				seat_set_focus_workspace(seat, ws);
 | 
									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);
 | 
						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.mode, &output->mode);
 | 
				
			||||||
	wl_signal_add(&wlr_output->events.transform, &output->transform);
 | 
						wl_signal_add(&wlr_output->events.transform, &output->transform);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,7 +67,7 @@ void root_scratchpad_add_container(struct sway_container *con) {
 | 
				
			||||||
	container_set_floating(con, true);
 | 
						container_set_floating(con, true);
 | 
				
			||||||
	container_detach(con);
 | 
						container_detach(con);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct sway_seat *seat = input_manager_current_seat(input_manager);
 | 
						struct sway_seat *seat = input_manager_current_seat();
 | 
				
			||||||
	if (parent) {
 | 
						if (parent) {
 | 
				
			||||||
		arrange_container(parent);
 | 
							arrange_container(parent);
 | 
				
			||||||
		seat_set_focus(seat, seat_get_focus_inactive(seat, &parent->node));
 | 
							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) {
 | 
					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);
 | 
						struct sway_workspace *ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If the current con or any of its parents are in fullscreen mode, we
 | 
					    // 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) {
 | 
					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_node *focus = seat_get_focus(seat);
 | 
				
			||||||
	struct sway_workspace *ws = con->workspace;
 | 
						struct sway_workspace *ws = con->workspace;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,7 +210,7 @@ void root_record_workspace_pid(pid_t pid) {
 | 
				
			||||||
		wl_list_init(&pid_workspaces);
 | 
							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);
 | 
						struct sway_workspace *ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
	if (!ws) {
 | 
						if (!ws) {
 | 
				
			||||||
		wlr_log(WLR_DEBUG, "Bailing out, no workspace");
 | 
							wlr_log(WLR_DEBUG, "Bailing out, no workspace");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -305,7 +305,7 @@ void view_request_activate(struct sway_view *view) {
 | 
				
			||||||
	if (!ws) { // hidden scratchpad container
 | 
						if (!ws) { // hidden scratchpad container
 | 
				
			||||||
		return;
 | 
							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) {
 | 
						switch (config->focus_on_window_activation) {
 | 
				
			||||||
	case FOWA_SMART:
 | 
						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) {
 | 
					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
 | 
						// Check if there's any `assign` criteria for the view
 | 
				
			||||||
	list_t *criterias = criteria_for_view(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) {
 | 
					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_container *prev_con = seat_get_focused_container(seat);
 | 
				
			||||||
	struct sway_workspace *prev_ws = seat_get_focused_workspace(seat);
 | 
						struct sway_workspace *prev_ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
	struct sway_workspace *map_ws = view->container->workspace;
 | 
						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;
 | 
						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_workspace *ws = select_workspace(view);
 | 
				
			||||||
	struct sway_node *node = seat_get_focus_inactive(seat, &ws->node);
 | 
						struct sway_node *node = seat_get_focus_inactive(seat, &ws->node);
 | 
				
			||||||
	struct sway_container *target_sibling = node->type == N_CONTAINER ?
 | 
						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)) {
 | 
						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;
 | 
						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) {
 | 
							if (config->mouse_warping == WARP_CONTAINER) {
 | 
				
			||||||
			struct sway_node *node = seat_get_focus(seat);
 | 
								struct sway_node *node = seat_get_focus(seat);
 | 
				
			||||||
			if (node && node->type == N_CONTAINER) {
 | 
								if (node && node->type == N_CONTAINER) {
 | 
				
			||||||
| 
						 | 
					@ -1106,7 +1106,7 @@ bool view_is_visible(struct sway_view *view) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Check view isn't in a tabbed or stacked container on an inactive tab
 | 
						// 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;
 | 
						struct sway_container *con = view->container;
 | 
				
			||||||
	while (con) {
 | 
						while (con) {
 | 
				
			||||||
		enum sway_container_layout layout = container_parent_layout(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;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (enable) {
 | 
						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) {
 | 
							if (seat_get_focused_container(seat) == view->container) {
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -40,7 +40,7 @@ struct sway_output *workspace_get_initial_output(const char *name) {
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	// Otherwise put it on the focused output
 | 
						// 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);
 | 
						struct sway_workspace *focus = seat_get_focused_workspace(seat);
 | 
				
			||||||
	return focus->output;
 | 
						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_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);
 | 
						struct sway_workspace *current = seat_get_focused_workspace(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strcmp(name, "prev") == 0) {
 | 
						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(
 | 
					static struct sway_workspace *workspace_output_prev_next_impl(
 | 
				
			||||||
		struct sway_output *output, int dir) {
 | 
							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);
 | 
						struct sway_workspace *workspace = seat_get_focused_workspace(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int index = list_find(output->workspaces, workspace);
 | 
						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 workspace_switch(struct sway_workspace *workspace,
 | 
				
			||||||
		bool no_auto_back_and_forth) {
 | 
							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);
 | 
						struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!no_auto_back_and_forth && config->auto_back_and_forth
 | 
						if (!no_auto_back_and_forth && config->auto_back_and_forth
 | 
				
			||||||
| 
						 | 
					@ -619,7 +619,7 @@ void workspace_add_gaps(struct sway_workspace *ws) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (config->smart_gaps) {
 | 
						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 =
 | 
							struct sway_container *focus =
 | 
				
			||||||
			seat_get_focus_inactive_tiling(seat, ws);
 | 
								seat_get_focus_inactive_tiling(seat, ws);
 | 
				
			||||||
		if (focus && !focus->view) {
 | 
							if (focus && !focus->view) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue