diff options
Diffstat (limited to 'lib/ephy-glade.c')
-rw-r--r-- | lib/ephy-glade.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/lib/ephy-glade.c b/lib/ephy-glade.c new file mode 100644 index 000000000..beb91827f --- /dev/null +++ b/lib/ephy-glade.c @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2000 Marco Pesenti Gritti + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#include "ephy-glade.h" +#include "ephy-file-helpers.h" + +#include <glade/glade-xml.h> +#include <gtk/gtkmenu.h> +#include <gmodule.h> + +static void +glade_signal_connect_func (const gchar *cb_name, GObject *obj, + const gchar *signal_name, const gchar *signal_data, + GObject *conn_obj, gboolean conn_after, + gpointer user_data); + +/** + * ephy_widget_new: build a new widget of the provided name, with all + * signals attached and data set to the provided parameter. + */ +GladeXML * +ephy_glade_widget_new (const char *file, const char *widget_name, + GtkWidget **root, gpointer data) +{ + GladeXML *gxml; + const char *glade_file; + + glade_file = ephy_file (file); + g_return_val_if_fail (glade_file != NULL, NULL); + + /* build the widget */ + /* note that libglade automatically caches the parsed file, + * so we don't need to worry about the efficiency of this */ + gxml = glade_xml_new (glade_file, widget_name, NULL); + g_return_val_if_fail (gxml != NULL, NULL); + + /* lookup the root widget if requested */ + if (root != NULL) + { + *root = glade_xml_get_widget (gxml, widget_name); + } + + /* connect signals and data */ + glade_xml_signal_autoconnect_full + (gxml, (GladeXMLConnectFunc)glade_signal_connect_func, data); + + /* return xml document for subsequent widget lookups */ + return gxml; +} + +/* + * glade_signal_connect_func: used by glade_xml_signal_autoconnect_full + */ +static void +glade_signal_connect_func (const gchar *cb_name, GObject *obj, + const gchar *signal_name, const gchar *signal_data, + GObject *conn_obj, gboolean conn_after, + gpointer user_data) +{ + /** Module with all the symbols of the program */ + static GModule *mod_self = NULL; + gpointer handler_func; + + /* initialize gmodule */ + if (mod_self == NULL) + { + mod_self = g_module_open (NULL, 0); + g_assert (mod_self != NULL); + } + + /*g_print( "glade_signal_connect_func: cb_name = '%s', signal_name = '%s', signal_data = '%s'\n", + cb_name, signal_name, signal_data ); */ + + if (g_module_symbol (mod_self, cb_name, &handler_func)) + { + /* found callback */ + if (conn_obj) + { + if (conn_after) + { + g_signal_connect_object + (obj, signal_name, + handler_func, conn_obj, + G_CONNECT_AFTER); + } + else + { + g_signal_connect_object + (obj, signal_name, + handler_func, conn_obj, + G_CONNECT_SWAPPED); + } + } + else + { + /* no conn_obj; use standard connect */ + gpointer data = NULL; + + data = user_data; + + if (conn_after) + { + g_signal_connect_after + (obj, signal_name, + handler_func, data); + } + else + { + g_signal_connect + (obj, signal_name, + handler_func, data); + } + } + } + else + { + g_warning("callback function not found: %s", cb_name); + } +} |