summaryrefslogtreecommitdiff
path: root/tools/glade/glade/glade_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/glade/glade/glade_plugin.c')
-rw-r--r--tools/glade/glade/glade_plugin.c176
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;
+}
+
+