1a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
3a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen/* GIO - GLib Input, Output and Streaming Library
4a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
5a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Copyright (C) 2006-2007 Red Hat, Inc.
6a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
7a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * This library is free software; you can redistribute it and/or
8a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * modify it under the terms of the GNU Lesser General Public
9a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * License as published by the Free Software Foundation; either
10a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * version 2 of the License, or (at your option) any later version.
11a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
12a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * This library is distributed in the hope that it will be useful,
13a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * but WITHOUT ANY WARRANTY; without even the implied warranty of
14a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Lesser General Public License for more details.
16a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
17a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * You should have received a copy of the GNU Lesser General
18a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Public License along with this library; if not, write to the
19a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Boston, MA 02111-1307, USA.
21a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
22a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Author: Matthias Clasen <mclasen@redhat.com>
23001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen *         Clemens N. Buss <cebuzz@gmail.com>
24a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen */
25a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
26a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#include <config.h>
27a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
28a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#include <string.h>
29a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
30a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#include "gemblemedicon.h"
31a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#include "glibintl.h"
324f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson#include "gioerror.h"
33a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
34a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#include "gioalias.h"
35a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
36a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen/**
37a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * SECTION:gemblemedicon
38a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * @short_description: Icon with emblems
39a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * @include: gio/gio.h
40001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @see_also: #GIcon, #GLoadableIcon, #GThemedIcon, #GEmblem
41a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
42a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * #GEmblemedIcon is an implementation of #GIcon that supports
43001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * adding an emblem to an icon. Adding multiple emblems to an
44001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * icon is ensured via g_emblemed_icon_add_emblem().
45a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
46a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Note that #GEmblemedIcon allows no control over the position
47001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * of the emblems. See also #GEmblem for more information.
48a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen **/
49a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
50a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic void g_emblemed_icon_icon_iface_init (GIconIface *iface);
51a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
52a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstruct _GEmblemedIcon
53a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
54a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GObject parent_instance;
55a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
56a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GIcon *icon;
57001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  GList *emblems;
58a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen};
59a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
60a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstruct _GEmblemedIconClass
61a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
62a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GObjectClass parent_class;
63a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen};
64a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
65a2b61b1e4695df69326a5ae52f66291e25825649Matthias ClasenG_DEFINE_TYPE_WITH_CODE (GEmblemedIcon, g_emblemed_icon, G_TYPE_OBJECT,
66001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen                         G_IMPLEMENT_INTERFACE (G_TYPE_ICON,
67001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen                         g_emblemed_icon_icon_iface_init))
68a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
69a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
70a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic void
71a2b61b1e4695df69326a5ae52f66291e25825649Matthias Claseng_emblemed_icon_finalize (GObject *object)
72a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
73a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GEmblemedIcon *emblemed;
74a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
75a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  emblemed = G_EMBLEMED_ICON (object);
76a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
77a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  g_object_unref (emblemed->icon);
78001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_list_foreach (emblemed->emblems, (GFunc) g_object_unref, NULL);
79e38e6aafe0d5549f38a50a01d1e194e2a952063cDavid Zeuthen  g_list_free (emblemed->emblems);
80a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
81a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  (*G_OBJECT_CLASS (g_emblemed_icon_parent_class)->finalize) (object);
82a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
83a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
84a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic void
85a2b61b1e4695df69326a5ae52f66291e25825649Matthias Claseng_emblemed_icon_class_init (GEmblemedIconClass *klass)
86a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
87a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
88a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  gobject_class->finalize = g_emblemed_icon_finalize;
89a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
90a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
91a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic void
92a2b61b1e4695df69326a5ae52f66291e25825649Matthias Claseng_emblemed_icon_init (GEmblemedIcon *emblemed)
93a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
94a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
95a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
96a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen/**
97a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * g_emblemed_icon_new:
98001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @icon: a #GIcon
99001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @emblem: a #GEmblem
100a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
101001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Creates a new emblemed icon for @icon with the emblem @emblem.
102a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
103001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Returns: a new #GIcon
104a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
105a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Since: 2.18
106a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen **/
107a2b61b1e4695df69326a5ae52f66291e25825649Matthias ClasenGIcon *
108001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Claseng_emblemed_icon_new (GIcon   *icon,
109001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen                     GEmblem *emblem)
110a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
111a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GEmblemedIcon *emblemed;
112001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
113001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_val_if_fail (G_IS_ICON (icon), NULL);
114001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_val_if_fail (!G_IS_EMBLEM (icon), NULL);
115001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_val_if_fail (G_IS_EMBLEM (emblem), NULL);
116a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
117a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  emblemed = G_EMBLEMED_ICON (g_object_new (G_TYPE_EMBLEMED_ICON, NULL));
118a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  emblemed->icon = g_object_ref (icon);
119001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
120001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_emblemed_icon_add_emblem (emblemed, emblem);
121a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
122a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  return G_ICON (emblemed);
123a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
124a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
125001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
126a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen/**
127a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * g_emblemed_icon_get_icon:
128001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @emblemed: a #GEmblemedIcon
129a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
130001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Gets the main icon for @emblemed.
131a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
132001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Returns: a #GIcon that is owned by @emblemed
133a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
134a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Since: 2.18
135a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen **/
136a2b61b1e4695df69326a5ae52f66291e25825649Matthias ClasenGIcon *
137001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Claseng_emblemed_icon_get_icon (GEmblemedIcon *emblemed)
138a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
139001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_val_if_fail (G_IS_EMBLEMED_ICON (emblemed), NULL);
140a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
141001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  return emblemed->icon;
142a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
143a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
144a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen/**
145001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * g_emblemed_icon_get_emblems:
146001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @emblemed: a #GEmblemedIcon
147a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
148001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Gets the list of emblems for the @icon.
149a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
150001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Returns: a #GList of #GEmblem <!-- -->s that is owned by @emblemed
151a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen *
152a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen * Since: 2.18
153a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen **/
154001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
155001bb527b6cbad8da7649e0411bdb48785e550d9Matthias ClasenGList *
156001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Claseng_emblemed_icon_get_emblems (GEmblemedIcon *emblemed)
157001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen{
158001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_val_if_fail (G_IS_EMBLEMED_ICON (emblemed), NULL);
159001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
160001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  return emblemed->emblems;
161001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen}
162001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
163001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
164001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen/**
165001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * g_emblemed_icon_add_emblem:
166001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @emblemed: a #GEmblemedIcon
167001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * @emblem: a #GEmblem
168001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen *
169001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Adds @emblem to the #GList of #GEmblem <!-- -->s.
170001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen *
171001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen * Since: 2.18
172001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen **/
173001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasenvoid
174001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Claseng_emblemed_icon_add_emblem (GEmblemedIcon *emblemed,
175001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen                            GEmblem       *emblem)
176a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
177001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_if_fail (G_IS_EMBLEMED_ICON (emblemed));
178001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_return_if_fail (G_IS_EMBLEM (emblem));
179a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
180001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  g_object_ref (emblem);
181001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  emblemed->emblems = g_list_append (emblemed->emblems, emblem);
182a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
183a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
184a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic guint
185a2b61b1e4695df69326a5ae52f66291e25825649Matthias Claseng_emblemed_icon_hash (GIcon *icon)
186a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
187a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GEmblemedIcon *emblemed = G_EMBLEMED_ICON (icon);
188001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  GList *list;
189001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  guint hash = g_icon_hash (emblemed->icon);
190a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
191001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  for (list = emblemed->emblems; list != NULL; list = list->next)
192001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    hash ^= g_icon_hash (G_ICON (list->data));
193a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
194a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  return hash;
195a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
196a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
197001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasenstatic gint
198001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Claseng_emblem_comp (GEmblem *a,
199001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen               GEmblem *b)
200001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen{
201001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  guint hash_a = g_icon_hash (G_ICON (a));
202001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  guint hash_b = g_icon_hash (G_ICON (b));
203001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
204001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  if(hash_a < hash_b)
205001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    return -1;
206001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
207001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  if(hash_a == hash_b)
208001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    return 0;
209001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
210001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  return 1;
211001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen}
212001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
213a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic gboolean
214a2b61b1e4695df69326a5ae52f66291e25825649Matthias Claseng_emblemed_icon_equal (GIcon *icon1,
215a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen                       GIcon *icon2)
216a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
217a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GEmblemedIcon *emblemed1 = G_EMBLEMED_ICON (icon1);
218a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  GEmblemedIcon *emblemed2 = G_EMBLEMED_ICON (icon2);
219001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  GList *list1, *list2;
220001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
221001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  if (!g_icon_equal (emblemed1->icon, emblemed2->icon))
222001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    return FALSE;
223001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
224001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  list1 = emblemed1->emblems;
225001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  list2 = emblemed2->emblems;
226001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
227001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  list1 = g_list_sort (list1, (GCompareFunc) g_emblem_comp);
228001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  list2 = g_list_sort (list2, (GCompareFunc) g_emblem_comp);
229001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
230001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  while (list1 && list2)
231001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  {
232001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    if (!g_icon_equal (G_ICON (list1->data), G_ICON (list2->data)))
233001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen        return FALSE;
234001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
235001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    list1 = list1->next;
236001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen    list2 = list2->next;
237001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  }
238001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen
239001bb527b6cbad8da7649e0411bdb48785e550d9Matthias Clasen  return list1 == NULL && list2 == NULL;
240a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
241a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
2424f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larssonstatic gboolean
2434f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larssong_emblemed_icon_to_tokens (GIcon *icon,
2444f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                           GPtrArray *tokens,
2454f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                           gint  *out_version)
2464f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson{
2474f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  GEmblemedIcon *emblemed_icon = G_EMBLEMED_ICON (icon);
2484f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  GList *l;
2494f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  char *s;
2504f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2514f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  /* GEmblemedIcons are encoded as
2524f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson   *
2534f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson   *   <encoded_icon> [<encoded_emblem_icon>]*
2544f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson   */
2554f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2564f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  g_return_val_if_fail (out_version != NULL, FALSE);
2574f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2584f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  *out_version = 0;
2594f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2604f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  s = g_icon_to_string (emblemed_icon->icon);
2614f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  if (s == NULL)
2624f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    return FALSE;
2634f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2644f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  g_ptr_array_add (tokens, s);
2654f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2664f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  for (l = emblemed_icon->emblems; l != NULL; l = l->next)
2674f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    {
2684f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      GIcon *emblem_icon = G_ICON (l->data);
2694f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2704f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      s = g_icon_to_string (emblem_icon);
2714f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      if (s == NULL)
2724f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson        return FALSE;
2734f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2744f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      g_ptr_array_add (tokens, s);
2754f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    }
2764f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2774f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  return TRUE;
2784f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson}
2794f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2804f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larssonstatic GIcon *
2814f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larssong_emblemed_icon_from_tokens (gchar  **tokens,
2824f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                             gint     num_tokens,
2834f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                             gint     version,
2844f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                             GError **error)
2854f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson{
2864f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  GEmblemedIcon *emblemed_icon;
2874f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  int n;
2884f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2894f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  emblemed_icon = NULL;
2904f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
2914f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  if (version != 0)
2924f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    {
2934f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      g_set_error (error,
2944f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   G_IO_ERROR,
2954f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   G_IO_ERROR_INVALID_ARGUMENT,
2964f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   _("Can't handle version %d of GEmblemedIcon encoding"),
2974f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   version);
2984f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      goto fail;
2994f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    }
3004f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3014f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  if (num_tokens < 1)
3024f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    {
3034f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      g_set_error (error,
3044f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   G_IO_ERROR,
3054f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   G_IO_ERROR_INVALID_ARGUMENT,
3064f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   _("Malformed number of tokens (%d) in GEmblemedIcon encoding"),
3074f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                   num_tokens);
3084f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      goto fail;
3094f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    }
3104f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3114f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  emblemed_icon = g_object_new (G_TYPE_EMBLEMED_ICON, NULL);
3124f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  emblemed_icon->icon = g_icon_new_for_string (tokens[0], error);
3134f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  if (emblemed_icon->icon == NULL)
3144f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    goto fail;
3154f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3164f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  for (n = 1; n < num_tokens; n++)
3174f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    {
3184f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      GIcon *emblem;
3194f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3204f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      emblem = g_icon_new_for_string (tokens[n], error);
3214f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      if (emblem == NULL)
3224f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson        goto fail;
3234f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3244f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      if (!G_IS_EMBLEM (emblem))
3254f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson        {
3264f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson          g_set_error_literal (error,
3274f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                               G_IO_ERROR,
3284f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                               G_IO_ERROR_INVALID_ARGUMENT,
3294f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson                               _("Expected a GEmblem for GEmblemedIcon"));
3304f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson          g_object_unref (emblem);
3314f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson          goto fail;
3324f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson        }
3334f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3344f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson      emblemed_icon->emblems = g_list_append (emblemed_icon->emblems, emblem);
3354f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    }
3364f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3374f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  return G_ICON (emblemed_icon);
3384f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
3394f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson fail:
3404f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  if (emblemed_icon != NULL)
3414f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson    g_object_unref (emblemed_icon);
3424f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  return NULL;
3434f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson}
3444f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson
345a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasenstatic void
346a2b61b1e4695df69326a5ae52f66291e25825649Matthias Claseng_emblemed_icon_icon_iface_init (GIconIface *iface)
347a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen{
348a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  iface->hash = g_emblemed_icon_hash;
349a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen  iface->equal = g_emblemed_icon_equal;
3504f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  iface->to_tokens = g_emblemed_icon_to_tokens;
3514f0b18d2031c2c9882c2d5a84435b3613f372c4cAlexander Larsson  iface->from_tokens = g_emblemed_icon_from_tokens;
352a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen}
353a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen
354a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#define __G_EMBLEMED_ICON_C__
355a2b61b1e4695df69326a5ae52f66291e25825649Matthias Clasen#include "gioaliasdef.c"
356