summaryrefslogtreecommitdiffstats
path: root/dwl-patches/patches/perinputconfig
diff options
context:
space:
mode:
Diffstat (limited to 'dwl-patches/patches/perinputconfig')
-rw-r--r--dwl-patches/patches/perinputconfig/README.md12
-rw-r--r--dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch173
-rw-r--r--dwl-patches/patches/perinputconfig/perinputconfig.patch295
3 files changed, 480 insertions, 0 deletions
diff --git a/dwl-patches/patches/perinputconfig/README.md b/dwl-patches/patches/perinputconfig/README.md
new file mode 100644
index 0000000..ab1602c
--- /dev/null
+++ b/dwl-patches/patches/perinputconfig/README.md
@@ -0,0 +1,12 @@
+### Description
+Replace the singular keyboard and pointer input configuration with an array allowing to set different variables matching by name.
+
+Tip to find the names: Grep for `device_name` and add a line after it to print to stdout. Then run EX: `dwl > /tmp/print_device_names.log`, exit dwl, and should see the names.
+
+### Download
+- [git branch](https://codeberg.org/nullsystem/dwl/src/branch/main_perinputconfig)
+- [2024-06-08](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/perinputconfig/perinputconfig.patch)
+- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/perinputconfig/perinputconfig-v0.5.patch)
+
+### Authors
+- [nullsystem](https://codeberg.org/nullsystem)
diff --git a/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch b/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch
new file mode 100644
index 0000000..25a2a92
--- /dev/null
+++ b/dwl-patches/patches/perinputconfig/perinputconfig-v0.5.patch
@@ -0,0 +1,173 @@
+From 9388faea3c4648aa99c01b9e4ce9287237b28b38 Mon Sep 17 00:00:00 2001
+From: nullsystem <nullsystem.aongp@slmail.me>
+Date: Mon, 1 Apr 2024 21:23:39 +0100
+Subject: [PATCH] Backport perinputconfig to v0.5
+
+- Array replaced singular variables for configuration
+- Only applies to enable-state, acceleration profile, and speed
+- Like EX: Rules, requires NULL/default set at the end
+- Keyboards can now also set by name
+---
+ config.def.h | 37 +++++++++++++++++++++++--------------
+ dwl.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
+ 2 files changed, 69 insertions(+), 17 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index db0babc..861a937 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -46,12 +46,13 @@ static const MonitorRule monrules[] = {
+ };
+
+ /* keyboard */
+-static const struct xkb_rule_names xkb_rules = {
+- /* can specify fields: rules, model, layout, variant, options */
++/* NOTE: Always include a fallback rule at the end (name as NULL) */
++static const KeyboardRule kbrules[] = {
++ /* name rules model layout variant options */
+ /* example:
+- .options = "ctrl:nocaps",
++ { "keyboard", NULL, NULL, "us,de", NULL, "ctrl:nocaps" },
+ */
+- .options = NULL,
++ { NULL, NULL, NULL, NULL, NULL, NULL },
+ };
+
+ static const int repeat_rate = 25;
+@@ -81,23 +82,31 @@ LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
+ static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
+
+ /* You can choose between:
++LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
++LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
++*/
++static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
++
++/*
++send_events_mode: You can choose between:
+ LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
+ LIBINPUT_CONFIG_SEND_EVENTS_DISABLED
+ LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE
+-*/
+-static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
+
+-/* You can choose between:
++accel_profile: You can choose between:
+ LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT
+ LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE
++
++NOTE: Always include a fallback rule at the end (name as NULL)
+ */
+-static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
+-static const double accel_speed = 0.0;
+-/* You can choose between:
+-LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
+-LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
+-*/
+-static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
++static const InputRule inputrules[] = {
++ /* name send_events_mode accel_profile accel_speed*/
++ /* examples:
++ { "SynPS/2 Synaptics TouchPad", LIBINPUT_CONFIG_SEND_EVENTS_DISABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 },
++ { "TPPS/2 IBM TrackPoint", LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE, 0.0 },
++ */
++ { NULL, LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 },
++};
+
+ /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
+ #define MODKEY WLR_MODIFIER_ALT
+diff --git a/dwl.c b/dwl.c
+index ef27a1d..a35f480 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -226,6 +226,22 @@ typedef struct {
+ struct wl_listener destroy;
+ } SessionLock;
+
++typedef struct {
++ const char *name;
++ uint32_t send_events_mode;
++ enum libinput_config_accel_profile accel_profile;
++ double accel_speed;
++} InputRule;
++
++typedef struct {
++ const char *name;
++ const char *rules;
++ const char *model;
++ const char *layout;
++ const char *variant;
++ const char *options;
++} KeyboardRule;
++
+ /* function declarations */
+ static void applybounds(Client *c, struct wlr_box *bbox);
+ static void applyrules(Client *c);
+@@ -766,11 +782,31 @@ createidleinhibitor(struct wl_listener *listener, void *data)
+ void
+ createkeyboard(struct wlr_keyboard *keyboard)
+ {
++ struct xkb_rule_names xkb_rules;
++ struct libinput_device *libinput_device = NULL;
+ struct xkb_context *context;
+ struct xkb_keymap *keymap;
++ const KeyboardRule *krule = NULL;
++ const char *device_name = "";
+ Keyboard *kb = keyboard->data = ecalloc(1, sizeof(*kb));
+ kb->wlr_keyboard = keyboard;
+
++ if (wlr_input_device_is_libinput(&keyboard->base)
++ && (libinput_device = wlr_libinput_get_device_handle(&keyboard->base))) {
++ device_name = libinput_device_get_name(libinput_device);
++ }
++ for (krule = kbrules; krule < END(kbrules); krule++) {
++ if (!krule->name || strstr(device_name, krule->name))
++ break;
++ }
++ if (krule) {
++ xkb_rules.rules = krule->rules;
++ xkb_rules.model = krule->model;
++ xkb_rules.layout = krule->layout;
++ xkb_rules.variant = krule->variant;
++ xkb_rules.options = krule->options;
++ }
++
+ /* Prepare an XKB keymap and assign it to the keyboard. */
+ context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ keymap = xkb_keymap_new_from_names(context, &xkb_rules,
+@@ -989,10 +1025,17 @@ createnotify(struct wl_listener *listener, void *data)
+ void
+ createpointer(struct wlr_pointer *pointer)
+ {
++ const InputRule *irule;
+ if (wlr_input_device_is_libinput(&pointer->base)) {
+ struct libinput_device *libinput_device = (struct libinput_device*)
+ wlr_libinput_get_device_handle(&pointer->base);
+
++ const char *device_name = libinput_device_get_name(libinput_device);
++ for (irule = inputrules; irule < END(inputrules); irule++) {
++ if (!irule->name || strstr(device_name, irule->name))
++ break;
++ }
++
+ if (libinput_device_config_tap_get_finger_count(libinput_device)) {
+ libinput_device_config_tap_set_enabled(libinput_device, tap_to_click);
+ libinput_device_config_tap_set_drag_enabled(libinput_device, tap_and_drag);
+@@ -1019,11 +1062,11 @@ createpointer(struct wlr_pointer *pointer)
+ libinput_device_config_click_set_method (libinput_device, click_method);
+
+ if (libinput_device_config_send_events_get_modes(libinput_device))
+- libinput_device_config_send_events_set_mode(libinput_device, send_events_mode);
++ libinput_device_config_send_events_set_mode(libinput_device, irule->send_events_mode);
+
+ if (libinput_device_config_accel_is_available(libinput_device)) {
+- libinput_device_config_accel_set_profile(libinput_device, accel_profile);
+- libinput_device_config_accel_set_speed(libinput_device, accel_speed);
++ libinput_device_config_accel_set_profile(libinput_device, irule->accel_profile);
++ libinput_device_config_accel_set_speed(libinput_device, irule->accel_speed);
+ }
+ }
+
+--
+2.44.0
+
diff --git a/dwl-patches/patches/perinputconfig/perinputconfig.patch b/dwl-patches/patches/perinputconfig/perinputconfig.patch
new file mode 100644
index 0000000..dae4bc8
--- /dev/null
+++ b/dwl-patches/patches/perinputconfig/perinputconfig.patch
@@ -0,0 +1,295 @@
+From c268707811fb5d8244115f23a0430f024e4e11a9 Mon Sep 17 00:00:00 2001
+From: nullsystem <nullsystem.aongp@slmail.me>
+Date: Sat, 8 Jun 2024 11:30:34 +0100
+Subject: [PATCH] perinputconfig - 2024-06-08 Update
+
+* Array replaced singular variables for configuration
+* Only applies to enable-state, acceleration profile, and speed
+* Like EX: Rules, requires NULL/default set at the end
+* Keyboards can now also set by name
+---
+ config.def.h | 36 +++++++++++++---------
+ dwl.c | 87 +++++++++++++++++++++++++++++++++++++++++++---------
+ 2 files changed, 95 insertions(+), 28 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index a784eb4..c733137 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -49,12 +49,13 @@ static const MonitorRule monrules[] = {
+ };
+
+ /* keyboard */
+-static const struct xkb_rule_names xkb_rules = {
+- /* can specify fields: rules, model, layout, variant, options */
++/* NOTE: Always include a fallback rule at the end (name as NULL) */
++static const KeyboardRule kbrules[] = {
++ /* name rules model layout variant options */
+ /* example:
+- .options = "ctrl:nocaps",
++ { "keyboard", NULL, NULL, "us,de", NULL, "ctrl:nocaps" },
+ */
+- .options = NULL,
++ { NULL, NULL, NULL, NULL, NULL, NULL },
+ };
+
+ static const int repeat_rate = 25;
+@@ -84,24 +85,31 @@ LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER
+ static const enum libinput_config_click_method click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
+
+ /* You can choose between:
++LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
++LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
++*/
++static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
++
++/*
++send_events_mode: You can choose between:
+ LIBINPUT_CONFIG_SEND_EVENTS_ENABLED
+ LIBINPUT_CONFIG_SEND_EVENTS_DISABLED
+ LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE
+-*/
+-static const uint32_t send_events_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
+
+-/* You can choose between:
++accel_profile: You can choose between:
+ LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT
+ LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE
+-*/
+-static const enum libinput_config_accel_profile accel_profile = LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE;
+-static const double accel_speed = 0.0;
+
+-/* You can choose between:
+-LIBINPUT_CONFIG_TAP_MAP_LRM -- 1/2/3 finger tap maps to left/right/middle
+-LIBINPUT_CONFIG_TAP_MAP_LMR -- 1/2/3 finger tap maps to left/middle/right
++NOTE: Always include a fallback rule at the end (name as NULL)
+ */
+-static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
++static const InputRule inputrules[] = {
++ /* name send_events_mode accel_profile accel_speed*/
++ /* examples:
++ { "SynPS/2 Synaptics TouchPad", LIBINPUT_CONFIG_SEND_EVENTS_DISABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 },
++ { "TPPS/2 IBM TrackPoint", LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE, 0.0 },
++ */
++ { NULL, LIBINPUT_CONFIG_SEND_EVENTS_ENABLED, LIBINPUT_CONFIG_ACCEL_PROFILE_FLAT, 0.0 },
++};
+
+ /* If you want to use the windows key for MODKEY, use WLR_MODIFIER_LOGO */
+ #define MODKEY WLR_MODIFIER_ALT
+diff --git a/dwl.c b/dwl.c
+index 6f041a0..0673a05 100644
+--- a/dwl.c
++++ b/dwl.c
+@@ -240,6 +240,22 @@ typedef struct {
+ struct wl_listener destroy;
+ } SessionLock;
+
++typedef struct {
++ const char *name;
++ uint32_t send_events_mode;
++ enum libinput_config_accel_profile accel_profile;
++ double accel_speed;
++} InputRule;
++
++typedef struct {
++ const char *name;
++ const char *rules;
++ const char *model;
++ const char *layout;
++ const char *variant;
++ const char *options;
++} KeyboardRule;
++
+ /* function declarations */
+ static void applybounds(Client *c, struct wlr_box *bbox);
+ static void applyrules(Client *c);
+@@ -259,7 +275,7 @@ static void commitnotify(struct wl_listener *listener, void *data);
+ static void createdecoration(struct wl_listener *listener, void *data);
+ static void createidleinhibitor(struct wl_listener *listener, void *data);
+ static void createkeyboard(struct wlr_keyboard *keyboard);
+-static KeyboardGroup *createkeyboardgroup(void);
++static KeyboardGroup *createkeyboardgroup(struct xkb_rule_names *new_xkb_rules);
+ static void createlayersurface(struct wl_listener *listener, void *data);
+ static void createlocksurface(struct wl_listener *listener, void *data);
+ static void createmon(struct wl_listener *listener, void *data);
+@@ -396,7 +412,7 @@ static struct wlr_session_lock_v1 *cur_lock;
+ static struct wl_listener lock_listener = {.notify = locksession};
+
+ static struct wlr_seat *seat;
+-static KeyboardGroup *kb_group;
++static struct wl_list kb_groups;
+ static struct wlr_surface *held_grab;
+ static unsigned int cursor_mode;
+ static Client *grabc;
+@@ -671,6 +687,8 @@ checkidleinhibitor(struct wlr_surface *exclude)
+ void
+ cleanup(void)
+ {
++ KeyboardGroup *kb_group;
++
+ #ifdef XWAYLAND
+ wlr_xwayland_destroy(xwayland);
+ xwayland = NULL;
+@@ -683,7 +701,8 @@ cleanup(void)
+ wlr_xcursor_manager_destroy(cursor_mgr);
+ wlr_output_layout_destroy(output_layout);
+
+- destroykeyboardgroup(&kb_group->destroy, NULL);
++ wl_list_for_each(kb_group, &kb_groups, link)
++ destroykeyboardgroup(&kb_group->destroy, NULL);
+
+ wl_display_destroy(dpy);
+ /* Destroy after the wayland display (when the monitors are already destroyed)
+@@ -803,6 +822,30 @@ createidleinhibitor(struct wl_listener *listener, void *data)
+ void
+ createkeyboard(struct wlr_keyboard *keyboard)
+ {
++ KeyboardGroup *kb_group;
++ const char *device_name = "";
++ const KeyboardRule *krule = NULL;
++ struct libinput_device *device = NULL;
++
++ if (wlr_input_device_is_libinput(&keyboard->base)
++ && (device = wlr_libinput_get_device_handle(&keyboard->base))) {
++ device_name = libinput_device_get_name(device);
++ }
++ for (krule = kbrules; krule < END(kbrules); krule++) {
++ if (!krule->name || strstr(device_name, krule->name))
++ break;
++ }
++ if (krule) {
++ struct xkb_rule_names xkb_rules;
++ xkb_rules.rules = krule->rules;
++ xkb_rules.model = krule->model;
++ xkb_rules.layout = krule->layout;
++ xkb_rules.variant = krule->variant;
++ xkb_rules.options = krule->options;
++ kb_group = createkeyboardgroup(&xkb_rules);
++ } else
++ wl_list_for_each(kb_group, &kb_groups, link);
++
+ /* Set the keymap to match the group keymap */
+ wlr_keyboard_set_keymap(keyboard, kb_group->wlr_group->keyboard.keymap);
+
+@@ -811,11 +854,16 @@ createkeyboard(struct wlr_keyboard *keyboard)
+ }
+
+ KeyboardGroup *
+-createkeyboardgroup(void)
++createkeyboardgroup(struct xkb_rule_names *new_xkb_rules)
+ {
+ KeyboardGroup *group = ecalloc(1, sizeof(*group));
+ struct xkb_context *context;
+ struct xkb_keymap *keymap;
++ struct xkb_rule_names xkb_rules;
++
++ memset(&xkb_rules, 0, sizeof(struct xkb_rule_names));
++ if (new_xkb_rules)
++ xkb_rules = *new_xkb_rules;
+
+ group->wlr_group = wlr_keyboard_group_create();
+ group->wlr_group->data = group;
+@@ -845,6 +893,9 @@ createkeyboardgroup(void)
+ * all of them. Set this combined wlr_keyboard as the seat keyboard.
+ */
+ wlr_seat_set_keyboard(seat, &group->wlr_group->keyboard);
++
++ wl_list_init(&group->destroy.link);
++ wl_list_insert(&kb_groups, &group->link);
+ return group;
+ }
+
+@@ -1042,9 +1093,15 @@ createnotify(struct wl_listener *listener, void *data)
+ void
+ createpointer(struct wlr_pointer *pointer)
+ {
++ const InputRule *irule;
+ struct libinput_device *device;
+ if (wlr_input_device_is_libinput(&pointer->base)
+ && (device = wlr_libinput_get_device_handle(&pointer->base))) {
++ const char *device_name = libinput_device_get_name(device);
++ for (irule = inputrules; irule < END(inputrules); irule++) {
++ if (!irule->name || strstr(device_name, irule->name))
++ break;
++ }
+
+ if (libinput_device_config_tap_get_finger_count(device)) {
+ libinput_device_config_tap_set_enabled(device, tap_to_click);
+@@ -1072,11 +1129,11 @@ createpointer(struct wlr_pointer *pointer)
+ libinput_device_config_click_set_method (device, click_method);
+
+ if (libinput_device_config_send_events_get_modes(device))
+- libinput_device_config_send_events_set_mode(device, send_events_mode);
++ libinput_device_config_send_events_set_mode(device, irule->send_events_mode);
+
+ if (libinput_device_config_accel_is_available(device)) {
+- libinput_device_config_accel_set_profile(device, accel_profile);
+- libinput_device_config_accel_set_speed(device, accel_speed);
++ libinput_device_config_accel_set_profile(device, irule->accel_profile);
++ libinput_device_config_accel_set_speed(device, irule->accel_speed);
+ }
+ }
+
+@@ -1277,7 +1334,6 @@ destroykeyboardgroup(struct wl_listener *listener, void *data)
+ wl_list_remove(&group->key.link);
+ wl_list_remove(&group->modifiers.link);
+ wl_list_remove(&group->destroy.link);
+- free(group);
+ }
+
+ Monitor *
+@@ -1467,6 +1523,7 @@ inputdevice(struct wl_listener *listener, void *data)
+ * available. */
+ struct wlr_input_device *device = data;
+ uint32_t caps;
++ KeyboardGroup *group;
+
+ switch (device->type) {
+ case WLR_INPUT_DEVICE_KEYBOARD:
+@@ -1485,8 +1542,11 @@ inputdevice(struct wl_listener *listener, void *data)
+ * there are no pointer devices, so we always include that capability. */
+ /* TODO do we actually require a cursor? */
+ caps = WL_SEAT_CAPABILITY_POINTER;
+- if (!wl_list_empty(&kb_group->wlr_group->devices))
+- caps |= WL_SEAT_CAPABILITY_KEYBOARD;
++ wl_list_for_each(group, &kb_groups, link)
++ if (!wl_list_empty(&group->wlr_group->devices)) {
++ caps |= WL_SEAT_CAPABILITY_KEYBOARD;
++ break;
++ }
+ wlr_seat_set_capabilities(seat, caps);
+ }
+
+@@ -2431,6 +2491,7 @@ setup(void)
+ */
+ wl_list_init(&clients);
+ wl_list_init(&fstack);
++ wl_list_init(&kb_groups);
+
+ xdg_shell = wlr_xdg_shell_create(dpy, 6);
+ LISTEN_STATIC(&xdg_shell->events.new_surface, createnotify);
+@@ -2514,8 +2575,7 @@ setup(void)
+ LISTEN_STATIC(&seat->events.request_start_drag, requeststartdrag);
+ LISTEN_STATIC(&seat->events.start_drag, startdrag);
+
+- kb_group = createkeyboardgroup();
+- wl_list_init(&kb_group->destroy.link);
++ createkeyboardgroup(NULL);
+
+ output_mgr = wlr_output_manager_v1_create(dpy);
+ LISTEN_STATIC(&output_mgr->events.apply, outputmgrapply);
+@@ -2857,10 +2917,9 @@ virtualkeyboard(struct wl_listener *listener, void *data)
+ {
+ struct wlr_virtual_keyboard_v1 *kb = data;
+ /* virtual keyboards shouldn't share keyboard group */
+- KeyboardGroup *group = createkeyboardgroup();
++ KeyboardGroup *group = createkeyboardgroup(NULL);
+ /* Set the keymap to match the group keymap */
+ wlr_keyboard_set_keymap(&kb->keyboard, group->wlr_group->keyboard.keymap);
+- LISTEN(&kb->keyboard.base.events.destroy, &group->destroy, destroykeyboardgroup);
+
+ /* Add the new keyboard to the group */
+ wlr_keyboard_group_add_keyboard(group->wlr_group, &kb->keyboard);
+--
+2.45.2
+