1
0
mirror of https://gitlab.gnome.org/GNOME/glib.git synced 2025-07-29 05:13:30 +02:00
Files
build
debian
docs
gio
fam
fen
inotify
libasyncns
tests
win32
xdgmime
.gitignore
ChangeLog
Makefile.am
abicheck.sh
gappinfo.c
gappinfo.h
gasynchelper.c
gasynchelper.h
gasyncinitable.c
gasyncinitable.h
gasyncresult.c
gasyncresult.h
gbufferedinputstream.c
gbufferedinputstream.h
gbufferedoutputstream.c
gbufferedoutputstream.h
gcancellable.c
gcancellable.h
gcharsetconverter.c
gcharsetconverter.h
gcontenttype.c
gcontenttype.h
gcontenttypeprivate.h
gconverter.c
gconverter.h
gconverterinputstream.c
gconverterinputstream.h
gconverteroutputstream.c
gconverteroutputstream.h
gdatainputstream.c
gdatainputstream.h
gdataoutputstream.c
gdataoutputstream.h
gdesktopappinfo.c
gdesktopappinfo.h
gdrive.c
gdrive.h
gdummyfile.c
gdummyfile.h
gemblem.c
gemblem.h
gemblemedicon.c
gemblemedicon.h
gfile.c
gfile.h
gfileattribute-priv.h
gfileattribute.c
gfileattribute.h
gfileenumerator.c
gfileenumerator.h
gfileicon.c
gfileicon.h
gfileinfo-priv.h
gfileinfo.c
gfileinfo.h
gfileinputstream.c
gfileinputstream.h
gfileiostream.c
gfileiostream.h
gfilemonitor.c
gfilemonitor.h
gfilenamecompleter.c
gfilenamecompleter.h
gfileoutputstream.c
gfileoutputstream.h
gfilterinputstream.c
gfilterinputstream.h
gfilteroutputstream.c
gfilteroutputstream.h
gicon.c
gicon.h
ginetaddress.c
ginetaddress.h
ginetsocketaddress.c
ginetsocketaddress.h
ginitable.c
ginitable.h
ginputstream.c
ginputstream.h
gio-marshal.list
gio.h
gio.rc.in
gio.symbols
gioenums.h
gioenumtypes.c.template
gioenumtypes.h.template
gioerror.c
gioerror.h
giomodule-priv.h
giomodule.c
giomodule.h
gioscheduler.c
gioscheduler.h
giostream.c
giostream.h
giotypes.h
gloadableicon.c
gloadableicon.h
glocaldirectorymonitor.c
glocaldirectorymonitor.h
glocalfile.c
glocalfile.h
glocalfileenumerator.c
glocalfileenumerator.h
glocalfileinfo.c
glocalfileinfo.h
glocalfileinputstream.c
glocalfileinputstream.h
glocalfileiostream.c
glocalfileiostream.h
glocalfilemonitor.c
glocalfilemonitor.h
glocalfileoutputstream.c
glocalfileoutputstream.h
glocalvfs.c
glocalvfs.h
gmemoryinputstream.c
gmemoryinputstream.h
gmemoryoutputstream.c
gmemoryoutputstream.h
gmount.c
gmount.h
gmountoperation.c
gmountoperation.h
gmountprivate.h
gnativevolumemonitor.c
gnativevolumemonitor.h
gnetworkaddress.c
gnetworkaddress.h
gnetworkingprivate.h
gnetworkservice.c
gnetworkservice.h
goutputstream.c
goutputstream.h
gpollfilemonitor.c
gpollfilemonitor.h
gresolver.c
gresolver.h
gseekable.c
gseekable.h
gsimpleasyncresult.c
gsimpleasyncresult.h
gsocket.c
gsocket.h
gsocketaddress.c
gsocketaddress.h
gsocketaddressenumerator.c
gsocketaddressenumerator.h
gsocketclient.c
gsocketclient.h
gsocketconnectable.c
gsocketconnectable.h
gsocketconnection.c
gsocketconnection.h
gsocketcontrolmessage.c
gsocketcontrolmessage.h
gsocketinputstream.c
gsocketinputstream.h
gsocketlistener.c
gsocketlistener.h
gsocketoutputstream.c
gsocketoutputstream.h
gsocketservice.c
gsocketservice.h
gsrvtarget.c
gsrvtarget.h
gtcpconnection.c
gtcpconnection.h
gthemedicon.c
gthemedicon.h
gthreadedresolver.c
gthreadedresolver.h
gthreadedsocketservice.c
gthreadedsocketservice.h
gunionvolumemonitor.c
gunionvolumemonitor.h
gunixconnection.c
gunixconnection.h
gunixfdlist.c
gunixfdlist.h
gunixfdmessage.c
gunixfdmessage.h
gunixinputstream.c
gunixinputstream.h
gunixmount.c
gunixmount.h
gunixmounts.c
gunixmounts.h
gunixoutputstream.c
gunixoutputstream.h
gunixresolver.c
gunixresolver.h
gunixsocketaddress.c
gunixsocketaddress.h
gunixvolume.c
gunixvolume.h
gunixvolumemonitor.c
gunixvolumemonitor.h
gvfs.c
gvfs.h
gvolume.c
gvolume.h
gvolumemonitor.c
gvolumemonitor.h
gwin32appinfo.c
gwin32appinfo.h
gwin32mount.c
gwin32mount.h
gwin32resolver.c
gwin32resolver.h
gwin32volumemonitor.c
gwin32volumemonitor.h
gzlibcompressor.c
gzlibcompressor.h
gzlibdecompressor.c
gzlibdecompressor.h
makefile.msc
makegioalias.pl
pltcheck.sh
glib
gmodule
gobject
gthread
m4macros
po
tests
.gitignore
AUTHORS
COPYING
ChangeLog.pre-1-2
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-14
ChangeLog.pre-2-16
ChangeLog.pre-2-18
ChangeLog.pre-2-2
ChangeLog.pre-2-20
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
HACKING
INSTALL.in
MAINTAINERS
Makefile.am
Makefile.decl
NEWS
NEWS.pre-1-3
README.commits
README.in
README.win32
acglib.m4
acinclude.m4
autogen.sh
config.h.win32.in
configure.in
gio-2.0-uninstalled.pc.in
gio-2.0.pc.in
gio-unix-2.0-uninstalled.pc.in
gio-unix-2.0.pc.in
glib-2.0-uninstalled.pc.in
glib-2.0.pc.in
glib-gettextize.in
glib-zip.in
glibconfig.h.win32.in
gmodule-2.0-uninstalled.pc.in
gmodule-2.0.pc.in
gmodule-export-2.0.pc.in
gmodule-no-export-2.0-uninstalled.pc.in
gmodule-no-export-2.0.pc.in
gobject-2.0-uninstalled.pc.in
gobject-2.0.pc.in
gthread-2.0-uninstalled.pc.in
gthread-2.0.pc.in
makefile.msc
mkinstalldirs
msvc_recommended_pragmas.h
sanity_check
win32-fixup.pl
glib/gio/gemblem.c
Matthias Clasen 642e9c7540 Fix the icon property implementation
Turns out both the setter and the getter were broken...
Fixes bug 585676.
2009-06-15 00:45:55 -04:00

