+ gchar *logical_color_name;
+ gchar *logical_font_name;
+} typedef HildonLogicalElement;
+
+static void
+hildon_logical_element_list_free (GSList *list)
+{
+ GSList *iterator = list;
+
+ while (iterator) {
+ HildonLogicalElement *element = (HildonLogicalElement *) iterator->data;
+
+ g_free (element->logical_color_name);
+ g_free (element->logical_font_name);
+ g_slice_free (HildonLogicalElement, element);
+
+ iterator = iterator->next;
+ }
+
+ /* Free the list itself */
+ g_slist_free (list);
+}
+
+static GQuark
+hildon_helper_logical_data_quark (void)
+{
+ static GQuark quark = 0;
+
+ if (G_UNLIKELY (quark == 0))
+ quark = g_quark_from_static_string ("hildon-logical-data");
+
+ return quark;
+}
+
+static HildonLogicalElement*
+attach_blank_element (GtkWidget *widget,
+ GSList **style_list)
+{
+ gboolean first = (*style_list == NULL) ? TRUE : FALSE;
+
+ HildonLogicalElement *element = g_slice_new (HildonLogicalElement);
+
+ element->is_color = FALSE;
+ element->rc_flags = 0;
+ element->state = 0;
+ element->logical_color_name = NULL;
+ element->logical_font_name = NULL;
+
+ *style_list = g_slist_append (*style_list, element);
+
+ if (first)
+ g_object_set_qdata_full (G_OBJECT (widget), hildon_helper_logical_data_quark (), *style_list, (GDestroyNotify) hildon_logical_element_list_free);
+
+ return element;
+}
+
+static GSList*
+attach_new_font_element (GtkWidget *widget,
+ const gchar *font_name)
+{
+ GSList *style_list = g_object_get_qdata (G_OBJECT (widget), hildon_helper_logical_data_quark ());
+ HildonLogicalElement *element = NULL;
+
+ /* Try to find an element that already sets a font */
+ GSList *iterator = style_list;
+ while (iterator) {
+ element = (HildonLogicalElement *) iterator->data;
+
+ if (element->is_color == FALSE) {
+ /* Reusing ... */
+ g_free (element->logical_font_name);
+ element->logical_font_name = g_strdup (font_name);
+ return style_list;
+ }
+
+ iterator = iterator->next;
+ }
+
+ /* It was not found so we need to create a new one and attach it */
+ element = attach_blank_element (widget, &style_list);
+ element->is_color = FALSE;
+ element->logical_font_name = g_strdup (font_name);
+ return style_list;
+}
+
+static GSList*
+attach_new_color_element (GtkWidget *widget,
+ GtkRcFlags flags,
+ GtkStateType state,
+ const gchar *color_name)
+{
+ GSList *style_list = g_object_get_qdata (G_OBJECT (widget), hildon_helper_logical_data_quark ());
+ HildonLogicalElement *element = NULL;
+
+ /* Try to find an element that has same flags and state */
+ GSList *iterator = style_list;
+ while (iterator) {
+ element = (HildonLogicalElement *) iterator->data;
+
+ if (element->rc_flags == flags &&
+ element->state == state &&
+ element->is_color == TRUE) {
+ /* Reusing ... */
+ g_free (element->logical_color_name);
+ element->logical_color_name = g_strdup (color_name);
+ return style_list;
+ }
+
+ iterator = iterator->next;
+ }
+
+ /* It was not found so we need to create a new one and attach it */
+ element = attach_blank_element (widget, &style_list);
+ element->is_color = TRUE;
+ element->state = state;
+ element->rc_flags = flags;
+ element->logical_color_name = g_strdup (color_name);
+ return style_list;
+}