mirror of
https://codeberg.org/dwl/dwl.git
synced 2025-09-08 12:14:45 +00:00
Fix layer-shell on-demand and exclusive keyboard interactivity
This commit is contained in:
parent
f2c09f9b11
commit
bb42612bc8
27
dwl.c
27
dwl.c
@ -175,6 +175,7 @@ typedef struct {
|
|||||||
|
|
||||||
struct wl_listener destroy;
|
struct wl_listener destroy;
|
||||||
struct wl_listener unmap;
|
struct wl_listener unmap;
|
||||||
|
struct wl_listener map;
|
||||||
struct wl_listener surface_commit;
|
struct wl_listener surface_commit;
|
||||||
} LayerSurface;
|
} LayerSurface;
|
||||||
|
|
||||||
@ -254,6 +255,7 @@ static void cleanup(void);
|
|||||||
static void cleanupmon(struct wl_listener *listener, void *data);
|
static void cleanupmon(struct wl_listener *listener, void *data);
|
||||||
static void cleanuplisteners(void);
|
static void cleanuplisteners(void);
|
||||||
static void closemon(Monitor *m);
|
static void closemon(Monitor *m);
|
||||||
|
static void maplayersurfacenotify(struct wl_listener *listener, void *data);
|
||||||
static void commitlayersurfacenotify(struct wl_listener *listener, void *data);
|
static void commitlayersurfacenotify(struct wl_listener *listener, void *data);
|
||||||
static void commitnotify(struct wl_listener *listener, void *data);
|
static void commitnotify(struct wl_listener *listener, void *data);
|
||||||
static void commitpopup(struct wl_listener *listener, void *data);
|
static void commitpopup(struct wl_listener *listener, void *data);
|
||||||
@ -592,7 +594,7 @@ arrangelayers(Monitor *m)
|
|||||||
/* Find topmost keyboard interactive layer, if such a layer exists */
|
/* Find topmost keyboard interactive layer, if such a layer exists */
|
||||||
for (i = 0; i < (int)LENGTH(layers_above_shell); i++) {
|
for (i = 0; i < (int)LENGTH(layers_above_shell); i++) {
|
||||||
wl_list_for_each_reverse(l, &m->layers[layers_above_shell[i]], link) {
|
wl_list_for_each_reverse(l, &m->layers[layers_above_shell[i]], link) {
|
||||||
if (locked || l->layer_surface->current.keyboard_interactive != ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE || !l->mapped)
|
if (locked || l->layer_surface->current.keyboard_interactive != ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_EXCLUSIVE || !l->mapped || l == exclusive_focus)
|
||||||
continue;
|
continue;
|
||||||
/* Deactivate the focused client. */
|
/* Deactivate the focused client. */
|
||||||
focusclient(NULL, 0);
|
focusclient(NULL, 0);
|
||||||
@ -644,7 +646,7 @@ buttonpress(struct wl_listener *listener, void *data)
|
|||||||
if (c && (!client_is_unmanaged(c) || client_wants_focus(c)))
|
if (c && (!client_is_unmanaged(c) || client_wants_focus(c)))
|
||||||
focusclient(c, 1);
|
focusclient(c, 1);
|
||||||
|
|
||||||
if (l && l->layer_surface->current.keyboard_interactive) {
|
if (l && !exclusive_focus && l->layer_surface->current.keyboard_interactive == ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND) {
|
||||||
focusclient(NULL, 0);
|
focusclient(NULL, 0);
|
||||||
client_notify_enter(l->layer_surface->surface, wlr_seat_get_keyboard(seat));
|
client_notify_enter(l->layer_surface->surface, wlr_seat_get_keyboard(seat));
|
||||||
}
|
}
|
||||||
@ -826,6 +828,21 @@ closemon(Monitor *m)
|
|||||||
printstatus();
|
printstatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
maplayersurfacenotify(struct wl_listener *listener, void *data)
|
||||||
|
{
|
||||||
|
LayerSurface *l = wl_container_of(listener, l, map);
|
||||||
|
struct wlr_layer_surface_v1 *layer_surface = l->layer_surface;
|
||||||
|
l->mapped = 1;
|
||||||
|
|
||||||
|
arrangelayers(l->mon);
|
||||||
|
|
||||||
|
if(!exclusive_focus && layer_surface->current.keyboard_interactive == ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_ON_DEMAND) {
|
||||||
|
focusclient(NULL, 0);
|
||||||
|
client_notify_enter(layer_surface->surface, wlr_seat_get_keyboard(seat));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
commitlayersurfacenotify(struct wl_listener *listener, void *data)
|
commitlayersurfacenotify(struct wl_listener *listener, void *data)
|
||||||
{
|
{
|
||||||
@ -1014,6 +1031,8 @@ createlayersurface(struct wl_listener *listener, void *data)
|
|||||||
|
|
||||||
l = layer_surface->data = ecalloc(1, sizeof(*l));
|
l = layer_surface->data = ecalloc(1, sizeof(*l));
|
||||||
l->type = LayerShell;
|
l->type = LayerShell;
|
||||||
|
|
||||||
|
LISTEN(&surface->events.map, &l->map, maplayersurfacenotify);
|
||||||
LISTEN(&surface->events.commit, &l->surface_commit, commitlayersurfacenotify);
|
LISTEN(&surface->events.commit, &l->surface_commit, commitlayersurfacenotify);
|
||||||
LISTEN(&surface->events.unmap, &l->unmap, unmaplayersurfacenotify);
|
LISTEN(&surface->events.unmap, &l->unmap, unmaplayersurfacenotify);
|
||||||
LISTEN(&layer_surface->events.destroy, &l->destroy, destroylayersurfacenotify);
|
LISTEN(&layer_surface->events.destroy, &l->destroy, destroylayersurfacenotify);
|
||||||
@ -1288,6 +1307,7 @@ destroylayersurfacenotify(struct wl_listener *listener, void *data)
|
|||||||
wl_list_remove(&l->link);
|
wl_list_remove(&l->link);
|
||||||
wl_list_remove(&l->destroy.link);
|
wl_list_remove(&l->destroy.link);
|
||||||
wl_list_remove(&l->unmap.link);
|
wl_list_remove(&l->unmap.link);
|
||||||
|
wl_list_remove(&l->map.link);
|
||||||
wl_list_remove(&l->surface_commit.link);
|
wl_list_remove(&l->surface_commit.link);
|
||||||
wlr_scene_node_destroy(&l->scene->node);
|
wlr_scene_node_destroy(&l->scene->node);
|
||||||
wlr_scene_node_destroy(&l->popups->node);
|
wlr_scene_node_destroy(&l->popups->node);
|
||||||
@ -1457,7 +1477,8 @@ focusclient(Client *c, int lift)
|
|||||||
* and focus it after the overlay is closed. */
|
* and focus it after the overlay is closed. */
|
||||||
if (old_client_type == LayerShell && wlr_scene_node_coords(
|
if (old_client_type == LayerShell && wlr_scene_node_coords(
|
||||||
&old_l->scene->node, &unused_lx, &unused_ly)
|
&old_l->scene->node, &unused_lx, &unused_ly)
|
||||||
&& old_l->layer_surface->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP) {
|
&& old_l->layer_surface->current.layer >= ZWLR_LAYER_SHELL_V1_LAYER_TOP
|
||||||
|
&& old_l == exclusive_focus) {
|
||||||
return;
|
return;
|
||||||
} else if (old_c && old_c == exclusive_focus && client_wants_focus(old_c)) {
|
} else if (old_c && old_c == exclusive_focus && client_wants_focus(old_c)) {
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user