364 lines
8.5 KiB
C

/* GIO - GLib Input, Output and Streaming Library
*
* Copyright (C) 2008 Clemens N. Buss <cebuzz@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <config.h>
#include "gicon.h"
#include "gemblem.h"
#include "glibintl.h"
#include "gioenums.h"
#include "gioenumtypes.h"
#include "gioerror.h"
#include <stdlib.h>
#include <string.h>
#include "gioalias.h"
/**
* SECTION:gemblem
* @short_description: An object for emblems
* @include: gio/gio.h
* @see_also: #GIcon, #GEmblemedIcon, #GLoadableIcon, #GThemedIcon
*
* #GEmblem is an implementation of #GIcon that supports
* having an emblem, which is an icon with additional properties.
* It can than be added to a #GEmblemedIcon.
*
* Currently, only metainformation about the emblem's origin is
* supported. More may be added in the future.
*/
static void g_emblem_iface_init (GIconIface *iface);
struct _GEmblem
{
GObject parent_instance;
GIcon *icon;
GEmblemOrigin origin;
};
struct _GEmblemClass
{
GObjectClass parent_class;
};
enum
{
PROP_0_GEMBLEM,
PROP_ICON,
PROP_ORIGIN
};
G_DEFINE_TYPE_WITH_CODE (GEmblem, g_emblem, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (G_TYPE_ICON, g_emblem_iface_init))
static void
g_emblem_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GEmblem *emblem = G_EMBLEM (object);
switch (prop_id)
{
case PROP_ICON:
g_value_set_object (value, emblem->icon);
break;
case PROP_ORIGIN:
g_value_set_enum (value, emblem->origin);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
g_emblem_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GEmblem *emblem = G_EMBLEM (object);
switch (prop_id)
{
case PROP_ICON:
emblem->icon = g_value_dup_object (value);
break;
case PROP_ORIGIN:
emblem->origin = g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
g_emblem_finalize (GObject *object)
{
GEmblem *emblem = G_EMBLEM (object);
g_object_unref (emblem->icon);
(*G_OBJECT_CLASS (g_emblem_parent_class)->finalize) (object);
}
static void
g_emblem_class_init (GEmblemClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = g_emblem_finalize;
gobject_class->set_property = g_emblem_set_property;
gobject_class->get_property = g_emblem_get_property;
g_object_class_install_property (gobject_class,
PROP_ORIGIN,
g_param_spec_enum ("origin",
P_("GEmblem's origin"),
P_("Tells which origin the emblem is derived from"),
G_TYPE_EMBLEM_ORIGIN,
G_EMBLEM_ORIGIN_UNKNOWN,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class,
PROP_ICON,
g_param_spec_object ("icon",
P_("The icon of the emblem"),
P_("The actual icon of the emblem"),
G_TYPE_OBJECT,
G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static void
g_emblem_init (GEmblem *emblem)
{
}
/**
* g_emblem_new:
* @icon: a GIcon containing the icon.
*
* Creates a new emblem for @icon.
*
* Returns: a new #GEmblem.
*
* Since: 2.18
*/
GEmblem *
g_emblem_new (GIcon *icon)
{
GEmblem* emblem;
g_return_val_if_fail (icon != NULL, NULL);
g_return_val_if_fail (G_IS_ICON (icon), NULL);
g_return_val_if_fail (!G_IS_EMBLEM (icon), NULL);
emblem = g_object_new (G_TYPE_EMBLEM, NULL);
emblem->icon = g_object_ref (icon);
emblem->origin = G_EMBLEM_ORIGIN_UNKNOWN;
return emblem;
}
/**
* g_emblem_new_with_origin:
* @icon: a GIcon containing the icon.
* @origin: a GEmblemOrigin enum defining the emblem's origin
*
* Creates a new emblem for @icon.
*
* Returns: a new #GEmblem.
*
* Since: 2.18
*/
GEmblem *
g_emblem_new_with_origin (GIcon *icon,
GEmblemOrigin origin)
{
GEmblem* emblem;
g_return_val_if_fail (icon != NULL, NULL);
g_return_val_if_fail (G_IS_ICON (icon), NULL);
g_return_val_if_fail (!G_IS_EMBLEM (icon), NULL);
emblem = g_object_new (G_TYPE_EMBLEM, NULL);
emblem->icon = g_object_ref (icon);
emblem->origin = origin;
return emblem;
}
/**
* g_emblem_get_icon:
* @emblem: a #GEmblem from which the icon should be extracted.
*
* Gives back the icon from @emblem.
*
* Returns: a #GIcon. The returned object belongs to the emblem
* and should not be modified or freed.
*
* Since: 2.18
*/
GIcon *
g_emblem_get_icon (GEmblem *emblem)
{
g_return_val_if_fail (G_IS_EMBLEM (emblem), NULL);
return emblem->icon;
}
/**
* g_emblem_get_origin:
* @emblem: a #GEmblem
*
* Gets the origin of the emblem.
*
* Returns: the origin of the emblem
*
* Since: 2.18
*/
GEmblemOrigin
g_emblem_get_origin (GEmblem *emblem)
{
g_return_val_if_fail (G_IS_EMBLEM (emblem), G_EMBLEM_ORIGIN_UNKNOWN);
return emblem->origin;
}
static guint
g_emblem_hash (GIcon *icon)
{
GEmblem *emblem = G_EMBLEM (icon);
guint hash;
hash = g_icon_hash (g_emblem_get_icon (emblem));
hash ^= emblem->origin;
return hash;
}
static gboolean
g_emblem_equal (GIcon *icon1,
GIcon *icon2)
{
GEmblem *emblem1 = G_EMBLEM (icon1);
GEmblem *emblem2 = G_EMBLEM (icon2);
return emblem1->origin == emblem2->origin &&
g_icon_equal (emblem1->icon, emblem2->icon);
}
static gboolean
g_emblem_to_tokens (GIcon *icon,
GPtrArray *tokens,
gint *out_version)
{
GEmblem *emblem = G_EMBLEM (icon);
char *s;
/* GEmblem are encoded as
*
* <origin> <icon>
*/
g_return_val_if_fail (out_version != NULL, FALSE);
*out_version = 0;
s = g_icon_to_string (emblem->icon);
if (s == NULL)
return FALSE;
g_ptr_array_add (tokens, s);
s = g_strdup_printf ("%d", emblem->origin);
g_ptr_array_add (tokens, s);
return TRUE;
}
static GIcon *
g_emblem_from_tokens (gchar **tokens,
gint num_tokens,
gint version,
GError **error)
{
GEmblem *emblem;
GIcon *icon;
GEmblemOrigin origin;
emblem = NULL;
if (version != 0)
{
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_INVALID_ARGUMENT,
_("Can't handle version %d of GEmblem encoding"),
version);
return NULL;
}
if (num_tokens != 2)
{
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_INVALID_ARGUMENT,
_("Malformed number of tokens (%d) in GEmblem encoding"),
num_tokens);
return NULL;
}
icon = g_icon_new_for_string (tokens[0], error);
if (icon == NULL)
return NULL;
origin = atoi (tokens[1]);
emblem = g_emblem_new_with_origin (icon, origin);
g_object_unref (icon);
return G_ICON (emblem);
}
static void
g_emblem_iface_init (GIconIface *iface)
{
iface->hash = g_emblem_hash;
iface->equal = g_emblem_equal;
iface->to_tokens = g_emblem_to_tokens;
iface->from_tokens = g_emblem_from_tokens;
}
#define __G_EMBLEM_C__
#include "gioaliasdef.c"