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.
This commit is contained in:
Matthias Clasen 2015-04-27 22:54:25 -04:00
parent 1525d4ab89
commit fc83c8ac76
2 changed files with 45 additions and 0 deletions

View File

@ -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;
}

View File

@ -197,5 +197,10 @@ gboolean _gtk_builder_check_parent (GtkBuilder *builder,
GMarkupParseContext *context,
const gchar *parent_name,
GError **error);
GObject * _gtk_builder_lookup_object (GtkBuilder *builder,
const gchar *name,
gint line,
gint col);
#endif /* __GTK_BUILDER_PRIVATE_H__ */