read the name of the plugin to be used by each catalog and pass it to the

* src/glade-catalog.c: read the name of the plugin to be used by each
	catalog and pass it to the constructor of glade-widget-class.  Also
	if a specific class has a specific plugin name to be used, use it instead
	of the generic of the whole catalog.
	* src/glade-gtk.c: remove the "static" from the functions that should
	be exported, and remove the "temp hack" that was used to load the
	address of the functions, as it's no more needed.
	* src/glade-property-class.c: remove glade_property_class_get_{get,set}_function
	and use g_module_symbol instead.
	* src/glade-widget-class.c: use g_module_symbol instead of the previous {get,set}
	functions.  Remove unused functions.  Rename glade_widget_class_new_from_name2
	to glade_widget_class_new as it's the only constructor.  Use the plugin
	name that glade-widget-class passed to the constructor and load it.
	* src/glade-widget-class.h: add a GModule* by GladeWidgetClass.
	* src/glade-widget.c: remove the #include <glade-gtk.h>
	* widgets/gtk-additional.xml: add the name of the plugin ("gtk") for all the
	widgets on gtk-additional.
	* widgets/gtk-base.xml: ditto
	* widgets/gtkwidget.xml: remove the "name" tag, as it's not need.
	* widgets/gtkwindow.xml: change glade_gtk_widget_{get,set}_tooltip by "ignore",
	as that's what these functions do.
This commit is contained in:
Joaquín Cuenca Abela 2003-10-04 10:36:31 +00:00
parent 8f8dd5f0d7
commit 7342e79cff
15 changed files with 192 additions and 338 deletions

View File

@ -1,3 +1,27 @@
2003-10-04 Joaquin Cuenca Abela <e98cuenc@yahoo.com>
* src/glade-catalog.c: read the name of the plugin to be used by each
catalog and pass it to the constructor of glade-widget-class. Also
if a specific class has a specific plugin name to be used, use it instead
of the generic of the whole catalog.
* src/glade-gtk.c: remove the "static" from the functions that should
be exported, and remove the "temp hack" that was used to load the
address of the functions, as it's no more needed.
* src/glade-property-class.c: remove glade_property_class_get_{get,set}_function
and use g_module_symbol instead.
* src/glade-widget-class.c: use g_module_symbol instead of the previous {get,set}
functions. Remove unused functions. Rename glade_widget_class_new_from_name2
to glade_widget_class_new as it's the only constructor. Use the plugin
name that glade-widget-class passed to the constructor and load it.
* src/glade-widget-class.h: add a GModule* by GladeWidgetClass.
* src/glade-widget.c: remove the #include <glade-gtk.h>
* widgets/gtk-additional.xml: add the name of the plugin ("gtk") for all the
widgets on gtk-additional.
* widgets/gtk-base.xml: ditto
* widgets/gtkwidget.xml: remove the "name" tag, as it's not need.
* widgets/gtkwindow.xml: change glade_gtk_widget_{get,set}_tooltip by "ignore",
as that's what these functions do.
2003-09-02 Paolo Borelli <pborelli@katamail.com>
* src/glade.h: add the internal child tag.

View File

@ -15,4 +15,5 @@
#undef PIXMAPS_DIR
#undef WIDGETS_DIR
#undef CATALOGS_DIR
#undef MODULES_DIR
#undef GETTEXT_PACKAGE

View File

@ -2,7 +2,8 @@
#define CONFIG_H__
#define PIXMAPS_DIR "./pixmaps"
#define CATALOGS_DIR "./catalog"
#define CATALOGS_DIR "./catalog"
#define WIDGETS_DIR "./widgets"
#define MODULES_DIR "./modules"
#endif

View File

@ -12,13 +12,14 @@ AC_PROG_INTLTOOL([0.11])
GNOME_COMMON_INIT
GNOME_PLATFORM_GNOME_2(yes, force)
AM_PROG_LIBTOOL
AC_ISC_POSIX
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_LIBTOOL_DLOPEN
AC_PROG_LIBTOOL
AC_CHECK_HEADERS(os2.h)
dnl ================================================================
@ -77,9 +78,19 @@ else
catalogsdir="${prefix}/${DATADIRNAME}/${PACKAGE}-${VERSION}/catalogs"
fi
dnl ================================================================
dnl MODULES
dnl ================================================================
if test "x${libdir}" = "xNONE"; then
modulesdir="${ac_default_libdir}/${PACKAGE}"
else
modulesdir="${libdir}/${PACKAGE}"
fi
AC_SUBST(pixmapsdir)
AC_SUBST(widgetsdir)
AC_SUBST(catalogsdir)
AC_SUBST(modulesdir)
AC_OUTPUT([
Makefile

View File

@ -3,6 +3,12 @@ SUBDIRS=
bin_PROGRAMS = glade-3
gladegtk_LTLIBRARIES = libgladegtk.la
gladegtkdir = $(modulesdir)
libgladegtk_la_SOURCES = glade-gtk.c
libgladegtk_la_LDFLAGS = -module -avoid-version
INCLUDES = \
-I$(top_srcdir) \
-I$(top_builddir) \
@ -13,6 +19,7 @@ INCLUDES = \
-DGLADE_ICONDIR=\""$(datadir)/pixmaps"\" \
-DGLADE_LOCALSTATEDIR=\""$(localstatedir)"\" \
-DGLADE_LOCALEDIR=\""$(datadir)/locale"\" \
-DMODULES_DIR=\""@modulesdir@"\" \
-DG_LOG_DOMAIN=\"Glade\"
CFLAGS = -g -O2 -Wall
@ -39,7 +46,6 @@ glade_3_SOURCES = \
glade-catalog.c \
glade-choice.c \
glade-editor.c \
glade-gtk.c \
glade-utils.c \
glade-signal.c \
glade-signal-editor.c \
@ -69,7 +75,6 @@ noinst_HEADERS = \
glade-property-class.h \
glade-popup.h \
glade-choice.h \
glade-gtk.h \
glade-catalog.h \
glade-utils.h \
glade-signal.h \

View File

@ -37,7 +37,6 @@
#define GLADE_TAG_PALETTE "GladePalette"
static GList *glade_catalog_list = NULL; /* A list of GladeCatalog items */
static GList *widget_class_list = NULL; /* A list of all the GladeWidgetClass objects loaded */
GList *
@ -80,12 +79,14 @@ glade_catalog_load (const char *base_catalog_filename)
char *generic_name = NULL;
char *catalog_filename = NULL;
char *base_filename = NULL;
char *partial_library = NULL;
char *base_library = NULL;
GList *last_widget_class = NULL;
catalog_filename = g_strdup_printf ("%s%c%s", CATALOGS_DIR, G_DIR_SEPARATOR, base_catalog_filename);
if (catalog_filename == NULL)
{
g_critical ("Not enough memory.");
g_critical (_("Not enough memory."));
goto lblError;
}
@ -93,7 +94,7 @@ glade_catalog_load (const char *base_catalog_filename)
context = glade_xml_context_new_from_path (catalog_filename, NULL, GLADE_TAG_CATALOG);
if (context == NULL)
{
g_warning ("Impossible to open the catalog [%s].", catalog_filename);
g_warning (_("Impossible to open the catalog [%s]."), catalog_filename);
goto lblError;
}
@ -104,7 +105,7 @@ glade_catalog_load (const char *base_catalog_filename)
catalog = g_new0 (GladeCatalog, 1);
if (catalog == NULL)
{
g_critical ("Not enough memory.");
g_critical (_("Not enough memory."));
goto lblError;
}
@ -115,14 +116,29 @@ glade_catalog_load (const char *base_catalog_filename)
if (!glade_xml_node_verify (root, GLADE_TAG_CATALOG))
{
g_warning ("The root node of [%s] has a name different from %s.", catalog_filename, GLADE_TAG_CATALOG);
g_warning (_("The root node of [%s] has a name different from %s."), catalog_filename, GLADE_TAG_CATALOG);
goto lblError;
}
/* get the library to be used by this catalog (if any) */
partial_library = glade_xml_get_property_string (root, "library");
if (partial_library && *partial_library)
{
base_library = g_strdup_printf ("libglade%s", partial_library);
if (!base_library)
{
g_critical (_("Not enough memory."));
goto lblError;
}
}
/* build all the GladeWidgetClass'es associated with this catalog */
widget_node = glade_xml_node_get_children (root);
for (; widget_node != NULL; widget_node = glade_xml_node_next (widget_node))
{
char *partial_widget_class_library = NULL;
char *base_widget_class_library = NULL;
if (!glade_xml_node_verify (widget_node, GLADE_TAG_GLADE_WIDGET))
continue;
@ -130,10 +146,23 @@ glade_catalog_load (const char *base_catalog_filename)
if (name == NULL)
continue;
/* get the specific library to the widget class, if any */
partial_widget_class_library = glade_xml_get_property_string (widget_node, "library");
if (partial_widget_class_library && *partial_widget_class_library)
{
base_widget_class_library = g_strdup_printf ("libglade%s", partial_widget_class_library);
if (!base_widget_class_library)
{
g_critical (_("Not enough memory."));
continue;
}
}
generic_name = glade_xml_get_property_string (widget_node, "generic_name");
base_filename = glade_xml_get_property_string (widget_node, "filename");
widget_class = glade_widget_class_new_from_name2 (name, generic_name, base_filename);
widget_class = glade_widget_class_new (name, generic_name, base_filename,
base_widget_class_library ? base_widget_class_library : base_library);
if (widget_class)
{
last_widget_class = g_list_append (last_widget_class, widget_class);
@ -147,6 +176,8 @@ glade_catalog_load (const char *base_catalog_filename)
g_free (name);
g_free (generic_name);
g_free (base_filename);
g_free (partial_widget_class_library);
g_free (base_widget_class_library);
}
glade_xml_context_free (context);
@ -157,6 +188,8 @@ lblError:
glade_xml_context_free (context);
g_free (catalog_filename);
g_free (catalog);
g_free (partial_library);
g_free (base_library);
return NULL;
}

View File

@ -34,7 +34,7 @@
#include "glade-command.h"
static void
void
glade_gtk_entry_set_text (GObject *object, GValue *value)
{
GtkEditable *editable = GTK_EDITABLE (object);
@ -54,7 +54,7 @@ glade_gtk_entry_set_text (GObject *object, GValue *value)
gtk_editable_set_position (editable, pos);
}
static void
void
glade_gtk_entry_get_text (GObject *object, GValue *value)
{
GtkEntry *entry = GTK_ENTRY (object);
@ -68,7 +68,7 @@ glade_gtk_entry_get_text (GObject *object, GValue *value)
g_value_set_string (value, text);
}
static void
void
glade_gtk_option_menu_set_items (GObject *object, GValue *value)
{
GtkOptionMenu *option_menu;
@ -107,7 +107,7 @@ glade_gtk_option_menu_set_items (GObject *object, GValue *value)
}
static void
void
glade_gtk_progress_bar_set_format (GObject *object, GValue *value)
{
GtkProgressBar *bar;
@ -119,7 +119,7 @@ glade_gtk_progress_bar_set_format (GObject *object, GValue *value)
gtk_progress_set_format_string (GTK_PROGRESS (bar), format);
}
static void
void
glade_gtk_spin_button_set_max (GObject *object, GValue *value)
{
GtkAdjustment *adjustment;
@ -131,7 +131,7 @@ glade_gtk_spin_button_set_max (GObject *object, GValue *value)
}
static void
void
glade_gtk_spin_button_set_min (GObject *object, GValue *value)
{
GtkAdjustment *adjustment;
@ -142,7 +142,7 @@ glade_gtk_spin_button_set_min (GObject *object, GValue *value)
gtk_adjustment_changed (adjustment);
}
static void
void
glade_gtk_spin_button_set_step_increment (GObject *object, GValue *value)
{
GtkAdjustment *adjustment;
@ -153,7 +153,7 @@ glade_gtk_spin_button_set_step_increment (GObject *object, GValue *value)
gtk_adjustment_changed (adjustment);
}
static void
void
glade_gtk_spin_button_set_page_increment (GObject *object, GValue *value)
{
GtkAdjustment *adjustment;
@ -164,7 +164,7 @@ glade_gtk_spin_button_set_page_increment (GObject *object, GValue *value)
gtk_adjustment_changed (adjustment);
}
static void
void
glade_gtk_spin_button_set_page_size (GObject *object, GValue *value)
{
GtkAdjustment *adjustment;
@ -176,7 +176,7 @@ glade_gtk_spin_button_set_page_size (GObject *object, GValue *value)
}
static void
void
glade_gtk_box_get_size (GObject *object, GValue *value)
{
GtkBox *box;
@ -189,7 +189,7 @@ glade_gtk_box_get_size (GObject *object, GValue *value)
g_value_set_int (value, g_list_length (box->children));
}
static void
void
glade_gtk_box_set_size (GObject *object, GValue *value)
{
GladeWidget *widget;
@ -238,7 +238,7 @@ glade_gtk_box_set_size (GObject *object, GValue *value)
g_object_set_data (object, "glade_nb_placeholders", GINT_TO_POINTER (new_size));
}
static void
void
glade_gtk_notebook_get_n_pages (GObject *object, GValue *value)
{
GtkNotebook *notebook;
@ -251,7 +251,7 @@ glade_gtk_notebook_get_n_pages (GObject *object, GValue *value)
g_value_set_int (value, g_list_length (notebook->children));
}
static void
void
glade_gtk_notebook_set_n_pages (GObject *object, GValue *value)
{
GladeWidget *widget;
@ -310,7 +310,7 @@ glade_gtk_notebook_set_n_pages (GObject *object, GValue *value)
#if 0
/* This code is working but i don't think we need it. Chema */
static void
void
glade_gtk_table_get_n_rows (GObject *object, GValue *value)
{
GtkTable *table;
@ -323,7 +323,7 @@ glade_gtk_table_get_n_rows (GObject *object, GValue *value)
g_value_set_int (value, table->nrows);
}
static void
void
glade_gtk_table_get_n_columns (GObject *object, GValue *value)
{
GtkTable *table;
@ -337,7 +337,7 @@ glade_gtk_table_get_n_columns (GObject *object, GValue *value)
}
#endif
static void
void
glade_gtk_table_set_n_common (GObject *object, GValue *value, gboolean for_rows)
{
GladeWidget *widget;
@ -408,19 +408,19 @@ glade_gtk_table_set_n_common (GObject *object, GValue *value, gboolean for_rows)
g_object_set_data (object, "glade_nb_placeholders", GINT_TO_POINTER (new_size * (for_rows ? table->ncols : table->nrows)));
}
static void
void
glade_gtk_table_set_n_rows (GObject *object, GValue *value)
{
glade_gtk_table_set_n_common (object, value, TRUE);
}
static void
void
glade_gtk_table_set_n_columns (GObject *object, GValue *value)
{
glade_gtk_table_set_n_common (object, value, FALSE);
}
static void
void
glade_gtk_button_set_stock (GObject *object, GValue *value)
{
GladeWidget *glade_widget;
@ -486,14 +486,19 @@ glade_gtk_button_set_stock (GObject *object, GValue *value)
}
}
static void
void
empty (GObject *object, GValue *value)
{
}
void
ignore (GObject *object, GValue *value)
{
}
/* ------------------------------------ Post Create functions ------------------------------ */
static void
void
glade_gtk_window_post_create (GObject *object, GValue *not_used)
{
GtkWindow *window = GTK_WINDOW (object);
@ -503,7 +508,7 @@ glade_gtk_window_post_create (GObject *object, GValue *not_used)
gtk_window_set_default_size (window, 440, 250);
}
static void
void
glade_gtk_dialog_post_create (GObject *object, GValue *not_used)
{
GtkDialog *dialog = GTK_DIALOG (object);
@ -513,7 +518,7 @@ glade_gtk_dialog_post_create (GObject *object, GValue *not_used)
gtk_window_set_default_size (GTK_WINDOW (dialog), 320, 260);
}
static void
void
glade_gtk_message_dialog_post_create (GObject *object, GValue *not_used)
{
GtkMessageDialog *dialog = GTK_MESSAGE_DIALOG (object);
@ -523,7 +528,7 @@ glade_gtk_message_dialog_post_create (GObject *object, GValue *not_used)
gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 115);
}
static void
void
glade_gtk_check_button_post_create (GObject *object, GValue *not_used)
{
GtkCheckButton *button = GTK_CHECK_BUTTON (object);
@ -538,7 +543,7 @@ glade_gtk_check_button_post_create (GObject *object, GValue *not_used)
}
static void
void
glade_gtk_table_post_create (GObject *object, GValue *value)
{
GtkTable *table = GTK_TABLE (object);
@ -561,94 +566,3 @@ glade_gtk_table_post_create (GObject *object, GValue *value)
}
}
/* ================ Temp hack =================== */
/* We have this table, but what we should do is use gmodule for this,
* however this requires that we link with libtool cause right now
* we are loosing the symbols. Chema
*/
typedef struct _GladeGtkFunction GladeGtkFunction;
struct _GladeGtkFunction {
const gchar *name;
void (* function) (GObject *object, GValue *value);
};
#define GLADE_NEW_FUNCTION(name) {#name, name}
#define GLADE_NEW_EMPTY_FUNCTION(name) {#name, empty}
GladeGtkFunction functions [] = {
GLADE_NEW_FUNCTION(glade_gtk_entry_get_text),
GLADE_NEW_FUNCTION(glade_gtk_box_get_size),
GLADE_NEW_EMPTY_FUNCTION(glade_gtk_widget_get_tooltip),
GLADE_NEW_FUNCTION(glade_gtk_button_set_stock),
#if 0
GLADE_NEW_FUNCTION(glade_gtk_table_get_n_rows),
GLADE_NEW_FUNCTION(glade_gtk_table_get_n_columns),
#endif
GLADE_NEW_FUNCTION(glade_gtk_table_set_n_rows),
GLADE_NEW_FUNCTION(glade_gtk_table_set_n_columns),
GLADE_NEW_FUNCTION(glade_gtk_entry_set_text),
GLADE_NEW_FUNCTION(glade_gtk_option_menu_set_items),
GLADE_NEW_FUNCTION(glade_gtk_progress_bar_set_format),
GLADE_NEW_FUNCTION(glade_gtk_box_set_size),
GLADE_NEW_EMPTY_FUNCTION(glade_gtk_widget_set_tooltip),
GLADE_NEW_EMPTY_FUNCTION(ignore), /* For example for gtkwindow::modal, we want to ignore the set */
GLADE_NEW_FUNCTION(glade_gtk_notebook_get_n_pages),
GLADE_NEW_FUNCTION(glade_gtk_notebook_set_n_pages),
GLADE_NEW_FUNCTION(glade_gtk_spin_button_set_max),
GLADE_NEW_FUNCTION(glade_gtk_spin_button_set_min),
GLADE_NEW_FUNCTION(glade_gtk_spin_button_set_step_increment),
GLADE_NEW_FUNCTION(glade_gtk_spin_button_set_page_increment),
GLADE_NEW_FUNCTION(glade_gtk_spin_button_set_page_size),
GLADE_NEW_FUNCTION(glade_gtk_check_button_post_create),
GLADE_NEW_FUNCTION(glade_gtk_window_post_create),
GLADE_NEW_FUNCTION(glade_gtk_dialog_post_create),
GLADE_NEW_FUNCTION(glade_gtk_message_dialog_post_create),
GLADE_NEW_FUNCTION(glade_gtk_table_post_create)
};
#undef GLADE_NEW_FUNCTION
#undef GLADE_NEW_EMPTY_FUNCTION
gpointer
glade_gtk_get_function (const gchar *name)
{
gint num;
gint i;
num = sizeof (functions) / sizeof (GladeGtkFunction);
for (i = 0; i < num; i++) {
if (strcmp (name, functions[i].name) == 0)
break;
}
if (i == num) {
g_warning ("Could not find the function %s\n",
name);
return NULL;
}
return functions[i].function;
}
gboolean
glade_gtk_get_set_function_hack (GladePropertyClass *class, const gchar *name)
{
class->set_function = glade_gtk_get_function (name);
return TRUE;
}
gboolean
glade_gtk_get_get_function_hack (GladePropertyClass *class, const gchar *name)
{
class->get_function = glade_gtk_get_function (name);
return TRUE;
}

