2012-04-13 11 views
10

Czy ktoś mógłby skompilować i wykonać mały przykładowy kod, który podałem poniżej? Daj mi znać, jeśli modyfikator klawisza shift działa prawidłowo. Ten przykład ma na celu zademonstrowanie funkcji naciśnięcia klawisza w gtk. Działa dobrze dla prostych naciśnięć klawiszy, a nawet działa z modyfikatorem klawisza sterującego, ale nie działa z modyfikatorem klawisza shift.W prostym przykładzie naciśnięcia klawisza gtk, GDK_SHIFT_MASK wydaje się być ignorowany

/* 
* 
* 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; 
} 

Wyjście Dostaję:

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

mam nic kiedy Naciśnij Shift + S lub Shift + M, więc wydaje się, że nie jestem dość uzyskanie jak GDK_SHIFT_MASK powinien być stosowany nawet chociaż przeczytałem dokumentację i widziałem wiele innych przykładów, w których wydaje się, że są używane w dokładnie taki sam sposób.

+0

Otrzymujesz te dane wyjściowe, za które dokładnie dane wejściowe? – ptomato

+0

@ptomato Dane wyjściowe dokładnie opisują dane wejściowe. – nomadicME

Odpowiedz

15

Wartość event->keyval po naciśnięciu shift + s to GDK_S, a nie GDK_s. Innymi słowy, GDK już zinterpretował klawiaturę dla ciebie, dając ci symbol "S", a nie "s". Maska zmiany jest jednak wciąż ustawiona. Widać to dodając sprawę do 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! to mnie tak długo zaskakiwało, ale wydaje mi się to tak oczywiste, kiedy to wyjaśnisz. :) Dzięki. – nomadicME

5

tylko heads up dla osób korzystających Gtk3 i wykorzystujących ten kod jako zasady. Makra zmienione i GDK_s jest teraz GDK_KEY_s. Kompilowanie tego kodu w obecnej postaci nie będzie działać. Pełna lista zaktualizowanych Keyvalów znajduje się tutaj: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h

+0

To nie jest odpowiedź i powinien być komentarzem do wpisu, na który odpowiada. Miałem nadzieję, że ludzie nie użyją kodu z SO-ów jako podstawy dla swoich ... a ci, którzy to zrobili, szybko zorientują się w problemie czytając błędy i dokumentację ... ale mogę być tam zbyt optymistycznie nastawiony. To może być przydatne. Ale wciąż nie jest odpowiedzią. –

Powiązane problemy