]> git.mdlowis.com Git - proto/labwc.git/commitdiff
Add keybind.c
authorJohan Malm <jgm323@gmail.com>
Tue, 16 Jun 2020 06:21:53 +0000 (07:21 +0100)
committerJohan Malm <jgm323@gmail.com>
Tue, 16 Jun 2020 06:21:53 +0000 (07:21 +0100)
README.md
include/rcxml.h
meson.build
src/config/keybind.c [new file with mode: 0644]
src/config/meson.build
src/config/rcxml.c
src/main.c
tests/meson.build
tests/t1000-rcxml-simple-parse.c
tests/t1001-rcxml-nodenames-simple.c

index 23daeacf381bd60484e8ebce2c4de10656581c6f..07f1e68fcb677a2e300119e2449169d259bf2123 100644 (file)
--- a/README.md
+++ b/README.md
@@ -16,10 +16,11 @@ It is in early development and has the following aims:
 - wayland-protocols
 - xwayland
 - libxml2
+- glib-2.0
 
 Will soon depend on
 
-- cairo, pango, glib
+- cairo, pango
 
 ## Roadmap
 
index 4e1d4b0ca98a54def4063c7caa77347d2f49d9e5..4bb7ab797a5938d269c7f7735b5e59829bbe44ef 100644 (file)
@@ -3,16 +3,32 @@
 
 #include <stdio.h>
 #include <stdbool.h>
+#include <wlr/types/wlr_keyboard.h>
+#include <wayland-server-core.h>
+#include <xkbcommon/xkbcommon.h>
 
 #include "buf.h"
 
+struct keybind {
+        uint32_t modifiers;
+        xkb_keysym_t *keysyms;
+        size_t keysyms_len;
+        char *action;
+        struct wl_list link;
+};
+
+void keybind_add(struct wl_list *keybinds, const char *keybind, const char *action);
+void keybind_init();
+void keybind_print();
+
 struct rcxml {
        bool client_side_decorations;
+       struct wl_list keybinds;
 };
 
 extern struct rcxml rc;
 
-void rcxml_init(struct rcxml *rc);
+void rcxml_init();
 void rcxml_parse_xml(struct buf *b);
 void rcxml_read(const char *filename);
 void rcxml_get_nodenames(struct buf *b);
index fe4feeb09c19226b11cb86bbf5a31d22ca4428e9..62a89284a7aa243e104b2c18591520a8f23c2c95 100644 (file)
@@ -41,6 +41,7 @@ wayland_server  = dependency('wayland-server')
 wayland_protos  = dependency('wayland-protocols')
 xkbcommon       = dependency('xkbcommon')
 xml2            = dependency('libxml-2.0')
+glib            = dependency('glib-2.0')
 
 labwc_inc       = include_directories('include')
 
@@ -49,7 +50,7 @@ subdir('src')
 subdir('tests')
 
 labwc_deps      = [
-  server_protos, wayland_server, wlroots, xkbcommon, xml2
+  server_protos, wayland_server, wlroots, xkbcommon, xml2, glib
 ]
 
 executable(
diff --git a/src/config/keybind.c b/src/config/keybind.c
new file mode 100644 (file)
index 0000000..942a3fa
--- /dev/null
@@ -0,0 +1,71 @@
+#define _POSIX_C_SOURCE 200809L
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#include "rcxml.h"
+
+static uint32_t parse_modifier(const char *symname)
+{
+       if (!strcmp(symname, "S"))
+               return WLR_MODIFIER_SHIFT;
+       else if (!strcmp(symname, "C"))
+               return WLR_MODIFIER_CTRL;
+       else if (!strcmp(symname, "A"))
+               return WLR_MODIFIER_ALT;
+       else if (!strcmp(symname, "W"))
+               return WLR_MODIFIER_LOGO;
+       else
+               return 0;
+}
+
+void keybind_add(struct wl_list *keybinds, const char *keybind,
+                const char *action)
+{
+       struct keybind *k = calloc(1, sizeof(struct keybind));
+       xkb_keysym_t keysyms[32];
+       gchar **symnames = g_strsplit(keybind, "-", -1);
+       for (int i = 0; symnames[i]; i++) {
+               char *symname = symnames[i];
+               uint32_t modifier = parse_modifier(symname);
+               if (modifier != 0) {
+                       k->modifiers |= modifier;
+               } else {
+                       xkb_keysym_t sym = xkb_keysym_from_name(
+                               symname, XKB_KEYSYM_NO_FLAGS);
+                       if (sym == XKB_KEY_NoSymbol) {
+                               fprintf(stderr, "unknown keybind (%s)\n",
+                                       symname);
+                               free(k);
+                               k = NULL;
+                               break;
+                       }
+                       keysyms[k->keysyms_len] = sym;
+                       k->keysyms_len++;
+               }
+       }
+       g_strfreev(symnames);
+       if (!k)
+               return;
+       wl_list_insert(keybinds, &k->link);
+       k->action = strdup(action);
+       k->keysyms = malloc(k->keysyms_len * sizeof(xkb_keysym_t));
+       memcpy(k->keysyms, keysyms, k->keysyms_len * sizeof(xkb_keysym_t));
+}
+
+void keybind_init()
+{
+       keybind_add(&rc.keybinds, "A-Escape", "exit");
+       keybind_add(&rc.keybinds, "A-F2", "cycle");
+}
+
+void keybind_print()
+{
+       struct keybind *keybind;
+       wl_list_for_each_reverse (keybind, &rc.keybinds, link) {
+               printf("KEY=%s\n", keybind->action);
+               for (size_t i = 0; i < keybind->keysyms_len; i++)
+                       printf("    %d\n", keybind->keysyms[i]);
+       }
+}
index 19872e98642e04f00fa1e8a91dda09003ff70a18..ac8e60128c169f345902095f04d55d1cf43f57d2 100644 (file)
@@ -1,3 +1,4 @@
 labwc_sources += files(
   'rcxml.c',
+  'keybind.c',
 )
index c917e6ab7716074e139245c5d68606a146382d81..27417869e08a16aa65e5e0c0101347eabc7a6616 100644 (file)
@@ -8,6 +8,7 @@
 #include <libxml/tree.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <wayland-server-core.h>
 
 #include "rcxml.h"
 
@@ -162,9 +163,12 @@ void rcxml_parse_xml(struct buf *b)
        xmlCleanupParser();
 }
 
