Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package sxhkd for openSUSE:Factory checked in at 2026-09-17 15:24:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/sxhkd (Old) and /work/SRC/openSUSE:Factory/.sxhkd.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "sxhkd" Thu Sep 17 15:24:01 2026 rev:6 rq:1378451 version:0.6.3 Changes: -------- --- /work/SRC/openSUSE:Factory/sxhkd/sxhkd.changes 2021-01-21 21:57:41.233864442 +0100 +++ /work/SRC/openSUSE:Factory/.sxhkd.new.383539/sxhkd.changes 2026-09-17 15:24:09.909921682 +0200 @@ -1,0 +2,15 @@ +Wed Sep 16 20:24:01 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to 0.6.3: + * Hardcode Mode_switch as Mod5 so bindings work with + xkeyboard-config >= 2.37 + * Enable XKB detectable auto-repeat (ignore extra KeyRelease) + * Export SXHKD_PID; SIGALRM aborts the current chord chain + * Close the command log fd before exec + * Add XF86Keyboard/WWAN/RFKill/AudioPreset/RotationLockToggle/ + FullScreen keysyms + * Warn on interfering hotkeys; document brace escaping +- Add pkgconfig(xcb-xkb) BuildRequires (now linked) +- Spec cleanup: drop Group, add gcc/make + +------------------------------------------------------------------- Old: ---- sxhkd-0.6.2.tar.gz New: ---- sxhkd-0.6.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ sxhkd.spec ++++++ --- /var/tmp/diff_new_pack.x85sTw/_old 2026-09-17 15:24:11.726997955 +0200 +++ /var/tmp/diff_new_pack.x85sTw/_new 2026-09-17 15:24:11.729998080 +0200 @@ -1,7 +1,7 @@ # # spec file for package sxhkd # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) 2017 Luke Jones, [email protected] # # All modifications and additions to the file contributed by third parties @@ -18,18 +18,20 @@ Name: sxhkd -Version: 0.6.2 +Version: 0.6.3 Release: 0 Summary: Simple X hotkey daemon License: BSD-2-Clause -Group: System/GUI/Other URL: https://github.com/baskerville/sxhkd Source0: https://github.com/baskerville/sxhkd/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: https://raw.githubusercontent.com/baskerville/bspwm/master/examples/sxhkdrc +BuildRequires: gcc +BuildRequires: make BuildRequires: pkgconfig BuildRequires: pkgconfig(xcb) BuildRequires: pkgconfig(xcb-keysyms) BuildRequires: pkgconfig(xcb-util) +BuildRequires: pkgconfig(xcb-xkb) %description sxhkd is a simple X hotkey daemon with a powerful and compact configuration syntax. ++++++ sxhkd-0.6.2.tar.gz -> sxhkd-0.6.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/Makefile new/sxhkd-0.6.3/Makefile --- old/sxhkd-0.6.2/Makefile 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/Makefile 2025-09-27 16:46:34.000000000 +0200 @@ -5,7 +5,7 @@ CPPFLAGS += -D_POSIX_C_SOURCE=200112L -DVERSION=\"$(VERSION)\" CFLAGS += -std=c99 -pedantic -Wall -Wextra LDFLAGS ?= -LDLIBS = $(LDFLAGS) -lxcb -lxcb-keysyms +LDLIBS = $(LDFLAGS) -lxcb -lxcb-keysyms -lxcb-xkb PREFIX ?= /usr/local BINPREFIX ?= $(PREFIX)/bin diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/README.md new/sxhkd-0.6.3/README.md --- old/sxhkd-0.6.2/README.md 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/README.md 2025-09-27 16:46:34.000000000 +0200 @@ -58,10 +58,16 @@ ## Editor Plugins ### Vim - - [vim-sxhkdrc](https://github.com/baskerville/vim-sxhkdrc). - [sxhkd-vim](https://github.com/kovetskiy/sxhkd-vim). +### VS Code +- [sxhkdrc-syntax](https://github.com/mosbasik/sxhkdrc-syntax). + +### Emacs +- [sxhkd-mode](https://github.com/xFA25E/sxhkd-mode) +- [sxhkdrc-mode](https://github.com/protesilaos/sxhkdrc-mode) + ---- For further information, check the `man` pages. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/VERSION new/sxhkd-0.6.3/VERSION --- old/sxhkd-0.6.2/VERSION 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/VERSION 2025-09-27 16:46:34.000000000 +0200 @@ -1 +1 @@ -0.6.2 \ No newline at end of file +0.6.3 \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/doc/sxhkd.1 new/sxhkd-0.6.3/doc/sxhkd.1 --- old/sxhkd-0.6.2/doc/sxhkd.1 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/doc/sxhkd.1 2025-09-27 16:46:34.000000000 +0200 @@ -2,12 +2,12 @@ .\" Title: sxhkd .\" Author: [see the "Author" section] .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/> -.\" Date: 08/02/2020 +.\" Date: 09/27/2025 .\" Manual: Sxhkd Manual -.\" Source: Sxhkd 0.6.2 +.\" Source: Sxhkd 0.6.3 .\" Language: English .\" -.TH "SXHKD" "1" "08/02/2020" "Sxhkd 0\&.6\&.2" "Sxhkd Manual" +.TH "SXHKD" "1" "09/27/2025" "Sxhkd 0\&.6\&.3" "Sxhkd Manual" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- @@ -88,10 +88,14 @@ .sp If \fBsxhkd\fR receives a \fISIGUSR1\fR (resp\&. \fISIGUSR2\fR) signal, it will reload its configuration file (resp\&. toggle the grabbing state of all its bindings)\&. .sp +If \fBsxhkd\fR recieves a \fISIGALRM\fR signal, it will break the current chain if there is one in progress\&. +.sp The commands are executed via \fBSHELL\fR \fI\-c\fR \fBCOMMAND\fR (hence you can use environment variables)\&. .sp \fBSHELL\fR will be the content of the first defined environment variable in the following list: \fBSXHKD_SHELL\fR, \fBSHELL\fR\&. .sp +\fBSXHKD_PID\fR will be automatically set to the pid of \fBsxhkd\fR in processes spawned by \fBsxhkd\fR, which may be used by the child process to send easily signals such as \fISIGALRM\fR to the correct instance of \fBsxhkd\fR\&. +.sp If you have a non\-QWERTY keyboard or a non\-standard layout configuration, you should provide a \fICOUNT\fR of \fI1\fR to the \fB\-m\fR option or \fI\-1\fR (interpreted as infinity) if you constantly switch from one layout to the other (\fBsxhkd\fR ignores all mapping notify events by default because the majority of those events are pointless)\&. .SH "CONFIGURATION" .sp @@ -168,7 +172,7 @@ .sp Pointer hotkeys can be defined by using one of the following special keysym names: \fIbutton1\fR, \fIbutton2\fR, \fIbutton3\fR, \&..., \fIbutton24\fR\&. .sp -The hotkey and the command may contain sequences of the form \fI{STRING_1,\&...,STRING_N}\fR\&. +The hotkey and the command may contain sequences of the form \fI{STRING_1,\&...,STRING_N}\fR\&. Braces can be escaped with \fB\e\fR\&. .sp In addition, the sequences can contain ranges of the form \fIA\fR\-\fIZ\fR where \fIA\fR and \fIZ\fR are alphanumeric characters\&. .sp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/doc/sxhkd.1.asciidoc new/sxhkd-0.6.3/doc/sxhkd.1.asciidoc --- old/sxhkd-0.6.2/doc/sxhkd.1.asciidoc 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/doc/sxhkd.1.asciidoc 2025-09-27 16:46:34.000000000 +0200 @@ -60,10 +60,14 @@ If *sxhkd* receives a _SIGUSR1_ (resp. _SIGUSR2_) signal, it will reload its configuration file (resp. toggle the grabbing state of all its bindings). +If *sxhkd* recieves a _SIGALRM_ signal, it will break the current chain if there is one in progress. + The commands are executed via *SHELL* _-c_ *COMMAND* (hence you can use environment variables). *SHELL* will be the content of the first defined environment variable in the following list: *SXHKD_SHELL*, *SHELL*. +*SXHKD_PID* will be automatically set to the pid of *sxhkd* in processes spawned by *sxhkd*, which may be used by the child process to send easily signals such as _SIGALRM_ to the correct instance of *sxhkd*. + If you have a non-QWERTY keyboard or a non-standard layout configuration, you should provide a _COUNT_ of _1_ to the *-m* option or _-1_ (interpreted as infinity) if you constantly switch from one layout to the other (*sxhkd* ignores all mapping notify events by default because the majority of those events are pointless). @@ -107,7 +111,7 @@ Pointer hotkeys can be defined by using one of the following special keysym names: _button1_, _button2_, _button3_, …, _button24_. -The hotkey and the command may contain sequences of the form '{STRING_1,…,STRING_N}'. +The hotkey and the command may contain sequences of the form '{STRING_1,…,STRING_N}'. Braces can be escaped with *\*. In addition, the sequences can contain ranges of the form _A_-_Z_ where _A_ and _Z_ are alphanumeric characters. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/src/helpers.c new/sxhkd-0.6.3/src/helpers.c --- old/sxhkd-0.6.2/src/helpers.c 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/src/helpers.c 2025-09-27 16:46:34.000000000 +0200 @@ -79,6 +79,7 @@ if (redir_fd != -1) { dup2(redir_fd, STDOUT_FILENO); dup2(redir_fd, STDERR_FILENO); + close(redir_fd); } execvp(cmd[0], cmd); err("Spawning failed.\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/src/parse.c new/sxhkd-0.6.3/src/parse.c --- old/sxhkd-0.6.2/src/parse.c 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/src/parse.c 2025-09-27 16:46:34.000000000 +0200 @@ -33,7 +33,7 @@ #include "parse.h" xcb_keysym_t Alt_L, Alt_R, Super_L, Super_R, Hyper_L, Hyper_R, - Meta_L, Meta_R, Mode_switch, Num_Lock, Scroll_Lock; + Meta_L, Meta_R, Num_Lock, Scroll_Lock; keysym_dict_t nks_dict[] = {/*{{{*/ {"VoidSymbol" , 0xffffff} , @@ -2347,6 +2347,12 @@ {"XF86TouchpadOn" , 0x1008FFB0} , {"XF86TouchpadOff" , 0x1008FFB1} , {"XF86AudioMicMute" , 0x1008FFB2} , + {"XF86Keyboard" , 0x1008FFB3} , + {"XF86WWAN" , 0x1008FFB4} , + {"XF86RFKill" , 0x1008FFB5} , + {"XF86AudioPreset" , 0x1008FFB6} , + {"XF86RotationLockToggle" , 0x1008FFB7} , + {"XF86FullScreen" , 0x1008FFB8} , {"XF86Switch_VT_1" , 0x1008FE01} , {"XF86Switch_VT_2" , 0x1008FE02} , {"XF86Switch_VT_3" , 0x1008FE03} , @@ -2470,6 +2476,11 @@ chain_t *chain = make_chain(); if (parse_chain(hotkey, chain)) { hotkey_t *hk = make_hotkey(chain, command); + for (hotkey_t* i = hotkeys_head; i; i = i->next) { + if (chains_interfere(i->chain, hk->chain)) { + warn("Hotkey interference found and may not be matched: '%s' (from '%s').\n", hotkey, hotkey_string); + } + } add_hotkey(hk); if (strcmp(hotkey, last_hotkey) == 0) num_same++; @@ -2739,7 +2750,7 @@ *modfield |= (modfield_from_keysym(Meta_L) | modfield_from_keysym(Meta_R)); return true; } else if (strcmp(name, "mode_switch") == 0) { - *modfield |= modfield_from_keysym(Mode_switch); + *modfield |= XCB_MOD_MASK_5; return true; } else if (strcmp(name, "mod1") == 0) { *modfield |= XCB_MOD_MASK_1; @@ -2797,7 +2808,6 @@ GETKS(Super_R) GETKS(Hyper_L) GETKS(Hyper_R) - GETKS(Mode_switch) GETKS(Num_Lock) GETKS(Scroll_Lock) #undef GETKS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/src/sxhkd.c new/sxhkd-0.6.3/src/sxhkd.c --- old/sxhkd-0.6.2/src/sxhkd.c 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/src/sxhkd.c 2025-09-27 16:46:34.000000000 +0200 @@ -23,6 +23,7 @@ */ #include <xcb/xcb_event.h> +#include <xcb/xkb.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -51,6 +52,8 @@ int mapping_count; int timeout; +char sxhkd_pid[MAXLEN]; + hotkey_t *hotkeys_head, *hotkeys_tail; bool running, grabbed, toggle_grab, reload, bell, chained, locked; xcb_keysym_t abort_keysym; @@ -281,6 +284,8 @@ dpy = xcb_connect(NULL, &screen_idx); if (xcb_connection_has_error(dpy)) err("Can't open display.\n"); + xcb_xkb_use_extension(dpy, XCB_XKB_MAJOR_VERSION, XCB_XKB_MINOR_VERSION); + xcb_xkb_per_client_flags(dpy, XCB_XKB_ID_USE_CORE_KBD, XCB_XKB_PER_CLIENT_FLAG_DETECTABLE_AUTO_REPEAT, 1, 0, 0, 0); xcb_screen_t *screen = NULL; xcb_screen_iterator_t screen_iter = xcb_setup_roots_iterator(xcb_get_setup(dpy)); for (; screen_iter.rem; xcb_screen_next(&screen_iter), screen_idx--) { @@ -297,6 +302,9 @@ symbols = xcb_key_symbols_alloc(dpy); hotkeys_head = hotkeys_tail = NULL; progress[0] = '\0'; + + snprintf(sxhkd_pid, MAXLEN, "%i", getpid()); + setenv("SXHKD_PID", sxhkd_pid, 1); } void cleanup(void) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/src/types.c new/sxhkd-0.6.3/src/types.c --- old/sxhkd-0.6.2/src/types.c 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/src/types.c 2025-09-27 16:46:34.000000000 +0200 @@ -113,6 +113,25 @@ return false; } +bool chains_interfere(chain_t* a, chain_t* b) { + chord_t* i = a->head; + chord_t* j = b->head; + for (; i && j; i = i->next, j = j->next) { + bool match = false; + for (chord_t* k = i; k; k = k->more) { + if (match_chord(j, k->event_type, k->keysym, k->button, k->modfield)) { + match = true; + break; + } + } + if (!match) { + break; + } + } + bool result = !i || !j; + return result; +} + chord_t *make_chord(xcb_keysym_t keysym, xcb_button_t button, uint16_t modfield, uint8_t event_type, bool replay_event, bool lock_chain) { chord_t *chord; @@ -126,7 +145,7 @@ for (unsigned char col = 0; col < KEYSYMS_PER_KEYCODE; col++) { xcb_keysym_t ks = xcb_key_symbols_get_keysym(symbols, *kc, col); if (ks == keysym) { - uint16_t implicit_modfield = (col & 1 ? XCB_MOD_MASK_SHIFT : 0) | (col & 2 ? modfield_from_keysym(Mode_switch) : 0); + uint16_t implicit_modfield = (col & 1 ? XCB_MOD_MASK_SHIFT : 0) | (col & 2 ? XCB_MOD_MASK_5 : 0); uint16_t explicit_modfield = modfield | implicit_modfield; chord = malloc(sizeof(chord_t)); bool unique = true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sxhkd-0.6.2/src/types.h new/sxhkd-0.6.3/src/types.h --- old/sxhkd-0.6.2/src/types.h 2020-08-02 09:53:02.000000000 +0200 +++ new/sxhkd-0.6.3/src/types.h 2025-09-27 16:46:34.000000000 +0200 @@ -34,8 +34,6 @@ #define ESCAPE_KEYSYM 0xff1b #define SYNCHRONOUS_CHAR ';' -extern xcb_keysym_t Mode_switch; - typedef struct chord_t chord_t; struct chord_t { char repr[MAXLEN]; @@ -77,6 +75,7 @@ hotkey_t *find_hotkey(xcb_keysym_t keysym, xcb_button_t button, uint16_t modfield, uint8_t event_type, bool *replay_event); bool match_chord(chord_t *chord, uint8_t event_type, xcb_keysym_t keysym, xcb_button_t button, uint16_t modfield); +bool chains_interfere(chain_t* a, chain_t* b); chord_t *make_chord(xcb_keysym_t keysym, xcb_button_t button, uint16_t modfield, uint8_t event_type, bool replay_event, bool lock_chain); void add_chord(chain_t *chain, chord_t *chord); chain_t *make_chain(void);
