[wip] layers: play with interactivity

This commit is contained in:
Johan Malm 2024-02-29 20:23:41 +00:00
parent 43e29f1f8d
commit 6064ff0531

View file

@ -118,47 +118,57 @@ handle_output_destroy(struct wl_listener *listener, void *data)
wlr_layer_surface_v1_destroy(layer->scene_layer_surface->layer_surface); wlr_layer_surface_v1_destroy(layer->scene_layer_surface->layer_surface);
} }
static bool
exclusive_focus(struct seat *seat) {
if (!seat->focused_layer) {
return false;
}
if (seat->focused_layer->current.keyboard_interactive !=
ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE) {
return false;
}
return true;
}
static bool
has_precedence(struct seat *seat, enum zwlr_layer_shell_v1_layer layer)
{
if (!seat->focused_layer) {
return true;
}
if (!exclusive_focus(seat)) {
return true;
}
if (layer >= seat->focused_layer->current.layer) {
return true;
}
return false;
}
static void static void
process_keyboard_interactivity(struct lab_layer_surface *layer) process_keyboard_interactivity(struct lab_layer_surface *layer)
{ {
struct wlr_layer_surface_v1 *layer_surface = layer->scene_layer_surface->layer_surface; struct wlr_layer_surface_v1 *layer_surface =
layer->scene_layer_surface->layer_surface;
struct seat *seat = &layer->server->seat; struct seat *seat = &layer->server->seat;
if (layer_surface->current.keyboard_interactive switch (layer_surface->current.keyboard_interactive) {
&& layer_surface->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) { case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE:
/* if (has_precedence(seat, layer_surface->current.layer)) {
* Give keyboard focus to surface if
* - keyboard-interactivity is 'exclusive' or 'on-demand'; and
* - surface is in top/overlay layers; and
* - currently focused layer has a lower precedence
*
* In other words, when dealing with two surfaces with
* exclusive/on-demand keyboard-interactivity (firstly the
* currently focused 'focused_layer' and secondly the
* 'layer_surface' for which we're just responding to a
* map/commit event), the following logic applies:
*
* | focused_layer | layer_surface | who gets keyboard focus |
* |---------------|---------------|-------------------------|
* | overlay | top | focused_layer |
* | overlay | overlay | layer_surface |
* | top | top | layer_surface |
* | top | overlay | layer_surface |
*/
if (!seat->focused_layer || seat->focused_layer->current.layer
<= layer_surface->current.layer) {
seat_set_focus_layer(seat, layer_surface); seat_set_focus_layer(seat, layer_surface);
} }
} else if (seat->focused_layer break;
&& !seat->focused_layer->current.keyboard_interactive) { case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND:
/* if (!exclusive_focus(seat)) {
* Clear focus if keyboard-interactivity has been set to seat_set_focus_layer(seat, layer_surface);
* ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE }
*/ break;
case ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE:
if (seat->focused_layer) {
seat_set_focus_layer(seat, NULL); seat_set_focus_layer(seat, NULL);
} }
} }
}
static void static void
handle_surface_commit(struct wl_listener *listener, void *data) handle_surface_commit(struct wl_listener *listener, void *data)