I know there are more relevant lists than this, but work won't
let me subcribe to any more lists, so please bear with me, and off list
replies if appropriate.
I've just started to learn Linux/GTK, which is brushing up my
rusty old C.  Rust deposits around pointers especially!!

So my question is this, from the GTK tutorial, the helloworld2
example they use one pointer called button to intiate and show
a button widget.  After packing and showing this widget the same
pointer 'button' is used to initialize and show another button widget.
Now I thought every button widget would need its own pointer to its individual widget 
structure, and all I can assume is that when you
gtk_widget_show(), it somehow frees that pointer and gtk_main and the signal connect 
functions keep their own internal pointers to each button widget ?  Am I thinking 
right or just totally wrong?  Perusal of gtk.org and documentation I have to hand 
didn't seem to help explain.  I think I fundamentally just don't get something here 
that everyone else does !?
Helloworld2.c included...

many thanks all.

Steve

<=====================================================>
The most exciting phrase to hear in science, the one that heralds
new discoveries, is not "Eureka!" but "That's funny..."' - Isaac Asimov

/* example-start helloworld2 helloworld2.c */

  #include <gtk/gtk.h>

  /* Our new improved callback.  The data passed to this function
   * is printed to stdout. */
  void callback( GtkWidget *widget,
                 gpointer   data )
  {
      g_print ("Hello again - %s was pressed\n", (char *) data);
  }

  /* another callback */
  gint delete_event( GtkWidget *widget,
                     GdkEvent  *event,
                     gpointer   data )
  {
      gtk_main_quit();
      return(FALSE);
  }

  int main( int   argc,
            char *argv[] )
  {
      /* GtkWidget is the storage type for widgets */
      GtkWidget *window;
      GtkWidget *button;
      GtkWidget *box1;

      /* This is called in all GTK applications. Arguments are parsed
       * from the command line and are returned to the application. */
      gtk_init (&argc, &argv);

      /* Create a new window */
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

      /* This is a new call, which just sets the title of our
       * new window to "Hello Buttons!" */
      gtk_window_set_title (GTK_WINDOW (window), "Hello Buttons!");

      /* Here we just set a handler for delete_event that immediately
       * exits GTK. */
      gtk_signal_connect (GTK_OBJECT (window), "delete_event",
                          GTK_SIGNAL_FUNC (delete_event), NULL);

      /* Sets the border width of the window. */
      gtk_container_set_border_width (GTK_CONTAINER (window), 10);

      /* We create a box to pack widgets into.  This is described in detail
       * in the "packing" section. The box is not really visible, it
       * is just used as a tool to arrange widgets. */
      box1 = gtk_hbox_new(FALSE, 0);

      /* Put the box into the main window. */
      gtk_container_add (GTK_CONTAINER (window), box1);

      /* Creates a new button with the label "Button 1". */
      button = gtk_button_new_with_label ("Button 1");

      /* Now when the button is clicked, we call the "callback" function
       * with a pointer to "button 1" as its argument */
      gtk_signal_connect (GTK_OBJECT (button), "clicked",
                          GTK_SIGNAL_FUNC (callback), (gpointer) "button 1");

      /* Instead of gtk_container_add, we pack this button into the invisible
       * box, which has been packed into the window. */
      gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);

      /* Always remember this step, this tells GTK that our preparation for
       * this button is complete, and it can now be displayed. */
      gtk_widget_show(button);

      /* Do these same steps again to create a second button */
      button = gtk_button_new_with_label ("Button 2");

      /* Call the same callback function with a different argument,
       * passing a pointer to "button 2" instead. */
      gtk_signal_connect (GTK_OBJECT (button), "clicked",
                          GTK_SIGNAL_FUNC (callback), (gpointer) "button 2");

      gtk_box_pack_start(GTK_BOX(box1), button, TRUE, TRUE, 0);

      /* The order in which we show the buttons is not really important, but I
       * recommend showing the window last, so it all pops up at once. */
      gtk_widget_show(button);

      gtk_widget_show(box1);

      gtk_widget_show (window);

      /* Rest in gtk_main and wait for the fun to begin! */
      gtk_main ();

      return(0);
  }
  /* example-end */

Reply via email to