root-window, off-the-spot, over-the-spot, on-the-spot

で,「nicolatter でその場入力・その場変換ができない」という問題について.

この問題が発生しているのはどうも gtk+ アプリだけのようである. kterm や XEmacs などの非 gtk+ アプリではその場入力・その場変換できている. また,kinput2 では gtk+ アプリでもその場入力・その場変換できている.

というわけで,手元の本で XIM の入力方法について調べてみる. X11R5 が出始めた時代の本なので,内容は古くなってると思うが,基本的なところはそれほど変わっていないだろう.

root-window
クライアントウィンドウの外に XIM 入力ウィンドウ
off-the-spot
クライアントウィンドウの隅に XIM 入力ウィンドウ
over-the-spot
クライアントウィンドウの入力ウィンドウの上に XIM 入力ウィンドウ
on-the-spot
クライアント側で入力を制御・表示

一口に「その場入力・その場変換」と言っても over-the-spot と on-the-spot の2通りのメソッド(?)が存在する. nicolatter で kterm や XEmacs での入力では,テキスト入力ウィンドウと変換ウィンドウのフォントが違っているので,おそらく over-the-spot なのであろう.

kinput2 では,それらしきライブラリがリンクされていないにも関わらずアンチエイリアジングフォントで表示されている. つまり,on-the-spot 入力になっているものと思われる.

一方,nicolatter では,off-the-spot 入力になってしまっている.

つまり,状況としては

  • kinput2 では on-the-spot 入力をサポートしているようだ
  • が,nicolatter では on-the-spot 入力はできないらしい

かつ

  • gtk+ が on-the-spot 入力をサポートしていて
  • かつ,over-the-spot 入力をサポートしていない
    もしくは off-the-spot よりも消極的な選択肢である

というところなのかなぁ.

親指シフト,動作せり

親指シフトキーボードでローマ字入力というのも悲しいので,nicolatter のソースコードと kinput2 のソースコードを追っかける.

jserver との接続の部分を見比べてみると,両者をには特に大きな違いはない. nicolatter のほうが jl_open_lang() を使っていて,kinput2 は jl_open() を使っているが,結局はヘッダのマクロで吸収されているので同じことなのである.

最初は C++ と C ライブラリの API ミスマッチかと思ったが,そういうわけではないようである. 試しに C で同様のプログラムをちょろっと書いてみて動かしてみたところ,nicolatter と同様,jserver に接続できない状態.

で,「ポート番号が狂ってるのかな」と kinput2 が動いている状態でおもむろに netstat を取ってみると…

こいつ,UNIX ドメインソケットで動いてるではないかい

引数に -jserver localhost って書いたのに. kinput2 のうそつき.

というわけで,nicolatter のほうも強引に UNIX ドメインソケットで接続するよう,jl_open_lang() の引数をいじると… 無事動作しました.

けど,オンザスポット,というか,その場変換できないんだよなぁ. あと,文節調整のキープレス・リリースがクライアント側に伝わってたりして,まだなんか妙. まぁ,今日のところは「とりあえず動いた」ということでよしとしよう.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2004-05-09 (日) 13:07:50 (7315d)