-void rcxml_init(struct rcxml *rc)
+void rcxml_init()
 {
        LIBXML_TEST_VERSION
+       wl_list_init(&rc.keybinds);
+       keybind_init();
+       keybind_print();
 }
 
 void rcxml_read(const char *filename)
index 23547c0965d5e854efa2feb6f51c65b850e90104..de84e6b5b9da5ec8e572865a036769782499e0a0 100644 (file)
@@ -27,7 +27,7 @@ int main(int argc, char *argv[])
                return 0;
        }
 
-       rcxml_init(&rc);
+       rcxml_init();
        rcxml_read("data/rc.xml");
        theme_read("data/themerc");
 
index e128600ba222ffb79ec1aa804cf3ff6f599e96d3..685361f963afc7220e2358d4f132a6f462bbf9a3 100644 (file)
@@ -1,9 +1,18 @@
+lib_xml2 = library('libxml-2.0')
+lib_wayland_server = library('wayland-server')
+lib_xkbcommon = library('xkbcommon')
+lib_glib = library('glib-2.0')
+
 rcxml_lib = static_library(
   'rcxml',
-  sources: files('../src/config/rcxml.c', '../src/common/buf.c'),
-  dependencies: xml2,
+  sources: files(
+    '../src/config/rcxml.c',
+    '../src/config/keybind.c',
+    '../src/common/buf.c'
+  ),
+  dependencies: [xml2, wayland_server, xkbcommon, glib],
   include_directories: [labwc_inc],
-  link_with: library('libxml-2.0'),
+  link_with: [lib_xml2, lib_wayland_server, lib_xkbcommon, lib_glib],
 )
 
 rcxml_tests = [
@@ -17,7 +26,7 @@ foreach t : rcxml_tests
     testname,
     sources: [t, 'tap.c'],
     include_directories: [labwc_inc],
-    link_with: rcxml_lib,
+    link_with: [rcxml_lib],
   )
   test(testname, exe)
 endforeach
index c57cb74cec1bfa545dfe673010055136b911cfa1..cb41d0c14f5b9828c9d4f4a63317b38f43deb22c 100644 (file)
@@ -27,7 +27,7 @@ int main(int argc, char **argv)
                exit(1);
        write(fd, src, sizeof(src) - 1);
 
-       rcxml_init(&rc);
+       rcxml_init();
        rcxml_read(template);
        unlink(template);
 
index fa2823beee4b8c770ab78670dd57440144a92bcb..88c5a6f7639c88938689e6781a3af658d6ba505d 100644 (file)
@@ -35,7 +35,7 @@ int main(int argc, char **argv)
        plan(1);
        diag("Parse simple rc.xml and read nodenames");
 
-       rcxml_init(&rc);
+       rcxml_init();
        rcxml_get_nodenames(&actual);
        rcxml_parse_xml(&source);
        printf("%s\n", actual.buf);