2009-12-18 14 views
6

Bir metin girişi de dahil olmak üzere, üzerinde bazı widget'lar içeren bir pop-up pencerem (WINDOW_POPUP türünü kullanarak oluşturulan) var. Sorun, girişin üzerine tıkladığımda odağı almamasıdır, bu yüzden hiçbir şey yazamam. Pencerenin klavye odağını almasına izin vermek için ayarladığım bir bayrak var mı?Bir pop-up için klavye odağı nasıl verilir Gtk.Window

cevap

-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

Odağı gerektiren gtk pencereleri için WINDOW_POPUP kullanamazsınız. Bu 'pop-up'

tahrip edildiğinde Bunun yerine bu benim için çalıştı sonraki işlevleri (veya yöntemleri)

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); 

tip GTK_WINDOW_TOPLEVEL ile GtkWindow kullanabilir ve aramalısınız ... pencere listede maalesef simgesi kısa yanıp söner

1

Önceki yanıtlara ve GTK Referansına rağmen, bir GTK_WINDOW_POPUP kullanırken klavye odağını almak mümkündür. Klavye kapmak için çalışan bir geri arama ile ...

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

... "gösteri" olayına bağlamak gerekir: oldukça iyi benim için çalışıyor

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

Bu, yalnızca klavye kapacaktır. Diğer programların fare ile tıklanması, klavye odağını onlara aktarmaz. Etrafta iş olabilir, ama ben hiç farkında değilim. –

İlgili konular