summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDominique Martinet <asmadeus@codewreck.org>2018-04-28 08:17:58 +0900
committerDominique Martinet <asmadeus@codewreck.org>2018-04-29 20:50:55 +0900
commit992e5add42ddc126b7872c53b88fc3bff47fed3f (patch)
tree1bd8869edeebf0211188ef5423197367e2e622b2 /lib
parent610b30364e1d5206b43b873e3f11d5d66d2e28e5 (diff)
downloadbemenu-992e5add42ddc126b7872c53b88fc3bff47fed3f.tar.gz
bemenu-992e5add42ddc126b7872c53b88fc3bff47fed3f.tar.bz2
bemenu-992e5add42ddc126b7872c53b88fc3bff47fed3f.zip
wayland renderer: Implement grab_keyboard
This avoids locking oneself out when running bemenu interactively, as input would be grabbed too early without that and layer shell does not allow to 'ungrab' focus by clicking on another window
Diffstat (limited to 'lib')
-rw-r--r--lib/renderers/wayland/wayland.c13
-rw-r--r--lib/renderers/wayland/wayland.h1
-rw-r--r--lib/renderers/wayland/window.c9
3 files changed, 22 insertions, 1 deletions
diff --git a/lib/renderers/wayland/wayland.c b/lib/renderers/wayland/wayland.c
index 5309280..dd97009 100644
--- a/lib/renderers/wayland/wayland.c
+++ b/lib/renderers/wayland/wayland.c
@@ -190,6 +190,18 @@ set_bottom(const struct bm_menu *menu, bool bottom)
}
static void
+grab_keyboard(const struct bm_menu *menu, bool grab)
+{
+ struct wayland *wayland = menu->renderer->internal;
+ assert(wayland);
+
+ struct window *window;
+ wl_list_for_each(window, &wayland->windows, link) {
+ bm_wl_window_grab_keyboard(window, wayland->display, grab);
+ }
+}
+
+static void
destructor(struct bm_menu *menu)
{
struct wayland *wayland = menu->renderer->internal;
@@ -282,6 +294,7 @@ register_renderer(struct render_api *api)
api->poll_key = poll_key;
api->render = render;
api->set_bottom = set_bottom;
+ api->grab_keyboard = grab_keyboard;
api->priorty = BM_PRIO_GUI;
api->version = BM_PLUGIN_VERSION;
return "wayland";
diff --git a/lib/renderers/wayland/wayland.h b/lib/renderers/wayland/wayland.h
index e0aeb4d..cc50feb 100644
--- a/lib/renderers/wayland/wayland.h
+++ b/lib/renderers/wayland/wayland.h
@@ -119,6 +119,7 @@ bool bm_wl_registry_register(struct wayland *wayland);
void bm_wl_registry_destroy(struct wayland *wayland);
void bm_wl_window_render(struct window *window, struct wl_display *display, const struct bm_menu *menu);
void bm_wl_window_set_bottom(struct window *window, struct wl_display *display, bool bottom);
+void bm_wl_window_grab_keyboard(struct window *window, struct wl_display *display, bool grab);
bool bm_wl_window_create(struct window *window, struct wl_display *display, struct wl_shm *shm, struct wl_output *output, struct zwlr_layer_shell_v1 *layer_shell, struct wl_surface *surface);
void bm_wl_window_destroy(struct window *window);
diff --git a/lib/renderers/wayland/window.c b/lib/renderers/wayland/window.c
index 5ca4578..6cf0c52 100644
--- a/lib/renderers/wayland/window.c
+++ b/lib/renderers/wayland/window.c
@@ -295,6 +295,14 @@ bm_wl_window_set_bottom(struct window *window, struct wl_display *display, bool
wl_display_roundtrip(display);
}
+void
+bm_wl_window_grab_keyboard(struct window *window, struct wl_display *display, bool grab)
+{
+ zwlr_layer_surface_v1_set_keyboard_interactivity(window->layer_surface, grab);
+ wl_surface_commit(window->surface);
+ wl_display_roundtrip(display);
+}
+
bool
bm_wl_window_create(struct window *window, struct wl_display *display, struct wl_shm *shm, struct wl_output *output, struct zwlr_layer_shell_v1 *layer_shell, struct wl_surface *surface)
{
@@ -305,7 +313,6 @@ bm_wl_window_create(struct window *window, struct wl_display *display, struct wl
zwlr_layer_surface_v1_set_exclusive_zone(window->layer_surface, -1);
zwlr_layer_surface_v1_set_anchor(window->layer_surface, (window->bottom ? ZWLR_LAYER_SURFACE_V1_ANCHOR_BOTTOM : ZWLR_LAYER_SURFACE_V1_ANCHOR_TOP) | ZWLR_LAYER_SURFACE_V1_ANCHOR_LEFT | ZWLR_LAYER_SURFACE_V1_ANCHOR_RIGHT);
zwlr_layer_surface_v1_set_size(window->layer_surface, 0, 32);
- zwlr_layer_surface_v1_set_keyboard_interactivity(window->layer_surface, true);
wl_surface_commit(surface);
wl_display_roundtrip(display);
} else {