マウス入力

2010年2月11日

ファイル

02-mouse.tar.gz

使い方

ウインドウ上でマウスを動かしたりボタンを押したりすると、コンソール上にメッセージが表示されます。

内容

マウスの入力を拾うには、コールバック関数を使います。

	g_signal_connect(win,
	  "button-press-event", G_CALLBACK(buttonPress), NULL);
	g_signal_connect(win,
	  "button-release-event", G_CALLBACK(buttonRelease), NULL);
	g_signal_connect(win,
	  "scroll-event", G_CALLBACK(buttonScroll), NULL);
	g_signal_connect(win,
	  "motion-notify-event", G_CALLBACK(motionNotify), NULL);
  • "button-press-event": マウスのボタンが押されたとき
  • "button-release-event": マウスのボタンが離されたとき
  • "scroll-event": ホイールを動かしたとき
  • "motion-notify-event": マウスを動かしたとき

"button-press-event", "button-release-event", "motion-notify-event" を拾うには、次のようにマスクの設定が必要です。

	gtk_widget_set_events(win,
	  GDK_BUTTON_PRESS_MASK |
	  GDK_BUTTON_RELEASE_MASK |
	  GDK_POINTER_MOTION_MASK
	);

"button-press-event", "button-release-event" のコールバック関数でボタンの状態を得るには、第 2 引数 event の event->button, event->state を調べます。

gboolean buttonPress(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
	printf("BUTTON PRESS\n");
	mouseButtonKind(event->button);
	modifierKind(event->state);

	return FALSE;
}

event->button

  • 1: 左ボタン
  • 2: 中央ボタン
  • 3: 右ボタン
void mouseButtonKind(int button)
{
	switch(button){
	case 1:
		printf("LEFT\n");
		break;
		...

event->state ("=" ではなく "&" で調べる)

  • GDK_SHIT_MASK: Shift が押されている
  • GDK_CONTROL_MASK: Ctrl が押されている
  • GDK_MOD1_MASK: Alt が押されている
void modifierKind(int state)
{
	if(state & GDK_SHIFT_MASK){
		printf("Shift\n");
	}
	...

"scroll-event" のコールバック関数では、第 2 引数 event の event->direction でホイールの移動方向を調べることができます。

gboolean buttonScroll(GtkWidget *widget, GdkEventScroll *event, gpointer data)
{
	switch(event->direction){
	case GDK_SCROLL_UP:
		printf("BUTTON SCROLL UP\n");
		break;
	case GDK_SCROLL_DOWN:
		printf("BUTTON SCROLL DOWN\n");
		break;
	default:
		break;
	}
	...

event->direction

  • GDK_SCROLL_UP: 上に動いた
  • GDK_SCROLL_DOWN: 下に動いた

マウスの位置を知るには、第 2 引数 event の event->x, event->y を調べます。

gboolean motionNotify(GtkWidget *widget, GdkEventMotion *event, gpointer data)
{
	printf("(%3d, %3d)\n", (int)event->x, (int)event->y);

	return FALSE;
}

GTK+ プログラミング 目次へ