2009-12-18 18 views
6

पर कीबोर्ड फ़ोकस कैसे दें मेरे पास एक पॉप-अप विंडो है (WINDOW_POPUP प्रकार का उपयोग करके बनाई गई) जिसमें टेक्स्ट एंट्री सहित कुछ विजेट शामिल हैं। समस्या यह है कि जब मैं उस पर क्लिक करता हूं तो प्रविष्टि फोकस नहीं करती है, इसलिए मैं कुछ भी टाइप नहीं कर सकता। खिड़की को कुंजीपटल फोकस पाने की अनुमति देने के लिए मुझे कोई झंडा सेट करना है?पॉप-अप Gtk.Window

उत्तर

-1
#include <gtk/gtk.h> 

static gboolean delete_event(GtkWidget *widget, 
           GdkEvent *event, 
           gpointer data) 
{ 
    g_print ("delete event occurred\n"); 
    gtk_main_quit(); 
    return TRUE; 
} 

static void destroy(GtkWidget *widget, 
        gpointer data) 
{ 
    gtk_main_quit(); 
} 

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

    gtk_init (&argc, &argv); 

    /* create a new window */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    windowpopup = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_transient_for(GTK_WINDOW(windowpopup),GTK_WINDOW(window)); 
    gtk_window_set_destroy_with_parent(GTK_WINDOW(windowpopup),TRUE); 
    gtk_widget_show (windowpopup); 

    g_signal_connect (G_OBJECT (window), "delete_event", 
       G_CALLBACK (delete_event), NULL); 
    g_signal_connect (G_OBJECT (window), "destroy", 
       G_CALLBACK (destroy), NULL); 

    /* Creates a new button with the label "Hello World". */ 
    button = gtk_button_new_with_label ("Hello World"); 

    g_signal_connect_swapped (G_OBJECT (button), "clicked", 
        G_CALLBACK (gtk_widget_destroy), 
           G_OBJECT (window)); 

    gtk_container_add (GTK_CONTAINER (window), button); 

    gtk_widget_show (button); 
    gtk_widget_show (window); 

    gtk_main(); 

    return 0; 
} 
4

आप gtk-windows के लिए WINDOW_POPUP का उपयोग नहीं कर सकते हैं, जिस पर फ़ोकस की आवश्यकता होती है। इसके बजाय आप प्रकार GTK_WINDOW_TOPLEVEL के साथ एक विंडो हेतु चिह्न का उपयोग करें और अगले कार्य (या तरीकों)

GtkWindow *result = g_object_new(GTK_TYPE_WINDOW, "type", GTK_WINDOW_TOPLEVEL, NULL); 
gtk_widget_set_can_focus(result, TRUE); 
gtk_window_set_decorated(GTK_WINDOW(result), FALSE); 
gtk_window_set_type_hint(GTK_WINDOW(result), GDK_WINDOW_TYPE_HINT_POPUP_MENU); 
gtk_window_set_transient_for(GTK_WINDOW(result), main_top_level_window); 

यह मेरे लिए काम किया बुलाना चाहिए ... दुर्भाग्य से खिड़की-सूची में आइकन कम ब्लिंक जब इस 'पॉपअप'

नष्ट हो जाता है
1

पिछले उत्तरों और जीटीके संदर्भ के बावजूद, GTK_WINDOW_POPUP का उपयोग करते समय कीबोर्ड फ़ोकस को पकड़ना संभव है। आप "शो" घटना से कनेक्ट करने के ...

GtkWindow *w = gtk_window_new(GTK_WINDOW_POPUP); 
g_signal_connect(G_OBJECT(w), "show", G_CALLBACK(on_window_show), NULL); 

... एक कॉलबैक कुंजीपटल हड़पने की कोशिश करता है उस के साथ की जरूरत है:

static void on_window_show(GtkWidget *w, gpointer user_data) { 
    /* grabbing might not succeed immediately... */ 
    while (gdk_keyboard_grab(w->window, FALSE, GDK_CURRENT_TIME) != GDK_GRAB_SUCCESS) { 
     /* ...wait a while and try again */ 
     sleep(0.1); 
    } 
} 

कि बहुत अच्छी तरह से मेरे लिए काम करता है।

+0

यह कीबोर्ड को विशेष रूप से पकड़ लेगा। माउस के साथ अन्य प्रोग्राम्स की खिड़कियों पर क्लिक करने से कीबोर्ड फोकस उन्हें हस्तांतरित नहीं करेगा। आसपास काम हो सकता है, लेकिन मुझे किसी के बारे में पता नहीं है। –

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