2012-04-13 16 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; 
} 

उत्पादन मैं हो रही है:

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

जब मैं Shift + या + m शिफ्ट मैं कुछ भी नहीं मिलता है, तो ऐसा लगता है कि मैं काफी हो रही है नहीं कर रहा हूँ कैसे GDK_SHIFT_MASK भी इस्तेमाल किया जाना चाहिए हालांकि मैंने प्रलेखन पढ़ा है और मैंने कई अन्य उदाहरण देखे हैं जहां यह बिल्कुल उसी तरह उपयोग किया जाता है।

+0

आपको उस इनपुट के लिए आउटपुट मिल रहा है, बिल्कुल? – ptomato

+0

@ptomato आउटपुट इनपुट का बिल्कुल वर्णन करता है। – nomadicME

उत्तर

15

event->keyval का मान जब Shift + s दबाया जाता है तो GDK_S नहीं, GDK_s है। दूसरे शब्दों में, जीडीके ने आपके लिए कीबोर्ड का अर्थ पहले से ही व्याख्या कर दिया है, जिससे आपको 'एस', नहीं 'प्रतीक दिया गया है। शिफ्ट मास्क अभी भी सेट है, हालांकि। Gtk3 का उपयोग करना और आधार के रूप में इस कोड का उपयोग लोगों के लिए ऊपर

... 
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

दोह! जो मुझे इतने लंबे समय तक फेंक दिया और फिर भी इसे समझाए जाने के बाद यह इतना स्पष्ट लगता है। :) धन्यवाद। – nomadicME

5

बस एक सिर: आप GDK_S के लिए एक मामला जोड़कर देख सकते हैं। मैक्रोज़ बदल गए और GDK_s अब GDK_KEY_s है। इस कोड को संकलित करना क्योंकि यह काम नहीं करेगा। अद्यतन कीवल्स की पूरी सूची यहां है: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h

+0

यह कोई जवाब नहीं है और जिस पोस्ट पर यह प्रतिक्रिया करता है उस पर एक टिप्पणी होना चाहिए। मुझे उम्मीद थी कि लोक ने एसओ पोस्ट थोक से अपने स्वयं के आधार पर कोड का उपयोग नहीं किया ... और जो लोग जल्दी ही त्रुटियों और दस्तावेजों को पढ़कर समस्या का पता लगाएंगे ... लेकिन मैं वहां बहुत आशावादी हो सकता हूं। तो, यह भी उपयोगी हो सकता है। लेकिन यह अभी भी एक जवाब नहीं है। –

संबंधित मुद्दे