2

我目前正在开发一个 python 项目,以实现跨平台将关键事件检测和解释为字符/名称。我一直在使用 python-xlib 为 X11 提供支持,但最近在将键事件的键码转换为相应的键符的过程中遇到了困难。

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

问题特别出现在 PyKeyboardEvent 类的使用中,我能够在其中检索键事件的事件数据,但不能将它们的键码解释为键符。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 之间接口的基本信息和技能,所以我花时间在我的通识教育中弥补这个差距。如果有人具体了解我的问题或我应该如何对相关主题进行研究,我很想听听。

4

1 回答 1

1

如果您查看 python-xlib 的源代码,它实际上根本没有使用 xlib;它是 Xlib 套接字协议的纯 Python 实现。您event的对象是rq模块中定义的类型之一的包装器(或在event或其他地方定义的子类),它是一个知道如何处理struct.pack自身的对象。

简单的做法可能是将值打包成一个字节字符串,然后将其转换为ctypes.Structure.

但请注意,xlibctypes将完全独立于您的python-xlib; 特别是,您将使用不同的 X 连接(这意味着您可能必须单独进行身份验证、重复任何设置等)。以一种或另一种方式做所有事情,而不是混搭,可能会更干净。


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

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

这也意味着您可能必须移植所有本地 C 代码才能获得XLookupString.

于 2013-11-04T19:41:45.963 回答