GUIのプログラムは、主にマウスの動作に反応して動きます。マウスの
動きなどは、イベントといわれます。ウィジェットは、イベントが起こった
ときに、挙動処理をするアクションを働かせることができます。
通常ウィジェットは、どのイベントが起こったときに、どのイベントを起
こすかを translations(変換テーブル)というリソースで設定します。
ちなみに、xev というXのイベントの状況を表示するアプリケーションが あります。
このような処理の流れは、変換テーブルで設定されています。
以下に、Toggle ウィジェットのデフォルトの変換テーブルを示します。
この処理をまとめると、
<EnterWindow>: highlight(Always)
<LeaveWindow>: unhighlight()
<Btn1Down>,<Btn1Up>: toggle() notify()
イベント | アクション | マウスの挙動 | 表示 |
---|---|---|---|
<EnterWindow> | highlight(Always) (内部に枠を表示にする) |
カーソルがボタンの外側 ↓ 内側に入る |
↓ |
<LeaveWindow> | unhighlight() (通常表示にする) |
カーソルがボタンの内側 ↓ 外側へ出る |
↓ |
<Btn1Down>,<Btn1Up> | toggle() (反転表示する) notify() (ボタンの処理を行なう) |
→ ↓ → |
↓↑ |
ボタンの種類 | 押す | 離す | 3 ボタンマウス | 2 ボタンマウス |
---|---|---|---|---|
ボタン1 | Btn1Down | Btn1Up | ||
ボタン2 | Btn2Down | Btn2Up | (同時に押す/離す) | |
ボタン3 | Btn2Down | Btn3Up |
X では、5 つまでのボタンを扱うことができますが、
ワークステーションで広く使われている 3 つのボタン以外は、
あまり使われません。
パソコンでは、2 つのボタンのマウスが多く使われています。
PC-UNIX では、通常、2 つボタンのマウスでも 3 つのボタンマウスの
機能を補うために、左右のボタンを同時に押す/離すことにより
中央の第2ボタンの働きをさせています。
プログラマは、アプリケーションがボタンの数に依存しないように
注意すべきです。
xwireless では、REC/PLAY/PAUSEなどでは、それぞれ、 録画(録音)中/再生中/停止中の状態を表すことが出来ればベストなの ですが、実際には、これを判定することが不可能なので以下のように、 リソースを設定して、通常の Command ウィジェットと同じ挙動にします。
このリソースの設定は、複数行に渡る。このため、次の行に続く場合に 行末に`\n\'を置きます。
*xwireless*Toggle.translations: \ <EnterWindow>: highlight() \n\ <LeaveWindow>: reset() \n\ <Btn1Down>: set() \n\ <Btn1Up>: notify() unset()
以下に独自のアクションの設定の例を方法を示します。
アクションのために追加するコードは、""で示す部分です。
-
- void action_proc(Widget w, XEvent *event,
String *params, Cardinal *num_params)
{
・
・
・
}
int main(int argc, char **argv)
{
XtAppContext app_context;
Widget topLevel;
-
- static XtActionsRec add_actions[] = {
{"action", action_proc},
・
・
・
{"action1", action_proc1},
};
topLevel = XtVaAppInitialize(
&app_context, /* Application context */
"XWireless", /* Application class */
NULL, 0, /* command line */
&argc, argv, /* command line args */
NULL, /* for missing app-defaults file */
NULL); /* terminate varargs list */
・
・
・
-
- XtAppAddActions(app_context,
add_actions, XtNumber(add_actions));
・
・
・
}
*xwireless*Toggle.translations: \ <EnterWindow>: highlight() action() \n\ <LeaveWindow>: reset() action() \n\ <Btn1Down>: set() \n\ <Btn1Up>: notify() unset()
ここでは、カーソルがウィジェットの中←→外の移動をしたときに呼び出されます。
translations(変換テーブル)の設定は、プログラマの予測範囲を越え
るカスタマイズになってしますことが多いと思います。つまり、バグにな
ってしまうことがよくあります。 また、他の設定でもバグの原因になる可能性があります。このため変更 する場合は、オリジナルおよび直前のリソースファイルのバックアップと っておいたほうがいいと思います。 |