表形式で表示を行う候補ウィンドウを作りました。
* ねらい・特徴
** uim-tutcodeの記号入力モード時に、
  表形式で多数の候補を表示して、候補を選びやすくするために作りました。
** Emacs用のT-Code入力環境tc2や、Windows用漢字直接入力ツール漢直Winでは、
  交ぜ書き変換の候補を表形式で選ぶようになっているので、それに合わせるため。
** 昔の日本語Wikiの要望ページに、T-Codeの仮想鍵盤表示に使えるような
  表形式のウィンドウが欲しいという要望があったので。
** uim-tutcodeでヘルプ表示に使うことも考えています。
  + 次に各キーを打ったときに入力される文字を表形式で表示(仮想鍵盤表示)
  + 交ぜ書き変換や部首合成変換での確定時に、
    直接入力可能な文字の打ち方を表示(自動ヘルプ)
** uim-tutcode以外のIMでも、Scheme側処理を記述すれば、記号入力モード等で
  多数の候補から選ぶ場合に使えると思います。
  (単純な記号入力はuim-input-pad-jaでいいと思いますが。)
#** 「風」のような入力方式の実現にも使えるかもしれません。
#** タッチスクリーン用の入力パネルとしても使えるかもしれません。
#   (ただし、候補クリック時に確定する機能の追加が必要)

* 表形式候補ウィンドウの概要
+ 13列8行の表の各セルをボタンで表示。
++ 表の各セルに以下のようにJIS配列キーボードレイアウトで各キーを割り当て。
  (割り当ては、uim-candwin-prog-layout変数で変更可能)
     1 2 3 4 5  6 7 8 9 0   - ^ \
     q w e r t  y u i o p   @ [
     a s d f g  h j k l ;   : ]
     z x c v b  n m , . /       スペース

     ! " # $ %  & ' ( )     = ~ |
     Q W E R T  Y U I O P   ` {
     A S D F G  H J K L +   * }
     Z X C V B  N M < > ?   _
++ 右上、左下、右下のブロックは表示候補が無い場合はブロックごと非表示。
++ 対応するキーが無いセルのボタンは非表示。
+ 表中の各位置のキーとラベル文字とを対応付け。
 Scheme側から指定された、ラベル文字と候補文字列の組に対し、
 ラベル文字に対応するキーの位置のボタンに候補文字列を表示。
+ Scheme側からはラベル文字と候補文字列を指定。(既存の候補ウィンドウと同様)

* 表示例
** 記号入力モード時
  http://www1.interq.or.jp/~deton/tutcode/candwin-tbl-kigou1.png
  http://www1.interq.or.jp/~deton/tutcode/candwin-tbl-kigou2.png
** 交ぜ書き変換時
  http://www1.interq.or.jp/~deton/tutcode/candwin-tbl-maze.png

* 構成、および既存の候補ウィンドウからの変更点
** 共通
*** 既存の候補ウィンドウをベースに、GtkTreeViewをGtkTableに変更して、
   セルにGtkButtonを配置。

** uim-xim用
  candwin-gtk.cをコピーしてcandwin-tbl-gtk.cを作成。
  (uim-ximは候補表示に使うプログラムをScheme変数uim-candwin-progで設定可能)

** gtk-immodule用
*** GObjectの流儀に従って、UIMCandWinGtkを継承してUIMCandWinTblGtkを作成。
*** UIMCandWinGtkの一部関数をvirtual相当に変更し、
   UIMCandWinTblGtkでオーバーライド。
*** gtk-im-uim.c:im_uim_init()内のuim_cand_win_gtk_new()呼び出し部分を変更し、
   Scheme変数uim-candwin-prog(uim-ximと同じ)を参照して、
   newする候補ウィンドウ(UIMCandWinGtkかUIMCandWinTblGtk)を切り替え。

*** ソースの把握・変更をしやすくするため、
   ソース量をあまり増やさない形で変更をしています。
   将来的に、他の候補ウィンドウの追加を想定するなら、
   もう少し構成を整理した方が良いかもしれません。
#例:+ 共通処理を抽象クラスにまとめる
#   + Scheme側から呼ばれる関数を全てvirtual相当にしておく(?)
#   + オーバーライドではなくソースをコピーする方針にする(?)
#   + input-pad-jaのように別プログラムにする(?)
#   + IM独自の候補ウィンドウは、pluginとして作る(?)

* パッチ
** gtk-immodule用パッチ
  http://www1.interq.or.jp/~deton/tutcode/candwin-tbl-gtk.patch.gz
** uim-xim用パッチ
  http://www1.interq.or.jp/~deton/tutcode/candwin-tbl-helper.patch.gz

* 制限事項
** uim-tutcodeでの動作のみ確認。
** 既存の候補ウィンドウを置き換えて使う場合の動作のみ確認。
  (候補数に応じて使う候補ウィンドウを切り替えるのではなく)(特にuim-xim)

* TODO
** マウスで候補をクリックしたときに確定する
** 候補ウィンドウに次/前ページ移動ボタンを追加(マウスだけで選択可能にするため)
   (signalの追加/HELPER-CANDWINプロトコルの拡張も?)
** Qt版の追加
** 使う候補ウィンドウを、uim-pref-gtk等の設定で切り替えられるようにする
** 候補ウィンドウ切替関数をScheme側に追加? (HELPER-CANDWINプロトコルの拡張も?)

* 使い方
 以下を~/.uimに追加。
 ; 設定が必須なのはuim-candwin-prog。
 ; uim-tutcodeの場合は、次の2つの変数の設定も必要。それ以外はオプション。
 ;   tutcode-nr-candidate-max   ; tutcode-heading-label-char-listの長さに設定
 ;   tutcode-nr-candidate-max-for-kigou-mode   ; 上と同様
;; 使用する候補ウィンドウの設定
 ; 表形式の候補ウィンドウを使用
 (define uim-candwin-prog "uim-candwin-tbl-gtk")
;; uim-tutcode用の設定
 ; 交ぜ書き変換時の候補選択用ラベル文字のリスト
 ; 打ちやすい場所から先に候補を埋める
 (set! tutcode-heading-label-char-list
   '("a" "s" "d" "f" "g"  "h" "j" "k" "l" ";"
     "q" "w" "e" "r" "t"  "y" "u" "i" "o" "p"
     "z" "x" "c" "v" "b"  "n" "m" "," "." "/"
     "1" "2" "3" "4" "5"  "6" "7" "8" "9" "0"))
 ; 記号入力モード時の候補選択用ラベル文字のリスト
 ; キーボードレイアウトに従って、左上から右下へ順に候補を埋める
 (set! tutcode-heading-label-char-list-for-kigou-mode
   '("1" "2" "3" "4" "5"  "6" "7" "8" "9" "0"  "-" "^" "\\"
     "q" "w" "e" "r" "t"  "y" "u" "i" "o" "p"  "@" "["
     "a" "s" "d" "f" "g"  "h" "j" "k" "l" ";"  ":" "]"
     "z" "x" "c" "v" "b"  "n" "m" "," "." "/"          " "
     "!" "\"" "#" "$" "%" "&" "'" "(" ")"      "=" "~" "|"
     "Q" "W" "E" "R" "T"  "Y" "U" "I" "O" "P"  "`" "{"
     "A" "S" "D" "F" "G"  "H" "J" "K" "L" "+"  "*" "}"
     "Z" "X" "C" "V" "B"  "N" "M" "<" ">" "?"  "_"))
 (set! tutcode-nr-candidate-max (length tutcode-heading-label-char-list))
 (set! tutcode-nr-candidate-max-for-kigou-mode
   (length tutcode-heading-label-char-list-for-kigou-mode))
 ; 記号入力モードを全角英数モードとして使うため、
 ; tutcode-heading-label-char-list-for-kigou-modeを全角にして
 ; tutcode-kigoudicの先頭に入れる
 (require "japanese.scm") ; for ja-wide
 (set! tutcode-kigoudic
   (append
     (map (lambda (lst) (list (ja-wide lst)))
       tutcode-heading-label-char-list-for-kigou-mode)
     (list-tail tutcode-kigoudic
       (length tutcode-heading-label-char-list-for-kigou-mode))))

