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