2012-04-13 12 views
10

私がコンパイルして、以下に提供する小さなサンプルコードを実行してください。シフトキー修正が正しく機能しているかどうか教えてください。この例では、gtkのキー入力機能を示すことを想定しています。シンプルなキーの押下ではうまく動作し、コントロールキーの変更子でも機能しますが、シフトキーの変更子では機能しません。単純なgtkキープレスイベントの例では、GDK_SHIFT_MASKは無視されるようです。

/* 
* 
* compile command: 
* 
* gcc keypress3.c -o keypress3 `pkg-config --libs --cflags gtk+-2.0` 
* 
*/ 

#include <gtk/gtk.h> 
#include <gdk/gdkkeysyms.h> 

gboolean 
on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data); 

int main (int argc, char *argv[]) 
{ 
    GtkWidget *window; 

    gtk_init (&argc, &argv); 

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 

    g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); 
    g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (on_key_press), NULL); 

    gtk_widget_show_all (window); 

    gtk_main(); 

    return 0; 
} 

gboolean 
on_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data) 
{ 
    switch (event->keyval) 
    { 
    case GDK_p: 
     printf("key pressed: %s\n", "p"); 
     break; 
    case GDK_s: 
     if (event->state & GDK_SHIFT_MASK) 
     { 
     printf("key pressed: %s\n", "shift + s"); 
     } 
     else if (event->state & GDK_CONTROL_MASK) 
     { 
     printf("key pressed: %s\n", "ctrl + s"); 
     } 
     else 
     { 
     printf("key pressed: %s\n", "s"); 
     } 
     break; 
    case GDK_m: 
     if (event->state & GDK_SHIFT_MASK) 
     { 
     printf("key pressed: %s\n", "shift + m"); 
     } 
     else if (event->state & GDK_CONTROL_MASK) 
     { 
     printf("key pressed: %s\n", "ctrl + m"); 
     } 
     else 
     { 
     printf("key pressed: %s\n", "m"); 
     } 
     break; 

    default: 
     return FALSE; 
    } 

    return FALSE; 
} 

私は取得しています出力:私はシフト+ SまたはShift + Mを押すと

key pressed: m 
key pressed: ctrl + m 
key pressed: p 
key pressed: ctrl + s 
key pressed: s 

は、私が何を取得、私はかなりGDK_SHIFT_MASKにも使用されるべきか得ていないのですようですので、私はドキュメンテーションを読んだことがありますが、まったく同じように使用されているような例がたくさんありました。

+0

あなたはどんな入力のためにその出力を得ていますか? – ptomato

+0

@ptomato出力は入力を正確に記述します。 – nomadicME

答えて

15

shift + sを押したときの値はevent->keyvalで、GDK_SではなくGDK_Sです。言い換えれば、GDKはすでにあなたのためにキーボードを解釈しています。記号ではなく、Sです。しかしシフトマスクはまだ設定されています。これはGDK_Sのケースを追加することで見ることができます:

... 
case GDK_S: // add this line 
case GDK_s: 
    if (event->state & GDK_SHIFT_MASK) 
    { 
    printf("key pressed: %s\n", "shift + s"); 
    } 
    else if (event->state & GDK_CONTROL_MASK) 
    { 
.... 
+0

doh!それは長い間私を困らせていました。 :)ありがとう。 – nomadicME

5

Gtk3を使用してこのコードをベースに使用するだけです。マクロが変更され、GDK_sGDK_KEY_sになりました。このコードをそのままコンパイルすることはできません。更新されたKeyvalsの完全なリストはここにあります: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h

+0

これは答えではなく、それが応答する投稿にコメントする必要があります。私は民族が自分のための拠点としての巨大な郵便物のコードを使用しただけではないと思っていました...そして、その人たちはエラーや文書を読んで問題をすぐに理解するでしょう...しかし、私はあまりにも楽観的かもしれません。だから、これは役に立つかもしれません。しかしそれはまだ答えではありません。 –

関連する問題