web-dev-qa-db-fra.com

Udev règle à la disposition du clavier de chargement automatique lorsque le clavier USB branché

j'essaie de charger une nouvelle mise en page de clavier lorsque je branche un clavier USB, mais ma règle Udev ne fonctionne pas.

 Subsystème == "Entrée", attr {idvendor} == "062a", attr (idproduct} == "0201", goto = "USB_XMODMAP_Auto" [.____] [.] Label = " USB_XMODMAP_Auto "
 Action ==" Ajouter ", exécuter + ="/USR/BIN/XMODMAP ~/.USBXMODMAP "[.] action ==" Supprimer ", exécuter + ="/usr/bin/xmodmap ~ /.pndxmodmap"

J'ai rechargé les règles en utilisant:

> Contrôle de Sudo Udevadm - Règles générales

et en redémarrant le système mais lorsque je branche le clavier USB, l'orginal xmodmap est toujours chargé et que la disposition du clavier est donc fausse, mais si j'exécute la commande dans le terminal.

>/usr/bin/xmodmap ~/.usbxmodmap
>/usr/bin/xmodmap ~/.pndxmodmap

ils travaillent juste bien.

j'espère que Soneone peut aider.

Edit :

juste pour aider plus j'ai couru des tests Udevadm:

[.____]> Udevadm Test --Action = Ajouter /Devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10

les sorties:

[.____] run_command: appelant: test 
 udevadm_test: version 151 [.____] Ce programme est destiné à déboguer uniquement, il n'exègre aucun programme, [.____] spécifié par une clé d'exécution. Il peut montrer des résultats incorrects, car [.____] Certaines valeurs peuvent être différentes ou non disponibles à une exécution de simulation. [.____] [.____] [...] [.____] 
 Parse_File: Lecture ' /etc/udev/rules.d/eusb -keyboard.rules 'comme fichier de règles [.____] udev_rules_new: Les règles utilisent 100572 jetons d'octets (8381 * 12 octets), 21523 bytes tampon [.____] udev_rules_new: Index temporaire utilisé 35380 octets (1769 * 20 octets) 
 Udev_device_new_from_syspath: périphérique 0x3b4d8 a devpath '/Devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/1put/Input10 '
 udev_rules_apply_to_event: exécuter'/sbin/modprobe -b $ env. /etc/udev/rules.d/80-drivers.rules:5[.Opply_to_event: exécution:/org/bleDesktop/hal/udev_event '/etc/udev/roules.d/90-hal.rules:2
udev_rules_apply_to_event: exécuter'/sbin/modprobe $ env (modalias} '/ etc/udev/règles/règles .D/local.Rules: 31 [.____] udev_rules_apply_to_event: exécution 'socket:/org/kernel/udev/moniteur' /etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: exécuter '/ usr/bin/xmodmap ~ /.usbxmodmap '/etc/udev/rules.d/usb -keyboard.rules:4
Devadm_test: udev_log = 6 [.____] udevadm_test: devpath =/dispositifs/plate-forme/eHci-omap.0/USB1/1-2/1-2.3/1-2.3: 1.1/INPUT/INPUT10 [.____] Udevadm_test: Produit = 3/62A/201/110 [.____] udevadm_test: nom = "clavier compatible USB" [.____] udevadm_test: phys = "USB-EHCI-OMAP.0-2.3/INPUT1" [.____] udevadm_test: Uniq = "" [.____] udevadm_test: ev == 1f [.____] udevadm_test : Clé == 837FFF 2C3027 BF004444 0 0 1FE3 C04 A27C000 267BFA D941DFED 9E0000 0 0 0 0 [.____] Udevadm_test: rel == 143 [.____] udevadm_test: ABS == 1 0 [.____] = 10 [.____] udevadm_test: modalias = entrée: B0003V062AP0201E0110-E0,1,2,3,4, K71 72,73,74,77,80 82,83,85,86,87,88,8999 , 8a, 8b, 8c, 8e, 8F, 90,96,98,9B, 9c, 9e, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AE, AE, B1 , B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, EB, 100 101 105 109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D 17F, 180 181 182,185,18C, 18D, 192,193,195,1A3,1a1,1a2,1a6,1a7,1a8,1a9,1aaa, 1Ab, 1Ac, 1ad, 1ae, 1e 1B0,1B1,1B7, R0,1 , 6,8, A20, M4, lsfw [.____] udevadm_test: action = ajouter 
 udevadm_test: udevadm_test: Sous-système = entrée [.____] Udevadm_test: exécution: '/ sbin/modprobe -b entrée: B0003V062AP0201E0110-E0,1,1 , 3,4, K71 72,73,74 77 80 82,83 85 86 87,88,89,8888889A, 8B, 8C, 8e, 8F, 90,96,98,9B, 9c , 9e, 9f, A1, A3, A4, A5, A6, A7, A8, A9, AB, AB, AB, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB , E2, EA, EB, EB, EB, 100 101 108 109 10A, 10B, 10C, 162,166,16a, 16e, 178,179,17a, 17B, 17C, 17D, 17F, 180,181 181 181, 18D, 192,193,195,1a0,1a1,1a2,1a3,1a4 , 1a5,1a6,1a7,1a8,1a9,1aa, 1Ab, 1Ab, 1AD, 1Ae, 1B0,1B1,1B7, R0,1,6,8, A20, M4, LSFW '[.____] Udevadm_test: Run: 'Prise: @/org/freeesktop/hal/udev_event' [.____] udevadm_test: exécution: '/ SBIN/MODPROBE INPUT: B0003V062AP0201E0110-E0,1,2,2,3,4, K71,72,73,74,77 , 80,82 83 85 86,87,88,89,878888889,8A, 8B, 8e, 8F, 90,96,98,9B, 9c, 9e, 9F, A1, A3, A4, A5, A6 , A7, A8, A9, AB, AC, AB, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, EB, 100 101 105 109,107,108,109 10A, 10B, 10C , 162 16616a, 16e, 178,179,17a, 178, 17c, 17d, 17f, 180 181 181 181, 18D, 192,193,195,1a0,1a1,1a2,1a3,1a4,1a5,1a6,1a7,1a8,1a9,1aa, 1a B, 1AC, 1AD, 1Ae, 1Ae, 1B0,1B1,1B7, R0,1,6,8, A20, M4, LSFW '[.____] Udevadm_Test: Run:' Socket: 'Socket:/Org/Kernel/Udev/Moniteur' [ .____] udevadm_test: exécuter: '/ usr/bin/xmodmap ~/.usbxmodmap' [.____]

et

[.____]> Test Udevadm = Supprimer /Devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/Input/Input10[.____]

les sorties:

[.____] run_command: appelant: test 
 udevadm_test: version 151 [.____] Ce programme est destiné à déboguer uniquement, il n'exègre aucun programme, [.____] spécifié par une clé d'exécution. Il peut montrer des résultats incorrects, car [.____] Certaines valeurs peuvent être différentes ou non disponibles à une exécution de simulation. [.____] [.____] [...] [.____] 
 Parse_File: Lecture ' /etc/udev/rules.d/eusb -keyboard.rules 'comme fichier de règles [.____] udev_rules_new: Les règles utilisent 100572 jetons d'octets (8381 * 12 octets), 21523 bytes tampon [.____] udev_rules_new: Index temporaire utilisé 35380 octets (1769 * 20 octets) 
 Udev_device_new_from_syspath: périphérique 0x3b4d8 a devpath '/Devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/1put/Input10 "[ org/kernel/udev/moniteur '/etc/udev/rules.d/run.rules:2
udev_rules_apply_to_event: exécuter'/USR/bin/xmodmap ~/.pndxmodmap '/etc/uev/rules.d /usb -keyboard.rules:5
Devadm_test: udev_log = 6 [.____] udevadm_test: devpath =/dispositifs/plate-forme/eHci-omap.0/USB1/1-2/1-2.3/1- 2.3: 1.1/entrée/entrée10 [.____] udevadm_test: produit = 3 /62a/201/110
udevadm_test: nom = "clavier compatible USB" 
 Udevadm_test: phys = "USB-EHCI-OMAP.0-2.3/INPUT1" [.____] udevadm_test: Uniq = "" [.____] udevadm_test: ev == 1f [.____] udevadm_test: key == 837FFF 2C3027 BF004444 0 0 1FE3 C04 A27C000 267BFA D941DFED 9E0000 0 0 0 0 [ [.____] udevadm_test: ABS == 1 0 [.____] udevadm_test: msc == 10 [ 73 74 77 80,82,83 85 86,87,88,89,89888889,8888888, 8C, 8E, 8F, 90,96,98,9B, 9C, 9e, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AB, AB, AE, B1, B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100 101 105 106,107,108,109, 10a, 10b, 10c, 162, 166,16a, 16e, 178,179,17A, 17B, 17C, 17D, 17F, 180.181 181 181, 18D, 192,193,195,1a0,1a1,1a2,1a3,1a4,1a5,1a6,1a7,1a8, 1A9,1AA, 1AB, 1Ac, 1AD, 1Ae, 1B0,1B1,1B7, R0,1,6,8, A20, M4, LSFW [.____] udevadm_test: action = supprimer [.____] udevadm_test: Subsystème = Entrée 
 udevadm_test: Run: 'Socket:' Socket: @/org/freeesktop/hal/udev_event '[.____] udevadm_test: exécution:' Socket:/org/kernel/udev/moniteur '
 udevadm_test: exécuter: '/ usr/bin/xmodmap ~/.pndxmodmap' [.____]

ce qui semble montrer qu'il devrait fonctionner, mais cela n'espère pas que cela aide à obtenir une réponse.

24
Jake Aitchison

J'ai trouvé un moyen de contourner cela, bien que c'est un petit hacky.

Je suis arrivé aujourd'hui au même point d'essayer de configurer deux claviers avec UDev, SetXKBMap et XInput --List et pour qu'ils travaillent avec un hotppugging USB. Je échange des clés autour, sans changer la mise en page, mais tout de même, une fois que vous avez identifié votre clavier sur un hotplug et appelle de manière conditionnelle SETXKBMAP, vous devriez pouvoir définir la langue du clavier que vous avez spécifié. . La liste des dispositions de clavier peut être trouvée ici ls -l /usr/share/kbd/keymaps/i386/ Et vous pouvez trouver votre nom de périphérique à gre avec xinput -list.

  1. Vous voudrez remplacer rizumu avec votre nom d'utilisateur, car j'ai trouvé qu'il n'était pas possible d'un moyen de le faire sans être explicite.
  2. Assurez-vous que Grep sur le nom du clavier your.
  3. Utilisez lsusb pour découvrir l'ID de matériel que vous devez définir dans la règle UDEV. Mon clavier Das ressemble à ceci Bus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.

Je configurais d'abord la règle Udev en autodetcct, le clavier consiste à créer une règle UDev:

Dans le fichier /etc/udev/rules.d/00-usb-keyboards.rules:

ACTION=="add", ATTRS{idVendor}=="04d9", ATTRS{idProduct}=="2013", RUN+="/home/rizumu/bin/kbd_udev", OWNER="rizumu"

J'ai deux fichiers ~/bin/kbd et ~/bin/kbd_udev. Assurez-vous qu'ils ont les bonnes autorisations chmod 755 ~/bin/kbd*

Le ~/bin/kbd_udev script contient:

#!/bin/bash
/home/rizumu/bin/kbd &

Et vous remarquerez que tout ce qu'il fait est l'appel ~/bin/kbd En arrière-plan, de sorte que Udev puisse terminer son processus et activer le clavier. À l'intérieur de ~/bin/kbd Script Nous dormons pendant une seconde, car nous devons attendre que le clavier soit activé afin que nous puissions obtenir l'ID de périphérique à l'aide de XInput. Pour aller faire cela, j'ai défini certaines variables et les exportées de Xinput Setxkbmap peut faire de Thier Travail: DISPLAY, XAUTHORITY, HOME, et un daskb_id Pour l'ID de mon Daskeyboard:

#!/bin/bash
sleep 1
DISPLAY=":0.0"
HOME=/home/rizumu/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME
daskb_id=`xinput -list | grep -i 'daskeyboard' | grep -o id=[0-9]. | grep -o [0-9]. | head -1`

xset r rate 200 30
setxkbmap -layout colemak
setxkbmap -option ctrl:nocaps
if [ "${daskb_id}" ]; then
    setxkbmap -device "${daskb_id}" -option altwin:swap_lalt_lwin
fi
16
Thomas Schreiber

Selon votre distro, vous pouvez déjà avoir une règle Udev pour les claviers dans /Lib/udev/roules.d/64-xorg-xkb.rules. Sur Ubuntu, ces importations/etc/par défaut/clavier, qui ont des options approximativement comme ceci:

XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

Pour ma configuration, j'ai constaté que cette règle intégrée exécutait après ma règle Udev personnalisée et remplace mes paramètres. Au lieu de cela, j'ai changé Xkboptions dans/etc/par défaut/clavier pour être:

XKBOPTIONS="-option ctrl:nocaps"

Pour obtenir le comportement "Caps Lock is Control", je voulais sur tous les claviers.

5
jsha

Cela ne fonctionne pas car udev et xmodmap n'a pas accès à votre affichage X11. En fait, udev _ ne sait même pas s'il y a sont Affichages actifs x11.

  • Remarque: Affiche, pluriel. Il ne peut pas Utilisez "L'écran" X11 car il peut y avoir plus d'un. Par exemple, si vous utilisez "commutation rapide d'utilisateur".
3
user1686

Si vous exécutez Gnome, vous devrez désactiver son plugin de gestion du clavier afin qu'il ne remplace pas vos modifications de mise en page.

gconftool-2 --toggle /apps/gnome_settings_daemon/plugins/keyboard/active

Exécutez à nouveau la même commande pour l'activer comme vous le souhaitez.

3

Qu'en est-il de la configuration x.org? De - Gentoo Wiki: x.org/input_drivers - udev :

Exemple: Si vous avez un clavier d'accès Logitech pour la partie française de Suisse, vous pouvez utiliser ce qui suit:

Fichier: /etc/x11/xorg.conf.d/10-keyboard.conf

Section "InputClass"
    Identifier             "evdev keyboard catchall"
    MatchIsKeyboard        "on"
    MatchDevicePath        "/dev/input/event*"
    Driver                 "evdev"
    Option                 "XkbModel" "logiaccess"
    Option                 "XkbLayout" "ch"
    Option                 "XkbVariant" "fr"
EndSection

Pour une explication approfondie, lisez:

man xorg.conf

et:

man evdev

Archwiki démontre à l'aide de la même syntaxe dans xorg.conf, mais note que "de nos jours, vous devez créer un fichier de configuration distinct, comme /etc/x11/xorg.conf.d/90 -keyboard-layouts.conf" . J'utilise arch et configuré mon propre clavier USB dans l'existant /etc/x11/xorg.conf.d/vim 10-evdev.conf a fonctionné pour moi.

@rizumu: Clever Kudge, merci pour le partage.

3
Casey Jones

Pour répondre à votre question sur l'accès à l'écran en cours d'exécution, vous pouvez exporter la variable d'affichage appropriée dans le script, en supposant que les autorisations pour l'affichage sont correctement définies. (man xset Pour les autorisations d'affichage.)

Dans de nombreux cas habituels, vous pouvez simplement export DISPLAY=:0 Pour la commande, car c'est le premier affichage sur un seul système utilisateur. Il est probablement plus facile d'exécuter un script plutôt que sur XModmap directement, car cela vous permettra d'avoir plus de contrôle sur les variables d'environnement et le reste. (Alors remplacer "/ usr/bin/xmodmap ~/.usbxmodmap" dans votre règle avec "/usr/local/bin/keyboard_plug.sh" et placez les commandes appropriées dans ce script avec la variable d'affichage.)

Comme indiqué ci-dessus, si vous supposez afficher =: 0, vous risquez de courir dans des problèmes plus tard si vous avez plusieurs utilisateurs ou des affichages. Vous pouvez écrire des scripts pour détecter l'affichage approprié, mais dans ce cas, vous êtes seul (en ce qui concerne cette réponse). :)

2
rust_and_moth

Puisque je ne pouvais pas obtenir les hacks pour faire fonctionner des règles Udev, j'ai écrit un petit Python Script en utilisant pyudev pour surveiller les événements de saisie.

#! /usr/bin/env python3

import pyudev
import time
import subprocess

ctx = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(ctx)
monitor.filter_by("input")

def defer_xmodmap():
    time.sleep(1) # not sure if there's a race here, but it feels like there could be.
    subprocess.run("xmodmap ~/dotfiles/.xmodmap", Shell=True)


for device in iter(monitor.poll, None):
    # there might be a way to add the action condition to the filter, but I couldn't find it
    if device.action != "add":
        continue

    # ensure the KB is initialized -- not sure if this is actually a needed check
    if not device.is_initialized:
        continue

    # my keyboard, from the output of `lsusb`
    if not "045E:07A5" in device.device_path:
        continue

    # it's the keyboard being added.
    defer_xmodmap()

J'utilise ensuite ce fichier SystemD utilisateur utilisateur pour le maintenir en cours d'exécution (systemctl --user enable name_of_service_file):

[Unit]
Description=udev xmodmap monitor

[Service]
ExecStart=/usr/bin/env python3 %h/local/bin/monitor_kb_udev
Restart=always
RestartSec=10

[Install]
WantedBy=default.target

La solution inotifywait de @ giosh94mhz est un peu plus simple et évite la dépendance sur pyudev. Cependant, pour une raison quelconque, j'ai trouvé que l'événement inotify n'était pas déclenché pendant 10 à 20 secondes après la connexion de mon clavier.

1
Ryan Marcus