2

私は現在、主要なイベントをプラットフォーム間で文字/名前として検出および解釈できるようにするための python プロジェクトに取り組んでいます。X11 のサポートを提供するために python-xlib を使用していますが、最近、キー イベントのキーコードを適切なキーシムに変換するプロセスで問題が発生しました。

私のコードのスナップショットはこちら: https://gist.github.com/SavinaRoja/7306962

問題は、特に PyKeyboardEvent クラスの使用で発生します。このクラスでは、キー イベントのイベント データを取得できますが、それらのキーコードをキーシムに解釈することはできません。Xlib.display の keycode_to_keysym 関数が適切に動作しません。

X11 について読んで、xev ユーティリティのソース コードで確認したところ、使用する適切な Xlib 関数は XLookupString のようです。この関数を使用して C (学習し始めたばかりの言語) でコーディングするのは簡単ですが、現在、python から関数を使用することに関して困惑しています。私は 2 つの選択肢を検討しました。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で定義されたタイプの1つ(または、または他の場所で定義されたサブクラス)のラッパーであり、それ自体の方法を知っているオブジェクトです。rqeventstruct.pack

最も簡単な方法は、おそらく値をバイト文字列にパックしてから、ctypes.Structure.

ただし、xlibctypesは完全に独立していることに注意してくださいpython-xlib。特に、別の X 接続を使用することになります (つまり、個別に認証したり、セットアップを繰り返したりする必要があるかもしれません)。すべてを混ぜ合わせるのではなく、どちらか一方の方法で行う方が、おそらくはるかにクリーンです。


libX11ソースXLookupStringをダウンロードすると、プロトコル関数ではなくKeyBind.c、クライアント側で少なくとも部分的に実行されるラッパー (ファイル内)のように見えます。USE_OWN_COMPOSEが定義されていないと仮定すると、効果的に呼び出して結果XTranslateKeyを取得しkeysym、次に呼び出しXTranslateKeySymて文字列バッファーを埋めます。これらの関数自体はほとんどがローカル関数です。しかし、それらは最終的XKeyInitializeに を呼び出します。これは、少なくとも 1 つのサーバー側関数を呼び出します— これはXGetKeyboardMappingpython-xlibサポートしています。

これは、2 つの接続の設定が同じであることを確認できない限り、個別のXlibインスタンスを使用しても、ctypes必ずしも正しいキーボード マッピングが得られるとは限らないことを意味します。

これは、 の機能を得るために、そのローカル C コードをすべて移植する必要があることも意味しますXLookupString

于 2013-11-04T19:41:45.963 に答える