diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-05-06 15:22:41 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-05-06 15:22:41 +0000 |
commit | 93d62acdf37427b18d8b9ebd655a7f2f6d32424b (patch) | |
tree | aaeb155a9014b46217efa2c3eb3d8218a03dc8bf | |
parent | 1a82e6a7624e5a08b8bd3d7b86a40b3a86f0066d (diff) | |
parent | 0ce49daa5f210140413927112da85f207f20ce47 (diff) | |
download | gtk+-93d62acdf37427b18d8b9ebd655a7f2f6d32424b.tar.gz |
Merge branch 'builder-treestore-data' into 'main'
Add buildable data support to GtkTreeStore
See merge request GNOME/gtk!4695
-rw-r--r-- | gtk/gtkbuilder.c | 32 | ||||
-rw-r--r-- | gtk/gtkbuilderprivate.h | 4 | ||||
-rw-r--r-- | gtk/gtktreestore.c | 369 | ||||
-rw-r--r-- | testsuite/gtk/builder.c | 317 | ||||
-rw-r--r-- | testsuite/gtk/builderparser.c | 8 |
5 files changed, 599 insertions, 131 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index 545699c45c..ec9fa6f913 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -2997,20 +2997,46 @@ _gtk_builder_check_parent (GtkBuilder *builder, const char *parent_name, GError **error) { + return _gtk_builder_check_parents (builder, context, error, parent_name, NULL); +} + +gboolean +_gtk_builder_check_parents (GtkBuilder *builder, + GtkBuildableParseContext *context, + GError **error, + ...) +{ GtkBuilderPrivate *priv = gtk_builder_get_instance_private (builder); GPtrArray *stack; int line, col; const char *parent; const char *element; + va_list args; + gboolean in_template; stack = gtk_buildable_parse_context_get_element_stack (context); element = g_ptr_array_index (stack, stack->len - 1); parent = stack->len > 1 ? g_ptr_array_index (stack, stack->len - 2) : ""; - if (g_str_equal (parent_name, parent) || - (g_str_equal (parent_name, "object") && g_str_equal (parent, "template"))) - return TRUE; + in_template = g_str_equal (parent, "template"); + + va_start (args, error); + + while (1) { + char *parent_name = va_arg (args, char *); + + if (parent_name == NULL) + break; + + if (g_str_equal (parent_name, parent) || (in_template && g_str_equal (parent_name, "object"))) + { + va_end (args); + return TRUE; + } + } + + va_end (args); gtk_buildable_parse_context_get_position (context, &line, &col); g_set_error (error, diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h index e99b7163e6..21ceca77c0 100644 --- a/gtk/gtkbuilderprivate.h +++ b/gtk/gtkbuilderprivate.h @@ -278,6 +278,10 @@ gboolean _gtk_builder_check_parent (GtkBuilder *builder, GtkBuildableParseContext *context, const char *parent_name, GError **error); +gboolean _gtk_builder_check_parents (GtkBuilder *builder, + GtkBuildableParseContext *context, + GError **error, + ...); GObject *gtk_builder_lookup_object (GtkBuilder *builder, const char *name, int line, diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index f41bfaadef..ed7b7c4449 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -177,11 +177,11 @@ static gboolean gtk_tree_store_buildable_custom_tag_start (GtkBuildable *b const char *tagname, GtkBuildableParser *parser, gpointer *data); -static void gtk_tree_store_buildable_custom_finished (GtkBuildable *buildable, +static void gtk_tree_store_buildable_custom_tag_end (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const char *tagname, - gpointer user_data); + gpointer parser_data); static void gtk_tree_store_move (GtkTreeStore *tree_store, GtkTreeIter *iter, @@ -275,7 +275,7 @@ void gtk_tree_store_buildable_init (GtkBuildableIface *iface) { iface->custom_tag_start = gtk_tree_store_buildable_custom_tag_start; - iface->custom_finished = gtk_tree_store_buildable_custom_finished; + iface->custom_tag_end = gtk_tree_store_buildable_custom_tag_end; } static void @@ -390,10 +390,10 @@ gtk_tree_store_newv (int n_columns, * @tree_store: A `GtkTreeStore` * @n_columns: Number of columns for the tree store * @types: (array length=n_columns): An array of `GType` types, one for each column - * - * This function is meant primarily for `GObjects` that inherit from - * `GtkTreeStore`, and should only be used when constructing a new - * `GtkTreeStore`. It will not function after a row has been added, + * + * This function is meant primarily for `GObjects` that inherit from + * `GtkTreeStore`, and should only be used when constructing a new + * `GtkTreeStore`. It will not function after a row has been added, * or a method on the `GtkTreeModel` interface is called. **/ void @@ -924,7 +924,7 @@ gtk_tree_store_real_set_value (GtkTreeStore *tree_store, _gtk_tree_data_list_value_to_node (list, &real_value); else _gtk_tree_data_list_value_to_node (list, value); - + retval = TRUE; if (converted) g_value_unset (&real_value); @@ -1197,7 +1197,7 @@ gtk_tree_store_set (GtkTreeStore *tree_store, * gtk_tree_store_remove: * @tree_store: A `GtkTreeStore` * @iter: A valid `GtkTreeIter` - * + * * Removes @iter from @tree_store. After being removed, @iter is set to the * next valid row at that level, or invalidated if it previously pointed to the * last one. @@ -1657,7 +1657,7 @@ gtk_tree_store_insert_with_valuesv (GtkTreeStore *tree_store, * @tree_store: A `GtkTreeStore` * @iter: (out): An unset `GtkTreeIter` to set to the prepended row * @parent: (nullable): A valid `GtkTreeIter` - * + * * Prepends a new row to @tree_store. If @parent is non-%NULL, then it will prepend * the new row before the first child of @parent, otherwise it will prepend a row * to the top level. @iter will be changed to point to this new row. The row @@ -1687,7 +1687,7 @@ gtk_tree_store_prepend (GtkTreeStore *tree_store, if (parent_node->children == NULL) { GtkTreePath *path; - + iter->stamp = priv->stamp; iter->user_data = g_node_new (NULL); @@ -1716,7 +1716,7 @@ gtk_tree_store_prepend (GtkTreeStore *tree_store, * @tree_store: A `GtkTreeStore` * @iter: (out): An unset `GtkTreeIter` to set to the appended row * @parent: (nullable): A valid `GtkTreeIter` - * + * * Appends a new row to @tree_store. If @parent is non-%NULL, then it will append the * new row after the last child of @parent, otherwise it will append a row to * the top level. @iter will be changed to point to this new row. The row will @@ -1775,10 +1775,10 @@ gtk_tree_store_append (GtkTreeStore *tree_store, * @tree_store: A `GtkTreeStore` * @iter: A valid `GtkTreeIter` * @descendant: A valid `GtkTreeIter` - * + * * Returns %TRUE if @iter is an ancestor of @descendant. That is, @iter is the * parent (or grandparent or great-grandparent) of @descendant. - * + * * Returns: %TRUE, if @iter is an ancestor of @descendant **/ gboolean @@ -1799,10 +1799,10 @@ gtk_tree_store_is_ancestor (GtkTreeStore *tree_store, * gtk_tree_store_iter_depth: * @tree_store: A `GtkTreeStore` * @iter: A valid `GtkTreeIter` - * + * * Returns the depth of @iter. This will be 0 for anything on the root level, 1 * for anything down a level, etc. - * + * * Returns: The depth of @iter **/ int @@ -1870,7 +1870,7 @@ gtk_tree_store_increment_stamp (GtkTreeStore *tree_store) /** * gtk_tree_store_clear: * @tree_store: a `GtkTreeStore` - * + * * Removes all rows from @tree_store **/ void @@ -1908,7 +1908,7 @@ gtk_tree_store_iter_is_valid_helper (GtkTreeIter *iter, /** * gtk_tree_store_iter_is_valid: - * @tree_store: a tree store + * @tree_store: a tree store * @iter: the iterator to check * * Checks if the given iter is a valid iter for this `GtkTreeStore`. @@ -1939,7 +1939,7 @@ static gboolean real_gtk_tree_store_row_draggable (GtkTreeDragSource *drag_sourc { return TRUE; } - + static gboolean gtk_tree_store_drag_data_delete (GtkTreeDragSource *drag_source, GtkTreePath *path) @@ -2159,7 +2159,7 @@ gtk_tree_store_row_drop_possible (GtkTreeDragDest *drag_dest, GtkTreePath *src_path = NULL; GtkTreePath *tmp = NULL; gboolean retval = FALSE; - + /* don't accept drops if the tree has been sorted */ if (GTK_TREE_STORE_IS_SORTED (drag_dest)) return FALSE; @@ -2168,7 +2168,7 @@ gtk_tree_store_row_drop_possible (GtkTreeDragDest *drag_dest, &src_model, &src_path)) goto out; - + /* can only drag to ourselves */ if (src_model != GTK_TREE_MODEL (drag_dest)) goto out; @@ -2186,13 +2186,13 @@ gtk_tree_store_row_drop_possible (GtkTreeDragDest *drag_dest, { tmp = gtk_tree_path_copy (dest_path); gtk_tree_path_up (tmp); - + if (!gtk_tree_store_get_iter (GTK_TREE_MODEL (drag_dest), &iter, tmp)) goto out; } } - + /* Can otherwise drop anywhere. */ retval = TRUE; @@ -2551,7 +2551,7 @@ gtk_tree_store_move (GtkTreeStore *tree_store, if (depth) { - gtk_tree_store_get_iter (GTK_TREE_MODEL (tree_store), + gtk_tree_store_get_iter (GTK_TREE_MODEL (tree_store), &parent_iter, path); parent = G_NODE (parent_iter.user_data); @@ -2570,7 +2570,7 @@ gtk_tree_store_move (GtkTreeStore *tree_store, if (gtk_tree_path_get_indices (pos_path)[gtk_tree_path_get_depth (pos_path) - 1] > 0) { gtk_tree_path_prev (pos_path); - if (gtk_tree_store_get_iter (GTK_TREE_MODEL (tree_store), + if (gtk_tree_store_get_iter (GTK_TREE_MODEL (tree_store), &dst_a, pos_path)) a = G_NODE (dst_a.user_data); else @@ -2668,7 +2668,7 @@ gtk_tree_store_move (GtkTreeStore *tree_store, parent->children = node; node->next = tmp; - if (tmp) + if (tmp) tmp->prev = node; handle_b = FALSE; @@ -2761,7 +2761,7 @@ gtk_tree_store_move (GtkTreeStore *tree_store, if (depth) { - tmppath = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), + tmppath = gtk_tree_store_get_path (GTK_TREE_MODEL (tree_store), &parent_iter); gtk_tree_model_rows_reordered (GTK_TREE_MODEL (tree_store), tmppath, &parent_iter, order); @@ -3316,31 +3316,168 @@ validate_gnode (GNode* node) * </columns> */ typedef struct { + gboolean translatable; + char *context; + int id; +} ColInfo; + +typedef struct { GtkBuilder *builder; GObject *object; - GSList *items; -} GSListSubParserData; + GSList *column_type_names; + GType *column_types; + GValue *values; + int *colids; + ColInfo **columns; + int last_row; + int n_columns; + int row_column; + gboolean is_data; + const char *domain; + GList *parents; + gboolean row_is_open; +} SubParserData; static void -tree_model_start_element (GtkBuildableParseContext *context, +append_current_row (SubParserData *data) +{ + GtkTreeIter *parent; + GtkTreeIter iter; + int i; + + if (data->parents) + parent = data->parents->data; + else + parent = NULL; + + gtk_tree_store_insert_with_valuesv (GTK_TREE_STORE (data->object), + &iter, + parent, + -1, + data->colids, + data->values, + data->row_column); + + data->parents = g_list_prepend (data->parents, gtk_tree_iter_copy (&iter)); + + for (i = 0; i < data->row_column; i++) + { + ColInfo *info = data->columns[i]; + g_free (info->context); + g_slice_free (ColInfo, info); + data->columns[i] = NULL; + g_value_unset (&data->values[i]); + } + g_free (data->values); + data->values = g_new0 (GValue, data->n_columns); + data->last_row++; + data->row_column = 0; + data->row_is_open = FALSE; +} + +static void +tree_store_start_element (GtkBuildableParseContext *context, const char *element_name, const char **names, const char **values, gpointer user_data, GError **error) { - GSListSubParserData *data = (GSListSubParserData*)user_data; + SubParserData *data = (SubParserData*)user_data; - if (strcmp (element_name, "columns") == 0) + if (strcmp (element_name, "col") == 0) { - if (!_gtk_builder_check_parent (data->builder, context, "object", error)) + int id = -1; + const char *id_str; + const char *msg_context = NULL; + gboolean translatable = FALSE; + ColInfo *info; + GValue val = G_VALUE_INIT; + + if (!_gtk_builder_check_parent (data->builder, context, "row", error)) + return; + + if (!data->row_is_open) + { + g_set_error (error, + GTK_BUILDER_ERROR, + GTK_BUILDER_ERROR_INVALID_TAG, + "Can't use <col> here"); + _gtk_builder_prefix_error (data->builder, context, error); + return; + } + + if (data->row_column >= data->n_columns) + { + g_set_error (error, + GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE, + "Too many columns, maximum is %d", data->n_columns - 1); + _gtk_builder_prefix_error (data->builder, context, error); + return; + } + + if (!g_markup_collect_attributes (element_name, names, values, error, + G_MARKUP_COLLECT_STRING, "id", &id_str, + G_MARKUP_COLLECT_BOOLEAN|G_MARKUP_COLLECT_OPTIONAL, "translatable", &translatable, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "comments", NULL, + G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "context", &msg_context, + G_MARKUP_COLLECT_INVALID)) + { + _gtk_builder_prefix_error (data->builder, context, error); + return; + } + + if (!gtk_builder_value_from_string_type (data->builder, G_TYPE_INT, id_str, &val, error)) + { + _gtk_builder_prefix_error (data->builder, context, error); + return; + } + + id = g_value_get_int (&val); + if (id < 0 || id >= data->n_columns) + { + g_set_error (error, + GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE, + "id value %d out of range", id); + _gtk_builder_prefix_error (data->builder, context, error); + return; + } + + info = g_slice_new0 (ColInfo); + info->translatable = translatable; + info->context = g_strdup (msg_context); + info->id = id; + + data->colids[data->row_column] = id; + data->columns[data->row_column] = info; + data->row_column++; + data->is_data = TRUE; + } + else if (strcmp (element_name, "row") == 0) + { + if (!_gtk_builder_check_parents (data->builder, context, error, "data", "row", NULL)) return; + if (data->row_is_open) + append_current_row (data); + if (!g_markup_collect_attributes (element_name, names, values, error, G_MARKUP_COLLECT_INVALID, NULL, NULL, G_MARKUP_COLLECT_INVALID)) _gtk_builder_prefix_error (data->builder, context, error); + data->row_is_open = TRUE; + } + else if (strcmp (element_name, "columns") == 0 || + strcmp (element_name, "data") == 0) + { + if (!_gtk_builder_check_parent (data->builder, context, "object", error)) + return; + + if (!g_markup_collect_attributes (element_name, names, values, error, + G_MARKUP_COLLECT_INVALID, NULL, NULL, + G_MARKUP_COLLECT_INVALID)) + _gtk_builder_prefix_error (data->builder, context, error); } else if (strcmp (element_name, "column") == 0) { @@ -3357,8 +3494,9 @@ tree_model_start_element (GtkBuildableParseContext *context, return; } - data->items = g_slist_prepend (data->items, g_strdup (type)); + data->column_type_names = g_slist_prepend (data->column_type_names, g_strdup (type)); } + else { _gtk_builder_error_unhandled_tag (data->builder, context, @@ -3368,27 +3506,38 @@ tree_model_start_element (GtkBuildableParseContext *context, } static void -tree_model_end_element (GtkBuildableParseContext *context, +tree_store_end_element (GtkBuildableParseContext *context, const char *element_name, gpointer user_data, GError **error) { - GSListSubParserData *data = (GSListSubParserData*)user_data; + SubParserData *data = (SubParserData*)user_data; g_assert(data->builder); - if (strcmp (element_name, "columns") == 0) + if (strcmp (element_name, "row") == 0) { + GtkTreeIter *parent; + + if (data->row_column > 0) + append_current_row (data); + + parent = data->parents->data; + data->parents = g_list_remove (data->parents, parent); + gtk_tree_iter_free (parent); + } + else if (strcmp (element_name, "columns") == 0) + { + GType *column_types; GSList *l; - GType *types; int i; GType type; - data = (GSListSubParserData*)user_data; - data->items = g_slist_reverse (data->items); - types = g_new0 (GType, g_slist_length (data->items)); + data = (SubParserData*)user_data; + data->column_type_names = g_slist_reverse (data->column_type_names); + column_types = g_new0 (GType, g_slist_length (data->column_type_names)); - for (l = data->items, i = 0; l; l = l->next, i++) + for (l = data->column_type_names, i = 0; l; l = l->next, i++) { type = gtk_builder_get_type_from_name (data->builder, l->data); if (type == G_TYPE_INVALID) @@ -3398,23 +3547,72 @@ tree_model_end_element (GtkBuildableParseContext *context, gtk_buildable_get_buildable_id (GTK_BUILDABLE (data->object))); continue; } - types[i] = type; + column_types[i] = type; g_free (l->data); } - gtk_tree_store_set_column_types (GTK_TREE_STORE (data->object), i, types); + gtk_tree_store_set_column_types (GTK_TREE_STORE (data->object), i, column_types); - g_free (types); + g_free (column_types); + } + else if (strcmp (element_name, "col") == 0) + { + data->is_data = FALSE; } } -static const GtkBuildableParser tree_model_parser = - { - tree_model_start_element, - tree_model_end_element - }; +static void +tree_store_text (GtkBuildableParseContext *context, + const char *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + SubParserData *data = (SubParserData*)user_data; + int i; + char *string; + ColInfo *info; + + if (!data->is_data) + return; + i = data->row_column - 1; + info = data->columns[i]; + + string = g_strndup (text, text_len); + if (info->translatable && text_len) + { + char *translated; + + /* FIXME: This will not use the domain set in the .ui file, + * since the parser is not telling the builder about the domain. + * However, it will work for gtk_builder_set_translation_domain() calls. + */ + translated = g_strdup (_gtk_builder_parser_translate (data->domain, + info->context, + string)); + g_free (string); + string = translated; + } + + if (!gtk_builder_value_from_string_type (data->builder, + data->column_types[info->id], + string, + &data->values[i], + error)) + { + _gtk_builder_prefix_error (data->builder, context, error); + } + g_free (string); +} + +static const GtkBuildableParser tree_store_parser = +{ + tree_store_start_element, + tree_store_end_element, + tree_store_text +}; static gboolean gtk_tree_store_buildable_custom_tag_start (GtkBuildable *buildable, @@ -3424,19 +3622,41 @@ gtk_tree_store_buildable_custom_tag_start (GtkBuildable *buildable, GtkBuildableParser *parser, gpointer *parser_data) { - GSListSubParserData *data; + SubParserData *data; if (child) return FALSE; if (strcmp (tagname, "columns") == 0) { - data = g_slice_new0 (GSListSubParserData); + data = g_slice_new0 (SubParserData); data->builder = builder; - data->items = NULL; + data->column_type_names = NULL; data->object = G_OBJECT (buildable); - *parser = tree_model_parser; + *parser = tree_store_parser; + *parser_data = data; + + return TRUE; + } + else if (strcmp (tagname, "data") == 0) + { + int n_columns = gtk_tree_store_get_n_columns (GTK_TREE_MODEL (buildable)); + if (n_columns == 0) + g_error ("Cannot append data to an empty model"); + + data = g_slice_new0 (SubParserData); + data->builder = builder; + data->object = G_OBJECT (buildable); + data->values = g_new0 (GValue, n_columns); + data->colids = g_new0 (int, n_columns); + data->columns = g_new0 (ColInfo *, n_columns); + data->column_types = GTK_TREE_STORE (buildable)->priv->column_headers; + data->n_columns = n_columns; + data->last_row = 0; + data->domain = gtk_builder_get_translation_domain (builder); + + *parser = tree_store_parser; *parser_data = data; return TRUE; @@ -3446,19 +3666,34 @@ gtk_tree_store_buildable_custom_tag_start (GtkBuildable *buildable, } static void -gtk_tree_store_buildable_custom_finished (GtkBuildable *buildable, - GtkBuilder *builder, - GObject *child, - const char *tagname, - gpointer user_data) +gtk_tree_store_buildable_custom_tag_end (GtkBuildable *buildable, + GtkBuilder *builder, + GObject *child, + const char *tagname, + gpointer parser_data) { - GSListSubParserData *data; - - if (strcmp (tagname, "columns")) - return; + SubParserData *data = (SubParserData*)parser_data; - data = (GSListSubParserData*)user_data; - - g_slist_free (data->items); - g_slice_free (GSListSubParserData, data); + if (strcmp (tagname, "columns") == 0) + { + g_slist_free (data->column_type_names); + g_slice_free (SubParserData, data); + } + else if (strcmp (tagname, "data") == 0) + { + int i; + for (i = 0; i < data->n_columns; i++) + { + ColInfo *info = data->columns[i]; + if (info) + { + g_free (info->context); + g_slice_free (ColInfo, info); + } + } + g_free (data->colids); + g_free (data->columns); + g_free (data->values); + g_slice_free (SubParserData, data); + } } diff --git a/testsuite/gtk/builder.c b/testsuite/gtk/builder.c index e581a7c512..88dc7c853a 100644 --- a/testsuite/gtk/builder.c +++ b/testsuite/gtk/builder.c @@ -68,14 +68,14 @@ test_parser (void) { GtkBuilder *builder; GError *error; - + builder = gtk_builder_new (); error = NULL; gtk_builder_add_from_string (builder, "<xxx/>", -1, &error); g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_UNHANDLED_TAG); g_error_free (error); - + error = NULL; gtk_builder_add_from_string (builder, "<interface invalid=\"X\"/>", -1, &error); g_assert_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE); @@ -115,7 +115,7 @@ test_parser (void) gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><property name=\"deafbeef\"></property></object></interface>", -1, &error); g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_PROPERTY); g_error_free (error); - + error = NULL; gtk_builder_add_from_string (builder, "<interface><object class=\"GtkButton\" id=\"a\"><signal name=\"deafbeef\" handler=\"gtk_true\"/></object></interface>", -1, &error); g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_SIGNAL); @@ -145,7 +145,7 @@ signal_after (GtkWindow *window, GParamSpec *spec) g_assert_true (GTK_IS_WINDOW (window)); g_assert_true (normal == 1); g_assert_true (after == 0); - + after++; } @@ -255,7 +255,7 @@ test_connect_signals (void) gtk_window_destroy (GTK_WINDOW (window)); g_object_unref (builder); - + builder = builder_new_from_string (buffer_order, -1, NULL); window = gtk_builder_get_object (builder, "window1"); normal = 0; @@ -277,13 +277,13 @@ test_connect_signals (void) gtk_window_set_title (GTK_WINDOW (window), "test"); g_assert_true (normal == 40); gtk_window_destroy (GTK_WINDOW (window)); - + g_object_unref (builder); /* new test, reset globals */ after = 0; normal = 0; - + builder = builder_new_from_string (buffer_after_child, -1, NULL); window = gtk_builder_get_object (builder, "window1"); gtk_window_set_title (GTK_WINDOW (window), "test"); @@ -300,12 +300,12 @@ test_domain (void) const char buffer1[] = "<interface/>"; const char buffer2[] = "<interface domain=\"domain\"/>"; const char *domain; - + builder = builder_new_from_string (buffer1, -1, NULL); domain = gtk_builder_get_translation_domain (builder); g_assert_true (domain == NULL); g_object_unref (builder); - + builder = builder_new_from_string (buffer1, -1, "domain-1"); domain = gtk_builder_get_translation_domain (builder); g_assert_nonnull (domain); @@ -447,7 +447,7 @@ test_sizegroup (void) window = gtk_builder_get_object (builder, "window1"); gtk_window_destroy (GTK_WINDOW (window)); } -#endif +#endif g_object_unref (builder); } @@ -463,7 +463,7 @@ test_list_store (void) " </columns>" " </object>" "</interface>"; - const char buffer2[] = + const char buffer2[] = "<interface>" " <object class=\"GtkListStore\" id=\"liststore1\">" " <columns>" @@ -485,7 +485,7 @@ test_list_store (void) " </data>" " </object>" "</interface>"; - const char buffer3[] = + const char buffer3[] = "<interface>" " <object class=\"GtkListStore\" id=\"liststore1\">" " <columns>" @@ -515,21 +515,21 @@ test_list_store (void) GtkTreeIter iter; char *surname, *lastname; int age; - + builder = builder_new_from_string (buffer1, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 2); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_UINT); g_object_unref (builder); - + builder = builder_new_from_string (buffer2, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 3); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT); - + g_assert_cmpint (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter), ==, TRUE); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, @@ -542,7 +542,7 @@ test_list_store (void) g_free (lastname); g_assert_cmpint (age, ==, 25); g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); - + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, @@ -555,7 +555,7 @@ test_list_store (void) g_assert_cmpint (age, ==, 50); g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); - g_object_unref (builder); + g_object_unref (builder); builder = builder_new_from_string (buffer3, -1, NULL); store = gtk_builder_get_object (builder, "liststore1"); @@ -563,7 +563,7 @@ test_list_store (void) g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT); - + g_assert_true (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)); gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, @@ -576,7 +576,7 @@ test_list_store (void) g_free (lastname); g_assert_cmpint (age, ==, 25); g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); - + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, @@ -588,7 +588,7 @@ test_list_store (void) g_free (lastname); g_assert_cmpint (age, ==, 50); g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); - + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, 0, &surname, 1, &lastname, @@ -614,14 +614,217 @@ test_tree_store (void) " </columns>" " </object>" "</interface>"; + const char buffer2[] = + "<interface>" + " <object class=\"GtkTreeStore\" id=\"treestore1\">" + " <columns>" + " <column type=\"gchararray\"/>" + " <column type=\"gchararray\"/>" + " <column type=\"gint\"/>" + " </columns>" + " <data>" + " <row>" + " <col id=\"0\" translatable=\"yes\">John</col>" + " <col id=\"1\" context=\"foo\">Doe</col>" + " <col id=\"2\" comments=\"foobar\">25</col>" + " </row>" + " <row>" + " <col id=\"0\">Johan</col>" + " <col id=\"1\">Dole</col>" + " <col id=\"2\">50</col>" + " </row>" + " </data>" + " </object>" + "</interface>"; + const char buffer3[] = + "<interface>" + " <object class=\"GtkTreeStore\" id=\"treestore1\">" + " <columns>" + " <column type=\"gchararray\"/>" + " <column type=\"gchararray\"/>" + " <column type=\"gint\"/>" + " </columns>" + " <data>" + " <row>" + " <col id=\"1\" context=\"foo\">Doe</col>" + " <col id=\"0\" translatable=\"yes\">John</col>" + " <col id=\"2\" comments=\"foobar\">25</col>" + " </row>" + " <row>" + " <col id=\"2\">50</col>" + " <col id=\"1\">Dole</col>" + " <col id=\"0\">Johan</col>" + " </row>" + " <row>" + " <col id=\"2\">19</col>" + " </row>" + " </data>" + " </object>" + "</interface>"; + const char buffer4[] = + "<interface>" + " <object class=\"GtkTreeStore\" id=\"treestore1\">" + " <columns>" + " <column type=\"gchararray\"/>" + " <column type=\"gchararray\"/>" + " <column type=\"gint\"/>" + " </columns>" + " <data>" + " <row>" + " <col id=\"1\" context=\"foo\">Doe</col>" + " <col id=\"0\" translatable=\"yes\">John</col>" + " <col id=\"2\" comments=\"foobar\">25</col>" + " <row>" + " <col id=\"2\">50</col>" + " <col id=\"1\">Dole</col>" + " <col id=\"0\">Johan</col>" + " </row>" + " </row>" + " <row>" + " <col id=\"2\">19</col>" + " </row>" + " </data>" + " </object>" + "</interface>"; GtkBuilder *builder; GObject *store; - + GtkTreeIter iter, parent; + char *surname, *lastname; + int age; + builder = builder_new_from_string (buffer, -1, NULL); store = gtk_builder_get_object (builder, "treestore1"); + g_assert_true (GTK_IS_TREE_STORE (store)); g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 2); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_UINT); + g_object_unref (builder); + + builder = builder_new_from_string (buffer2, -1, NULL); + store = gtk_builder_get_object (builder, "treestore1"); + g_assert_true (GTK_IS_TREE_STORE (store)); + g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 3); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT); + + g_assert_cmpint (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter), ==, TRUE); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_cmpstr (surname, ==, "John"); + g_free (surname); + g_assert_cmpstr (lastname, ==, "Doe"); + g_free (lastname); + g_assert_cmpint (age, ==, 25); + g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_cmpstr (surname, ==, "Johan"); + g_free (surname); + g_assert_cmpstr (lastname, ==, "Dole"); + g_free (lastname); + g_assert_cmpint (age, ==, 50); + g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + + g_object_unref (builder); + + builder = builder_new_from_string (buffer3, -1, NULL); + store = gtk_builder_get_object (builder, "treestore1"); + g_assert_true (GTK_IS_TREE_STORE (store)); + g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 3); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT); + + g_assert_true (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_cmpstr (surname, ==, "John"); + g_free (surname); + g_assert_cmpstr (lastname, ==, "Doe"); + g_free (lastname); + g_assert_cmpint (age, ==, 25); + g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_cmpstr (surname, ==, "Johan"); + g_free (surname); + g_assert_cmpstr (lastname, ==, "Dole"); + g_free (lastname); + g_assert_cmpint (age, ==, 50); + g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_null (surname); + g_assert_null (lastname); + g_assert_cmpint (age, ==, 19); + g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + + g_object_unref (builder); + + builder = builder_new_from_string (buffer4, -1, NULL); + store = gtk_builder_get_object (builder, "treestore1"); + g_assert_true (GTK_IS_TREE_STORE (store)); + g_assert_cmpint (gtk_tree_model_get_n_columns (GTK_TREE_MODEL (store)), ==, 3); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 0), ==, G_TYPE_STRING); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 1), ==, G_TYPE_STRING); + g_assert_cmpint (gtk_tree_model_get_column_type (GTK_TREE_MODEL (store), 2), ==, G_TYPE_INT); + + g_assert_true (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)); + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_cmpstr (surname, ==, "John"); + g_free (surname); + g_assert_cmpstr (lastname, ==, "Doe"); + g_free (lastname); + g_assert_cmpint (age, ==, 25); + parent = iter; + g_assert_true (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &iter, &parent)); + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_cmpstr (surname, ==, "Johan"); + g_free (surname); + g_assert_cmpstr (lastname, ==, "Dole"); + g_free (lastname); + g_assert_cmpint (age, ==, 50); + g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + iter = parent; + g_assert_true (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + 0, &surname, + 1, &lastname, + 2, &age, + -1); + g_assert_null (surname); + g_assert_null (lastname); + g_assert_cmpint (age, ==, 19); + g_assert_false (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); g_object_unref (builder); } @@ -629,7 +832,7 @@ test_tree_store (void) static void test_types (void) { - const char buffer[] = + const char buffer[] = "<interface>" " <object class=\"GtkBox\" id=\"box\"/>" " <object class=\"GtkButton\" id=\"button\"/>" @@ -654,11 +857,11 @@ test_types (void) " <object class=\"GtkViewport\" id=\"viewport\"/>" " <object class=\"GtkWindow\" id=\"window\"/>" "</interface>"; - const char buffer2[] = + const char buffer2[] = "<interface>" " <object class=\"GtkWindow\" type-func=\"gtk_window_get_type\" id=\"window\"/>" "</interface>"; - const char buffer3[] = + const char buffer3[] = "<interface>" " <object class=\"XXXInvalidType\" type-func=\"gtk_window_get_type\" id=\"window\"/>" "</interface>"; @@ -690,7 +893,7 @@ test_types (void) g_assert_true (GTK_IS_WINDOW (window)); gtk_window_destroy (GTK_WINDOW (window)); g_object_unref (builder); - + error = NULL; builder = gtk_builder_new (); gtk_builder_add_from_string (builder, buffer4, -1, &error); @@ -728,7 +931,7 @@ test_spin_button (void) GObject *obj; GtkAdjustment *adjustment; double value; - + builder = builder_new_from_string (buffer, -1, NULL); obj = gtk_builder_get_object (builder, "spinbutton1"); g_assert_true (GTK_IS_SPIN_BUTTON (obj)); @@ -746,7 +949,7 @@ test_spin_button (void) g_assert_cmpint (value, ==, 3); g_object_get (adjustment, "page-size", &value, NULL); g_assert_cmpint (value, ==, 0); - + g_object_unref (builder); } @@ -830,7 +1033,7 @@ test_construct_only_property (void) " </object>" "</interface>"; GObject *widget, *tagtable, *textbuffer; - + builder = builder_new_from_string (buffer, -1, NULL); widget = gtk_builder_get_object (builder, "window1"); g_assert_cmpstr (gtk_widget_get_css_name (GTK_WIDGET (widget)), ==, "amazing"); @@ -874,7 +1077,7 @@ test_object_properties (void) " <object class=\"GtkWindow\" id=\"window2\"/>" "</interface>"; GObject *label, *spinbutton, *window; - + builder = builder_new_from_string (buffer, -1, NULL); label = gtk_builder_get_object (builder, "label1"); g_assert_nonnull (label); @@ -1111,7 +1314,7 @@ test_icon_view (void) " </object>" "</interface>"; GObject *window, *iconview; - + builder = builder_new_from_string (buffer, -1, NULL); iconview = gtk_builder_get_object (builder, "iconview1"); g_assert_true (GTK_IS_ICON_VIEW (iconview)); @@ -1282,7 +1485,7 @@ test_cell_view (void) GObject *model, *window; GtkTreePath *path; GList *renderers; - + builder = builder_new_from_string (buffer, -1, NULL); cellview = gtk_builder_get_object (builder, "cellview1"); g_assert_nonnull (builder); @@ -1292,14 +1495,14 @@ test_cell_view (void) g_object_unref (model); path = gtk_tree_path_new_first (); gtk_cell_view_set_displayed_row (GTK_CELL_VIEW (cellview), path); - + renderers = gtk_cell_layout_get_cells (GTK_CELL_LAYOUT (cellview)); g_assert_cmpint (g_list_length (renderers), ==, 1); window = gtk_builder_get_object (builder, "window1"); g_assert_nonnull (window); gtk_window_destroy (GTK_WINDOW (window)); - + g_object_unref (builder); } @@ -1336,14 +1539,14 @@ test_dialog (void) GObject *dialog1; GObject *button_ok; GObject *button_cancel; - + builder = builder_new_from_string (buffer1, -1, NULL); dialog1 = gtk_builder_get_object (builder, "dialog1"); button_ok = gtk_builder_get_object (builder, "button_ok"); g_assert_cmpint (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_ok)), ==, 3); button_cancel = gtk_builder_get_object (builder, "button_cancel"); g_assert_cmpint (gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog1), GTK_WIDGET (button_cancel)), ==, -5); - + gtk_window_destroy (GTK_WINDOW (dialog1)); g_object_unref (builder); } @@ -1432,23 +1635,23 @@ test_widget (void) "</interface>"; GtkBuilder *builder; GObject *window1, *button1, *label1; - + builder = builder_new_from_string (buffer, -1, NULL); button1 = gtk_builder_get_object (builder, "button1"); g_assert_true (gtk_widget_has_focus (GTK_WIDGET (button1))); window1 = gtk_builder_get_object (builder, "window1"); gtk_window_destroy (GTK_WINDOW (window1)); - + g_object_unref (builder); - + builder = builder_new_from_string (buffer2, -1, NULL); button1 = gtk_builder_get_object (builder, "button1"); g_assert_true (gtk_widget_get_receives_default (GTK_WIDGET (button1))); - + g_object_unref (builder); - + builder = builder_new_from_string (buffer3, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); @@ -1482,7 +1685,7 @@ test_window (void) GtkBuilder *builder; GObject *window1; char *title; - + builder = builder_new_from_string (buffer1, -1, NULL); window1 = gtk_builder_get_object (builder, "window1"); g_object_get (window1, "title", &title, NULL); @@ -1505,7 +1708,7 @@ test_value_from_string (void) GtkBuilder *builder; builder = gtk_builder_new (); - + g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_STRING, "test", &value, &error)); g_assert_true (G_VALUE_HOLDS_STRING (&value)); g_assert_cmpstr (g_value_get_string (&value), ==, "test"); @@ -1545,7 +1748,7 @@ test_value_from_string (void) g_assert_true (G_VALUE_HOLDS_BOOLEAN (&value)); g_assert_true (g_value_get_boolean (&value)); g_value_unset (&value); - + g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "blaurgh", &value, &error) == FALSE); g_value_unset (&value); g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE); @@ -1557,19 +1760,19 @@ test_value_from_string (void) g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE); g_error_free (error); error = NULL; - + g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "trueee", &value, &error) == FALSE); g_value_unset (&value); g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE); g_error_free (error); error = NULL; - + g_assert_false (gtk_builder_value_from_string_type (builder, G_TYPE_BOOLEAN, "", &value, &error)); g_value_unset (&value); g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE); g_error_free (error); error = NULL; - + g_assert_true (gtk_builder_value_from_string_type (builder, G_TYPE_INT, "12345", &value, &error)); g_assert_true (G_VALUE_HOLDS_INT (&value)); g_assert_cmpint (g_value_get_int (&value), ==, 12345); @@ -1628,7 +1831,7 @@ test_value_from_string (void) g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE); g_error_free (error); error = NULL; - + g_object_unref (builder); } @@ -1667,7 +1870,7 @@ test_reference_counting (void) " </object>" "</interface>"; GObject *window, *treeview, *model; - + builder = builder_new_from_string (buffer1, -1, NULL); window = gtk_builder_get_object (builder, "window1"); treeview = gtk_builder_get_object (builder, "treeview1"); @@ -1679,7 +1882,7 @@ test_reference_counting (void) g_assert_false (model_freed); gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), NULL); g_assert_true (model_freed); - + gtk_window_destroy (GTK_WINDOW (window)); builder = builder_new_from_string (buffer2, -1, NULL); @@ -1697,8 +1900,8 @@ typedef struct { gboolean language; } FoundAttrs; -static gboolean -filter_pango_attrs (PangoAttribute *attr, +static gboolean +filter_pango_attrs (PangoAttribute *attr, gpointer data) { FoundAttrs *found = (FoundAttrs *)data; @@ -1710,7 +1913,7 @@ filter_pango_attrs (PangoAttribute *attr, else if (attr->klass->type == PANGO_ATTR_UNDERLINE) found->underline = TRUE; /* Make sure optional start/end properties are working */ - else if (attr->klass->type == PANGO_ATTR_SIZE && + else if (attr->klass->type == PANGO_ATTR_SIZE && attr->start_index == 5 && attr->end_index == 10) found->size = TRUE; @@ -1760,7 +1963,7 @@ test_pango_attributes (void) GObject *label; GError *error = NULL; PangoAttrList *attrs, *filtered; - + /* Test attributes are set */ builder = builder_new_from_string (buffer, -1, NULL); label = gtk_builder_get_object (builder, "label1"); @@ -1868,7 +2071,7 @@ test_add_objects (void) g_assert_null (obj); obj = gtk_builder_get_object (builder, "window2"); g_assert_null (obj); - obj = gtk_builder_get_object (builder, "mainbox"); + obj = gtk_builder_get_object (builder, "mainbox"); g_assert_true (GTK_IS_WIDGET (obj)); g_object_unref (builder); @@ -1882,7 +2085,7 @@ test_add_objects (void) obj = gtk_builder_get_object (builder, "window2"); g_assert_true (GTK_IS_WINDOW (obj)); gtk_window_destroy (GTK_WINDOW (obj)); - obj = gtk_builder_get_object (builder, "mainbox"); + obj = gtk_builder_get_object (builder, "mainbox"); g_assert_true (GTK_IS_WIDGET (obj)); g_object_unref (builder); } @@ -2284,7 +2487,7 @@ static void test_anaconda_signal (void) { GtkBuilder *builder; - const char buffer[] = + const char buffer[] = "<?xml version='1.0' encoding='UTF-8'?>" "<interface>" " <requires lib='gtk' version='4.0'/>" @@ -2364,7 +2567,7 @@ test_shortcuts (void) GtkBuilder *builder; GObject *obj; - const char buffer[] = + const char buffer[] = "<interface>" " <object class='GtkBox' id='box'>" " <child>" diff --git a/testsuite/gtk/builderparser.c b/testsuite/gtk/builderparser.c index 7f26242d60..66556e2048 100644 --- a/testsuite/gtk/builderparser.c +++ b/testsuite/gtk/builderparser.c @@ -51,7 +51,7 @@ test_file (const char *filename, GString *string) { g_string_append_printf (string, "ERROR: %s %d\n%s\n", g_quark_to_string (error->domain), - error->code, + error->code, error->message); g_error_free (error); } @@ -66,12 +66,12 @@ get_expected_filename (const char *filename) f = g_strdup (filename); p = strstr (f, ".ui"); - if (p) + if (p) *p = 0; expected = g_strconcat (f, ".expected", NULL); - + g_free (f); - + return expected; } |