From 17e475a5df2584146eb90f6386627ffb0d018cab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= Date: Fri, 29 Dec 2023 02:27:16 +0000 Subject: [PATCH] update numlock/capslock f876192 no one noticed, right? --- numlock-capslock/numlock-capslock.patch | 207 +++++++++--------------- 1 file changed, 79 insertions(+), 128 deletions(-) diff --git a/numlock-capslock/numlock-capslock.patch b/numlock-capslock/numlock-capslock.patch index a3f306a..eb4ccda 100644 --- a/numlock-capslock/numlock-capslock.patch +++ b/numlock-capslock/numlock-capslock.patch @@ -1,154 +1,105 @@ -From c2e65831770a54eebe6eef6e36bfa4716c7e1ada Mon Sep 17 00:00:00 2001 +From f8761928cc1eb5c9c694cf43cf6442579ea40150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leonardo=20Hern=C3=A1ndez=20Hern=C3=A1ndez?= - -Date: Sat, 8 Jul 2023 17:11:36 -0600 -Subject: [PATCH] port autostart patch from dwm + +Date: Sun, 4 Apr 2021 19:56:09 -0500 +Subject: [PATCH] add option to enable numlock/capslock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -https://dwm.suckless.org/patches/cool_autostart/ Signed-off-by: Leonardo Hernández Hernández --- - config.def.h | 7 +++++++ - dwl.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++----- - 2 files changed, 61 insertions(+), 5 deletions(-) + config.def.h | 4 ++++ + dwl.c | 31 ++++++++++++++++++++++++++----- + 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/config.def.h b/config.def.h -index a8ed61d..3585711 100644 +index a8ed61d..87f91d7 100644 --- a/config.def.h +++ b/config.def.h -@@ -20,6 +20,13 @@ static const float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0}; /* You can al - /* logging */ - static int log_level = WLR_ERROR; +@@ -56,6 +56,10 @@ static const struct xkb_rule_names xkb_rules = { + .options = NULL, + }; -+/* Autostart */ -+static const char *const autostart[] = { -+ "wbg", "/path/to/your/image", NULL, -+ NULL /* terminate */ -+}; ++/* numlock and capslock */ ++static const int numlock = 1; ++static const int capslock = 0; + -+ - static const Rule rules[] = { - /* app_id title tags mask isfloating monitor */ - /* examples: + static const int repeat_rate = 25; + static const int repeat_delay = 600; + diff --git a/dwl.c b/dwl.c -index edf0cf1..4b7adc8 100644 +index 10d5a5b..962748b 100644 --- a/dwl.c +++ b/dwl.c -@@ -236,6 +236,7 @@ static void arrange(Monitor *m); - static void arrangelayer(Monitor *m, struct wl_list *list, - struct wlr_box *usable_area, int exclusive); - static void arrangelayers(Monitor *m); -+static void autostartexec(void); - static void axisnotify(struct wl_listener *listener, void *data); - static void buttonpress(struct wl_listener *listener, void *data); - static void chvt(const Arg *arg); -@@ -403,6 +404,9 @@ static xcb_atom_t netatom[NetLast]; - /* attempt to encapsulate suck into one file */ - #include "client.h" +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -336,6 +337,7 @@ static void zoom(const Arg *arg); + static const char broken[] = "broken"; + static pid_t child_pid = -1; + static int locked; ++static uint32_t locked_mods = 0; + static void *exclusive_focus; + static struct wl_display *dpy; + static struct wlr_backend *backend; +@@ -768,6 +770,8 @@ createkeyboard(struct wlr_keyboard *keyboard) + wlr_keyboard_set_keymap(keyboard, kb_group.wlr_group->keyboard.keymap); + wlr_keyboard_set_repeat_info(keyboard, repeat_rate, repeat_delay); -+static pid_t *autostart_pids; -+static size_t autostart_len; ++ wlr_keyboard_notify_modifiers(keyboard, 0, 0, locked_mods, 0); + - /* function implementations */ - void - applybounds(Client *c, struct wlr_box *bbox) -@@ -533,6 +537,27 @@ arrangelayers(Monitor *m) - } + /* Add the new keyboard to the group */ + wlr_keyboard_group_add_keyboard(kb_group.wlr_group, keyboard); } +@@ -2354,13 +2358,9 @@ setup(void) + XKB_KEYMAP_COMPILE_NO_FLAGS))) + die("failed to compile keymap"); -+void -+autostartexec(void) { -+ const char *const *p; -+ size_t i = 0; -+ -+ /* count entries */ -+ for (p = autostart; *p; autostart_len++, p++) -+ while (*++p); -+ -+ autostart_pids = calloc(autostart_len, sizeof(pid_t)); -+ for (p = autostart; *p; i++, p++) { -+ if ((autostart_pids[i] = fork()) == 0) { -+ setsid(); -+ execvp(*p, (char *const *)p); -+ die("dwl: execvp %s:", *p); -+ } -+ /* skip arguments */ -+ while (*++p); -+ } -+} -+ - void - axisnotify(struct wl_listener *listener, void *data) - { -@@ -630,11 +655,21 @@ checkidleinhibitor(struct wlr_surface *exclude) - void - cleanup(void) - { -+ size_t i; - #ifdef XWAYLAND - wlr_xwayland_destroy(xwayland); - xwayland = NULL; - #endif - wl_display_destroy_clients(dpy); -+ -+ /* kill child processes */ -+ for (i = 0; i < autostart_len; i++) { -+ if (0 < autostart_pids[i]) { -+ kill(autostart_pids[i], SIGTERM); -+ waitpid(autostart_pids[i], NULL, 0); -+ } ++ wlr_seat_set_keyboard(seat, &kb_group.wlr_group->keyboard); + wlr_keyboard_set_keymap(&kb_group.wlr_group->keyboard, keymap); + wlr_keyboard_set_keymap(&vkb_group.wlr_group->keyboard, keymap); +- xkb_keymap_unref(keymap); +- xkb_context_unref(context); +- +- wlr_keyboard_set_repeat_info(&kb_group.wlr_group->keyboard, repeat_rate, repeat_delay); +- wlr_keyboard_set_repeat_info(&vkb_group.wlr_group->keyboard, repeat_rate, repeat_delay); + + /* Set up listeners for keyboard events */ + LISTEN(&kb_group.wlr_group->keyboard.events.key, &kb_group.key, keypress); +@@ -2368,6 +2368,27 @@ setup(void) + LISTEN(&vkb_group.wlr_group->keyboard.events.key, &vkb_group.key, keypress); + LISTEN(&vkb_group.wlr_group->keyboard.events.modifiers, &vkb_group.modifiers, keypressmod); + ++ if (numlock) { ++ xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_NUM); ++ if (mod_index != XKB_MOD_INVALID) ++ locked_mods |= (uint32_t)1 << mod_index; + } + - if (child_pid > 0) { - kill(child_pid, SIGTERM); - waitpid(child_pid, NULL, 0); -@@ -1295,18 +1330,31 @@ void - handlesig(int signo) - { - if (signo == SIGCHLD) { --#ifdef XWAYLAND - siginfo_t in; - /* wlroots expects to reap the XWayland process itself, so we - * use WNOWAIT to keep the child waitable until we know it's not - * XWayland. - */ - while (!waitid(P_ALL, 0, &in, WEXITED|WNOHANG|WNOWAIT) && in.si_pid -- && (!xwayland || in.si_pid != xwayland->server->pid)) -- waitpid(in.si_pid, NULL, 0); --#else -- while (waitpid(-1, NULL, WNOHANG) > 0); -+#ifdef XWAYLAND -+ && (!xwayland || in.si_pid != xwayland->server->pid) - #endif -+ ) { -+ pid_t *p, *lim; -+ waitpid(in.si_pid, NULL, 0); -+ if (in.si_pid == child_pid) -+ child_pid = -1; -+ if (!(p = autostart_pids)) -+ continue; -+ lim = &p[autostart_len]; ++ if (capslock) { ++ xkb_mod_index_t mod_index = xkb_keymap_mod_get_index(keymap, XKB_MOD_NAME_CAPS); ++ if (mod_index != XKB_MOD_INVALID) ++ locked_mods |= (uint32_t)1 << mod_index; ++ } + -+ for (; p < lim; p++) { -+ if (*p == in.si_pid) { -+ *p = -1; -+ break; -+ } -+ } -+ } - } else if (signo == SIGINT || signo == SIGTERM) { - quit(NULL); - } -@@ -1966,6 +2014,7 @@ run(char *startup_cmd) - die("startup: backend_start"); - - /* Now that the socket exists and the backend is started, run the startup command */ -+ autostartexec(); - if (startup_cmd) { - int piperw[2]; - if (pipe(piperw) < 0) ++ if (locked_mods) ++ wlr_keyboard_notify_modifiers(&kb_group.wlr_group->keyboard, 0, 0, locked_mods, 0); ++ ++ xkb_keymap_unref(keymap); ++ xkb_context_unref(context); ++ ++ wlr_keyboard_set_repeat_info(&kb_group.wlr_group->keyboard, repeat_rate, repeat_delay); ++ wlr_keyboard_set_repeat_info(&vkb_group.wlr_group->keyboard, repeat_rate, repeat_delay); ++ + kb_group.key_repeat_source = wl_event_loop_add_timer( + wl_display_get_event_loop(dpy), keyrepeat, &kb_group); + vkb_group.key_repeat_source = wl_event_loop_add_timer( -- 2.43.0