| GTK+ / Gnome Application Development | |||
|---|---|---|---|
| <<< Previous | Home | Next >>> | |
You can "attach" arbitrary string-pointer pairs to a GtkObject instance, in effect adding a new data member. GTK+ uses this some internally, but it can also be a convenient way to pass data around in your application. In particular, it's a nice way to pass information to callbacks.
Here's a simple example:
    GtkWidget* button = gtk_button_new();
    GtkWidget* label  = gtk_label_new(_("Foo"));
  
    gtk_object_set_data(GTK_OBJECT(button), "my_label_key", label); 
  
           | 
        
Later, when you have a pointer to the button but not the label (perhaps in a callback connected to the button's "clicked" signal), you can do this:
    GtkWidget* label = gtk_object_get_data(GTK_OBJECT(button),
                                           "my_label_key");
    /* If no data is found for the key, NULL is returned. */
    if (label == NULL)
      {
        g_warning("No data was associated with 'my_label_key'!");
      }
  
           | 
        
A pair of convenience functions use a predetermined key and thus save typing (and remembering) the object data key. These are gtk_object_set_user_data() and gtk_object_get_user_data(). You can also register a function to free the data when the data is removed or replaced, or the GtkObject is destroyed; This function should be of type GtkDestroyNotify:
typedef void (*GtkDestroyNotify) (gpointer data);  | 
        
Conveniently, g_free() and gtk_object_unref() will work here. You register a "destroy notification" function when you set the data, using gtk_object_set_data_full(). You can remove data before the object is destroyed with gtk_object_remove_data(), or remove it without calling the destroy function with gtk_object_remove_no_notify(). Setting the data to NULL is equivalent to removing it with gtk_object_remove_data(), and will also call the destroy function if you registered one. Figure 6 summarizes the object data functions.
It's worth pointing out that the object data system is a thin wrapper around the GData facility in glib, which can be used standalone.
#include <gtk/gtkobject.h>  | 
            
            void 
            gtk_object_set_data(GtkObject* object, const gchar* key, gpointer data);
            void 
            gtk_object_set_data_full(GtkObject* object, const gchar* key, gpointer data, GtkDestroyNotify destroy);
            void 
            gtk_object_remove_data(GtkObject* object, const gchar* key);
            gpointer gtk_object_get_data(GtkObject*
            object, const gchar*
            key);
            void 
            gtk_object_remove_no_notify(GtkObject* object, const gchar* key);
            void 
            gtk_object_set_user_data(GtkObject* object, gpointer data);
            gpointer 
            gtk_object_get_user_data(GtkObject* object);
Figure 6. Attaching key-value pairs to a GtkObject