udev rule to set XKB keyboard model
Component
udev rule files
Is your feature request related to a problem? Please describe
Currently, GNOME doesn't have UI to set the keyboard model, so user has to tweak it with external apps or command line. This can be unsuitable for average user, and is bad UX overall, leading the model left unset.
Describe the solution you'd like
In many cases, as for Apple keyboards, the keyboard "model" (e.g., ANSI/ISO/JP) can be detected automatically.
We can look at how hid-apple driver does it (probably just by vendor/device IDs) and make a udev rule to set the model accordingly.
Original issue: https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config/-/issues/535
There's infra already to comunicate an intended xkb layout to upper layers. It works via systemd's hwdb logic. It is used for certain chromebooks for example, see d7d31692bf7cde5dce7f4ed3cae429a5b302a9f0
Or what is this issue about? If you want your apple hw covered by this, you just have to post an appropriate patch with an hwdb entry, we are happy to merge it, if done properly.
(we do not possess such hw, don#t expect this to be added from our side)
That seems at least relative, thanks.
The hid-apple has a huge list of Vendor/Product IDs aliases (which apparently works for Bluetooth connected keyboards, too):
modinfo hid-apple
$ modinfo hid-apple
filename: /lib/modules/6.14.6-300.fc42.x86_64/kernel/drivers/hid/hid-apple.ko.xz
license: GPL
description: Apple USB HID quirks support for Linux
alias: hid:b0003g*v000005ACp00008102
alias: hid:b0005g*v0000004Cp0000029F
alias: hid:b0003g*v000005ACp0000029F
alias: hid:b0005g*v0000004Cp0000029A
alias: hid:b0003g*v000005ACp0000029A
alias: hid:b0005g*v0000004Cp00000320
alias: hid:b0003g*v000005ACp00000320
alias: hid:b0005g*v0000004Cp0000029C
alias: hid:b0003g*v000005ACp0000029C
alias: hid:b0003g*v000005ACp0000030B
alias: hid:b0003g*v000005ACp0000030A
alias: hid:b0005g*v000005ACp0000023B
alias: hid:b0005g*v000005ACp0000023A
alias: hid:b0005g*v000005ACp00000239
alias: hid:b0003g*v000005ACp00000340
alias: hid:b0003g*v000005ACp00000280
alias: hid:b0003g*v000005ACp0000027F
alias: hid:b0003g*v000005ACp0000027E
alias: hid:b0003g*v000005ACp0000027D
alias: hid:b0003g*v000005ACp0000027C
alias: hid:b0003g*v000005ACp0000027B
alias: hid:b0003g*v000005ACp0000027A
alias: hid:b0003g*v000005ACp00000274
alias: hid:b0003g*v000005ACp00000273
alias: hid:b0003g*v000005ACp00000272
alias: hid:b0003g*v000005ACp00000292
alias: hid:b0003g*v000005ACp00000291
alias: hid:b0003g*v000005ACp00000290
alias: hid:b0003g*v000005ACp0000025B
alias: hid:b0003g*v000005ACp0000025A
alias: hid:b0003g*v000005ACp00000259
alias: hid:b0003g*v000005ACp00000264
alias: hid:b0003g*v000005ACp00000263
alias: hid:b0003g*v000005ACp00000262
alias: hid:b0003g*v000005ACp00000254
alias: hid:b0003g*v000005ACp00000253
alias: hid:b0003g*v000005ACp00000252
alias: hid:b0003g*v000005ACp0000024B
alias: hid:b0003g*v000005ACp0000024A
alias: hid:b0003g*v000005ACp00000249
alias: hid:b0003g*v000005ACp0000024E
alias: hid:b0003g*v000005ACp0000024D
alias: hid:b0003g*v000005ACp0000024C
alias: hid:b0003g*v000005ACp00000247
alias: hid:b0003g*v000005ACp00000246
alias: hid:b0003g*v000005ACp00000245
alias: hid:b0003g*v000005ACp00000244
alias: hid:b0003g*v000005ACp00000243
alias: hid:b0003g*v000005ACp00000242
alias: hid:b0003g*v000005ACp00000241
alias: hid:b0003g*v000005ACp00000240
alias: hid:b0003g*v000005ACp0000023F
alias: hid:b0003g*v000005ACp00000238
alias: hid:b0003g*v000005ACp00000237
alias: hid:b0003g*v000005ACp00000236
alias: hid:b0003g*v000005ACp00000232
alias: hid:b0003g*v000005ACp00000231
alias: hid:b0003g*v000005ACp00000230
alias: hid:b0003g*v000005ACp00000225
alias: hid:b0003g*v000005ACp00000224
alias: hid:b0003g*v000005ACp00000223
alias: hid:b0005g*v0000004Cp0000026C
alias: hid:b0003g*v000005ACp0000026C
alias: hid:b0005g*v0000004Cp00000267
alias: hid:b0003g*v000005ACp00000267
alias: hid:b0005g*v000005ACp0000022E
alias: hid:b0005g*v000005ACp00000257
alias: hid:b0005g*v000005ACp00000255
alias: hid:b0005g*v000005ACp00000256
alias: hid:b0005g*v000005ACp0000022D
alias: hid:b0005g*v000005ACp0000022C
alias: hid:b0003g*v000005ACp00000251
alias: hid:b0005g*v000005ACp00000250
alias: hid:b0003g*v000005ACp00000250
alias: hid:b0005g*v000005ACp0000024F
alias: hid:b0003g*v000005ACp0000024F
alias: hid:b0003g*v000005ACp0000022B
alias: hid:b0003g*v000005ACp0000022A
alias: hid:b0003g*v000005ACp00000229
alias: hid:b0003g*v000005ACp00000222
alias: hid:b0003g*v000005ACp00000221
alias: hid:b0003g*v000005ACp00000220
alias: hid:b0003g*v000005ACp0000021F
alias: hid:b0003g*v000005ACp0000021E
alias: hid:b0003g*v000005ACp0000021D
alias: hid:b0003g*v000005ACp0000021C
alias: hid:b0003g*v000005ACp0000021B
alias: hid:b0003g*v000005ACp0000021A
alias: hid:b0003g*v000005ACp00000219
alias: hid:b0003g*v000005ACp00000218
alias: hid:b0003g*v000005ACp00000217
alias: hid:b0003g*v000005ACp00000216
alias: hid:b0003g*v000005ACp00000215
alias: hid:b0003g*v000005ACp00000214
alias: hid:b0003g*v000005ACp0000020F
alias: hid:b0003g*v000005ACp0000020E
alias: hid:b0003g*v000005ACp00000304
...
If there is correlation between keyboard model (ISO, ANSI, JP) and these IDs, maybe we could just use that to fill in the hwdb and set XKB_FIXED_MODEL accordingly.
Needs a closer look I guess..