XIMレシーバは、On-The-Root、Over-The-Spotスタイルにおいて、XIMサーバに代わって前編集文字列などをユーザに提示するものです。

XIMサーバと分離した理由

当時On-The-Spotスタイルに対応するしっかりしたXIMサーバを利用できなかったことがきっかけとなり、自分でXIMサーバを実装することになりました。

初期の目標はOn-The-Spotスタイルだけを提供するXIMサーバを実装することでした。On-The-SpotスタイルではXIMクライアントが前編集中の文字列や変換結果などを描画するので、当初の実装ではXIMサーバが自前でそれらを描画する必要がありませんでした。そのため、XIMサーバのイベント処理の構造などは比較的簡単なものでした。

「候補一覧」や「状態(StatusAreaの対応)」をXIMサーバが描画するように実装しているときに、次のような問題に遭遇しました。

  • 候補一覧ウィンドウの外観と、XIMクライアントの外観との調和: 外観を変更するためにはXIMサーバ自身を変更する必要がある。
  • 候補一覧ウィンドウや状態ウィンドウに関する(再描画や破壊などの)イベント管理: ソースコードが複雑になり、同期に関するバグが発生しやすい。

将来的にXIMサーバをOn-The-Root、Over-The-Spotスタイルに対応させる場合、このままではイベント処理周辺の実装が煩雑になることを懸念しました。また、外観をハードコーディングして固定することは、カスタマイズという点でも望ましくありません。そこで、描画(ルックアンドフィール)に関する部分を別のモジュール(XIMレシーバ)にするという方針を採用することにしました。

この方針により、XIMサーバ自身は描画せず、その代わりに表示して欲しい文字列をXIMレシーバに送信して、XIMレシーバが描画を代行するようになります。

(注: 現在でも候補一覧ウィンドウと、XIMStatusAreaスタイルにおける状態表示ウィンドウについてはXIMサーバ側で描画していますが、そのためにイベント処理が複雑になっています。)

利点

XIMサーバから表示部分を分離したことにより、次の利点が得られました。

  • XIMサーバ、XIMレシーバの両方とも構造が簡単になる。
  • ユーザは自分の好みにあう外観をもつXIMレシーバを選べる。

しかし、XIMレシーバとXIMサーバはXサーバを介して通信するため、性能という点については逆に不利になっています。

ダウンロード・ビルド

最新版はimreceiver-20041223.tar.gzです。主に動作確認したプラットフォームは次の通りです。

  • FreeBSD 4.10 + XFree86 4.4.0
  • Red Hat Linux 9 + XFree86 4.3.0

tar ballを展開後、環境に合うようにImakefileを編集してください。

あとはxmkmf -a ; make ; make installで完了です。

使用法

コマンドラインから次のように起動します(XIMサーバの起動の前でも、後でも問題ありません)。

% imreceiver &

ドキュメント

プロトコル

使用するプロトコルは大きく4つに分類できます。

1. XIMPreeditPositionスタイル — Over-The-Spotスタイルの前編集文字列

起動時にXIM_RECEIVERセレクションを取得します(セレクションが奪われた場合は、XIMレシーバは終了する必要があります)。セレクション要求を受け取り、セレクションターゲットがXIM_PREEDIT_WINDOWアトムの場合、セレクションリクエスタのウィンドウのプロパティを監視します(ただし既に監視対象のウィンドウであった場合は無視します)。

そのウィンドウが破壊されるまで、次の5つプロパティを取得し、適切に表示します。プロパティに変更があった場合は、再取得して表示を更新します。

  1. 指定ウィンドウのXIM_PREEDIT_STRINGプロパティ(COMPOUND_TEXT): 前編集文字列。このプロパティが存在しない場合は、前編集文字列の表示をいっさい中止する。
  2. 指定ウィンドウのXIM_PREEDIT_FEEDBACKプロパティ(INTEGER): フィードバックを指定するXIMFeedback型の配列。
  3. 指定ウィンドウのXIM_PREEDIT_CARETプロパティ(INTEGER): 前編集文字列のキャレット位置。
  4. 指定ウィンドウのXIM_PREEDIT_FONTSETプロパティ(STRING): 前編集文字列のフォントセットを指定する文字列。
  5. 指定ウィンドウのXIM_PREEDIT_SPOT_LOCATIONプロパティ(POINT): ルートウィンドウに関する挿入位置の座標。y座標はベースライン位置。

2. XIMPreeditNothingスタイル — On-The-Rootスタイルの前編集文字列

次の3つのプロパティを取得し、適切に表示します。プロパティに変更があった場合は、再取得して表示を更新します。

  1. ルートウィンドウのXIM_PREEDIT_STRINGプロパティ(COMPOUND_TEXT): 前編集文字列。このプロパティが存在しない場合は、前編集文字列の表示をいっさい中止する。
  2. ルートウィンドウのXIM_PREEDIT_FEEDBACKプロパティ(INTEGER): フィードバックを指定するXIMFeedback型の配列。
  3. ルートウィンドウのXIM_PREEDIT_CARETプロパティ(INTEGER): 前編集文字列のキャレット位置。

3. XIMStatusNothingスタイル — On-The-Rootスタイルの状態文字列

次のプロパティを取得し、適切に表示します。プロパティに変更があった場合は、再取得して表示を更新します。

  • ルートウィンドウのXIM_STATUS_STRINGプロパティ(COMPOUND_TEXT): 状態文字列。このプロパティが存在しない場合は、状態文字列の表示をいっさい中止する。

4. 予測入力の候補

次のプロパティを取得し、適切に表示します。プロパティに変更があった場合は、再取得して表示を更新します。

  • ルートウィンドウの XIM_PREDICT_STRINGプロパティ(COMPOUND_TEXT): 予測入力の候補文字列(の配列)。このプロパティが存在しない場合は、候補の表示をいっさい中止する。