GTK: Frage zum Combobox-Event "changed"



  • Hallo,

    wenn ich bei einer Combobox einen Handler für das Signal "changed" einrichte, wird mein Handler komischerweise zweimal aufgerufen. Im Handler hol ich mir dann den aktuellen Eintrag der Combobox mittels g_object_get(), beim ersten Mal bleibt der Eintrag allerdings leer, erst beim zweiten Durchlauf liegt der Eintrag vor. Wie kann das sein???
    Unten ist mal ein kleines Codebeispiel angefügt. Bei mir kommt es zu folgender Ausgabe:

    Eintrag:
    Eintrag: Test2
    Eintrag:
    Eintrag: Test1
    ...

    Was mache ich falsch?
    Vielen Dank schonmal für die Hilfe!

    Grüße
    Trombo

    #include <gtk/gtk.h>
    
    static GtkComboBox *combo[1];
    
    static gchar *signal[] =
    {
       "Test1", "Test2"
    };
    
    static gint delete_event(GtkWidget *widget, GdkEvent event, gpointer daten) 
    {
      return FALSE;
    }
    
    static void end_event(GtkWidget *widget, gpointer daten) 
    {
      gtk_main_quit();
    }
    
    void combo_event(GtkComboBox *combobox, gpointer user_data)
    {
      gchar *opt;
    
    	g_object_get(GTK_COMBO(combo[0])->entry, "text", &opt, NULL);
    	g_print("Eintrag: %s\n", opt);
    }
    
    int main(int argc, char **argv)
    {
      GtkWindow  *win;
      GdkPixbuf  *pic;
      GList *combo_list = NULL;
      GtkHBox    *hbox[1];
      gint i;
    
      gtk_init( &argc, &argv );
      pic = gdk_pixbuf_new_from_file("icon/at-work.gif", NULL );
      win = g_object_new( GTK_TYPE_WINDOW,
                          "title", "Test",
                          "default-width",  300,
                          "default-height", 200,
                          "allow-grow", FALSE,
                          "allow-shrink", FALSE,
                          "resizable", FALSE,
                          "window-position", GTK_WIN_POS_CENTER,
                          "border-width", 20,
                          "icon", pic,
                          NULL );
    
      combo[0] = g_object_new (GTK_TYPE_COMBO, NULL);
      for (i = 0; i < 2; i++)
        combo_list = g_list_append (combo_list, signal[i]);
    	gtk_combo_set_popdown_strings (GTK_COMBO (combo[0]), combo_list);
    	combo_list = NULL;
      g_list_free (combo_list);
    
      hbox[0] = g_object_new( GTK_TYPE_HBOX,
                           "spacing", 20,
                           "homogeneous", FALSE,
                           NULL );
    
      g_signal_connect(win, "delete-event", G_CALLBACK(delete_event), NULL );
      g_signal_connect(win, "destroy", G_CALLBACK(end_event), NULL );
     	g_signal_connect(GTK_COMBO(combo[0])->entry, "changed", G_CALLBACK(combo_event), NULL);
    
      gtk_box_pack_start_defaults(GTK_BOX(hbox[0]), GTK_WIDGET(combo[0]));
      gtk_container_add( GTK_CONTAINER( win ), GTK_WIDGET(hbox[0]));
      gtk_widget_show_all( GTK_WIDGET(win) );
    
      gtk_main();
      return 0;
    }
    


  • Hat keiner eine Idee woran das liegen könnte? Bin ich der Einzige mit diesem Problem (wär schon ganz schön seltsam)??? Wäre schön, wenn mir hier jemand helfen könnte!

    Grüße
    Trombo

    PS: Ich entwickle mit GTK+ 2.0 unter openSuSE 10.2



  • Sorry, wollt's mir am Wochenende anschauen, bin dann aber doch nicht dazugekommen. Ich schau mal, ob's heute Abend klappt 🙂

    MfG

    GPC



  • So, hab's eben kompiliert und konnte keine Unregelmäßigkeiten feststellen. Folgende Ausgabe:

    [gpc@desktop ~/tmp]$ ./main
    Eintrag: Test2
    Eintrag: Test1
    Eintrag: Test2
    Eintrag: Test1
    Eintrag: Test2
    [gpc@desktop ~/tmp]$
    

    Übersetzt wurde es auf FreeBSD 6.2 RELEASE und mit folgenden Versionen der Libs:
    gtk-2.10.9
    glib-2.12.9
    atk-1.12.4
    pango-1.14.10
    cairo-1.2.6_1

    MfG

    GPC



  • Danke für die Hilfe! Das ist ja echt komisch, dass das bei dir so klappt und bei mir nicht 😕 ! Ich hab jetzt festgestellt, dass der Effekt auch bei meinen Radiobuttons auftritt, echt komisch! Da scheint bei meinem GTK irgendwas schief zu laufen! Naja, beim Eintritt in den Signalhandler prüfe ich jetzt halt auf einen gültigen Eintrag, so klappts dann! Aber optimal ist das nicht!
    Naja, trotzdem schönen Dank!

    Grüße
    Trombo


Anmelden zum Antworten