2009-12-23 8 views
2

Je voudrais avoir une barre d'état, donc j'ai commencé par faire un petit programme avec juste une barre d'état, donc j'ai pu voir comment cela fonctionnait.Comment fonctionne GTK Statusbar? Qu'est ce qui ne va pas avec mon code?

En ce moment je voudrais juste pouvoir y mettre du texte, mais il montre un caractère aléatoire à la place.

Quelqu'un peut-il voir ce qui ne va pas avec mon code?

#include <gtk/gtk.h> 

int main (int argc, char *argv[]) { 
    GtkWidget *window, *statusbar, *vbox; 
    gchar *info; 
    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_size_request(window, 250, -1); 

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

    statusbar = gtk_statusbar_new(); 

    /* stack for info messages */ 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) "1"); 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) "2"); 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) "3"); 

    /* stack for warning messages */ 
    g_object_set_data(G_OBJECT(statusbar), "warning", (gpointer) "A"); 
    g_object_set_data(G_OBJECT(statusbar), "warning", (gpointer) "B"); 
    g_object_set_data(G_OBJECT(statusbar), "warning", (gpointer) "C"); 

    /* get id for the message at the top of the info stack? */ 
    guint id = gtk_statusbar_get_context_id(statusbar, "info"); 
    /* show the top message from the info stack ? */ 
    gtk_statusbar_push(statusbar, id, info); 

    vbox = gtk_vbox_new(FALSE, 5); 
    gtk_box_pack_start_defaults(GTK_BOX (vbox), statusbar); 
    gtk_container_add(GTK_CONTAINER(window), vbox); 

    gtk_widget_show_all(window); 
    gtk_main(); 
    return 0; 
} 

Je reçois ces avertissements

s.c:26: warning: passing argument 1 of ‘gtk_statusbar_get_context_id’ from incompatible pointer type 
/usr/include/gtk-2.0/gtk/gtkstatusbar.h:94: note: expected ‘struct GtkStatusbar *’ but argument is of type ‘struct GtkWidget *’ 
s.c:28: warning: passing argument 1 of ‘gtk_statusbar_pop’ from incompatible pointer type 
/usr/include/gtk-2.0/gtk/gtkstatusbar.h:100: note: expected ‘struct GtkStatusbar *’ but argument is of type ‘struct GtkWidget *’ 
s.c:28: error: too many arguments to function ‘gtk_statusbar_pop’ 
+1

pas de ce code que vous n'avez pas - il n'y a pas de 'gtk_statusbar_pop' dedans! –

Répondre

4

Vous avez déclaré GtkWidget *statusbar mais les méthodes gtk_statusbar_... attendre GtkStatusbar *: coulée avec GTK_STATUSBAR(statusbar) supprime les avertissements. Ce n'est pas un gros problème car le programme fonctionnerait de toute façon: le plus gros problème est que vous utilisez info sans l'initialiser.

Le code suivant fonctionne comme prévu ici:

/* gcc -o status status.c $(pkg-config --cflags --libs gtk+-2.0) */ 

#include <gtk/gtk.h> 

int main (int argc, char *argv[]) { 
    GtkWidget *window, *statusbar, *vbox; 
    gchar *info; 
    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_widget_set_size_request(window, 250, -1); 

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

    statusbar = gtk_statusbar_new(); 

    /* stack for info messages */ 
    g_object_set_data(G_OBJECT(statusbar), "info", (gpointer) 
         "1"); 
    g_object_set_data(G_OBJECT(statusbar), "info", 
         (gpointer) "2"); 
    g_object_set_data(G_OBJECT(statusbar), "info", 
         (gpointer) "3"); 

    /* stack for warning messages */ 
    g_object_set_data(G_OBJECT(statusbar), "warning", 
         (gpointer) "A"); 
    g_object_set_data(G_OBJECT(statusbar), "warning", 
         (gpointer) "B"); 
    g_object_set_data(G_OBJECT(statusbar), 
         "warning", (gpointer) "C"); 

    /* get id for the message at the top of the 
    * info stack? */ 
    guint id = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "info"); 
    /* show the top message from the info stack 
    * ? */ 
    info = "This was uninitialized"; 
    gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, info); 

    vbox = gtk_vbox_new(FALSE, 5); 
    gtk_box_pack_start_defaults(GTK_BOX 
           (vbox), 
           statusbar); 
    gtk_container_add(GTK_CONTAINER(window), 
         vbox); 

    gtk_widget_show_all(window); 
    gtk_main(); 
    return 0; 
} 

Je ne sais pas ce que vous essayez d'atteindre avec g_object_set_data bien, mais peut-être ils ne sont que de vieux essais ...

Addenda:

Vous devez utiliser gtk_statusbar_push() pour empiler les messages dans la pile de la barre d'état. Avec gtk_statusbar_pop() vous allez supprimer le dernier message poussé, en découvrant le précédent.

gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, "First message"); 
// Now the statusbar shows "First message" 
gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, "Second message"); 
// Now the statusbar shows "Second message" 
gtk_statusbar_pop(GTK_STATUSBAR(statusbar), id); 
// Now the statusbar shows "First message" 
+0

Cool! Merci beaucoup. Alors disons maintenant que je veux que la barre d'état affiche le message d'avertissement 2. Comment cela se ferait-il? Je n'arrive pas à comprendre comment fonctionne ce concept push/pop. – Louise

+1

Exemple ajouté dans la réponse. – ntd

+0

Wow. Merci beaucoup. Tu connais vraiment tes trucs! – Louise

Questions connexes