USBキーボードをラップトップに接続するときにキーボード設定を自動的に変更し、決定的な動作を達成するにはどうすればよいですか?

USBキーボードをラップトップに接続するときにキーボード設定を自動的に変更し、決定的な動作を達成するにはどうすればよいですか?

私はLinux Mint 20を使用しています。 udevルールは私を不安にさせます。時には動作しますが、時には動作しません。

繰り返しますが、今日は働いていません。

私はいつもネットワークを介してコンテンツをコピーして調整し、最終的には動作する設定を得ましたが、数週間/月後に動作が停止することがわかりました。

一度に確実な解決策を得たいと思います。

  • 私が望むもの:キーボードをラップトップに接続すると、外部USBキーボード設定が自動的に変更されます(書き込むために大文字とCtrl + Lwinを置き換えます)。

  • 私がしたこと:

a) マイ USB キーボードデバイス情報を取得します。

# lsusb |grep Dell
Bus 001 Device 045: ID 413c:2107 Dell Computer Corp. 

b)私の/etc/udev/rules.d/90-keyboard_swapcaps.rulesに以下を追加しました。

## DEBUG
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", RUN+="/bin/sh -c 'echo == >> /tmp/udev-env.txt; env >> /tmp/udev-env.txt'"
# ACTUAL
ACTION=="change", ATTRS{idVendor}=="413c", ATTRS{idProduct}=="2107", ENV{XKBLAYOUT}="fr", ENV{XKBOPTIONS}+="ctrl:swapcaps", ENV{XKBOPTIONS}+="compose:lwin"

c) 次に、以下を実行した。

# udevadm control --reload-rules && udevadm trigger
  • 私が得るもの:

a) キーボード構成に変更はありません。

b) モニタリング

# udevadm monitor -u
...
UDEV  [10555.979594] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55 (input)
UDEV  [10555.989903] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV  [10555.992442] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54 (input)
UDEV  [10555.994812] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV  [10556.001225] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/hidraw/hidraw1 (hidraw)
UDEV  [10556.003513] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/input/input54/mouse1 (input)
UDEV  [10556.005834] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.1/1-1.1:1.0/0003:046D:C077.001D/hidraw/hidraw0 (hidraw)
UDEV  [10556.010005] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV  [10556.019614] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::numlock (leds)
UDEV  [10556.021307] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::scrolllock (leds)
UDEV  [10556.022045] add      /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/event20 (input)
UDEV  [10556.024438] change   /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E/input/input55/input55::capslock (leds)
UDEV  [10556.026259] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001E (hid)

これは、デバイスが検出され、正確であることを知らせます。

c) /tmp/udev-env.txt には次のような行がたくさんあります。

...
==
ID_FOR_SEAT=leds-pci-0000_00_14_0-usb-0_1_2_1_0
ACTION=change
TRIGGER=kbd-scrolllock
SEQNUM=17431
USEC_INITIALIZED=10059229961
TAGS=:seat:
XKBLAYOUT=fr
XKBOPTIONS=ctrl:swapcaps compose:lwin
DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:413C:2107.001C/input/input53/input53::scrolllock
SUBSYSTEM=leds
ID_PATH=pci-0000:00:14.0-usb-0:1.2:1.0
ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_2_1_0
PWD=/

これは、ルールが一致して適用されたことを示します。

キーボード構成を変更できないのはなぜですか?

答え1

環境変数は、子プロセスから親プロセスに伝播されるのではなく、親プロセスから子プロセスにのみ伝播されます。そして、udevルールで実行されるすべてのエントリは通常、GUIセッション環境にアクセスできません。

RUN+=あなたの場合、udevルールセクションで始まるシェルプロセスには、XKBLAYOUT必要な方法で設定された環境変数が必要です。XKBOPTIONSただし、RUN+=...コマンドが完了するとシェルが終了し、変更された環境変数は何の影響もなく消えます。

これらの環境変数は、その情報がsetxkbmapディストリビューションのX11セッション設定の標準部分として発生する可能性があるコマンドまたは同様のコマンドに渡される場合にのみ適用されます。 X11サーバーに値を渡さずに単に変数自体を設定することは、キーボードレイアウトには影響しません。

X11 セッションの設定は通常、GUI アプリケーションに合理的な環境を提供するために同様のシェル起動ファイルで提供されるため、これらの変数を次のように/etc/profile設定すれば十分です。/etc/profile.d/*.sh現れる働くただし、本当の魔法は変数にあるのではなく、setxkbmap -layout $XKBLAYOUT ...これらの変数またはそれに対応する値に基づいて実行されるX11セッション設定プロセスにあります。これはまったく提供されていないudevルールの一部です。

udev ルールの実行コンテキストは、GUI セッションの実行コンテキストとは完全に独立しています。したがって、これらの変数を使用してX11サーバーに変更を渡すコマンドを追加しても、udevルールによって開始されたシェルにはGUIセッションを参照する変数がsetxkbmapないため、コマンドは単にエラーメッセージを表示します。DISPLAYXAUTHORITYCannot open display

(変数要素DISPLAY~/.XauthorityXAUTHORITY

がっかりしています。ほぼこの問題をきれいに解決する機能です。/etc/udev/hwdb.d/70-keyboard.hwdb次の内容で名前付きファイルを作成できます。

evdev:input:b????v413Cp2107e*
  XKB_FIXED_LAYOUT="fr"
  # XKB_FIXED_OPTIONS="ctrl:swapcaps compose:lwin" # Unfortunately this part has not been implemented yet!

私が理解したように、X11キーボードのレイアウトを指定できます。この特定のキーボードでのみ利用可能、レイアウトが異なる他のキーボードがシステムに接続されていても同様です。申し訳ありません。指定されたセクションは許可されます。オプションXKBキーボードレイアウト仕様の一部(この部分があなたにとって重要な部分であるようです)は実装されていません。

関連情報