Implement output auto-selection in rootston
This commit is contained in:
		
							parent
							
								
									177b548b15
								
							
						
					
					
						commit
						edbf4a2f60
					
				|  | @ -30,4 +30,6 @@ bool input_view_has_focus(struct roots_input *input, struct roots_view *view); | ||||||
| 
 | 
 | ||||||
| struct roots_seat *input_get_seat(struct roots_input *input, char *name); | struct roots_seat *input_get_seat(struct roots_input *input, char *name); | ||||||
| 
 | 
 | ||||||
|  | struct roots_seat *input_last_active_seat(struct roots_input *input); | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -326,13 +326,7 @@ bool view_center(struct roots_view *view) { | ||||||
| 
 | 
 | ||||||
| 	struct roots_desktop *desktop = view->desktop; | 	struct roots_desktop *desktop = view->desktop; | ||||||
| 	struct roots_input *input = desktop->server->input; | 	struct roots_input *input = desktop->server->input; | ||||||
| 	struct roots_seat *seat = NULL, *_seat; | 	struct roots_seat *seat = input_last_active_seat(input); | ||||||
| 	wl_list_for_each(_seat, &input->seats, link) { |  | ||||||
| 		if (!seat || (seat->seat->last_event.tv_sec > _seat->seat->last_event.tv_sec && |  | ||||||
| 				seat->seat->last_event.tv_nsec > _seat->seat->last_event.tv_nsec)) { |  | ||||||
| 			seat = _seat; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if (!seat) { | 	if (!seat) { | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -312,6 +312,18 @@ void handle_layer_shell_surface(struct wl_listener *listener, void *data) { | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if (!layer_surface->output) { | ||||||
|  | 		struct roots_input *input = desktop->server->input; | ||||||
|  | 		struct roots_seat *seat = input_last_active_seat(input); | ||||||
|  | 		assert(seat); // Technically speaking we should handle this case
 | ||||||
|  | 		struct wlr_output *output = | ||||||
|  | 			wlr_output_layout_output_at(desktop->layout, | ||||||
|  | 					seat->cursor->cursor->x, | ||||||
|  | 					seat->cursor->cursor->y); | ||||||
|  | 		assert(output); // And this one
 | ||||||
|  | 		layer_surface->output = output; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	roots_surface->surface_commit.notify = handle_surface_commit; | 	roots_surface->surface_commit.notify = handle_surface_commit; | ||||||
| 	wl_signal_add(&layer_surface->surface->events.commit, | 	wl_signal_add(&layer_surface->surface->events.commit, | ||||||
| 		&roots_surface->surface_commit); | 		&roots_surface->surface_commit); | ||||||
|  |  | ||||||
|  | @ -999,3 +999,14 @@ void roots_seat_end_compositor_grab(struct roots_seat *seat) { | ||||||
| 
 | 
 | ||||||
| 	cursor->mode = ROOTS_CURSOR_PASSTHROUGH; | 	cursor->mode = ROOTS_CURSOR_PASSTHROUGH; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | struct roots_seat *input_last_active_seat(struct roots_input *input) { | ||||||
|  | 	struct roots_seat *seat = NULL, *_seat; | ||||||
|  | 	wl_list_for_each(_seat, &input->seats, link) { | ||||||
|  | 		if (!seat || (seat->seat->last_event.tv_sec > _seat->seat->last_event.tv_sec && | ||||||
|  | 				seat->seat->last_event.tv_nsec > _seat->seat->last_event.tv_nsec)) { | ||||||
|  | 			seat = _seat; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return seat; | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue