RE: Problem with Data Passed to Call Back Function



Title: RE: Problem with Data Passed to Call Back Function

Actually the 3 elements in newstr[] are the same, i.e. tmpstr, because tmpstr is an array, it has fixed address in this routine. Therefore when you pass the address to G_CALLBACK (button_cb) in g_signal_connect, the content is still right, say "1", "2" and "3". But after the "for" loop, the content is "3", and all reference to this address is "3".

Maybe this could be better:

#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];

                gchar *tmpstr;

        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)

          {

                        tmpstr = (gchar *)g_malloc0(12);

            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;

    }

---------------------------------------

Best Wishes!

 

Zhang Hui

Email: Hui003 Zhang samsung com

Phone: 86-25-58748787-8215

Samsung Electronics(China) R&D Center

---------------------------------------

-----Original Message-----
From: gtk-list-bounces gnome org [mailto:gtk-list-bounces gnome org] On Behalf Of Chris
Sent: Thursday, November 30, 2006 9:31 AM
To: gtklist
Subject: Problem with Data Passed to Call Back Function

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 gnome org

http://mail.gnome.org/mailman/listinfo/gtk-list



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