从python中的keycode获取keysym

时间:2013-11-04 19:02:08

标签: python c x11 xlib keycode

我目前正在开发一个python项目,以便将关键事件的检测和解释作为跨平台的字符/名称。我一直在使用python-xlib来提供对X11的支持,但是我最近在将关键事件的密钥代码转换为适当的密钥时遇到了困难。

我的代码快照在这里:https://gist.github.com/SavinaRoja/7306962

在使用PyKeyboardEvent类时出现了麻烦,我可以在其中检索关键事件的事件数据,但不能将其键码解释为keysyms。 Xlib.display的keycode_to_keysym函数无法正常工作。

在阅读有关X11并且由xev实用程序源代码确认时,似乎要使用的适当Xlib函数是XLookupString。如果我用C语言编写(一种我刚开始学习的语言),使用这个函数会很简单,但是我目前在使用python函数时遇到了困难。我考虑了两个选项:我可能会尝试利用和扩展python-xlib的协议来调用XLookupString,或者我可能会尝试使用ctypes来调用XLookupString。我的代码包括对后者的尝试(不起作用,但显示我目前所处的位置):

from ctypes import *
XLookupString = cdll.LoadLibrary('libX11.so').XLookupString

char_buffer = create_string_buffer(257)
keysym = c_int()  # the important value
count = XLookupString(byref(event),  # TypeError, not a ctypes instance
                      byref(char_buffer),
                      len(char_buffer),
                      keysym,
                      None)

我怀疑我缺少的是能够将事件类从python-xlib转换为XLookupString的适当C结构,或者能够解释从X服务器接收的数据(python-xlib解析为事件实例)到这样的结构中。我怀疑这是正确的吗?如果是这样,我需要学习哪些工具?

此时我可能遗漏了很多关于python和C之间接口的基本信息和技巧,所以我花时间在我的普通教育中修复这个差距。如果有人明确了解我的问题,或者我应该如何对相关主题进行研究,我很乐意听到。

1 个答案:

答案 0 :(得分:1)

如果你看一下python-xlib的源代码,它实际上根本就不使用xlib;它是Xlib套接字协议的纯Python实现。你event对象是rq模块(或event或其他地方定义的子类)中定义的一种类型的包装器,它是一个知道如何{{1本身。

最简单的要做的事情可能是将值打包成字节字符串,然后将其转换为struct.pack

但请注意ctypes.Structure完全独立于ctypes的xlib;特别是,您将使用不同的X连接(这意味着您可能需要单独授权,重复任何设置等)。以某种方式完成所有事情可能会更加清晰,而不是混合搭配。


下载libX11 source,看起来python-xlib不是协议函数,而是一个至少部分在客户端运行的包装器(在文件XLookupString中)。假设未定义KeyBind.c,它会有效地调用USE_OWN_COMPOSE来获取XTranslateKey结果,然后调用keysym来填充字符串缓冲区。这些功能本身大多是本地功能。但是他们最终调用XTranslateKeySym,它调用至少一个服务器端函数XKeyInitialize - python-xlib 支持

这意味着使用单独的XGetKeyboardMapping实例到Xlib并不一定能获得正确的键盘映射,除非您可以确保两个连接具有相同的设置。

这也意味着您可能必须移植所有本地C代码才能获得ctypes的功能。