使用pyudev设置键盘布局

时间:2012-05-02 08:49:18

标签: python linux bash xinput xmodmap

我编写了这个脚本来自动更改插件上的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()
如果我在bash中键入它,

setxkbmap carpalx可以正常工作,但它不会改变上面代码中的布局。所以我在bash中这样做了:

setxkbmap carpalx
xmodmap -pke > carpalx2

将上述调用行更改为call(["xmodmap", "./carpalx2"]),现在该脚本正常运行。我有以下问题:

  1. 为什么xmodmap在代码中工作而setxkbmap没有,但两者都在bash中工作?
  2. 目前,为每个usb事件调用kbd_event,并为我插入的每个usb设备运行call(["xmodmap", "./carpalx2"])。如何进一步过滤事件,以便仅在插入键盘时更改布局?
  3. 使用我当前的代码,每次插入鼠标时键盘布局都会改变:)

1 个答案:

答案 0 :(得分:1)

您可以通过检查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可能打印的任何错误消息。