summaryrefslogtreecommitdiff
path: root/gtk/gtkbuilder.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-04-27 22:54:25 -0400
committerMatthias Clasen <mclasen@redhat.com>2015-04-27 22:54:25 -0400
commitfc83c8ac76b2a9ec13430dab530fa262aaaa9337 (patch)
treefe4c4b84745e2927ea25a552e804404ad5f9cc84 /gtk/gtkbuilder.c
parent1525d4ab89722a19129b1e2f11135fdb3e5fc58b (diff)
downloadgtk+-fc83c8ac76b2a9ec13430dab530fa262aaaa9337.tar.gz
GtkBuilder: Add new convenience API
Add a convenience function that is like gtk_builder_get_object() but stashes away a GError if a lookup fails. To make the error message informative, the function takes a line/column pair. Doing things this way is necessary because the custom_tag_end, custom_finished, and parser_finished vfuncs don't take a GError parameter, despite being called from a place where we can report a GError back.
Diffstat (limited to 'gtk/gtkbuilder.c')
-rw-r--r--gtk/gtkbuilder.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 6cd801c712..60b3b9a696 100644
--- a/gtk/gtkbuilder.c
+++ b/gtk/gtkbuilder.c
@@ -2706,3 +2706,43 @@ _gtk_builder_check_parent (GtkBuilder *builder,
return FALSE;
}
+
+/*< private >
+ * @builder: a #GtkBuilder
+ * @name: object name to look up
+ * @line: line number where @name was encountered
+ * @col: column number where @name was encountered
+ *
+ * Looks up an object by name. Similar to gtk_builder_get_object(),
+ * but sets an error if lookup fails during custom_tag_end,
+ * custom_finished or parser_finished vfuncs.
+ *
+ * The reason for doing things this way is that these vfuncs don't
+ * take a GError** parameter to return an error.
+ *
+ * Returns: the found object
+ */
+GObject *
+_gtk_builder_lookup_object (GtkBuilder *builder,
+ const gchar *name,
+ gint line,
+ gint col)
+{
+ GObject *obj;
+ GError *error = NULL;
+
+ obj = g_hash_table_lookup (builder->priv->objects, name);
+ error = (GError *) g_object_get_data (G_OBJECT (builder), "lookup-error");
+
+ if (!obj && !error)
+ {
+ g_set_error (&error,
+ GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_ID,
+ "%s:%d:%d Object with ID %s not found",
+ builder->priv->filename, line, col, name);
+ g_object_set_data_full (G_OBJECT (builder), "lookup-error",
+ error, (GDestroyNotify)g_error_free);
+ }
+
+ return obj;
+}