현재 키스톤 이벤트를 플랫폼에서 문자/이름으로 감지하고 해석 할 수 있도록 파이썬 프로젝트를 진행 중입니다. 저는 X11에 대한 지원을 제공하기 위해 python-xlib를 사용 해왔지만 키 이벤트의 키 코드를 적절한 keysym으로 변환하는 과정에서 최근 어려움에 처했습니다. 키 코드를 파이썬에서 가져옴
내 코드의 스냅 샷
은 여기에 있습니다 : https://gist.github.com/SavinaRoja/7306962는문제는 내가 키 이벤트에 대한 이벤트 데이터를 검색 할 수 오전 PyKeyboardEvent 클래스의 사용에 특히 발생하지만, keysyms 자신의 키 코드를 해석하지. Xlib.display의 keycode_to_keysym 함수가 제대로 작동하지 않습니다.
x11에 대한 내용을 읽고 xev 유틸리티 소스 코드에서 확인한 결과 적절한 Xlib 함수가 XLookupString 인 것으로 보입니다. 이 함수를 사용하는 것이 C 언어로만 코딩되었지만 (현재는 배우기 시작한 것입니다), 간단하지만 파이썬에서 함수를 사용하는 것에 관해서는 현재 부족합니다. 나는 두 가지 옵션을 고려했다 : 나는 XLookupString을 호출하기 위해 python-xlib의 프로토콜을 활용하고 확장하려고 시도 할 수도 있고, 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가 이벤트 인스턴스로 구문 분석 한)에서받은 데이터를 해석하여 해당 구조체에 해석하는 기능. 나는이 의심에서 맞습니까? 그렇다면 어떤 도구를 배워야합니까?
이 시점에서 저는 파이썬과 C 사이의 인터페이스에 관한 많은 기본 정보와 기술을 놓쳤을 것입니다. 그래서 저는 제 일반 교육에서 이러한 차이를 해결할 시간을 할애하고 있습니다. 누구든지 내 문제에 대한 통찰력이 있거나 관련 주제에 대한 연구를 수행해야하는 경우 듣고 싶습니다.
감사합니다. 파이썬 -xlib와 커스텀 ctypes 호출을 섞어서 매치하지 않는 것에 대한 좋은 지적을했다고 생각합니다. 저는 현재 python-xlib의 프로토콜을 소화하려고합니다. 내가 올바르게 이해하면, 요청은 바이너리로 압축되고 소켓을 통해 X 서버로 전달되며, 선택적으로 서버로부터 응답을받습니다. OpCodes가 서버의 데이터 처리를 제어하고 XLookupString이 핵심 프로토콜이 아니기 때문에 XLookupString을이 프레임 워크에서 사용할 수 없을 수도 있습니다. http://www.x.org/wiki/Development/Documentation/Protocol/OpCodes/ – user1467345
@ user1467345 : 내 xlib은 녹슨 녹슨 이상이므로 기억이 안납니다.하지만 ... XLookupString은 확장 프로토콜을 사용하거나 네트워크 호출이 전혀없고 하드 코딩 된 클라이언트 측 데이터 만 사용하기 때문에? – abarnert
나는 [Xutil.h] (http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/precise/libx11/precise/view/head:/include/X11/Xutil)에서 정의를 찾을 수있었습니다. .h) 그러나 나는 아직도 그것에 대해 어둠 속에있다. 나는 그 밑에있는 소스 코드를 찾고있다. 파이썬에서 클라이언트 측 데이터 만 필요하면 다시 구현할 수 있습니다. – user1467345