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 carpalx如果我在 bash 中键入它就可以工作,但它不会改变上面代码中的布局。所以我在 bash 中这样做了:

setxkbmap carpalx
xmodmap -pke > carpalx2

将上面的调用行更改为call(["xmodmap", "./carpalx2"]),现在脚本可以工作了。我有以下问题:

  1. 为什么 xmodmap 可以在代码中工作而 setxkbmap 不能,但两者都可以在 bash 中工作?
  2. 目前,每个 USB 事件都会调用 kbd_event,并且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 回答