SDL xim パッチ (c) 2004 wo * インターフェース enableUNICODE したあとの keysym.unicode を文字列にしたような使い方でいけるかと。 SDL_KEYDOWN が届くと、文字列がim_composeに入ってる。 SDL_SetIMPosition(int x,int y) を使うと変換中の文字列とかの位置を設定できる。 やってること、変更したとこ * SDL_keysym (SDL_keyboard.h) 変換された文字列を入れられるイベントがなかったので、 im_composeを付けたした。 文字列だったらsymっていう名前は変な感じがしないでもないけど、 そのへんはX11_TranslateKeyをいじるのが面倒だったので。 * seup_xim(SDL_x11video.c) XIM初期化処理の追加。 WMwindow (SDLはWindowManagerとかに使うウィンドウと描画に使うウィンドウを分けているような感じ。 理由はわからんけど。キーボードイベントを扱うのはWMwindowらしい。) を対象にする XICをつくる。 IMで変換されたあとの文字列を入れるバッファ(im_compose_buffer)をつくる。 * X11_DispatchEvent(SDL_x11events.c) IMにイベントが届くように、XFilterEventを通すようにした。 フォーカスを調整した。 * X11_TranslateKey(SDL_x11events.c) - X11のキーをSDLのキーに変換する部分 引数がDisplayだったんだけど、XICが欲しいので、引数をTHIS_にした。 あと、それに関連して変数名などを少々。 enableUNICODE していて、 XICが存在していたらIMから文字列を取得して、 keysym中のim_composeにその文字列の参照を入れておくような部分を追加。 このへんがまだよくわからん。 * SDL_PrivateKeyboard(SDL_keyboard.c) - キーリピートとかをなにかする IMから届いたKeyPressはKeyReleaseが飛んでこないので、SDL_KeyStateがおかしくなる。 んで、2回目以降のIMから届くKeyPressが無かったことにされてしまうので、 IMから飛んでくるキー(SDLK_UNKNOWN)がきたらSDL_KeyStateは更新しないように、ちょい強引に修正。 * SDL_SetIMPosition(SDL_event.c) - IMの位置を設定する あたらしく作った。 SDLでは、中でドライバの関数を呼び出す方法をとってるので、 ドライバの中にもSetIMPosition関数を追加。 これに対応した X11_SetIMPosition(SDL_x11event.c)を追加。 * configure.in enable_im_event 追加 これが設定されると、 ENABLE_IM_EVENT がCFLAGSに追加 →追加したら、autoconfとかが走ってパッチが大きくなってしまった。 なんとかする方法をわかる人教えてください… あとは、ヘッダファイルなんかを少々。 * 色々 文字コード(Unicodeがいい? Xutf8LookupString? Windows9xでは?) IMから届くイベントを別にする?しない? → イベントが飛んできたら、文字列を拾いに行かせるようにする? XIMではIMにある文字列の長さがわかんない(と思う)。 文字列長の制限(今は255文字)XIMが必要とする文字列の長さがわかんない。 取りこぼしてもわからない。(多分) → コールバックを使えばいける。面倒。 見た目とかフォントの指定。