mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Only reconfigure input mappings on output change
Fully reconfiguring all input devices on output change takes a loooong time. Let's just reconfigure what we need: only mappings depend on outputs.
This commit is contained in:
		
							parent
							
								
									caa92ddee8
								
							
						
					
					
						commit
						7036769bea
					
				
					 6 changed files with 38 additions and 5 deletions
				
			
		| 
						 | 
					@ -47,6 +47,8 @@ void input_manager_apply_input_config(struct input_config *input_config);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_configure_all_inputs(void);
 | 
					void input_manager_configure_all_inputs(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void input_manager_configure_all_input_mappings(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_reset_input(struct sway_input_device *input_device);
 | 
					void input_manager_reset_input(struct sway_input_device *input_device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_reset_all_inputs(void);
 | 
					void input_manager_reset_all_inputs(void);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -168,6 +168,9 @@ void seat_add_device(struct sway_seat *seat,
 | 
				
			||||||
void seat_configure_device(struct sway_seat *seat,
 | 
					void seat_configure_device(struct sway_seat *seat,
 | 
				
			||||||
		struct sway_input_device *device);
 | 
							struct sway_input_device *device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void seat_configure_device_mapping(struct sway_seat *seat,
 | 
				
			||||||
 | 
							struct sway_input_device *input_device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_reset_device(struct sway_seat *seat,
 | 
					void seat_reset_device(struct sway_seat *seat,
 | 
				
			||||||
		struct sway_input_device *input_device);
 | 
							struct sway_input_device *input_device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -590,7 +590,7 @@ bool apply_output_config(struct output_config *oc, struct sway_output *output) {
 | 
				
			||||||
	// Reconfigure all devices, since input config may have been applied before
 | 
						// Reconfigure all devices, since input config may have been applied before
 | 
				
			||||||
	// this output came online, and some config items (like map_to_output) are
 | 
						// this output came online, and some config items (like map_to_output) are
 | 
				
			||||||
	// dependent on an output being present.
 | 
						// dependent on an output being present.
 | 
				
			||||||
	input_manager_configure_all_inputs();
 | 
						input_manager_configure_all_input_mappings();
 | 
				
			||||||
	// Reconfigure the cursor images, since the scale may have changed.
 | 
						// Reconfigure the cursor images, since the scale may have changed.
 | 
				
			||||||
	input_manager_configure_xcursor();
 | 
						input_manager_configure_xcursor();
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -571,6 +571,16 @@ void input_manager_configure_all_inputs(void) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void input_manager_configure_all_input_mappings(void) {
 | 
				
			||||||
 | 
						struct sway_input_device *input_device;
 | 
				
			||||||
 | 
						wl_list_for_each(input_device, &server.input->devices, link) {
 | 
				
			||||||
 | 
							struct sway_seat *seat;
 | 
				
			||||||
 | 
							wl_list_for_each(seat, &server.input->seats, link) {
 | 
				
			||||||
 | 
								seat_configure_device_mapping(seat, input_device);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void input_manager_apply_input_config(struct input_config *input_config) {
 | 
					void input_manager_apply_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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -710,6 +710,15 @@ static void seat_apply_input_mapping(struct sway_seat *seat,
 | 
				
			||||||
	struct input_config *ic =
 | 
						struct input_config *ic =
 | 
				
			||||||
		input_device_get_config(sway_device->input_device);
 | 
							input_device_get_config(sway_device->input_device);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (sway_device->input_device->wlr_device->type) {
 | 
				
			||||||
 | 
						case WLR_INPUT_DEVICE_POINTER:
 | 
				
			||||||
 | 
						case WLR_INPUT_DEVICE_TOUCH:
 | 
				
			||||||
 | 
						case WLR_INPUT_DEVICE_TABLET_TOOL:
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return; // these devices don't support mappings
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sway_log(SWAY_DEBUG, "Applying input mapping to %s",
 | 
						sway_log(SWAY_DEBUG, "Applying input mapping to %s",
 | 
				
			||||||
		sway_device->input_device->identifier);
 | 
							sway_device->input_device->identifier);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -799,7 +808,6 @@ static void seat_configure_pointer(struct sway_seat *seat,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	wlr_cursor_attach_input_device(seat->cursor->cursor,
 | 
						wlr_cursor_attach_input_device(seat->cursor->cursor,
 | 
				
			||||||
		sway_device->input_device->wlr_device);
 | 
							sway_device->input_device->wlr_device);
 | 
				
			||||||
	seat_apply_input_mapping(seat, sway_device);
 | 
					 | 
				
			||||||
	wl_event_source_timer_update(
 | 
						wl_event_source_timer_update(
 | 
				
			||||||
			seat->cursor->hide_source, cursor_get_timeout(seat->cursor));
 | 
								seat->cursor->hide_source, cursor_get_timeout(seat->cursor));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -841,7 +849,6 @@ static void seat_configure_touch(struct sway_seat *seat,
 | 
				
			||||||
		struct sway_seat_device *sway_device) {
 | 
							struct sway_seat_device *sway_device) {
 | 
				
			||||||
	wlr_cursor_attach_input_device(seat->cursor->cursor,
 | 
						wlr_cursor_attach_input_device(seat->cursor->cursor,
 | 
				
			||||||
		sway_device->input_device->wlr_device);
 | 
							sway_device->input_device->wlr_device);
 | 
				
			||||||
	seat_apply_input_mapping(seat, sway_device);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void seat_configure_tablet_tool(struct sway_seat *seat,
 | 
					static void seat_configure_tablet_tool(struct sway_seat *seat,
 | 
				
			||||||
| 
						 | 
					@ -852,7 +859,6 @@ static void seat_configure_tablet_tool(struct sway_seat *seat,
 | 
				
			||||||
	sway_configure_tablet(sway_device->tablet);
 | 
						sway_configure_tablet(sway_device->tablet);
 | 
				
			||||||
	wlr_cursor_attach_input_device(seat->cursor->cursor,
 | 
						wlr_cursor_attach_input_device(seat->cursor->cursor,
 | 
				
			||||||
		sway_device->input_device->wlr_device);
 | 
							sway_device->input_device->wlr_device);
 | 
				
			||||||
	seat_apply_input_mapping(seat, sway_device);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void seat_configure_tablet_pad(struct sway_seat *seat,
 | 
					static void seat_configure_tablet_pad(struct sway_seat *seat,
 | 
				
			||||||
| 
						 | 
					@ -909,6 +915,18 @@ void seat_configure_device(struct sway_seat *seat,
 | 
				
			||||||
			seat_configure_tablet_pad(seat, seat_device);
 | 
								seat_configure_tablet_pad(seat, seat_device);
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						seat_apply_input_mapping(seat, seat_device);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void seat_configure_device_mapping(struct sway_seat *seat,
 | 
				
			||||||
 | 
							struct sway_input_device *input_device) {
 | 
				
			||||||
 | 
						struct sway_seat_device *seat_device = seat_get_device(seat, input_device);
 | 
				
			||||||
 | 
						if (!seat_device) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						seat_apply_input_mapping(seat, seat_device);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void seat_reset_device(struct sway_seat *seat,
 | 
					void seat_reset_device(struct sway_seat *seat,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -277,7 +277,7 @@ void output_disable(struct sway_output *output) {
 | 
				
			||||||
	// Reconfigure all devices, since devices with map_to_output directives for
 | 
						// Reconfigure all devices, since devices with map_to_output directives for
 | 
				
			||||||
	// an output that goes offline should stop sending events as long as the
 | 
						// an output that goes offline should stop sending events as long as the
 | 
				
			||||||
	// output remains offline.
 | 
						// output remains offline.
 | 
				
			||||||
	input_manager_configure_all_inputs();
 | 
						input_manager_configure_all_input_mappings();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void output_begin_destroy(struct sway_output *output) {
 | 
					void output_begin_destroy(struct sway_output *output) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue