2013-11-04 63 views
2

我目前正在开发一个python项目,以便能够跨平台检测和解释按键事件作为字符/名称。我一直在使用python-xlib来为X11提供支持,但最近在将键盘事件的键码转换为适当的键名的过程中遇到了困难。从python密钥中获取keysym

我的代码快照是在这里: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) 

我怀疑什么,我缺少的是对事件类蟒蛇,Xlib中转化为适当的能力用于XLookupString的C结构,或者将从X服务器接收到的数据(python-xlib解析为事件实例)解释为这样的结构的能力。我的猜疑是否正确?如果是这样,我需要学习什么工具?

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

回答

1

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

最简单要做的事情可能是将值打包到字节字符串中,然后将其转换为ctypes.Structure

但是请注意,​​将xlib将完全独立于您的python-xlib;特别是,您将使用不同的X连接(这意味着您可能需要单独授权,重复任何设置等)。这样做可能会更清洁一些,而不是混合搭配。


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

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

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

+0

谢谢。我认为你对不混合和匹配python-xlib和自定义ctypes调用非常有用;我目前正在尝试消化python-xlib的协议。如果我理解正确,请求打包为二进制文件并通过套接字传递给X服务器,可选地接收来自服务器的响应。我担心在此框架中XLookupString可能不可用,因为OpCodes似乎控制服务器对数据的处理,而XLookupString不是核心协议。 http://www.x.org/wiki/Development/Documentation/Protocol/OpCodes/ – user1467345

+0

@ user1467345:我的xlib不仅有点生疏,所以我不记得了,但是...因为XLookupString是扩展协议,还是因为它根本不是网络调用,而只是使用硬编码的客户端数据? – abarnert

+0

我已经能够在[Xutil.h]中找到它的定义(http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/precise/libx11/precise/view/head:/include/X11/Xutil .h)但我仍然对这件事情一无所知。我正在寻找它的底层源代码;如果仅需要客户端数据,则可以在python中重新实现它。 – user1467345