mirror of
https://github.com/labwc/labwc.git
synced 2026-04-12 08:21:13 -04:00
[wip] layers: play with interactivity
This commit is contained in:
parent
43e29f1f8d
commit
6064ff0531
1 changed files with 42 additions and 32 deletions
72
src/layers.c
72
src/layers.c
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue