Próbuję załadować nowy układ klawiatury po podłączeniu klawiatury USB, ale moja reguła udev nie działa.
SUBSYSTEM == „input”, ATTR {idVendor} == „062a”, ATTR {idProduct} == „0201”, GOTO = „usb_xmodmap_auto” LABEL = "usb_xmodmap_auto" ACTION == "add", RUN + = "/ usr / bin / xmodmap ~ / .usbXmodmap" AKCJA == "usuń", RUN + = "/ usr / bin / xmodmap ~ / .pndXmodmap"
Ponownie załadowałem zasady, używając:
> sudo udevadm control --reload-rules
i poprzez ponowne uruchomienie systemu, ale po podłączeniu klawiatury USB oryginalna xmodmap jest nadal ładowana, a zatem układ klawiatury jest nieprawidłowy, ale jeśli uruchomię polecenie w terminalu
> / usr / bin / xmodmap ~ / .usbXmodmaplub
> / usr / bin / xmodmap ~ / .pndXmodmap
działają dobrze.
Mam nadzieję, że ktoś może pomóc.
Edytować:
tylko po to, żeby bardziej pomóc, przeprowadziłem kilka testów udevadm:
> test udevadm --action = add /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
wyjścia:
polecenie_ruchomienia: wywołanie: test udevadm_test: wersja 151 Ten program służy wyłącznie do debugowania, nie uruchamia żadnego programu, określone za pomocą przycisku RUN. Może wyświetlać nieprawidłowe wyniki, ponieważ niektóre wartości mogą się różnić lub mogą być niedostępne podczas przebiegu symulacji. [...] plik_parse: czytanie „/etc/udev/rules.d/usb-keyboard.rules” jako pliku reguł udev_rules_new: reguły używają tokenów 100572 bajtów (8381 * 12 bajtów), bufor 21523 bajtów udev_rules_new: używany indeks tymczasowy 35380 bajtów (1769 * 20 bajtów) udev_device_new_from_syspath: urządzenie 0x3b4d8 ma devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10' udev_rules_apply_to_event: RUN '/ sbin / modprobe -b $ env {MODALIAS}' /etc/udev/rules.d/80-drivers.rules:5 udev_rules_apply_to_event: gniazdo RUN: @ / org / freedesktop / hal / udev_event '/etc/udev/rules.d/90-hal.rules:2 udev_rules_apply_to_event: RUN '/ sbin / modprobe $ env {MODALIAS}' /etc/udev/rules.d/local.rules:31 udev_rules_apply_to_event: gniazdo RUN: / org / kernel / udev / monitor '/etc/udev/rules.d/run.rules:2 udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .usbXmodmap' /etc/udev/rules.d/usb-keyboard.rules:4 udevadm_test: UDEV_LOG = 6 udevadm_test: DEVPATH = / devices / platform / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / input / input10 udevadm_test: PRODUCT = 3 / 62a / 201/110 udevadm_test: NAME = "Klawiatura zgodna z 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 udevadm_test: REL == 143 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = dane wejściowe: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,87,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, 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,182,185,18C, 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 = add udevadm_test: SUBSYSTEM = wejście udevadm_test: run: '/ sbin / modprobe -b input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,73,78,89 , 8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, AE, B1 , B2, B5, CE, CF, D0, D1, D2, D5, D9, DB, E2, EA, EB, 100,101,105,106,107,107,108,109,10A, 10B, 10C, 162,166,16A, 16E, 178,179,17A, 17B, 17C, 17D , 17F, 180,181,182,185,18C, 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: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: '/ sbin / modprobe input: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,77,7,80,82,8A , 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, 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,182,185,18C, 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: run: 'socket: / org / kernel / udev / monitor' udevadm_test: run: '/ usr / bin / xmodmap ~ / .usbXmodmap'
i
> test udevadm --action = usuń /devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10
wyjścia:
polecenie_ruchomienia: wywołanie: test udevadm_test: wersja 151 Ten program służy wyłącznie do debugowania, nie uruchamia żadnego programu, określone za pomocą przycisku RUN. Może wyświetlać nieprawidłowe wyniki, ponieważ niektóre wartości mogą się różnić lub mogą być niedostępne podczas przebiegu symulacji. [...] plik_parse: czytanie „/etc/udev/rules.d/usb-keyboard.rules” jako pliku reguł udev_rules_new: reguły używają tokenów 100572 bajtów (8381 * 12 bajtów), bufor 21523 bajtów udev_rules_new: używany indeks tymczasowy 35380 bajtów (1769 * 20 bajtów) udev_device_new_from_syspath: urządzenie 0x3b4d8 ma devpath '/devices/platform/ehci-omap.0/usb1/1-2/1-2.3/1-2.3:1.1/input/input10' udev_rules_apply_to_event: gniazdo RUN: @ / org / freedesktop / hal / udev_event '/etc/udev/rules.d/90-hal.rules:2 udev_rules_apply_to_event: gniazdo RUN: / org / kernel / udev / monitor '/etc/udev/rules.d/run.rules:2 udev_rules_apply_to_event: RUN '/ usr / bin / xmodmap ~ / .pndXmodmap' /etc/udev/rules.d/usb-keyboard.rules:5 udevadm_test: UDEV_LOG = 6 udevadm_test: DEVPATH = / devices / platform / ehci-omap.0 / usb1 / 1-2 / 1-2.3 / 1-2.3: 1.1 / input / input10 udevadm_test: PRODUCT = 3 / 62a / 201/110 udevadm_test: NAME = "Klawiatura zgodna z 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 udevadm_test: REL == 143 udevadm_test: ABS == 1 0 udevadm_test: MSC == 10 udevadm_test: MODALIAS = dane wejściowe: b0003v062Ap0201e0110-e0,1,2,3,4, k71,72,73,74,77,80,82,83,85,86,87,89,8A, 8B, 8C, 8E, 8F, 90,96,98,9B, 9C, 9E, 9F, A1, A3, A4, A5, A6, A7, A8, A9, AB, AC, AD, 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,182,185,18C, 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 = usuń udevadm_test: SUBSYSTEM = wejście udevadm_test: run: 'socket: @ / org / freedesktop / hal / udev_event' udevadm_test: run: 'socket: / org / kernel / udev / monitor' udevadm_test: run: '/ usr / bin / xmodmap ~ / .pndXmodmap'
co wydaje się wskazywać, że powinno działać, ale nie ma nadziei, że to pomoże uzyskać odpowiedź.
Odpowiedzi:
Znalazłem sposób na obejście tego, choć jest to trochę zuchwałe.
Doszedłem do tego samego dokładnego punktu dzisiaj, próbując skonfigurować dwie klawiatury z udev, setxkbmap i xinput --list i aby mogły one pracować z hotplugowaniem USB. Zamieniam klawisze, nie zmieniam układu, ale wszystko jest takie samo, gdy już zidentyfikujesz klawiaturę na hotplug i możesz warunkowo wywołać setxkbmap, powinieneś być w stanie ustawić język tylko klawiatury, którą określiłeś . Lista układów klawiatury znajduje się tutaj
ls -l /usr/share/kbd/keymaps/i386/
i możesz znaleźć nazwę swojego urządzeniaxinput -list
.rizumu
swoją nazwę użytkownika, ponieważ okazało się, że nie można tego zrobić bez wyraźnego określenia.your
nazwie klawiatury.lsusb
do wykrywania identyfikatora sprzętu, który należy ustawić w regule udev. Moja klawiatura das wygląda takBus 002 Device 009: ID 04d9:2013 Holtek Semiconductor, Inc.
Najpierw skonfigurowałem regułę udev do automatycznego wykrywania klawiatury, tworząc regułę udev:
W pliku
/etc/udev/rules.d/00-usb-keyboards.rules
:Mam dwa pliki ~ / bin / kbd i ~ / bin / kbd_udev. Upewnij się, że mają odpowiednie uprawnienia
chmod 755 ~/bin/kbd*
~/bin/kbd_udev
Skrypt zawiera:Zauważysz, że wystarczy zadzwonić
~/bin/kbd
w tle, aby udev mógł zakończyć proces i aktywować klawiaturę. Wewnątrz~/bin/kbd
skryptu śpimy przez sekundę, ponieważ musimy poczekać, aż klawiatura zostanie aktywowana, abyśmy mogli uzyskać identyfikator urządzenia za pomocą xinput. Aby to mam ustawić kilka zmiennych achive i wywoził je tak xinput setxkbmap może nie thier pracy:DISPLAY
,XAUTHORITY
,HOME
, i jedendaskb_id
dla mojego daskeyboard ID:źródło
notify-send "USB Keyboard is plugged in and ready for use now." -i gtk-dialog-info -t 1000 -u normal
.). Ponieważ niewiele wiem o skryptach, próbowałem wstawić go przed „fi” lub po nim, ale w obu przypadkach komunikat powiadomienia pojawiał się w kółko :-(OWNER
dla tego urządzenia?xset r rate 200 30
linia?xset
nie jest dostępny w mojej instalacji Ubuntu 17.04.xmodmap $HOME/.Xmodmap
skryptu analogicznego do twojego „/ home / rizumu / bin / kbd”. Dlaczego miałoby to być?W zależności od dystrybucji możesz już mieć regułę udev dla klawiatur w /lib/udev/rules.d/64-xorg-xkb.rules. W Ubuntu importuje / etc / default / keyboard, który ma opcje mniej więcej takie:
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
Dla mojej konfiguracji odkryłem, że ta wbudowana reguła działała po mojej niestandardowej regule udev i zastępowała moje ustawienia. Zamiast tego zmieniłem XKBOPTIONS w / etc / default / keyboard na:
XKBOPTIONS="-option ctrl:nocaps"
Aby uzyskać zachowanie „Caps Lock is Control”, chciałem na wszystkich klawiaturach.
źródło
XBKOPTIONS="ctrl:nocaps"
Jeśli korzystasz z GNOME, musisz wyłączyć wtyczkę do zarządzania klawiaturą, aby nie zastępowała zmian w układzie.
Ponownie uruchom to samo polecenie, aby włączyć je zgodnie z potrzebami.
źródło
dconf
poniżej/org/gnome/settings-daemon/plugins/keyboard/active
.gsettings set org.gnome.settings-daemon.plugins.keyboard active false
To nie działa, bo
udev
ixmodmap
nie ma dostępu do wyświetlacza X11. W rzeczywistościudev
nawet nie wie, czy są aktywne wyświetlacze X11.źródło
Co z konfiguracją X.Org? Z Gentoo Wiki: X.Org/Input_drivers - udev :
ArchWiki demonstruje użycie tej samej składni w xorg.conf, ale zauważa, że „w dzisiejszych czasach powinieneś utworzyć osobny plik konfiguracyjny, taki jak /etc/X11/xorg.conf.d/90-keyboard-layouts.conf”. Korzystam z Arch i skonfigurowałem własną klawiaturę USB w istniejącym pliku /etc/X11/xorg.conf.d/vim 10-evdev.conf. Pracowałem dla mnie.
@rizumu: Clever kludge, dzięki za udostępnienie.
źródło
Aby odpowiedzieć na pytanie dotyczące dostępu do działającego ekranu, możesz wyeksportować odpowiednią zmienną DISPLAY w skrypcie, zakładając, że uprawnienia do wyświetlania są poprawnie ustawione. (w
man xset
przypadku uprawnień do wyświetlania).W wielu zwykłych przypadkach możesz po prostu użyć
export DISPLAY=:0
polecenia, ponieważ jest to pierwszy ekran w systemie jednego użytkownika. Prawdopodobnie najłatwiej jest uruchomić skrypt bezpośrednio niż xmodmap, ponieważ pozwoli ci to mieć większą kontrolę nad zmiennymi środowiskowymi i resztą. (Więc zamień „/ usr / bin / xmodmap ~ / .usbXmodmap” w swojej regule na „/usr/local/bin/keyboard_plug.sh” i umieść odpowiednie polecenia w tym skrypcie wraz ze zmienną DISPLAY.)Jak wspomniano powyżej, jednak jeśli przyjmiesz DISPLAY =: 0, możesz później napotkać problemy, jeśli masz wielu użytkowników lub wyświetlaczy. Możesz pisać skrypty, aby wykryć odpowiedni ekran, ale w takim przypadku jesteś sam (o ile dotyczy to odpowiedzi). :)
źródło
Myślę, że znalazłem o wiele czystszy sposób na skonfigurowanie tego, który nie wymaga specjalnego hakowania X11.
Pomysł polega na tym, że
udev
wykryje tylko nowe wprowadzanie z klawiatury i utworzy dowiązanie symboliczne dla każdego układu, a następnieinotify
będzie szukał nowego układu w przestrzeni użytkownika.zasady udev
Zgodnie z tymi regułami mam katalog w dev (
/dev/input/by-layout
) do obserwowania zmian w skryptach przestrzeni użytkownika.Skrypt przestrzeni użytkownika dla KDE
Na przykład podczas korzystania z KDE mam uruchomiony ten skrypt (automatyczny):
Dla mnie to działa jak urok. Aby zmienić układ systemu (którego nie potrzebuję teraz), podobny skrypt, którego
loadkeys
można użyć, można zdemonizować za pomocą systemowego skryptu inicjującego.źródło
inotifywait
uruchomić skrypt instalacyjny przy każdej zmianie/dev/input
, ponieważ sam skrypt jest idempotentny.Ponieważ nie mogłem zmusić hacków do działania reguł udev, napisałem mały skrypt Pythona, który używa
pyudev
do monitorowania zdarzeń wejściowych.Następnie używam tego pliku systemowej jednostki użytkownika, aby utrzymać go w działaniu (
systemctl --user enable name_of_service_file
):inotifywait
Rozwiązanie z @ giosh94mhz jest trochę prostsza, a unika się zależnośćpyudev
. Jednak z jakiegoś powodu zauważyłem, żeinotify
zdarzenie nie było uruchamiane przez 10-20 sekund po podłączeniu klawiatury.źródło