Problem with Data Passed to Call Back Function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,


In the program below I am creating 3 buttons in a
horizontal box.  The buttons get created and labeled
properly as:

Button 1
Button 2
Button 3

When I click on any of the buttons though,
the data sent to the callback function should
be the label of the button pressed.
Instead it all shows up as:

Button 3

The button labels are stored in an array of character
pointers which appears to work find in the for loop.
Once out, if I print out the contents of the array
of character pointers they are all:

Button 3

I am guessing that I am missing some simple
problem but have been unable to find it on
my own.
Any help would be appreciated.

Thanks

Chris


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <gtk/gtk.h>

static void button_cb (GtkWidget *widget, gpointer data)
    {
        g_print ("Hello - %s was pressed\n", (gchar *) data);
    }

static void delete_event_cb(GtkWidget *widget, GdkEvent *event, gpointer 
data)
    {
        g_print ("A delete event has occurred\n");
        gtk_main_quit();
    }

int main( int   argc,
          char *argv[] )
    {
        GtkWidget *window;
        GtkWidget *button;
        GtkWidget *box1;
        gchar *newstr[3];
        gchar tmpstr[12];
        gint i;

        gtk_init (&argc, &argv);
   
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (window), "Test Program");
        gtk_container_set_border_width (GTK_CONTAINER (window), 50);
        g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK 
(delete_event_cb), NULL);
       
        box1 = gtk_hbox_new (TRUE, 20);
        gtk_container_add (GTK_CONTAINER (window), box1);

    
        for (i=1; i<=3; i=i+1)
          {
            sprintf(tmpstr,"%s%d","Button ",i);
            printf("The value of tmpstr = %s\n",tmpstr);     /* Prints 
Button 1, Button 2, Button 3*/
            newstr[i-1] = tmpstr;
            printf("The current label is %s\n",newstr[i-1]);   /* Prints 
Button 1, Button 2, Button 3*/ 
             
            button = gtk_button_new_with_label (newstr[i-1]);
            g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK 
(button_cb), (gpointer) newstr[i-1]);
            gtk_box_pack_start (GTK_BOX(box1), button, TRUE, TRUE, 0);
            gtk_widget_show (button);
            printf("The current label is %s\n",newstr[i-1]); /* Prints 
Button 1, Button 2, Button 3*/
          }

            printf("The value of element 1 is %s\n",newstr[0]);  /* 
Prints Button 3*/  
            printf("The value of element 2 is %s\n",newstr[1]);  /* 
Prints Button 3*/
            printf("The value of element 3 is %s\n",newstr[2]);  /* 
Prints Button 3*/

        gtk_widget_show (box1);
        gtk_widget_show (window);
   
        gtk_main ();
   
        return 0;
    }
 


_______________________________________________
gtk-list mailing list
gtk-list@xxxxxxxxx
http://mail.gnome.org/mailman/listinfo/gtk-list

[Index of Archives]     [Touch Screen Library]     [GIMP Users]     [Gnome]     [KDE]     [Yosemite News]     [Steve's Art]

  Powered by Linux