View File

@ -35,7 +35,6 @@
#include "glade-parameter.h"
#include "glade-property.h"
#include "glade-property-class.h"
#include "glade-gtk.h"
#include "glade-debug.h"
#if 0
@ -842,39 +841,6 @@ glade_property_class_load_from_param_spec (const gchar *name,
}
#endif
static gboolean
glade_property_class_get_get_function (GladePropertyClass *class, const gchar *function_name)
{
return glade_gtk_get_get_function_hack (class, function_name);
}
static gboolean
glade_property_class_get_set_function (GladePropertyClass *class, const gchar *function_name)
{
static GModule *allsymbols;
/* This is not working ... So add a temp hack */
return glade_gtk_get_set_function_hack (class, function_name);
g_return_val_if_fail (GLADE_IS_PROPERTY_CLASS (class), FALSE);
g_return_val_if_fail (class->set_function == NULL, FALSE);
g_return_val_if_fail (function_name != NULL, FALSE);
if (!allsymbols)
allsymbols = g_module_open (NULL, 0);
if (!g_module_symbol (allsymbols, function_name,
(gpointer) &class->set_function)) {
g_warning (_("We could not find the symbol \"%s\" while trying to load \"%s\""),
function_name, class->name);
return FALSE;
}
g_assert (class->set_function);
return TRUE;
}
static GList *
glade_xml_read_list (GladeXmlNode *node, const gchar *list_tag, const gchar *item_tag)
{
@ -1006,6 +972,7 @@ glade_property_class_update_from_node (GladeXmlNode *node,
*property_class = pproperty_class;
}
else {
#if 0
/* If the property is an object Load it */
if (pproperty_class->type == GLADE_PROPERTY_TYPE_OBJECT) {
child = glade_xml_search_child_required (node, GLADE_TAG_GLADE_WIDGET_CLASS);
@ -1017,6 +984,7 @@ glade_property_class_update_from_node (GladeXmlNode *node,
pproperty_class->child = glade_widget_class_new_from_node (child);
}
#endif
pproperty_class->def = glade_property_class_get_default (node, pproperty_class);
glade_property_class_free (*property_class);
@ -1056,20 +1024,41 @@ glade_property_class_update_from_node (GladeXmlNode *node,
/* If this property can't be set with g_object_set, get the workarround
* function
*/
/* I use here a g_warning to signal these errors instead of a dialog box, as if there is one
* of this kind of errors, there will probably a lot of them, and we don't want to inflict
* the user the pain of plenty of dialog boxes. Ideally, we should collect these errors,
* and show all of them at the end of the load processus. */
child = glade_xml_search_child (node, GLADE_TAG_SET_FUNCTION);
if (child != NULL) {
gchar * content = glade_xml_get_content (child);
glade_property_class_get_set_function (pproperty_class, content);
g_free (content);
gchar *symbol_name = glade_xml_get_content (child);
if (!widget_class->module)
g_warning (_("The property [%s] of the widget's class [%s] needs a special \"set\" function, but there is no library associated to this widget's class."),
pproperty_class->name, widget_class->name);
if (!g_module_symbol (widget_class->module, symbol_name, (gpointer *) &pproperty_class->set_function))
g_warning (_("Unable to get the \"set\" function [%s] of the property [%s] of the widget's class [%s] from the module [%s]: %s"),
symbol_name, pproperty_class->name, widget_class->name, g_module_name (widget_class->module), g_module_error ());
g_free (symbol_name);
}
/* If this property can't be get with g_object_get, get the workarround
* function
*/
child = glade_xml_search_child (node, GLADE_TAG_GET_FUNCTION);
if (child != NULL) {
gchar * content = glade_xml_get_content (child);
glade_property_class_get_get_function (pproperty_class, content);
g_free (content);
gchar *symbol_name = glade_xml_get_content (child);
if (!widget_class->module)
g_warning (_("The property [%s] of the widget's class [%s] needs a special \"get\" function, but there is no library associated to this widget's class."),
pproperty_class->name, widget_class->name);
if (!g_module_symbol(widget_class->module, symbol_name, (gpointer *) &pproperty_class->get_function))
g_warning (_("Unable to get the \"get\" function [%s] of the property [%s] of the widget's class [%s] from the module [%s]: %s"),
symbol_name, pproperty_class->name, widget_class->name, g_module_name (widget_class->module), g_module_error ());
g_free (symbol_name);
}
return;

View File

@ -44,7 +44,6 @@
#include "glade-catalog.h"
#include "glade-choice.h"
#include "glade-parameter.h"
#include "glade-gtk.h"
#include "glade-debug.h"
/* hash table that will contain all the GtkWidgetClass'es created, indexed by its name */
@ -83,21 +82,6 @@ glade_widget_class_compose_get_type_func (GladeWidgetClass *class)
return retval;
}
static GladeWidgetClass *
glade_widget_class_new (void)
{
GladeWidgetClass *class;
class = g_new0 (GladeWidgetClass, 1);
class->flags = 0;
class->placeholder_replace = NULL;
class->type = 0;
class->properties = NULL;
class->child_properties = NULL;
return class;
}
void
glade_widget_class_free (GladeWidgetClass *widget_class)
{
@ -277,29 +261,6 @@ glade_widget_class_list_signals (GladeWidgetClass *class)
return signals;
}
static gboolean
glade_widget_class_set_type (GladeWidgetClass *class,
const gchar *init_function_name)
{
GType type;
class->type = 0;
g_return_val_if_fail (GLADE_IS_WIDGET_CLASS (class), FALSE);
g_return_val_if_fail (init_function_name != NULL, FALSE);
type = glade_util_get_type_from_name (init_function_name);
if (type == 0)
return FALSE;
class->type = type;
if (type == 0)
return FALSE;
return TRUE;
}
static void
glade_widget_class_add_virtual_methods (GladeWidgetClass *class)
{
@ -309,83 +270,6 @@ glade_widget_class_add_virtual_methods (GladeWidgetClass *class)
glade_placeholder_add_methods_to_class (class);
}
GladeWidgetClass *
glade_widget_class_new_from_node (GladeXmlNode *node)
{
GladeWidgetClass *class;
GladeXmlNode *child;
gchar *init_function_name;
gchar *post_create_function_name;
if (!glade_xml_node_verify (node, GLADE_TAG_GLADE_WIDGET_CLASS))
return NULL;
class = glade_widget_class_new ();
class->name = glade_xml_get_value_string_required (node, GLADE_TAG_NAME, NULL);
class->generic_name = glade_xml_get_value_string_required (node, GLADE_TAG_GENERIC_NAME, NULL);
if (!class->name || !class->generic_name) {
g_warning ("Invalid XML file. Widget Class %s\n", class->name);
return NULL;
}
init_function_name = glade_xml_get_value_string (node, GLADE_TAG_GET_TYPE_FUNCTION);
if (!init_function_name) {
init_function_name = glade_widget_class_compose_get_type_func (class);
if (!init_function_name)
return FALSE;
}
if (!glade_widget_class_set_type (class, init_function_name))
return NULL;
g_free (init_function_name);
/* Properties.
* if needed add/override properties listed in the xml file.
*/
class->properties = glade_widget_class_list_properties (class);
child = glade_xml_search_child (node, GLADE_TAG_PROPERTIES);
if (child)
glade_property_class_list_add_from_node (child, class, &class->properties);
/* Child properties */
/* TODO: we probably want to override/add some packing properties from
* the xml file like we do foe normal properties, in other words we may
* need a function similar to glade_property_class_list_add_from_node
*/
class->child_properties = glade_widget_class_list_child_properties (class);
/* Signals */
class->signals = glade_widget_class_list_signals (class);
/* Get the flags */
if (glade_xml_get_boolean (node, GLADE_TAG_TOPLEVEL, FALSE))
GLADE_WIDGET_CLASS_SET_FLAGS (class, GLADE_TOPLEVEL);
else
GLADE_WIDGET_CLASS_UNSET_FLAGS (class, GLADE_TOPLEVEL);
if (glade_xml_get_boolean (node, GLADE_TAG_PLACEHOLDER, FALSE))
GLADE_WIDGET_CLASS_SET_FLAGS (class, GLADE_ADD_PLACEHOLDER);
else
GLADE_WIDGET_CLASS_UNSET_FLAGS (class, GLADE_ADD_PLACEHOLDER);
/* placeholder_replace */
glade_widget_class_add_virtual_methods (class);
/* PostCreateFunction */
post_create_function_name = glade_xml_get_value_string (node, GLADE_TAG_POST_CREATE_FUNCTION);
if (post_create_function_name) {
class->post_create_function = glade_gtk_get_function (post_create_function_name);
if (!class->post_create_function)
g_warning ("Could not find %s\n", post_create_function_name);
}
g_free (post_create_function_name);
class->in_palette = glade_xml_get_boolean (node, GLADE_TAG_IN_PALETTE, TRUE);
return class;
}
static GtkWidget *
glade_widget_class_create_icon (GladeWidgetClass *class)
{
@ -426,9 +310,8 @@ glade_widget_class_extend_with_file (GladeWidgetClass *widget_class, const char
node = glade_xml_doc_get_root (doc);
post_create_function_name = glade_xml_get_value_string (node, GLADE_TAG_POST_CREATE_FUNCTION);
if (post_create_function_name) {
widget_class->post_create_function = glade_gtk_get_function (post_create_function_name);
if (!widget_class->post_create_function)
if (post_create_function_name && widget_class->module) {
if (!g_module_symbol (widget_class->module, post_create_function_name, (void **) &widget_class->post_create_function))
g_warning ("Could not find %s\n", post_create_function_name);
}
g_free (post_create_function_name);
@ -464,7 +347,7 @@ glade_widget_class_store_with_name (GladeWidgetClass *widget_class)
}
/**
* glade_widget_class_get_from_name:
* glade_widget_class_get_by_name:
* @name: name of the widget class (for instance: GtkButton)
*
* Returns an already created GladeWidgetClass with the name passed as argument.
@ -545,8 +428,8 @@ glade_widget_class_remove_duplicated_properties (GladeWidgetClass *widget_class)
GList *old_property;
/* if it's the first time we see this property, then we add it to the list of
* properties that we will keep the property. Idem if the last time we saw
* this property it was not modified, and this time the property is modified
* properties that we will keep for this widget. Idem if the last time we saw
* this property, it was not modified, and this time the property is modified
* (ie, we change the non modified property by the modified one). */
if ((old_property = g_hash_table_lookup (hash_properties, property_class->id)) == NULL ||
(!((GladePropertyClass*) old_property->data)->is_modified && property_class->is_modified))
@ -582,7 +465,7 @@ glade_widget_class_remove_duplicated_properties (GladeWidgetClass *widget_class)
}
/**
* glade_widget_class_new_from_name2:
* glade_widget_class_new:
* @name: name of the widget class (for instance: GtkButton)
* @generic_name: base of the name for the widgets of this class (for instance: button).
* This parameter is optional. For abstract classes there is no need to supply a generic_name.
@ -597,17 +480,16 @@ glade_widget_class_remove_duplicated_properties (GladeWidgetClass *widget_class)
* the xml filename.
*
* Return Value: The new GladeWidgetClass, or %NULL if there are any errors.
*
* TODO: this function should replace glade_widget_class_new_from_name & new_from_node
* when done, we should of course rename it.
**/
GladeWidgetClass *
glade_widget_class_new_from_name2 (const char *name,
const char *generic_name,
const char *base_filename)
glade_widget_class_new (const char *name,
const char *generic_name,
const char *base_filename,
const char *base_library)
{
GladeWidgetClass *widget_class = NULL;
char *filename = NULL;
char *library = NULL;
char *init_function_name = NULL;
GType parent_type;
@ -621,18 +503,26 @@ glade_widget_class_new_from_name2 (const char *name,
if (base_filename != NULL) {
filename = g_strconcat (WIDGETS_DIR, "/", base_filename, NULL);
if (filename == NULL) {
g_warning ("Not enough memory.");
g_warning (_("Not enough memory."));
goto lblError;
}
}
widget_class = glade_widget_class_new ();
if (base_library != NULL) {
library = g_strconcat (MODULES_DIR G_DIR_SEPARATOR_S, base_library, NULL);
if (library == NULL) {
g_warning (_("Not enough memory."));
goto lblError;
}
}
widget_class = g_new0 (GladeWidgetClass, 1);
if (!widget_class) {
g_warning ("Not enough memory.");
g_warning (_("Not enough memory."));
goto lblError;
}
widget_class->generic_name = g_strdup (generic_name);
widget_class->generic_name = generic_name ? g_strdup (generic_name) : NULL;
widget_class->name = g_strdup (name);
widget_class->in_palette = generic_name ? TRUE : FALSE;
@ -641,7 +531,7 @@ glade_widget_class_new_from_name2 (const char *name,
* type is to call foo_bar_get_type() */
init_function_name = glade_widget_class_compose_get_type_func (widget_class);
if (!init_function_name) {
g_warning ("Not enough memory.");
g_warning (_("Not enough memory."));
goto lblError;
}
@ -665,6 +555,14 @@ glade_widget_class_new_from_name2 (const char *name,
widget_class->icon = glade_widget_class_create_icon (widget_class);
if (library != NULL) {
widget_class->module = g_module_open (library, G_MODULE_BIND_LAZY);
if (!widget_class->module) {
g_warning (_("Unable to open the module %s."), library);
goto lblError;
}
}
/* if there is an associated filename, then open and parse it */
if (filename != NULL)
glade_widget_class_extend_with_file (widget_class, filename);
@ -693,36 +591,12 @@ glade_widget_class_new_from_name2 (const char *name,
lblError:
g_free (filename);
g_free (library);
g_free (init_function_name);
glade_widget_class_free (widget_class);
return NULL;
}
GladeWidgetClass *
glade_widget_class_new_from_name (const gchar *name)
{
GladeWidgetClass *class;
GladeXmlContext *context;
GladeXmlDoc *doc;
gchar *file_name;
file_name = g_strconcat (WIDGETS_DIR, "/", name, ".xml", NULL);
context = glade_xml_context_new_from_path (file_name, NULL, GLADE_TAG_GLADE_WIDGET_CLASS);
if (!context)
return NULL;
doc = glade_xml_context_get_doc (context);
class = glade_widget_class_new_from_node (glade_xml_doc_get_root (doc));
class->xml_file = g_strdup (name);
glade_xml_context_free (context);
class->icon = glade_widget_class_create_icon (class);
g_free (file_name);
return class;
}
const gchar *
glade_widget_class_get_name (GladeWidgetClass *widget)
{

View File

@ -2,8 +2,9 @@
#ifndef __GLADE_WIDGET_CLASS_H__
#define __GLADE_WIDGET_CLASS_H__
G_BEGIN_DECLS
#include <gmodule.h>
G_BEGIN_DECLS
typedef enum {
GLADE_TOPLEVEL = 1 << 2,
@ -65,6 +66,11 @@ struct _GladeWidgetClass
* are edited when the _child_ is selected.
*/
GModule *module; /* Module with the (optional) special functions
* needed for placeholder_replace, post_create_function
* and the set & get functions of the properties
* of this class */
void (*placeholder_replace) (GtkWidget *current,
GtkWidget *new,
GtkWidget *container);
@ -84,8 +90,7 @@ struct _GladeWidgetClassSignal
* eg GtkButton */
};
GladeWidgetClass *glade_widget_class_new_from_name (const char *name);
GladeWidgetClass *glade_widget_class_new_from_name2 (const char *name, const char *generic_name, const char *base_filename);
GladeWidgetClass *glade_widget_class_new (const char *name, const char *generic_name, const char *base_filename, const char *base_library);
GladeWidgetClass *glade_widget_class_new_from_node (GladeXmlNode *node);
void glade_widget_class_free (GladeWidgetClass *widget_class);
GladeWidgetClass *glade_widget_class_get_by_name (const char *name);

View File

@ -34,7 +34,6 @@
#include "glade-popup.h"
#include "glade-placeholder.h"
#include "glade-signal.h"
#include "glade-gtk.h"
#include "glade-clipboard.h"
#include "glade-command.h"
#include "glade-debug.h"

View File

@ -1,4 +1,4 @@
<GladeCatalog Title="Gtk+ Additional">
<GladeCatalog Title="Gtk+ Additional" library="gtk">
<GladeWidget name="GtkHScale" generic_name="hscale"/>
<GladeWidget name="GtkVScale" generic_name="vscale"/>

View File

@ -1,4 +1,4 @@
<GladeCatalog Title="Gtk+ Basic">
<GladeCatalog Title="Gtk+ Basic" library="gtk">
<GladeWidget name="GtkWidget" filename="gtkwidget.xml"/>
<GladeWidget name="GtkBox" filename="gtkbox.xml"/>

View File

@ -1,13 +1,11 @@
<GladeWidgetClass>
<Name>GtkWidget</Name>
<Properties>
<Property Common="True" Id="visible">
<SetFunction>ignore</SetFunction>
<GetFunction>ignore</GetFunction>
</Property>
<Property Common="True" Optional="True" OptionalDefault="False" Default="0" Id="width-request"/>
<Property Common="True" Optional="True" OptionalDefault="False" Default="0" Id="height-request"/>
<Property Common="True" Optional="True" OptionalDefault="False" Default="0" Id="width-request"/>
<Property Common="True" Optional="True" OptionalDefault="False" Default="0" Id="height-request"/>
</Properties>
</GladeWidgetClass>

View File

@ -11,8 +11,8 @@
<Property Common="True" Id="tooltip" ParamSpec="False" Name="Tooltip">
<Type>String</Type>
<SetFunction>glade_gtk_widget_set_tooltip</SetFunction>
<GetFunction>glade_gtk_widget_get_tooltip</GetFunction>
<SetFunction>ignore</SetFunction>
<GetFunction>ignore</GetFunction>
</Property>
</Properties>