[gtk+] GtkWidget: Use the new helpers
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkWidget: Use the new helpers
- Date: Mon, 27 Apr 2015 05:19:36 +0000 (UTC)
commit b53b38ff32e0c25c92def1cc9fe1f3a2a5d66260
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Apr 25 19:37:02 2015 -0400
GtkWidget: Use the new helpers
Instead of issuing g_warning, fill the provided GError.
This lets us test this error handling, and is the right
thing to do. Use the new GtkBuilder helpers and
g_markup_collect_attributes to do so.
gtk/gtkwidget.c | 327 ++++++++++++++++++++++++++++---------------------------
1 files changed, 164 insertions(+), 163 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index e1db357..8aab90c 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -14140,21 +14140,20 @@ gtk_widget_buildable_parser_finished (GtkBuildable *buildable,
typedef struct
{
+ GtkBuilder *builder;
GSList *actions;
GSList *relations;
} AccessibilitySubParserData;
static void
accessibility_start_element (GMarkupParseContext *context,
- const gchar *element_name,
- const gchar **names,
- const gchar **values,
- gpointer user_data,
- GError **error)
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ gpointer user_data,
+ GError **error)
{
AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data;
- guint i;
- gint line_number, char_number;
if (strcmp (element_name, "relation") == 0)
{
@@ -14162,106 +14161,46 @@ accessibility_start_element (GMarkupParseContext *context,
gchar *type = NULL;
AtkRelationData *relation;
- for (i = 0; names[i]; i++)
- {
- if (strcmp (names[i], "target") == 0)
- target = g_strdup (values[i]);
- else if (strcmp (names[i], "type") == 0)
- type = g_strdup (values[i]);
- else
- {
- g_markup_parse_context_get_position (context,
- &line_number,
- &char_number);
- g_set_error (error,
- GTK_BUILDER_ERROR,
- GTK_BUILDER_ERROR_INVALID_ATTRIBUTE,
- "%s:%d:%d '%s' is not a valid attribute of <%s>",
- "<input>",
- line_number, char_number, names[i], "relation");
- g_free (target);
- g_free (type);
- return;
- }
- }
+ if (!_gtk_builder_check_parent (data->builder, context, "accessibility", error))
+ return;
- if (!target || !type)
- {
- g_markup_parse_context_get_position (context,
- &line_number,
- &char_number);
- g_set_error (error,
- GTK_BUILDER_ERROR,
- GTK_BUILDER_ERROR_MISSING_ATTRIBUTE,
- "%s:%d:%d <%s> requires attribute \"%s\"",
- "<input>",
- line_number, char_number, "relation",
- type ? "target" : "type");
- g_free (target);
- g_free (type);
- return;
- }
+ if (!g_markup_collect_attributes (element_name, names, values, error,
+ G_MARKUP_COLLECT_STRING, "target", &target,
+ G_MARKUP_COLLECT_STRING, "type", &type,
+ G_MARKUP_COLLECT_INVALID))
+ {
+ _gtk_builder_prefix_error (data->builder, context, error);
+ return;
+ }
relation = g_slice_new (AtkRelationData);
- relation->target = target;
- relation->type = type;
+ relation->target = g_strdup (target);
+ relation->type = g_strdup (type);
data->relations = g_slist_prepend (data->relations, relation);
}
else if (strcmp (element_name, "action") == 0)
{
- const gchar *action_name = NULL;
+ const gchar *action_name;
const gchar *description = NULL;
const gchar *msg_context = NULL;
gboolean translatable = FALSE;
AtkActionData *action;
- for (i = 0; names[i]; i++)
- {
- if (strcmp (names[i], "action_name") == 0)
- action_name = values[i];
- else if (strcmp (names[i], "description") == 0)
- description = values[i];
- else if (strcmp (names[i], "translatable") == 0)
- {
- if (!_gtk_builder_boolean_from_string (values[i], &translatable, error))
- return;
- }
- else if (strcmp (names[i], "comments") == 0)
- {
- /* do nothing, comments are for translators */
- }
- else if (strcmp (names[i], "context") == 0)
- msg_context = values[i];
- else
- {
- g_markup_parse_context_get_position (context,
- &line_number,
- &char_number);
- g_set_error (error,
- GTK_BUILDER_ERROR,
- GTK_BUILDER_ERROR_INVALID_ATTRIBUTE,
- "%s:%d:%d '%s' is not a valid attribute of <%s>",
- "<input>",
- line_number, char_number, names[i], "action");
- return;
- }
- }
+ if (!_gtk_builder_check_parent (data->builder, context, "accessibility", error))
+ return;
- if (!action_name)
- {
- g_markup_parse_context_get_position (context,
- &line_number,
- &char_number);
- g_set_error (error,
- GTK_BUILDER_ERROR,
- GTK_BUILDER_ERROR_MISSING_ATTRIBUTE,
- "%s:%d:%d <%s> requires attribute \"%s\"",
- "<input>",
- line_number, char_number, "action",
- "action_name");
- return;
- }
+ if (!g_markup_collect_attributes (element_name, names, values, error,
+ G_MARKUP_COLLECT_STRING, "action_name", &action_name,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "description",
&description,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "comments", NULL,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "context",
&msg_context,
+ G_MARKUP_COLLECT_BOOLEAN|G_MARKUP_COLLECT_OPTIONAL, "translatable",
&translatable,
+ G_MARKUP_COLLECT_INVALID))
+ {
+ _gtk_builder_prefix_error (data->builder, context, error);
+ return;
+ }
action = g_slice_new (AtkActionData);
action->action_name = g_strdup (action_name);
@@ -14272,9 +14211,21 @@ accessibility_start_element (GMarkupParseContext *context,
data->actions = g_slist_prepend (data->actions, action);
}
else if (strcmp (element_name, "accessibility") == 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
- g_warning ("Unsupported tag for GtkWidget: %s\n", element_name);
+ {
+ _gtk_builder_error_unhandled_tag (data->builder, context,
+ "GtkWidget", element_name,
+ error);
+ }
}
static void
@@ -14304,6 +14255,7 @@ static const GMarkupParser accessibility_parser =
typedef struct
{
GObject *object;
+ GtkBuilder *builder;
guint key;
guint modifiers;
gchar *signal;
@@ -14311,42 +14263,65 @@ typedef struct
static void
accel_group_start_element (GMarkupParseContext *context,
- const gchar *element_name,
- const gchar **names,
- const gchar **values,
- gpointer user_data,
- GError **error)
-{
- gint i;
- guint key = 0;
- guint modifiers = 0;
- gchar *signal = NULL;
- AccelGroupParserData *parser_data = (AccelGroupParserData*)user_data;
-
- for (i = 0; names[i]; i++)
+ const gchar *element_name,
+ const gchar **names,
+ const gchar **values,
+ gpointer user_data,
+ GError **error)
+{
+ AccelGroupParserData *data = (AccelGroupParserData*)user_data;
+
+ if (strcmp (element_name, "accelerator") == 0)
{
- if (strcmp (names[i], "key") == 0)
- key = gdk_keyval_from_name (values[i]);
- else if (strcmp (names[i], "modifiers") == 0)
- {
- if (!_gtk_builder_flags_from_string (GDK_TYPE_MODIFIER_TYPE,
- values[i],
- &modifiers,
- error))
+ const gchar *key_str = NULL;
+ const gchar *signal = NULL;
+ const gchar *modifiers_str = NULL;
+ guint key = 0;
+ guint modifiers = 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_STRING, "key", &key_str,
+ G_MARKUP_COLLECT_STRING, "signal", &signal,
+ G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "modifiers",
&modifiers_str,
+ G_MARKUP_COLLECT_INVALID))
+ {
+ _gtk_builder_prefix_error (data->builder, context, error);
+ return;
+ }
+
+ key = gdk_keyval_from_name (key_str);
+ if (key == 0)
+ {
+ g_set_error (error,
+ GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE,
+ "Could not parse key '%s'", key_str);
+ _gtk_builder_prefix_error (data->builder, context, error);
+ return;
+ }
+
+ if (modifiers_str != NULL)
+ {
+ if (!_gtk_builder_flags_from_string (GDK_TYPE_MODIFIER_TYPE,
+ modifiers_str, &modifiers, error))
+ {
+ _gtk_builder_prefix_error (data->builder, context, error);
return;
- }
- else if (strcmp (names[i], "signal") == 0)
- signal = g_strdup (values[i]);
- }
+ }
+ }
- if (key == 0 || signal == NULL)
+ data->key = key;
+ data->modifiers = modifiers;
+ data->signal = g_strdup (signal);
+ }
+ else
{
- g_warning ("<accelerator> requires key and signal attributes");
- return;
+ _gtk_builder_error_unhandled_tag (data->builder, context,
+ "GtkWidget", element_name,
+ error);
}
- parser_data->key = key;
- parser_data->modifiers = modifiers;
- parser_data->signal = signal;
}
static const GMarkupParser accel_group_parser =
@@ -14356,6 +14331,7 @@ static const GMarkupParser accel_group_parser =
typedef struct
{
+ GtkBuilder *builder;
GSList *classes;
} StyleParserData;
@@ -14367,25 +14343,41 @@ style_start_element (GMarkupParseContext *context,
gpointer user_data,
GError **error)
{
- StyleParserData *style_data = (StyleParserData *)user_data;
- gchar *class_name;
+ StyleParserData *data = (StyleParserData *)user_data;
if (strcmp (element_name, "class") == 0)
{
- if (g_markup_collect_attributes (element_name,
- names,
- values,
- error,
- G_MARKUP_COLLECT_STRDUP, "name", &class_name,
- G_MARKUP_COLLECT_INVALID))
+ const gchar *name;
+
+ if (!_gtk_builder_check_parent (data->builder, context, "style", error))
+ return;
+
+ if (!g_markup_collect_attributes (element_name, names, values, error,
+ G_MARKUP_COLLECT_STRING, "name", &name,
+ G_MARKUP_COLLECT_INVALID))
{
- style_data->classes = g_slist_append (style_data->classes, class_name);
+ _gtk_builder_prefix_error (data->builder, context, error);
+ return;
}
+
+ data->classes = g_slist_append (data->classes, g_strdup (name));
}
else if (strcmp (element_name, "style") == 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
- g_warning ("Unsupported tag for GtkWidget: %s\n", element_name);
+ {
+ _gtk_builder_error_unhandled_tag (data->builder, context,
+ "GtkWidget", element_name,
+ error);
+ }
}
static const GMarkupParser style_parser =
@@ -14395,40 +14387,49 @@ static const GMarkupParser style_parser =
static gboolean
gtk_widget_buildable_custom_tag_start (GtkBuildable *buildable,
- GtkBuilder *builder,
- GObject *child,
- const gchar *tagname,
- GMarkupParser *parser,
- gpointer *data)
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ GMarkupParser *parser,
+ gpointer *parser_data)
{
- g_assert (buildable);
-
if (strcmp (tagname, "accelerator") == 0)
{
- AccelGroupParserData *parser_data;
+ AccelGroupParserData *data;
+
+ data = g_slice_new0 (AccelGroupParserData);
+ data->object = g_object_ref (buildable);
+ data->builder = builder;
- parser_data = g_slice_new0 (AccelGroupParserData);
- parser_data->object = g_object_ref (buildable);
*parser = accel_group_parser;
- *data = parser_data;
+ *parser_data = data;
+
return TRUE;
}
+
if (strcmp (tagname, "accessibility") == 0)
{
- AccessibilitySubParserData *parser_data;
+ AccessibilitySubParserData *data;
+
+ data = g_slice_new0 (AccessibilitySubParserData);
+ data->builder = builder;
- parser_data = g_slice_new0 (AccessibilitySubParserData);
*parser = accessibility_parser;
- *data = parser_data;
+ *parser_data = data;
+
return TRUE;
}
+
if (strcmp (tagname, "style") == 0)
{
- StyleParserData *parser_data;
+ StyleParserData *data;
+
+ data = g_slice_new0 (StyleParserData);
+ data->builder = builder;
- parser_data = g_slice_new0 (StyleParserData);
*parser = style_parser;
- *data = parser_data;
+ *parser_data = data;
+
return TRUE;
}
@@ -14437,8 +14438,8 @@ gtk_widget_buildable_custom_tag_start (GtkBuildable *buildable,
void
_gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
- GtkWidget *toplevel,
- gpointer user_data)
+ GtkWidget *toplevel,
+ gpointer user_data)
{
AccelGroupParserData *accel_data;
GSList *accel_groups;
@@ -14475,10 +14476,10 @@ _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
static void
gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
- GtkBuilder *builder,
- GObject *child,
- const gchar *tagname,
- gpointer user_data)
+ GtkBuilder *builder,
+ GObject *child,
+ const gchar *tagname,
+ gpointer user_data)
{
if (strcmp (tagname, "accelerator") == 0)
{
@@ -14566,9 +14567,9 @@ gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
}
}
-static GtkSizeRequestMode
+static GtkSizeRequestMode
gtk_widget_real_get_request_mode (GtkWidget *widget)
-{
+{
/* By default widgets dont trade size at all. */
return GTK_SIZE_REQUEST_CONSTANT_SIZE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]