!!! キー入力イベント * キー入力すると送られる !! キー入力イベントの種類 ||種類-|発生状況- ||key_press_event|キーが押された ||key_release_event|キーが離された !! イベントの設定 8< void gtk_widget_set_events (GtkWidget *widget, gint events); >8 * [gtk_widget_set_events|http://developer.gnome.org/gtk/2.24/GtkWidget.html#gtk-widget-set-events] ** [events|http://developer.gnome.org/gdk/2.24/gdk-Events.html#GdkEventMask] ** 入門GTK+ 3版pdf:249(261)ページ 8< +define g_signal_connect(instance, detailed_signal, c_handler, data) >8 * [g_signal_connect|http://developer.gnome.org/gobject/2.26/gobject-Signals.html#g-signal-connect] ** 入門GTK+ 3版pdf:40(52)ページ 8< struct GdkEventKey >8 * [GdkEventKey|http://developer.gnome.org/gdk/2.24/gdk-Event-Structures.html#GdkEventKey] !!! key_press_event * キーが押されたときに発生 * 押されたキーの判定はコールバック側で行う * 最後に押されたキーだけ、わかる ** 複数キーの同時入力に対応するには、key_release_eventとの組み合わせが必要 !! コールバックの登録 * main関数 8< g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(cb_key_press_event), NULL); >8 ** 本来はGDK_KEY_PRESS_MASKを設定する必要があるが、デフォルトで設定されているので省略可能 * コールバック関数 8< + include gint cb_key_press_event(GtkWidget *widget, GdkEventKey *event) { /* 押されたキーの判定 */ switch(event->keyval) { case GDK_Left: /* 左キーが押されたときの処理 */ break; case GDK_Down: /* 下キーが押されたときの処理 */ break; case GDK_Up: /* 上キーが押されたときの処理 */ break; case GDK_Right: /* 右キーが押されたときの処理 */ break; default: break; } return TRUE; } >8 ! # include * GDK_Leftなどが#defineされている * GDK_aなどはキャラクタコードが定義されているだけ ** GDK_aは'a'と同じ ** 'a'などとは書きにくいキー(例えば「Home」)などには便利 * 各キーが何と#defineされているかはxevで確認できる ** xevを起動して「Home」を押した時の表示 8< KeyPress event, serial 29, synthetic NO, window 0x2c00001, root 0x3e, subw 0x0, time 1236567743, (778,143), root:(822,223), state 0x10, keycode 97 (keysym 0xff50, Home), same_screen YES, XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False >8 ** 3行目に“(keysym 0xff50, Home)”とあり、GDK_Homeと定義されていることがわかる !!! key_release_event * キーが離されたときに発生 * 離されたキーの判定はコールバック側で行う * 最後に離されたキーだけ、わかる !! コールバックの登録 * main関数 8< g_signal_connect(G_OBJECT(window), "key_release_event", G_CALLBACK(cb_key_release_event), NULL); >8 ** 本来はGDK_KEY_RELEASE_MASKを設定する必要があるが、デフォルトで設定されているので省略可能 * コールバック関数 8< + include gint cb_key_release_event(GtkWidget *widget, GdkEventKey *event) { /* key_press_event同じような処理をすればいい */ } >8 !!! キーが押されたときにだけ処理 * key_press_eventのみ処理 !! 複数同時入力不可 * キーが押されたときにだけ処理すると、最後に押されたキーにしか対応できない * サンプル No Flag ** カーソルキーでスクロール !!! キーが押されたときと離されたとき処理 * key_press_event,key_release_eventをどちらも処理 !! 複数同時入力可 * キーが押されたときにフラグを立て、離されたときにフラグを寝かす * フラグが立っているとき、処理する ** 複数のキーを押すと複数のフラグが立つので、全て処理すれば同時入力に対応できる ! 動作サンプル A. [←]を押す ++ [←]のフラグを立てる ++ フラグをチェック *** [←]:左にスクロールさせる B. [↑]を押す ++ [↑]のフラグを立てる ++ フラグをチェック *** [←]:左にスクロールさせる *** [↑]:上にスクロールさせる C. [↑]を離す ++ [↑]のフラグを寝せる ++ フラグをチェック *** [←]:左にスクロールさせる