ソフトウェア設計及び演習2016
GDK2016::キー入力イベント
キー入力イベント
- キー入力すると送られる
イベントの設定
void gtk_widget_set_events (GtkWidget *widget, gint events);
-
gtk_widget_set_events
- events
- 入門GTK+ 3版pdf:249(261)ページ
#define g_signal_connect(instance, detailed_signal, c_handler, data)
-
g_signal_connect
- 入門GTK+ 3版pdf:40(52)ページ
struct GdkEventKey
key_press_event
- キーが押されたときに発生
- 押されたキーの判定はコールバック側で行う
- 最後に押されたキーだけ、わかる
- 複数キーの同時入力に対応するには、key_release_eventとの組み合わせが必要
コールバックの登録
- main関数
g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(cb_key_press_event), NULL);
- 本来はGDK_KEY_PRESS_MASKを設定する必要があるが、デフォルトで設定されているので省略可能
- コールバック関数
#include <gdk/gdkkeysyms.h> 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; }
# include <gdk/gdkkeysyms.h>
- GDK_Leftなどが#defineされている
- GDK_aなどはキャラクタコードが定義されているだけ
- GDK_aは'a'と同じ
- 'a'などとは書きにくいキー(例えば「Home」)などには便利
- 各キーが何と#defineされているかはxevで確認できる
- xevを起動して「Home」を押した時の表示
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
- 3行目に“(keysym 0xff50, Home)”とあり、GDK_Homeと定義されていることがわかる
key_release_event
- キーが離されたときに発生
- 離されたキーの判定はコールバック側で行う
- 最後に離されたキーだけ、わかる
コールバックの登録
- main関数
g_signal_connect(G_OBJECT(window), "key_release_event", G_CALLBACK(cb_key_release_event), NULL);
- 本来はGDK_KEY_RELEASE_MASKを設定する必要があるが、デフォルトで設定されているので省略可能
- コールバック関数
#include <gdk/gdkkeysyms.h> gint cb_key_release_event(GtkWidget *widget, GdkEventKey *event) { /* key_press_event同じような処理をすればいい */ }
最終更新日:2015/03/05 10:01:28