tMove keybindings configuration to config.h - spkp - Stacking wayland compositor
(HTM) git clone git://git.z3bra.org/spkp.git
(DIR) Log
(DIR) Files
(DIR) Refs
---
(DIR) commit d9297195a41fb19b58a494f2a74b2fa0247ee43c
(DIR) parent 309db35851509a986a45ced6182bb73f2ff18af5
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Tue, 10 Nov 2020 10:50:15 +0100
Move keybindings configuration to config.h
Diffstat:
M compositor.c | 56 +++++++++++++++++++++++++------
M config.def.h | 4 ++++
2 files changed, 50 insertions(+), 10 deletions(-)
---
(DIR) diff --git a/compositor.c b/compositor.c
t@@ -26,7 +26,6 @@
#include "xdg-shell-protocol.h"
#include "arg.h"
-#include "config.h"
enum {
NORMAL,
t@@ -106,6 +105,21 @@ struct keyboard {
struct wl_list link;
};
+/* Optional argument to pass down to a keybinding function */
+union keyarg {
+ int i;
+ float f;
+ const void *v;
+};
+
+/* Keybindig to function association, see config.h */
+struct key {
+ uint32_t mod;
+ uint32_t key;
+ void (*func)(struct state *, union keyarg *);
+ union keyarg arg;
+};
+
/* Rendering data, used to render window's surfaces */
struct rdata {
struct wlr_output *output;
t@@ -147,6 +161,11 @@ static int keybinding(struct state *, uint32_t, uint32_t);
static struct window *underneath(struct state *, double, double);
static struct wlr_surface *topsurface(struct window *, double, double, double *, double *);
+/* keybinding functions, see config.h */
+static void kb_terminate(struct state *, union keyarg *);
+
+#include "config.h"
+
void
usage(char *pgm)
{
t@@ -759,13 +778,14 @@ focus(struct window *window, struct wlr_surface *surface)
int
keybinding(struct state *server, uint32_t mod, uint32_t key)
{
- switch (key) {
- case XKB_KEY_Escape:
- if (mod & WLR_MODIFIER_LOGO) {
- wl_display_terminate(server->dpy);
- return 1; /* NOTREACHED */
- }
- break;
+ ssize_t i, nkey;
+
+ nkey = sizeof(keys)/sizeof(*keys);
+
+ for (i=0; i<nkey; i++) {
+ if (keys[i].mod == mod \
+ && keys[i].key == key)
+ keys[i].func(server, NULL);
}
return 0;
t@@ -802,17 +822,33 @@ underneath(struct state *server, double x, double y)
return NULL;
}
+/*
+ * Return the topmost wlr_surface at the given position.
+ * The x, y coordinates relative to that surface are also returned if
+ * a pointer to sx, sy is given.
+ * This function is mostly used to relay pointer events to and underlying
+ * surface.
+ */
struct wlr_surface *
-topsurface(struct window *window, double x, double y, double *rx, double *ry)
+topsurface(struct window *window, double x, double y, double *sx, double *sy)
{
struct wlr_surface *surface;
surface = wlr_xdg_surface_surface_at(window->surface,
- x - window->x, y - window->y, rx, ry);
+ x - window->x, y - window->y, sx, sy);
return surface;
}
+/*
+ * Keybind: Terminate the wayland compositor
+ */
+void kb_terminate(struct state *server, union keyarg *arg)
+{
+ (void)arg;
+ wl_display_terminate(server->dpy);
+}
+
int
main(int argc, char *argv[])
{
(DIR) diff --git a/config.def.h b/config.def.h
t@@ -1 +1,5 @@
float background[4] = { 1.0, 0.6, 0.6, 0.3 };
+
+struct key keys[] = {
+ { WLR_MODIFIER_LOGO, XKB_KEY_Escape, kb_terminate, {0} },
+};