I have a new function to add to libglade it basically just makes it
easier to use glade for things such as the following:

I define a struct that contains my application state.
then i normally using gtk would just pass this via
g_signal_connect to each callback.  using 
glade_xml_signal_autoconnect  I have no way of doing this.
I believe I can accomplish what I want using 
glade_xml_signal_autoconnect_full
however, this function requires quiet a bit of understanding more
then I the casual user cares to understand.  So, the solution to 
my problem was to add the following function:

glade_xml_signal_autoconnect_with_data (GladeXML *self, gpointer user_data);

which works just like glade_xml_signal_autoconnect just passes along
the user_data to the g_signal_connect functions.  

the patch provided is for what's currently in cvs.

hope this patch is useful

-todd

-------------------------------------------------
This mail sent through IMP: http://horde.org/imp/
? data.diff
Index: glade/glade-xml.c
===================================================================
RCS file: /cvs/gnome/libglade/glade/glade-xml.c,v
retrieving revision 1.104
diff -u -r1.104 glade-xml.c
--- glade/glade-xml.c	23 Jul 2003 14:48:48 -0000	1.104
+++ glade/glade-xml.c	24 Dec 2003 18:42:04 -0000
@@ -271,15 +271,21 @@
     }
 }
 
+/* used for passing both the module symbols and user data to each signal
+ * handler */
+typedef struct SymbolData{
+    GModule *allsymbols;
+    gpointer user_data;
+}SymbolData;
+
 static void
 autoconnect_foreach(const char *signal_handler, GList *signals,
-		    GModule *allsymbols)
+		    SymbolData *symdata)
 {
     GCallback func;
-
-    if (!g_module_symbol(allsymbols, signal_handler, (gpointer *)&func))
+    if (!g_module_symbol(symdata->allsymbols, signal_handler, (gpointer *)&func))
 	g_warning("could not find signal handler '%s'.", signal_handler);
-    else
+    else{
 	for (; signals != NULL; signals = signals->next) {
 	    GladeSignalData *data = signals->data;
 	    if (data->connect_object) {
@@ -296,12 +302,16 @@
 		 * be helpful for someone */
 		if (data->signal_after)
 		    g_signal_connect_after(data->signal_object,
-					   data->signal_name, func, NULL);
-		else
-		    g_signal_connect(data->signal_object, data->signal_name,
-				     func, NULL);
+					   data->signal_name, func, 
+					   symdata->user_data );
+		else{
+		    g_signal_connect(data->signal_object, 
+			             data->signal_name,
+				     func, symdata->user_data );
+		}
 	    }
 	}
+    }
 }
 
 /**
@@ -317,19 +327,28 @@
  * Note that this function will not work correctly if gmodule is not
  * supported on the platform.
  */
+
 void
-glade_xml_signal_autoconnect (GladeXML *self)
+glade_xml_signal_autoconnect_with_data (GladeXML *self, gpointer user_data)
 {
-    GModule *allsymbols;
+    SymbolData sym_data;
 
     g_return_if_fail(self != NULL);
     if (!g_module_supported())
 	g_error("glade_xml_signal_autoconnect requires working gmodule");
 
     /* get a handle on the main executable -- use this to find symbols */
-    allsymbols = g_module_open(NULL, 0);
-    g_hash_table_foreach(self->priv->signals, (GHFunc)autoconnect_foreach,
-			 allsymbols);
+    sym_data.allsymbols = g_module_open(NULL, 0);
+    g_return_if_fail(sym_data.allsymbols != NULL);
+
+    sym_data.user_data = user_data;
+    g_hash_table_foreach( self->priv->signals, (GHFunc)autoconnect_foreach,
+			 &sym_data );
+}
+void
+glade_xml_signal_autoconnect (GladeXML *self)
+{
+    glade_xml_signal_autoconnect_with_data( self, NULL );
 }
 
 
Index: glade/glade-xml.h
===================================================================
RCS file: /cvs/gnome/libglade/glade/glade-xml.h,v
retrieving revision 1.31
diff -u -r1.31 glade-xml.h
--- glade/glade-xml.h	26 Apr 2002 14:55:31 -0000	1.31
+++ glade/glade-xml.h	24 Dec 2003 18:42:04 -0000
@@ -81,6 +81,15 @@
  */
 void       glade_xml_signal_autoconnect  (GladeXML *self);
 
+/*
+ * basically the same as glade_xml_signal_autoconnect but passes
+ * a user data variable which gets connected to each signal handler
+ * useful if you'd like to maintain a single struct accross all 
+ * callback funtions.
+ */
+void       glade_xml_signal_autoconnect_with_data (GladeXML *self, 
+                                                   gpointer user_data);
+
 /* if the gtk_signal_connect_object behaviour is required, connect_object
  * will point to the object, otherwise it will be NULL.
  */

Reply via email to