Compare commits

...

3 Commits

Author SHA1 Message Date
Alexander Orzechowski c02d3576e1
Merge 972fcc60df into 087226d997 2024-04-16 22:29:52 -03:00
Alexander Orzechowski 972fcc60df layer_shell: Ensure keyboard exclusive clients remain focused 2024-03-02 18:48:03 -05:00
Alexander Orzechowski 1800b1266b seat: Drop has_exclusive_layer
We can just check if the current focused layer has exclusive input.
2024-03-02 18:48:03 -05:00
3 changed files with 28 additions and 16 deletions

View File

@ -99,8 +99,6 @@ struct sway_seat {
char *prev_workspace_name; // for workspace back_and_forth
struct wlr_layer_surface_v1 *focused_layer;
// If the exclusive layer is set, views cannot receive keyboard focus
bool has_exclusive_layer;
// Last touch point
int32_t touch_id;

View File

@ -233,19 +233,33 @@ static void handle_surface_commit(struct wl_listener *listener, void *data) {
wlr_scene_node_reparent(&surface->scene->tree->node, output_layer);
}
bool commit = false;
if (layer_surface->initial_commit || committed || layer_surface->surface->mapped != surface->mapped) {
surface->mapped = layer_surface->surface->mapped;
arrange_layers(surface->output);
commit = true;
}
if (layer_surface->current.keyboard_interactive ==
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
struct sway_seat *seat;
wl_list_for_each(seat, &server.input->seats, link) {
seat_set_focus_layer(seat, layer_surface);
}
commit = true;
}
if (commit) {
transaction_commit_dirty();
}
}
static void handle_map(struct wl_listener *listener, void *data) {
struct sway_layer_surface *surface = wl_container_of(listener,
surface, map);
struct sway_layer_surface *surface = wl_container_of(listener, surface, map);
struct wlr_layer_surface_v1 *layer_surface = surface->scene->layer_surface;
struct wlr_layer_surface_v1 *layer_surface =
surface->scene->layer_surface;
bool exclusive = layer_surface->current.keyboard_interactive ==
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE;
// focus on new surface
if (layer_surface->current.keyboard_interactive &&
@ -254,12 +268,15 @@ static void handle_map(struct wl_listener *listener, void *data) {
struct sway_seat *seat;
wl_list_for_each(seat, &server.input->seats, link) {
// but only if the currently focused layer has a lower precedence
if (!seat->focused_layer ||
seat->focused_layer->current.layer >= layer_surface->current.layer) {
if (!seat->focused_layer || exclusive || (
seat->focused_layer->current.keyboard_interactive !=
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE &&
seat->focused_layer->current.layer >= layer_surface->current.layer)) {
seat_set_focus_layer(seat, layer_surface);
}
}
arrange_layers(surface->output);
transaction_commit_dirty();
}
cursor_rebase_all();

View File

@ -1264,13 +1264,15 @@ static void seat_set_workspace_focus(struct sway_seat *seat, struct sway_node *n
}
void seat_set_focus(struct sway_seat *seat, struct sway_node *node) {
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
// Prevents the layer from losing focus if it has keyboard exclusivity
if (seat->has_exclusive_layer) {
struct wlr_layer_surface_v1 *layer = seat->focused_layer;
if (layer && layer->current.keyboard_interactive ==
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
seat_set_focus_layer(seat, NULL);
seat_set_workspace_focus(seat, node);
seat_set_focus_layer(seat, layer);
} else if (seat->focused_layer) {
} else if (layer) {
seat_set_focus_layer(seat, NULL);
seat_set_workspace_focus(seat, node);
} else {
@ -1324,11 +1326,6 @@ void seat_set_focus_layer(struct sway_seat *seat,
return;
}
assert(layer->surface->mapped);
if (layer->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP &&
layer->current.keyboard_interactive
== ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
seat->has_exclusive_layer = true;
}
if (seat->focused_layer == layer) {
return;
}