2013-11-04 8 views
2

현재 키스톤 이벤트를 플랫폼에서 문자/이름으로 감지하고 해석 할 수 있도록 파이썬 프로젝트를 진행 중입니다. 저는 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 사이의 인터페이스에 관한 많은 기본 정보와 기술을 놓쳤을 것입니다. 그래서 저는 제 일반 교육에서 이러한 차이를 해결할 시간을 할애하고 있습니다. 누구든지 내 문제에 대한 통찰력이 있거나 관련 주제에 대한 연구를 수행해야하는 경우 듣고 싶습니다.

답변

1

python-xlib의 소스 코드를 보면 실제로 xlib를 사용하지 않고 있습니다. 이것은 Xlib 소켓 프로토콜의 pure-Python 구현입니다. event 개체는 rq 모듈 (또는 event 또는 다른 곳에서 정의 된 하위 클래스)에 정의 된 형식 중 하나를 래퍼로 사용하며 이는 struct.pack 방법을 알고있는 개체입니다.

가장 간단한 할 일은 값을 바이트 문자열에 압축 한 다음 ctypes.Structure으로 전송하는 것입니다.

그러나 ctypes 인 xlib는 사용자의 python-xlib과 완전히 독립적입니다. 특히, 다른 X 연결을 사용하게됩니다 (즉, 별도로 인증하고 설정을 반복해야 할 수도 있음). 그것은 아마도 모든 것을 한 방향으로 또는 다른 방향으로 수행하는 것이 훨씬 더 깔끔하고 믹스 앤 매치가 아닌 것입니다. libX11 source 다운로드


, 그것은 XLookupString이 프로토콜 기능이 아니라 모양이 아니라 클라이언트 측에서 적어도 부분적으로 실행 (파일 KeyBind.c에서) 래퍼. USE_OWN_COMPOSE이 정의되어 있지 않다면 XTranslateKey을 호출하여 keysym 결과를 얻은 다음 XTranslateKeySym을 호출하여 문자열 버퍼를 채 웁니다. 이러한 함수는 대부분 로컬 함수입니다. 그러나 그들은 궁극적으로 XKeyInitialize이라고 부르며 적어도 하나의 서버 측 함수 인 XGetKeyboardMapping을 호출합니다. 이는 python-xlib 을 지원합니다.

즉, ctypes을 통해 별도의 Xlib 인스턴스를 사용하면 두 연결이 동일한 설정을 가질 수 없다면 올바른 키보드 매핑을 얻지 못할 수도 있습니다.

이는 또한 XLookupString의 기능을 얻으려면 해당 로컬 C 코드를 모두 이식해야 할 수도 있음을 의미합니다.

+0

감사합니다. 파이썬 -xlib와 커스텀 ctypes 호출을 섞어서 매치하지 않는 것에 대한 좋은 지적을했다고 생각합니다. 저는 현재 python-xlib의 프로토콜을 소화하려고합니다. 내가 올바르게 이해하면, 요청은 바이너리로 압축되고 소켓을 통해 X 서버로 전달되며, 선택적으로 서버로부터 응답을받습니다. OpCodes가 서버의 데이터 처리를 제어하고 XLookupString이 핵심 프로토콜이 아니기 때문에 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) 그러나 나는 아직도 그것에 대해 어둠 속에있다. 나는 그 밑에있는 소스 코드를 찾고있다. 파이썬에서 클라이언트 측 데이터 만 필요하면 다시 구현할 수 있습니다. – user1467345