AIDA Shinra
shinr****@j10n*****
2005年 9月 18日 (日) 20:02:26 JST
相田です。 > canna-3.7p3のjrKanjiStringとjrKanjiControlを使ったプログラムを書いてい > るのですが、KC_SETLISTCALLBACKの使い方でわからないところがあったので質 > 問させて下さい。 > > 私が理解していることを書きます。 > > jrKanjiControl(id, KC_SETLISTCALLBACK, (char *)&lcs); > は候補一覧の操作を行うコールバック関数を設定する。 > コールバック関数は jrEUCListCallbackStruct 型のlcsの > callback_func で指定する。lcs.client_dataにはコールバック関数に渡され > る第一引数を指定する。 > > コールバック関数の型は以下の通り。 > int listfunc(char *client_data, int func, char **items, int nitems, int *cur_item) > funcは操作の種類を表す。funcの値には以下のものがある。 > > o CANNA_LIST_Start > 呼ばれるタイミング > 候補一覧の表示を開始するとき > 引数 > itemsは全候補 > nitemsは全候補の数 > cur_itemは現在の候補番号(0から始まる)のアドレス > (funcの値に関わらず、コールバック関数内でcur_itemの指す候補番号を > 変えることによって、候補選択が行える) > 関数内で行うこと > 候補一覧を表示 > 返り値 > 無視される コールバック関数の外でも候補番号は変更できます。例えばkinput2はCanna.c のSelectItem()がこれを行っています。実際にlibcannaが*cur_itemを参照す るのはCANNA_LIST_SelectまたはCANNA_LIST_Queryの後です。 > o CANNA_LIST_Select > 呼ばれるタイミング > 現在の候補を選択し、候補一覧表示を終了するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > 候補一覧表示を終了 > 返り値 > 無視される > > o CANNA_LIST_Quit > 呼ばれるタイミング > 候補一覧表示を終了するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > 候補一覧表示を終了 > 返り値 > 無視される > > o CANNA_LIST_Forward > 呼ばれるタイミング > 次の候補を選択するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > 次の候補を選択 > 返り値 コールバックされた側でエラーが発生すれば0以外 > > o CANNA_LIST_Backward > 呼ばれるタイミング > 前の候補を選択するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > 前の候補を選択 > 返り値 > ? > > o CANNA_LIST_Next > 呼ばれるタイミング > 次のページに移動するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > 次のページに移動 > 返り値 > ? > > o CANNA_LIST_Prev > 呼ばれるタイミング > 前のページに移動するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > 前のページに移動 > 返り値 > ? > > o CANNA_LIST_BeginningOfLine > 呼ばれるタイミング > ページ内の最初の候補を選択するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > ページ内の最初の候補を選択 > 返り値 > ? > > o CANNA_LIST_EndOfLine > 呼ばれるタイミング > ページ内の最後の候補を選択するとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと > ページ内の最後の候補を選択 > 返り値 > ? 以上、返り値はCANNA_LIST_Forwardと同様です。 > o CANNA_LIST_Query > 呼ばれるタイミング libcannaが*cur_itemの値を更新して欲しいと思ったとき > 引数 > items, nitems, cur_itemすべて0 > 関数内で行うこと *cur_itemを更新 > 返り値 > 無視される > o CANNA_LIST_Bango > 使われない > > o CANNA_LIST_PageUp > CANNA_LIST_Prevと同じ > > o CANNA_LIST_PageDown > CANNA_LIST_Nextと同じ > > o CANNA_LIST_Convert > CANNA_LIST_Forwardと同じ > ただし返り値は無視される > > o CANNA_LIST_Insert > 呼ばれるタイミング > 操作キー以外のキーが押されたとき(a-z, 0-9など) > 引数 > nitemsは押されたキー > itemsとcur_itemは0 > 関数内で行うこと キーがアプリケーション側で特別な意味を持つ場合はその処理を行う。 > 返り値 アプリケーション側でキーが特別な意味を持たない場合は0を返してlibcanna に処理を任せる。アプリケーション側で処理が完結しlibcannaが何もしなくて いいときはCANNA_FN_Nopを返す。libcannaに何か実行して欲しいときは CANNA_FN_*を返す。 > 質問1 > ?になっているところがわかりません。 > ?になっていないところも間違っているところがあれば教えてください。 > > 質問2 > (setq cursor-wrap t)のとき最後の候補の次に行くと最初の候補になりますが、 > (setq cursor-wrap nil)のときは最後の候補から最初の候補に移動しません。 > コールバック関数内でこれを実現するためには、cursor-wrapの値を知る必要 > があると思うのですが、どうすればいいのでしょうか。 kinput2ではcursor-wrapなどは気にせず(setq cursor-wrap t)であるかのよう に扱っています。アプリケーションからcursor-wrapの値を知る方法はありま せん。