表形式で表示を行う候補ウィンドウを作りました。
* ねらい・特徴
** 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 / [email protected]
http://www1.interq.or.jp/~deton/
--
Google Groups "uim-ja" group
[email protected]
http://groups.google.com/group/uim-ja/about