1

GUIウィンドウでユーザーキープレスCtrl + dをキャッチして終了しようとしています。私のコードは次のようになります。

static gboolean
callback(GtkWidget   *widget,
         GdkEventKey *event,
         gpointer    data)
{
    if(event->state == GDK_CONTROL_MASK && event->keyval == 'd')
        gtk_main_quit();

    return FASLE;
}

これは私のラップトップ(Ubuntu 11.04、gcc 4.5.2、libgtk 2.24.4)で動作します。しかし、新しいシステム (Ubuntu 12.10、gcc 4.7.2、libgtk 2.24.13) で同じことを行うと、機能しません。

g_print("%u\n", event->state);ステートメントの前に追加しましifた。 を押すCtrlと、event->stateドキュメントの 4 または 1 << 2 ではなく 20 であることが示されます。を 20に変更するGDK_CONTROL_MASKと、新しいシステムでは機能しますが、古いシステムでは機能しません。なぜこうなったのか、どうすれば直せるのか誰か教えてください。

4

2 に答える 2

3

event->statebitmapです。つまり、値 20 は「4 ではなく 20」を意味するのではなく、「4 と 16 を同時に」という意味です。ヘッダーによると、値 16 ( 1 << 4) はMOD2修飾子に対応しておりfn、ラップトップに存在するキーに対応している可能性があります。

簡単な修正は、&演算子を使用して、他の修飾子を無視しながらコントロールをチェックすることです。

    if (event->state & GDK_CONTROL_MASK && event->keyval == 'd')

これは両方のシステムで機能します。

于 2013-04-26T12:42:50.243 に答える