aboutsummaryrefslogblamecommitdiffstats
path: root/lib/ephy-glade.c
blob: beb91827fe0a47de3374fdb88153bb70d160edf8 (plain) (tree)





































































































































                                                                                                         
/*
 *  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);
    }
}