diff options
Diffstat (limited to 'tools/glade/glade/glade_plugin.c')
-rw-r--r-- | tools/glade/glade/glade_plugin.c | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/tools/glade/glade/glade_plugin.c b/tools/glade/glade/glade_plugin.c new file mode 100644 index 00000000..ceae962b --- /dev/null +++ b/tools/glade/glade/glade_plugin.c @@ -0,0 +1,176 @@ +/* Gtk+ User Interface Builder + * Copyright (C) 1998-1999 Damon Chaplin + * + * 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 of the License, 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. + */ + +/* + * File : glade_plugin.c + * Description : Provides support for plugin widget libraries which use Args. + * Unfinished, experimental code at present. + * For Gnome, we may want to think about bonobo components, + * rather like COM/ActiveX components in Delphi/VB. + */ + +#include "gladeconfig.h" + +#ifndef _WIN32 +#include <gmodule.h> +#endif +#include <gtk/gtk.h> + +#include "gbwidget.h" +#include "glade_plugin.h" +#include "palette.h" +#include "utils.h" + + +/* This loads extra libraries of widgets which we will access via the GTK+ + Arg functions. */ +void +glade_plugin_load_plugins (void) +{ +#if 0 + /* FIXME: Here we just test for /usr/local/gnome/lib/libdruid.so, but we'll + support some user configuration later. */ + gchar *module_dir = "/usr/local/gnome/lib"; + gchar *module_file = "druid"; + + typedef gboolean (*GladePluginInitFunc) (gint **widget_types, + gchar ****xpm_data); + + GModule *module; + gchar *library_file; + gpointer symbol_value; + GladePluginInitFunc plugin_init_func; + gboolean status; + gint *widget_types; + gchar ***widget_xpms; + gint i; + + /* Check if dynamic loading is supported by the current platform. */ + if (!g_module_supported ()) + return; + + library_file = g_module_build_path (module_dir, module_file); + if (!glade_util_file_exists (library_file)) + return; + + module = g_module_open (library_file, 0); + g_return_if_fail (module != NULL); + + /* Try to find the initialization function. */ + if (!g_module_symbol (module, "glade_plugin_init", &symbol_value)) + { + g_warning ("Plugin library contains no initialization function: %s\n", + library_file); + return; + } + + plugin_init_func = (GladePluginInitFunc) symbol_value; + status = (*plugin_init_func) (&widget_types, &widget_xpms); + g_return_if_fail (status == TRUE); + + g_return_if_fail (widget_types != NULL); + + for (i = 0; widget_types[i]; i++) + { + GbWidget *gbwidget; + gchar *class_name; + + gbwidget = glade_plugin_new (); + if (widget_xpms) + { + gbwidget->pixmap_struct = widget_xpms[i]; + } + + class_name = gtk_type_name (widget_types[i]); + gbwidget->tooltip = class_name; + gb_widget_register_gbwidget (class_name, gbwidget); + palette_add_gbwidget (gbwidget, "Plugins", class_name); + } +#endif +} + + +/* This finds out which Args the widget (and any ancestors) support. */ +static void +glade_plugin_create_properties (GtkWidget * widget, + GbWidgetCreateArgData * data) +{ +#if 0 + GtkObjectClass *klass; + GtkArg *args; + guint32 *arg_flags; + guint n_args; + gint arg; + gchar flags[16], *pos; + GtkType type; + + g_print ("In glade_plugin_create_properties\n"); + + klass = GTK_OBJECT (widget)->klass; + g_return_if_fail (klass != NULL); + + type = klass->type; + while (type != 0) + { + args = gtk_object_query_args (type, &arg_flags, &n_args); + + for (arg = 0; arg < n_args; arg++) + { + pos = flags; + /* We use one-character flags for simplicity. */ + if (arg_flags[arg] & GTK_ARG_READABLE) + *pos++ = 'r'; + if (arg_flags[arg] & GTK_ARG_WRITABLE) + *pos++ = 'w'; + if (arg_flags[arg] & GTK_ARG_CONSTRUCT) + *pos++ = 'x'; + if (arg_flags[arg] & GTK_ARG_CONSTRUCT_ONLY) + *pos++ = 'X'; + if (arg_flags[arg] & GTK_ARG_CHILD_ARG) + *pos++ = 'c'; + *pos = '\0'; + + g_print ("ARG: %s (%s:%s)\n", + args[arg].name, gtk_type_name (args[arg].type), flags); + } + + g_free (args); + g_free (arg_flags); + + type = gtk_type_parent (type); + } +#endif +} + + +/* This creates a new GbWidget which may have different tooltip/icon fields, + but the functions will all be the same, since we can handle Args + generically. */ +GbWidget* +glade_plugin_new () +{ + GbWidget *gbwidget; + + gbwidget = g_new (GbWidget, 1); + gb_widget_init_struct (gbwidget); + gbwidget->gb_widget_create_properties = glade_plugin_create_properties; + + return gbwidget; +} + + |