Skip to content

Commit

Permalink
Add support for getting symbolic icons
Browse files Browse the repository at this point in the history
  • Loading branch information
William Jon McCann committed Aug 30, 2012
1 parent 96daf63 commit c47f093
Show file tree
Hide file tree
Showing 15 changed files with 273 additions and 34 deletions.
9 changes: 9 additions & 0 deletions client/gdaemonmount.c
Expand Up @@ -121,6 +121,14 @@ g_daemon_mount_get_icon (GMount *mount)
return g_object_ref (daemon_mount->mount_info->icon);
}

static GIcon *
g_daemon_mount_get_symbolic_icon (GMount *mount)
{
GDaemonMount *daemon_mount = G_DAEMON_MOUNT (mount);

return g_object_ref (daemon_mount->mount_info->symbolic_icon);
}

static char *
g_daemon_mount_get_name (GMount *mount)
{
Expand Down Expand Up @@ -413,6 +421,7 @@ g_daemon_mount_mount_iface_init (GMountIface *iface)
iface->get_root = g_daemon_mount_get_root;
iface->get_name = g_daemon_mount_get_name;
iface->get_icon = g_daemon_mount_get_icon;
iface->get_symbolic_icon = g_daemon_mount_get_symbolic_icon;
iface->get_uuid = g_daemon_mount_get_uuid;
iface->get_volume = g_daemon_mount_get_volume;
iface->get_drive = g_daemon_mount_get_drive;
Expand Down
19 changes: 18 additions & 1 deletion common/gmounttracker.c
Expand Up @@ -89,6 +89,7 @@ g_mount_info_dup (GMountInfo *info)
copy->stable_name = g_strdup (info->stable_name);
copy->x_content_types = g_strdup (info->x_content_types);
copy->icon = g_object_ref (info->icon);
copy->symbolic_icon = g_object_ref (info->symbolic_icon);
copy->dbus_id = g_strdup (info->dbus_id);
copy->object_path = g_strdup (info->object_path);
copy->mount_spec = g_mount_spec_copy (info->mount_spec);
Expand Down Expand Up @@ -116,6 +117,7 @@ g_mount_info_unref (GMountInfo *info)
g_free (info->stable_name);
g_free (info->x_content_types);
g_object_unref (info->icon);
g_object_unref (info->symbolic_icon);
g_free (info->dbus_id);
g_free (info->object_path);
g_mount_spec_unref (info->mount_spec);
Expand Down Expand Up @@ -181,22 +183,25 @@ g_mount_info_from_dbus (GVariant *value)
const gchar *stable_name;
const gchar *x_content_types;
const gchar *icon_str;
const gchar *symbolic_icon_str;
const gchar *prefered_filename_encoding;
const gchar *dbus_id;
const gchar *obj_path;
const gchar *fuse_mountpoint;
const gchar *default_location;
GIcon *icon;
GIcon *symbolic_icon;
GVariant *iter_mount_spec;
GError *error;

g_variant_get (value, "(&s&o&s&s&s&s&sb^&ay@(aya{sv})^&ay)",
g_variant_get (value, "(&s&o&s&s&s&s&s&sb^&ay@(aya{sv})^&ay)",
&dbus_id,
&obj_path,
&display_name,
&stable_name,
&x_content_types,
&icon_str,
&symbolic_icon_str,
&prefered_filename_encoding,
&user_visible,
&fuse_mountpoint,
Expand Down Expand Up @@ -224,12 +229,24 @@ g_mount_info_from_dbus (GVariant *value)
icon = g_themed_icon_new ("gtk-missing-image"); /* TODO: maybe choose a better name */
}

if (symbolic_icon_str == NULL || strlen (symbolic_icon_str) == 0)
symbolic_icon_str = "drive-removable-media-symbolic";
error = NULL;
symbolic_icon = g_icon_new_for_string (symbolic_icon_str, &error);
if (symbolic_icon == NULL)
{
g_warning ("Malformed icon string '%s': %s", symbolic_icon_str, error->message);
g_error_free (error);
symbolic_icon = g_themed_icon_new ("drive-removable-media-symbolic");
}

info = g_new0 (GMountInfo, 1);
info->ref_count = 1;
info->display_name = g_strdup (display_name);
info->stable_name = g_strdup (stable_name);
info->x_content_types = g_strdup (x_content_types);
info->icon = icon;
info->symbolic_icon = symbolic_icon;
info->dbus_id = g_strdup (dbus_id);
info->object_path = g_strdup (obj_path);
info->mount_spec = mount_spec;
Expand Down
1 change: 1 addition & 0 deletions common/gmounttracker.h
Expand Up @@ -45,6 +45,7 @@ typedef struct {
char *stable_name;
char *x_content_types;
GIcon *icon;
GIcon *symbolic_icon;
char *dbus_id;
char *object_path;
gboolean user_visible;
Expand Down
11 changes: 6 additions & 5 deletions common/org.gtk.vfs.xml
Expand Up @@ -67,25 +67,26 @@
<interface name='org.gtk.vfs.MountTracker'>
<method name="LookupMount">
<arg type='(aya{sv})' name='mount_spec' direction='in'/>
<arg type='(sosssssbay(aya{sv})ay)' name='mount' direction='out'/>
<arg type='(sossssssbay(aya{sv})ay)' name='mount' direction='out'/>
</method>
<method name="LookupMountByFusePath">
<arg type='ay' name='fuse_path' direction='in'/>
<arg type='(sosssssbay(aya{sv})ay)' name='mount' direction='out'/>
<arg type='(sossssssbay(aya{sv})ay)' name='mount' direction='out'/>
</method>
<method name="MountLocation">
<arg type='(aya{sv})' name='mount_spec' direction='in'/>
<arg type='(so)' name='mount_source' direction='in'/>
</method>
<method name="ListMounts">
<arg type='a(sosssssbay(aya{sv})ay)' name='mounts' direction='out'/>
<arg type='a(sossssssbay(aya{sv})ay)' name='mounts' direction='out'/>
</method>
<method name="RegisterMount">
<arg type='o' name='obj_path' direction='in'/>
<arg type='s' name='display_name' direction='in'/>
<arg type='s' name='stable_name' direction='in'/>
<arg type='s' name='x_content_types' direction='in'/>
<arg type='s' name='icon' direction='in'/>
<arg type='s' name='symbolic_icon' direction='in'/>
<arg type='s' name='prefered_filename_encoding' direction='in'/>
<arg type='b' name='user_visible' direction='in'/>
<arg type='(aya{sv})' name='mount_spec' direction='in'/>
Expand All @@ -103,10 +104,10 @@
<method name="RegisterFuse">
</method>
<signal name="Mounted">
<arg type='(sosssssbay(aya{sv})ay)' name='mount'/>
<arg type='(sossssssbay(aya{sv})ay)' name='mount'/>
</signal>
<signal name="Unmounted">
<arg type='(sosssssbay(aya{sv})ay)' name='mount'/>
<arg type='(sossssssbay(aya{sv})ay)' name='mount'/>
</signal>
</interface>

Expand Down
33 changes: 33 additions & 0 deletions daemon/gvfsbackend.c
Expand Up @@ -74,6 +74,7 @@ struct _GVfsBackendPrivate
char *stable_name;
char **x_content_types;
GIcon *icon;
GIcon *symbolic_icon;
char *prefered_filename_encoding;
gboolean user_visible;
char *default_location;
Expand Down Expand Up @@ -148,6 +149,7 @@ g_vfs_backend_finalize (GObject *object)
g_free (backend->priv->stable_name);
g_strfreev (backend->priv->x_content_types);
g_clear_object (&backend->priv->icon);
g_clear_object (&backend->priv->symbolic_icon);
g_free (backend->priv->prefered_filename_encoding);
g_free (backend->priv->default_location);
if (backend->priv->mount_spec)
Expand Down Expand Up @@ -197,6 +199,7 @@ g_vfs_backend_init (GVfsBackend *backend)
{
backend->priv = G_TYPE_INSTANCE_GET_PRIVATE (backend, G_VFS_TYPE_BACKEND, GVfsBackendPrivate);
backend->priv->icon = NULL;
backend->priv->symbolic_icon = NULL;
backend->priv->prefered_filename_encoding = g_strdup ("");
backend->priv->display_name = g_strdup ("");
backend->priv->stable_name = g_strdup ("");
Expand Down Expand Up @@ -399,6 +402,22 @@ g_vfs_backend_set_icon (GVfsBackend *backend,
backend->priv->icon = g_object_ref (icon);
}

void
g_vfs_backend_set_symbolic_icon_name (GVfsBackend *backend,
const char *icon_name)
{
g_clear_object (&backend->priv->symbolic_icon);
backend->priv->symbolic_icon = g_themed_icon_new_with_default_fallbacks (icon_name);
}

void
g_vfs_backend_set_symbolic_icon (GVfsBackend *backend,
GIcon *icon)
{
g_clear_object (&backend->priv->symbolic_icon);
backend->priv->symbolic_icon = g_object_ref (icon);
}

void
g_vfs_backend_set_prefered_filename_encoding (GVfsBackend *backend,
const char *prefered_filename_encoding)
Expand Down Expand Up @@ -475,6 +494,12 @@ g_vfs_backend_get_icon (GVfsBackend *backend)
return backend->priv->icon;
}

GIcon *
g_vfs_backend_get_symbolic_icon (GVfsBackend *backend)
{
return backend->priv->symbolic_icon;
}

const char *
g_vfs_backend_get_default_location (GVfsBackend *backend)
{
Expand Down Expand Up @@ -635,6 +660,7 @@ register_mount_got_proxy_cb (GObject *source_object,
const char *stable_name;
char *x_content_types_string;
char *icon_str;
char *symbolic_icon_str;

proxy = gvfs_dbus_mount_tracker_proxy_new_for_bus_finish (res, &error);
if (proxy == NULL)
Expand Down Expand Up @@ -662,6 +688,11 @@ register_mount_got_proxy_cb (GObject *source_object,
else
icon_str = g_strdup ("");

if (backend->priv->symbolic_icon != NULL)
symbolic_icon_str = g_icon_to_string (backend->priv->symbolic_icon);
else
symbolic_icon_str = g_strdup ("");

if (backend->priv->stable_name != NULL &&
*backend->priv->stable_name != 0)
stable_name = backend->priv->stable_name;
Expand All @@ -674,6 +705,7 @@ register_mount_got_proxy_cb (GObject *source_object,
stable_name,
x_content_types_string,
icon_str,
symbolic_icon_str,
backend->priv->prefered_filename_encoding,
backend->priv->user_visible,
g_mount_spec_to_dbus (backend->priv->mount_spec),
Expand All @@ -683,6 +715,7 @@ register_mount_got_proxy_cb (GObject *source_object,

g_free (x_content_types_string);
g_free (icon_str);
g_free (symbolic_icon_str);
g_object_unref (proxy);
async_proxy_create_free (data);
}
Expand Down
5 changes: 5 additions & 0 deletions daemon/gvfsbackend.h
Expand Up @@ -467,6 +467,10 @@ void g_vfs_backend_set_icon_name (GVfsBackend *ba
const char *icon_name);
void g_vfs_backend_set_icon (GVfsBackend *backend,
GIcon *icon);
void g_vfs_backend_set_symbolic_icon_name (GVfsBackend *backend,
const char *icon_name);
void g_vfs_backend_set_symbolic_icon (GVfsBackend *backend,
GIcon *icon);
void g_vfs_backend_set_prefered_filename_encoding (GVfsBackend *backend,
const char *prefered_filename_encoding);
void g_vfs_backend_set_user_visible (GVfsBackend *backend,
Expand All @@ -486,6 +490,7 @@ const char *g_vfs_backend_get_display_name (GVfsBackend *ba
const char *g_vfs_backend_get_stable_name (GVfsBackend *backend);
char **g_vfs_backend_get_x_content_types (GVfsBackend *backend);
GIcon *g_vfs_backend_get_icon (GVfsBackend *backend);
GIcon *g_vfs_backend_get_symbolic_icon (GVfsBackend *backend);
const char *g_vfs_backend_get_default_location (GVfsBackend *backend);
GMountSpec *g_vfs_backend_get_mount_spec (GVfsBackend *backend);
GVfsDaemon *g_vfs_backend_get_daemon (GVfsBackend *backend);
Expand Down
9 changes: 7 additions & 2 deletions daemon/mount.c
Expand Up @@ -39,6 +39,7 @@ typedef struct {
char *stable_name;
char *x_content_types;
char *icon;
char *symbolic_icon;
char *prefered_filename_encoding;
gboolean user_visible;
char *default_location;
Expand Down Expand Up @@ -187,6 +188,7 @@ vfs_mount_free (VfsMount *mount)
g_free (mount->stable_name);
g_free (mount->x_content_types);
g_free (mount->icon);
g_free (mount->symbolic_icon);
g_free (mount->fuse_mountpoint);
g_free (mount->prefered_filename_encoding);
g_free (mount->default_location);
Expand All @@ -199,19 +201,20 @@ vfs_mount_free (VfsMount *mount)


/* Keep in sync with dbus-interfaces.xml */
#define VFS_MOUNT_ARRAY_DBUS_STRUCT_TYPE "a(sosssssbay(aya{sv})ay)"
#define VFS_MOUNT_ARRAY_DBUS_STRUCT_TYPE "a(sossssssbay(aya{sv})ay)"
#define VFS_MOUNTABLE_ARRAY_DBUS_STRUCT_TYPE "a(ssasib)"

static GVariant *
vfs_mount_to_dbus (VfsMount *mount)
{
return g_variant_new ("(sosssssb^ay@(aya{sv})^ay)",
return g_variant_new ("(sossssssb^ay@(aya{sv})^ay)",
mount->dbus_id,
mount->object_path,
mount->display_name,
mount->stable_name,
mount->x_content_types,
mount->icon,
mount->symbolic_icon,
mount->prefered_filename_encoding,
mount->user_visible,
(fuse_available && mount->fuse_mountpoint) ? mount->fuse_mountpoint : "",
Expand Down Expand Up @@ -593,6 +596,7 @@ handle_register_mount (GVfsDBusMountTracker *object,
const gchar *arg_stable_name,
const gchar *arg_x_content_types,
const gchar *arg_icon,
const gchar *arg_symbolic_icon,
const gchar *arg_prefered_filename_encoding,
gboolean arg_user_visible,
GVariant *arg_mount_spec,
Expand Down Expand Up @@ -630,6 +634,7 @@ handle_register_mount (GVfsDBusMountTracker *object,
mount->stable_name = g_strdup (arg_stable_name);
mount->x_content_types = g_strdup (arg_x_content_types);
mount->icon = g_strdup (arg_icon);
mount->symbolic_icon = g_strdup (arg_symbolic_icon);
mount->prefered_filename_encoding = g_strdup (arg_prefered_filename_encoding);
mount->user_visible = arg_user_visible;
mount->dbus_id = g_strdup (id);
Expand Down
17 changes: 17 additions & 0 deletions monitor/afc/afcvolume.c
Expand Up @@ -25,6 +25,7 @@ struct _GVfsAfcVolume {

char *name;
char *icon;
char *symbolic_icon;
char *icon_fallback;
};

Expand All @@ -45,6 +46,7 @@ g_vfs_afc_volume_finalize (GObject *object)

g_free (self->name);
g_free (self->icon);
g_free (self->symbolic_icon);
g_free (self->icon_fallback);

if (G_OBJECT_CLASS(g_vfs_afc_volume_parent_class)->finalize)
Expand All @@ -58,6 +60,7 @@ g_vfs_afc_volume_init (GVfsAfcVolume *self)

afc_volume->name = g_strdup ("iPhone");
afc_volume->icon = g_strdup ("phone-apple-iphone");
afc_volume->symbolic_icon = g_strdup ("phone-apple-iphone-symbolic");
}

static void
Expand Down Expand Up @@ -138,11 +141,13 @@ _g_vfs_afc_volume_update_metadata (GVfsAfcVolume *self)
{
g_free (self->icon);
self->icon = g_strdup ("multimedia-player-apple-ipod-touch");
self->symbolic_icon = g_strdup ("multimedia-player-apple-ipod-touch-symbolic");
}
else if (g_str_equal(model, "iPad") != FALSE)
{
g_free (self->icon);
self->icon = g_strdup ("computer-apple-ipad");
self->symbolic_icon = g_strdup ("computer-apple-ipad-symbolic");
}
g_free (model);
plist_free (value);
Expand Down Expand Up @@ -207,6 +212,17 @@ g_vfs_afc_volume_get_icon (GVolume *volume)
return icon;
}

static GIcon *
g_vfs_afc_volume_get_symbolic_icon (GVolume *volume)
{
GVfsAfcVolume *afc_volume = G_VFS_AFC_VOLUME (volume);
GIcon *icon;

icon = g_themed_icon_new_with_default_fallbacks (afc_volume->symbolic_icon);

return icon;
}

static char *
g_vfs_afc_volume_get_uuid (GVolume *volume)
{
Expand Down Expand Up @@ -355,6 +371,7 @@ g_vfs_afc_volume_iface_init (GVolumeIface *iface)
{
iface->get_name = g_vfs_afc_volume_get_name;
iface->get_icon = g_vfs_afc_volume_get_icon;
iface->get_symbolic_icon = g_vfs_afc_volume_get_symbolic_icon;
iface->get_uuid = g_vfs_afc_volume_get_uuid;
iface->get_drive = g_vfs_afc_volume_get_drive;
iface->get_mount = g_vfs_afc_volume_get_mount;
Expand Down

0 comments on commit c47f093

Please sign in to comment.