static gboolean gtk_level_bar_ensure_offset (GtkLevelBar *self, const gchar *name, gdouble value) { GList *existing; GtkLevelBarOffset *offset = NULL; existing = g_list_find_custom (self->priv->offsets, name, offset_find_func); if (existing) offset = existing->data; if (offset && (offset->value == value)) return FALSE; if (offset) { gtk_level_bar_offset_free (offset); self->priv->offsets = g_list_delete_link (self->priv->offsets, existing); } offset = gtk_level_bar_offset_new (name, value); self->priv->offsets = g_list_insert_sorted (self->priv->offsets, offset, offset_sort_func); return TRUE; }
static void offset_start_element (GMarkupParseContext *context, const gchar *element_name, const gchar **names, const gchar **values, gpointer user_data, GError **error) { OffsetsParserData *data = user_data; if (strcmp (element_name, "offsets") == 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, "offset") == 0) { const gchar *name; const gchar *value; GValue gvalue = G_VALUE_INIT; GtkLevelBarOffset *offset; if (!_gtk_builder_check_parent (data->builder, context, "offsets", error)) return; if (!g_markup_collect_attributes (element_name, names, values, error, G_MARKUP_COLLECT_STRING, "name", &name, G_MARKUP_COLLECT_STRING, "value", &value, G_MARKUP_COLLECT_INVALID)) { _gtk_builder_prefix_error (data->builder, context, error); return; } if (!gtk_builder_value_from_string_type (data->builder, G_TYPE_DOUBLE, value, &gvalue, error)) { _gtk_builder_prefix_error (data->builder, context, error); return; } offset = gtk_level_bar_offset_new (name, g_value_get_double (&gvalue)); data->offsets = g_list_prepend (data->offsets, offset); } else { _gtk_builder_error_unhandled_tag (data->builder, context, "GtkLevelBar", element_name, error); } }
static void offset_start_element (GMarkupParseContext *context, const gchar *element_name, const gchar **names, const gchar **values, gpointer user_data, GError **error) { OffsetsParserData *parser_data = user_data; const gchar *name = NULL; const gchar *value_str = NULL; GtkLevelBarOffset *offset; gint line_number, char_number; gint idx; if (strcmp (element_name, "offsets") == 0) ; else if (strcmp (element_name, "offset") == 0) { for (idx = 0; names[idx] != NULL; idx++) { if (strcmp (names[idx], "name") == 0) { name = values[idx]; } else if (strcmp (names[idx], "value") == 0) { value_str = values[idx]; } 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[idx], "offset"); return; } } if (name && value_str) { offset = gtk_level_bar_offset_new (name, g_ascii_strtod (value_str, NULL)); parser_data->offsets = g_list_prepend (parser_data->offsets, offset); } } else { g_markup_parse_context_get_position (context, &line_number, &char_number); g_set_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_UNHANDLED_TAG, "%s:%d:%d unsupported tag for GtkLevelBar: \"%s\"", "<input>", line_number, char_number, element_name); } }