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