[glade3] Make Glade introspect lowest possible version when loading an old unversioned file.
- From: Tristan Van Berkom <tvb src gnome org>
- To: svn-commits-list gnome org
- Subject: [glade3] Make Glade introspect lowest possible version when loading an old unversioned file.
- Date: Mon, 22 Jun 2009 21:37:20 -0400 (EDT)
commit 0620f1e70d5031b18d7966f8ef9383ba83ec21de
Author: Tristan Van Berkom <vantr TheBully local>
Date: Sat Jun 20 11:39:46 2009 -0400
Make Glade introspect lowest possible version when loading an old unversioned file.
* gladeui/glade-project.c: Added glade_project_introspect_gtk_version() to loop
over loaded project widgets and set the target version when a malformed file
is loaded without a version (bug 572756).
gladeui/glade-project.c | 154 +++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 150 insertions(+), 4 deletions(-)
---
diff --git a/gladeui/glade-project.c b/gladeui/glade-project.c
index 5f65385..df17ecf 100644
--- a/gladeui/glade-project.c
+++ b/gladeui/glade-project.c
@@ -942,7 +942,8 @@ glade_project_read_requires_from_comment (GladeXmlNode *comment,
static gboolean
glade_project_read_requires (GladeProject *project,
GladeXmlNode *root_node,
- const gchar *path)
+ const gchar *path,
+ gboolean *has_gtk_dep)
{
GString *string = g_string_new (NULL);
@@ -983,8 +984,13 @@ glade_project_read_requires (GladeProject *project,
loadable = FALSE;
}
else
+ {
+ if (has_gtk_dep && strcmp (required_lib, "gtk+") == 0)
+ *has_gtk_dep = TRUE;
+
glade_project_set_target_version
(project, required_lib, major, minor);
+ }
g_free (required_lib);
}
@@ -1150,6 +1156,142 @@ glade_project_read_comment (GladeProject *project, GladeXmlDoc *doc)
*/
}
+
+typedef struct {
+ GladeWidget *widget;
+ gint major;
+ gint minor;
+} VersionData;
+
+static void
+glade_project_introspect_signal_versions (const gchar *signal_name,
+ GPtrArray *signals,
+ VersionData *data)
+{
+ gint i;
+
+ for (i = 0; i < signals->len; i++)
+ {
+ GladeSignalClass *signal_class;
+ GladeSignal *signal = g_ptr_array_index (signals, i);
+ gchar *catalog = NULL;
+ gboolean is_gtk_adaptor = FALSE;
+
+ signal_class = glade_widget_adaptor_get_signal_class (data->widget->adaptor, signal->name);
+ /* unknown signal... can it happen ? */
+ if (!signal_class)
+ continue;
+ g_assert (signal_class->adaptor);
+
+ /* Check if the signal comes from a GTK+ widget class */
+ g_object_get (signal_class->adaptor, "catalog", &catalog, NULL);
+ if (strcmp (catalog, "gtk+") == 0)
+ is_gtk_adaptor = TRUE;
+ g_free (catalog);
+
+ /* Check GTK+ version that signal was introduced */
+ if (is_gtk_adaptor &&
+ (data->major < signal_class->version_since_major ||
+ (data->major == signal_class->version_since_major &&
+ data->minor < signal_class->version_since_minor)))
+ {
+ data->major = signal_class->version_since_major;
+ data->minor = signal_class->version_since_minor;
+ }
+ }
+}
+
+static void
+glade_project_introspect_gtk_version (GladeProject *project)
+{
+ GladeProjectFormat fmt;
+ GladeWidget *widget;
+ GList *list, *l;
+ gint target_major = 2, target_minor = 0;
+
+ fmt = glade_project_get_format (project);
+
+ if (fmt == GLADE_PROJECT_FORMAT_GTKBUILDER)
+ target_minor = 12;
+ else
+ target_minor = 6;
+
+ for (list = project->priv->objects; list; list = list->next)
+ {
+ gboolean is_gtk_adaptor = FALSE;
+ gchar *catalog = NULL;
+ VersionData data = { 0, };
+
+ widget = glade_widget_get_from_gobject (list->data);
+
+ /* Check if its a GTK+ widget class */
+ g_object_get (widget->adaptor, "catalog", &catalog, NULL);
+ if (strcmp (catalog, "gtk+") == 0)
+ is_gtk_adaptor = TRUE;
+ g_free (catalog);
+
+ /* Check widget class version */
+ if (is_gtk_adaptor &&
+ (target_major < GWA_VERSION_SINCE_MAJOR (widget->adaptor) ||
+ (target_major == GWA_VERSION_SINCE_MAJOR (widget->adaptor) &&
+ target_minor < GWA_VERSION_SINCE_MINOR (widget->adaptor))))
+ {
+ target_major = GWA_VERSION_SINCE_MAJOR (widget->adaptor);
+ target_minor = GWA_VERSION_SINCE_MINOR (widget->adaptor);
+ }
+
+ /* Check all properties */
+ for (l = widget->properties; l; l = l->next)
+ {
+ GladeProperty *property = l->data;
+ GladeWidgetAdaptor *prop_adaptor, *adaptor;
+
+ /* Unset properties ofcourse dont count... */
+ if (glade_property_original_default (property))
+ continue;
+
+ /* Check if this property originates from a GTK+ widget class */
+ prop_adaptor = glade_widget_adaptor_from_pclass (property->klass);
+ adaptor = glade_widget_adaptor_from_pspec (prop_adaptor, property->klass->pspec);
+
+ catalog = NULL;
+ is_gtk_adaptor = FALSE;
+ g_object_get (adaptor, "catalog", &catalog, NULL);
+ if (strcmp (catalog, "gtk+") == 0)
+ is_gtk_adaptor = TRUE;
+ g_free (catalog);
+
+ /* Check GTK+ property class versions */
+ if (is_gtk_adaptor &&
+ (target_major < property->klass->version_since_major ||
+ (target_major == property->klass->version_since_major &&
+ target_minor < property->klass->version_since_minor)))
+ {
+ target_major = property->klass->version_since_major;
+ target_minor = property->klass->version_since_minor;
+ }
+ }
+
+ /* Check all signal versions here */
+ data.widget = widget;
+ data.major = target_major;
+ data.minor = target_minor;
+
+ g_hash_table_foreach (widget->signals,
+ (GHFunc)glade_project_introspect_signal_versions,
+ &data);
+
+ if (target_major < data.major)
+ target_major = data.major;
+
+ if (target_minor < data.minor)
+ target_minor = data.minor;
+ }
+
+ glade_project_set_target_version (project, "gtk+", target_major, target_minor);
+}
+
+
static gboolean
glade_project_load_from_file (GladeProject *project, const gchar *path)
{
@@ -1158,6 +1300,7 @@ glade_project_load_from_file (GladeProject *project, const gchar *path)
GladeXmlNode *root;
GladeXmlNode *node;
GladeWidget *widget;
+ gboolean has_gtk_dep = FALSE;
project->priv->selection = NULL;
project->priv->objects = NULL;
@@ -1192,7 +1335,7 @@ glade_project_load_from_file (GladeProject *project, const gchar *path)
/* XXX Need to load project->priv->comment ! */
glade_project_read_comment (project, doc);
- if (glade_project_read_requires (project, root, path) == FALSE)
+ if (glade_project_read_requires (project, root, path, &has_gtk_dep) == FALSE)
{
glade_xml_context_free (context);
return FALSE;
@@ -1214,6 +1357,9 @@ glade_project_load_from_file (GladeProject *project, const gchar *path)
glade_project_add_object (project, NULL, widget->object);
}
+ if (!has_gtk_dep)
+ glade_project_introspect_gtk_version (project);
+
if (glade_util_file_is_writeable (project->priv->path) == FALSE)
glade_project_set_readonly (project, TRUE);
@@ -2677,10 +2823,10 @@ glade_project_set_target_version (GladeProject *project,
g_hash_table_insert (project->priv->target_versions_major,
g_strdup (catalog),
- GINT_TO_POINTER (major));
+ GINT_TO_POINTER ( ( int ) major));
g_hash_table_insert (project->priv->target_versions_minor,
g_strdup (catalog),
- GINT_TO_POINTER (minor));
+ GINT_TO_POINTER ( ( int ) minor));
/* Update prefs dialog from here... */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]