;; JIS配列キーボード以外(ASCII配列やDvorakキーボード等)の場合の設定
 ; 表形式の候補ウィンドウ上の各ボタンとキーの対応表 (13列8行)
 ; 例: ASCII配列キーボード用設定
 ;(define uim-candwin-prog-layout
 ;  '("1" "2" "3" "4" "5"  "6" "7" "8" "9" "0"  "-" "=" "\\"
 ;    "q" "w" "e" "r" "t"  "y" "u" "i" "o" "p"  "[" "]" ""
 ;    "a" "s" "d" "f" "g"  "h" "j" "k" "l" ";"  "'" "`" ""
 ;    "z" "x" "c" "v" "b"  "n" "m" "," "." "/"  ""  ""  " "
 ;    "!" "@" "#" "$" "%"  "^" "&" "*" "(" ")"  "_" "+" "|"
 ;    "Q" "W" "E" "R" "T"  "Y" "U" "I" "O" "P"  "{" "}" ""
 ;    "A" "S" "D" "F" "G"  "H" "J" "K" "L" ":"  "\"" "~" ""
 ;    "Z" "X" "C" "V" "B"  "N" "M" "<" ">" "?"  ""  ""  ""))
 ;(set! tutcode-heading-label-char-list-for-kigou-mode
 ;  (delete "" uim-candwin-prog-layout))

--
木原 英人 / KIHARA, Hideto / de...@m1.interq.or.jp
http://www1.interq.or.jp/~deton/

-- 
Google Groups "uim-ja" group
uim-ja@googlegroups.com
http://groups.google.com/group/uim-ja/about

メールによる返信