0

プラグインでUSBキーボードのレイアウトを自動的に変更するためにこのスクリプトを書きました

import pyudev                                                                   
from subprocess import call

monitor = pyudev.Monitor.from_netlink(pyudev.Context())
monitor.filter_by('usb')

def kbd_event(action, device):
    if action == 'add':
        call(["setxkbmap", "carpalx"])

observer = pyudev.MonitorObserver(monitor, kbd_event)
observer.start()

setxkbmap carpalxbashで入力すると機能しますが、上記のコードのレイアウトは変更されません。だから私はbashでこれをしました:

setxkbmap carpalx
xmodmap -pke > carpalx2

上記の呼び出し行をに変更しcall(["xmodmap", "./carpalx2"])、スクリプトが機能するようになりました。次の問題があります。

  1. コードで xmodmap が機能し、setxkbmap が機能しないのに、bash では両方が機能するのはなぜですか?
  2. 現在、kbd_event はすべての USB イベントに対して呼び出され、call(["xmodmap", "./carpalx2"])プラグインするすべての USB デバイスに対して実行されます。キーボードを挿入したときにのみレイアウトが変更されるように、イベントをさらにフィルタリングするにはどうすればよいですか?

現在のコードでは、マウスを接続するたびにキーボード レイアウトが変更されます :)

4

1 に答える 1

2

ID_INPUT_KEYBOARD次のプロパティをチェックして、キーボードをフィルタリングできます。

if action == 'add' and device['ID_INPUT_KEYBOARD'] == '1':
    print('a keyboard was added')

直接呼び出す場合とスクリプトを使用する場合の違いについてはsetxkbmap、X サーバーもキーボードを初期化するのに時間がかかると思います。UDev は、キーボードが udev 処理を完了するとすぐにコールバックを呼び出しますが、これは X11 サーバーが新しいキーボードを構成および初期化する前に簡単に実行できます。

X.org ログと、出力される可能性のあるエラー メッセージを確認しsetxkbmapます。

于 2012-05-23T20:45:05.030 に答える