ソフトウェア設計及び演習2017

GDK2017::キー入力イベント

キー入力イベント

  • キー入力すると送られる

キー入力イベントの種類

種類- 発生状況-
key_press_event キーが押された
key_release_event キーが離された

イベントの設定

void gtk_widget_set_events (GtkWidget *widget,
                            gint events);
#define g_signal_connect(instance, detailed_signal, c_handler, data)
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同じような処理をすればいい */
}

キーが押されたときにだけ処理

  • key_press_eventのみ処理

複数同時入力不可

  • キーが押されたときにだけ処理すると、最後に押されたキーにしか対応できない
  • サンプル No Flag
    • カーソルキーでスクロール

キーが押されたときと離されたとき処理

  • key_press_event,key_release_eventをどちらも処理

複数同時入力可

  • キーが押されたときにフラグを立て、離されたときにフラグを寝かす
  • フラグが立っているとき、処理する
    • 複数のキーを押すと複数のフラグが立つので、全て処理すれば同時入力に対応できる
動作サンプル

A. [←]を押す

  1. [←]のフラグを立てる
  2. フラグをチェック
    • [←]:左にスクロールさせる

B. [↑]を押す

  1. [↑]のフラグを立てる
  2. フラグをチェック
    • [←]:左にスクロールさせる
    • [↑]:上にスクロールさせる

C. [↑]を離す

  1. [↑]のフラグを寝せる
  2. フラグをチェック
    • [←]:左にスクロールさせる


最終更新日:2017/04/03 09:14:22