2012-04-13 24 views
10

¿Podría alguien compilar y ejecutar el código de muestra pequeño que proporcioné a continuación? Por favor, avíseme si el modificador de tecla shift funciona correctamente para usted. Este ejemplo se supone que demuestra la funcionalidad de pulsación de tecla en gtk. Funciona bien para presionar teclas simples e incluso funciona con el modificador de la tecla de control, pero no funciona con el modificador de la tecla shift.En el ejemplo simple del evento de la tecla gtk, GDK_SHIFT_MASK parece ser ignorado

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

La salida me estoy haciendo:

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

no consigo nada cuando pulso shift + s o Shift + m, por lo que parece que no estoy bastante recibiendo cómo el GDK_SHIFT_MASK debe ser utilizado incluso aunque he leído la documentación y he visto muchos otros ejemplos en los que parece que se usa exactamente de la misma manera.

+0

¿Obtiene esa salida para qué entrada, exactamente? – ptomato

+0

@ptomato El resultado describe la entrada exactamente. – nomadicME

Respuesta

15

El valor de event->keyval cuando se presiona shift + s es GDK_S, no GDK_s. En otras palabras, GDK ya ha interpretado el teclado por ti, dándote el símbolo 'S', no 's'. La máscara de cambio aún está configurada, sin embargo. Esto se puede ver mediante la adición de un caso para 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! eso me dejó perplejo por tanto tiempo y, sin embargo, parece tan obvio una vez que lo explicaste. :) Gracias. – nomadicME

5

Sólo las cabezas para arriba para las personas que utilizan gtk3 y utilizando este código como base. Las macros han cambiado y GDK_s es ahora GDK_KEY_s. Compilar este código tal como está no funcionará. La lista completa de Keyvals actualizadas está aquí: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h

+0

Esto no es una respuesta y debería ser un comentario en la publicación a la que responde. Esperé que la gente no usara solo el código de los puestos SO al por mayor como base para los suyos ... y los que lo hicieran averiguarían rápidamente el problema leyendo errores y documentación ... pero podría ser demasiado optimista allí. Entonces, esto podría ser útil. Pero todavía no es una respuesta. –

Cuestiones relacionadas