From 77e43a18aec0d627b52aee95a663a3ce79f8ffcf Mon Sep 17 00:00:00 2001 From: Raheman Vaiya Date: Mon, 3 Oct 2022 00:22:19 -0400 Subject: [PATCH] config: Add k: and m: device matching prefixes --- data/keyd-application-mapper.1.gz | Bin 1524 -> 1524 bytes data/keyd.1.gz | Bin 8780 -> 8863 bytes docs/keyd.scdoc | 4 +++ src/config.c | 46 ++++++++++++++++++++++-------- src/config.h | 15 +++++++--- src/daemon.c | 30 +++++++++++-------- 6 files changed, 67 insertions(+), 28 deletions(-) diff --git a/data/keyd-application-mapper.1.gz b/data/keyd-application-mapper.1.gz index 5afa794b9aded807ab97626742af53e1d30cb32d..3cc0207cc5adc2045a19a7232b7aadba97b56afa 100644 GIT binary patch literal 1524 zcmV_qPaHQ8{ha+Prc_D*aeF!X<3mIvT_Q?ON|Ojk(hB(C z+x6~Qc-I@-dvI0MzrAn9yBsv7Qc)sU+cWd#&6~0F%N;t=t@bMFl9n3^Md=Ef<+E9S znB~}g?V8T&s0r(RquZ#WaV=HOQ(T!qop-fY4dKt$MN(^JtXf)4Dv+X+cOS{Lm7`A8 zI?Iiw%XT-fDK7)fztH8b`jX|^Qu-NIpJjQw%5qhb6$r0%ZCa}DU>2^80P-Ts&)?9_ zwceBy)pgbs0&UXZL;D@tnc@H8^TWf*?D^#R4?9`@A`O%314fI2TB#c_I9^RhFNg(T~}aiz6J4+P}QY zvL{FSw(~j!Mmc-=@cR(omrwKbFUuW^2q5M>o?h3E(Uv7SrK@?Po(X>OrY ztDwFNNN_}ismlY|Zq$Zc$D&f!ZlpaGgwnU>79lp4J=(HR9__Nb&p_!{j1PUQc(fca z~GCyguO-;-t8{hU`hb$RKfi3 z@!?|SU1R!&4H&q0R*e4DMh@%m_WnP#_@G^wUav9nn3DNq#tfpi%$6{g=z4bfbc`PH zw@j*Urc~;OxKa_)z^D#s1Lr{lTkUF)T*JlW@TZ>(XPw^@m197yd5aRF$5kie4YG4f zu4=le5U1l2HTyqusYaQ^O*8cWW4GOe zn;{DTaU&xXox5?pr_zMZDo)Vzm4If721Du36dLs4>e#X=EZ*`VU$B&%&+b-3no=X3 zi;4qC#v@eW;DEC6`*FDJJH0(H&W#VC)igRy3zN73tC%f#A#l(v%{GvL2S~VIC2J~O zYznIfwihixm&o+)X@hpSasK*%7z;IhV13_V7Ky@L4}#L>O07}IqR>IcBu4aft^5=Q zA}quSuDI4whPc6}W`DTlb+b&RV}CH?(|oA*uJ88724OkO`H_V_X!&~Yy@{JN^Iy#| zBLzvym-_|p1U#6EIJW8dQji1js0S!S`!-D#UpVgZy0PL;a04en~*K7YEgiD@TW+4 zDydKRrKGaZ%gWvXnTV;y+5&lNj6t4EnUglf^%gfG7PW+TG2XHk@jB$Us&HTSnqN@p zuC^HEb~Ze}_{u!E2k1XlGx&F{FqyIw>ayseK>R6r-f2?=Gx8>jFNo%k$3;+OsUI~%_ literal 1524 zcmV@`Z`(Ey{XG4OTL!dA5X*J2?L*NOaEmN8(6vR9wj1Jn zpe0HsLWwF#Iq^{Jx9{Ciij#F2u%JaEl6Uv+-Mb_6q>)P(iE(QQ=GxRxsCDXvYR&b!*HhVWaUJ)1n6?Pd9gEI)rkAJ6BfC;ah@O_%Hf^AdKq|*HfWd zu19-Kt|F}fFX%!lC3Ofo^2WVnDRjCpl_?M;T!#T+nK{P6Fl*~p%98IbVwSoxEvQEw zknmK;B4v8G%X0v80n@|3#8LL7k=9+%g@f~$Lzby7dRZXe|eQ< z-@VYco!22S%Gt|@-^ch~KFQO+EUyeaNHIUJwbu-8^u*M2aMx;1{aXwnfe-+fFA~Fu z^zw=x{QN+_aTT~ZhT_Q42PR)%L=%zhV1CaeonZ;ci4^f9;{~Y_1Ky=4pbZynqpX2! zd@Vgks5nkeH1F>R&56D`xibq`J{b6ChdW@S{&;l$%h{@0EU#<_g5n^lEqb&>N(JuRk43vJw_|UhCN6QgI zzN}kl`|BZ8Rvun4KA6}P1~In(=!*mmRfVZo-u2l)^MHX%omy^{a%BUKvD51bexH6L z$7>VgmbIvCgwU?&7kWL3YBerg%EI~mr8q9Z>N3R1;m&+U*lSeb-TtBtrUal)70mwu zA1>D3HKuRafPs5w#pqvc zWm0`JrBXk{wTh4iMs-LVI1d`wYF~ro8ZIWsKmA-d>->SJ90O{@Ta*wzt~wcSkeyp` zRntv{I316;p~TkJ`&QI2Ktay%WNA{-BhwrHhOVMHh_X&4 zp#ue|scTFdOmJM7T84NcEnN=^SIpUrf~nCEgUsepPBc#1`S&9_zkxGO^OW_Q+7TCn z^SI##8@_)Q@6IpgZ{N-@7VqEj8mbY|Wod-VqzHz)h+73yk9%TFHOeGznxX$6yX_|2 z3|Rn(8yTVK+^y?9l_qpnae|(&1T<4L7)pPp(4Yrb$Bs>5@sFt4WZhQc(rqO9yn8XcO#caU~frDmgwt)mZK*IehSySm^ zTUb4?y=VctM5cF78??iX^VdhjSg7d(>-!F~NEGgR5R^98YJ)-+g$^<%F`}m%<)<(Z zVIfX%#kGzy#0@?*`@=1-n^h_u`-2&u=0ml2eRnW62+Lv4k1X^-%h!AFP28rL|7wmI zDM(Vj+%I@1;K5YHu}#O9nlx%@Jep^i))+Yatl-`$^~NB9EUaB`OTiZc?x2#{kOZrq zDV8k9ff2SL>IOJjNpcr+0}5-dsLt=$d*n$XZb9*Jvt!(a;uw_?TIgluJ1ivrw(KSjb* zNqu@KC6$F}6@s72K*CD@Eh5NGC{DMMv zwZ$m6^Wpi$SLV?@K>w+l!M|&T$&{T?mqiZ+;!nx*PMad2v77EWU>WNg7xIWus)$L8 ab+711Re}kH) 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 F004=&pq2mt diff --git a/docs/keyd.scdoc b/docs/keyd.scdoc index 507f130..5e43840 100644 --- a/docs/keyd.scdoc +++ b/docs/keyd.scdoc @@ -118,6 +118,10 @@ of _[global]_ (see _GLOBALS_). Config errors will appear in the log output and can be accessed in the usual way using your system's service manager (e.g sudo journalctl -eu keyd). +If a vendor/product pair matches more than one device type, the prefix k: may +be used to exclusively match keyboards and the prefix m: may be used to +exclusively match mice. (E.g m:046d:b01d) + Note: All keyboards defined within a given config file will share the same state. This is useful for linking separate input devices together (e.g foot pedals). diff --git a/src/config.c b/src/config.c index a0367cb..821894a 100644 --- a/src/config.c +++ b/src/config.c @@ -758,12 +758,34 @@ static void parse_id_section(struct config *config, struct ini_section *section) if (!strcmp(s, "*")) { config->wildcard = 1; } else { - if (sscanf(s, "-%hx:%hx", &vendor, &product) == 2) { - assert(config->nr_excluded_ids < ARRAY_SIZE(config->excluded_ids)); - config->excluded_ids[config->nr_excluded_ids++] = (vendor << 16 | product); + if (sscanf(s, "m:%hx:%hx", &vendor, &product) == 2) { + assert(config->nr_ids < ARRAY_SIZE(config->ids)); + config->ids[config->nr_ids].product = product; + config->ids[config->nr_ids].vendor = vendor; + config->ids[config->nr_ids].flags = ID_MOUSE; + + config->nr_ids++; + } else if (sscanf(s, "k:%hx:%hx", &vendor, &product) == 2) { + assert(config->nr_ids < ARRAY_SIZE(config->ids)); + config->ids[config->nr_ids].product = product; + config->ids[config->nr_ids].vendor = vendor; + config->ids[config->nr_ids].flags = ID_KEYBOARD; + + config->nr_ids++; + } else if (sscanf(s, "-%hx:%hx", &vendor, &product) == 2) { + assert(config->nr_ids < ARRAY_SIZE(config->ids)); + config->ids[config->nr_ids].product = product; + config->ids[config->nr_ids].vendor = vendor; + config->ids[config->nr_ids].flags = ID_EXCLUDED; + + config->nr_ids++; } else if (sscanf(s, "%hx:%hx", &vendor, &product) == 2) { assert(config->nr_ids < ARRAY_SIZE(config->ids)); - config->ids[config->nr_ids++] = (vendor << 16 | product); + config->ids[config->nr_ids].product = product; + config->ids[config->nr_ids].vendor = vendor; + config->ids[config->nr_ids].flags = ID_KEYBOARD | ID_MOUSE; + + config->nr_ids++; } else { warn("%s is not a valid device id", s); @@ -871,19 +893,19 @@ int config_parse(struct config *config, const char *path) return 0; } -int config_check_match(struct config *config, uint32_t id) +int config_check_match(struct config *config, uint16_t vendor, uint16_t product, uint8_t flags) { size_t i; for (i = 0; i < config->nr_ids; i++) { - if (config->ids[i] == id) - return 2; - } - - for (i = 0; i < config->nr_excluded_ids; i++) - if (config->excluded_ids[i] == id) { - return 0; + if (config->ids[i].product == product && config->ids[i].vendor == vendor) { + if (config->ids[i].flags & ID_EXCLUDED) { + return 0; + } else if (config->ids[i].flags & flags) { + return 2; + } } + } return config->wildcard ? 1 : 0; } diff --git a/src/config.h b/src/config.h index 519f03e..79c6a82 100644 --- a/src/config.h +++ b/src/config.h @@ -20,6 +20,9 @@ #define PATH_MAX 1024 #endif +#define ID_EXCLUDED 1 +#define ID_MOUSE 2 +#define ID_KEYBOARD 4 enum op { OP_KEYSEQUENCE = 1, @@ -110,11 +113,15 @@ struct config { char aliases[256][32]; uint8_t wildcard; - uint32_t ids[64]; - uint32_t excluded_ids[64]; + struct { + uint16_t product; + uint16_t vendor; + uint8_t flags; + } ids[64]; + size_t nr_ids; - size_t nr_excluded_ids; + size_t nr_layers; size_t nr_macros; size_t nr_descriptors; @@ -135,6 +142,6 @@ int config_parse(struct config *config, const char *path); int config_add_entry(struct config *config, const char *exp); int config_get_layer_index(const struct config *config, const char *name); -int config_check_match(struct config *config, uint32_t id); +int config_check_match(struct config *config, uint16_t vendor, uint16_t product, uint8_t flags); #endif diff --git a/src/daemon.c b/src/daemon.c index 8989b35..e3db8ba 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -152,40 +152,46 @@ static void load_configs() closedir(dh); } -static int lookup_config_ent(uint32_t id, struct config_ent **match) +static struct config_ent *lookup_config_ent(uint16_t vendor, + uint16_t product, + uint8_t flags) { struct config_ent *ent = configs; + struct config_ent *match = NULL; int rank = 0; - *match = NULL; - while (ent) { - int r = config_check_match(&ent->config, id); + int r = config_check_match(&ent->config, vendor, product, flags); if (r > rank) { - *match = ent; + match = ent; rank = r; } ent = ent->next; } - return rank; + /* The wildcard should not match mice. */ + if (rank == 1 && (flags == ID_MOUSE)) + return NULL; + else + return match; } static void manage_device(struct device *dev) { - int match; - uint32_t id = dev->vendor_id << 16 | dev->product_id; - struct config_ent *ent = NULL; + uint8_t flags = 0; + struct config_ent *ent; if (!strcmp(dev->name, VKBD_NAME)) return; - match = lookup_config_ent(id, &ent); + if (dev->capabilities & CAP_KEYBOARD) + flags |= ID_KEYBOARD; + if (dev->capabilities & (CAP_MOUSE|CAP_MOUSE_ABS)) + flags |= ID_MOUSE; - if ((match && dev->capabilities & CAP_KEYBOARD) || - (match == 2 && dev->capabilities & (CAP_MOUSE | CAP_MOUSE_ABS))) { + if ((ent = lookup_config_ent(dev->vendor_id, dev->product_id, flags))) { if (device_grab(dev)) { warn("Failed to grab %s", dev->path); dev->data = NULL;