diff options
author | David Zeuthen <zeuthen@gmail.com> | 2012-11-20 15:58:18 -0500 |
---|---|---|
committer | David Zeuthen <zeuthen@gmail.com> | 2012-11-20 15:58:18 -0500 |
commit | d2273d404cb3e895ba67052dde4a3e85b1c084ba (patch) | |
tree | 50d6a764e5e1420220b1e0d29c803519ec4d2180 /monitor/udisks2/gvfsudisks2drive.c | |
parent | e4f2a031e0fbe1424e155a6c4dbed104dcf93155 (diff) | |
download | gvfs-d2273d404cb3e895ba67052dde4a3e85b1c084ba.tar.gz |
Use UDisksObjectInfo API from udisks 2.0.90, if available, for symbolic icons
Without this fix volumes would fall back to folder-remote-symbolic
which is obviosly wrong. With this fix, it looks correct, see
http://people.freedesktop.org/~david/gvfs-udisks2-symbolic-icons.png
Right now we only use the API if it's available - things still work
with udisks >= 1.97.
Signed-off-by: David Zeuthen <zeuthen@gmail.com>
Diffstat (limited to 'monitor/udisks2/gvfsudisks2drive.c')
-rw-r--r-- | monitor/udisks2/gvfsudisks2drive.c | 66 |
1 files changed, 58 insertions, 8 deletions
diff --git a/monitor/udisks2/gvfsudisks2drive.c b/monitor/udisks2/gvfsudisks2drive.c index a5da220f..e91a9c1d 100644 --- a/monitor/udisks2/gvfsudisks2drive.c +++ b/monitor/udisks2/gvfsudisks2drive.c @@ -52,6 +52,7 @@ struct _GVfsUDisks2Drive UDisksDrive *udisks_drive; GIcon *icon; + GIcon *symbolic_icon; gchar *name; gchar *sort_key; gchar *device_file; @@ -88,8 +89,8 @@ gvfs_udisks2_drive_finalize (GObject *object) g_object_unref (drive->udisks_drive); } - if (drive->icon != NULL) - g_object_unref (drive->icon); + g_clear_object (&drive->icon); + g_clear_object (&drive->symbolic_icon); g_free (drive->name); g_free (drive->sort_key); g_free (drive->device_file); @@ -118,11 +119,23 @@ emit_changed (GVfsUDisks2Drive *drive) g_signal_emit_by_name (drive->monitor, "drive-changed", drive); } + +static gpointer +_g_object_ref0 (gpointer object) +{ + if (object != NULL) + return g_object_ref (G_OBJECT (object)); + else + return NULL; +} + static gboolean update_drive (GVfsUDisks2Drive *drive) { + UDisksClient *udisks_client; gboolean changed; GIcon *old_icon; + GIcon *old_symbolic_icon; gchar *old_name; gchar *old_sort_key; gchar *old_device_file; @@ -131,6 +144,11 @@ update_drive (GVfsUDisks2Drive *drive) gboolean old_has_media; gboolean old_can_eject; UDisksBlock *block; +#if UDISKS_CHECK_VERSION(2,0,90) + UDisksObjectInfo *info = NULL; +#endif + + udisks_client = gvfs_udisks2_volume_monitor_get_udisks_client (drive->monitor); /* ---------------------------------------------------------------------------------------------------- */ /* save old values */ @@ -144,6 +162,7 @@ update_drive (GVfsUDisks2Drive *drive) old_device_file = g_strdup (drive->device_file); old_dev = drive->dev; old_icon = drive->icon != NULL ? g_object_ref (drive->icon) : NULL; + old_symbolic_icon = drive->symbolic_icon != NULL ? g_object_ref (drive->symbolic_icon) : NULL; /* ---------------------------------------------------------------------------------------------------- */ /* reset */ @@ -154,11 +173,12 @@ update_drive (GVfsUDisks2Drive *drive) g_free (drive->device_file); drive->device_file = NULL; drive->dev = 0; g_clear_object (&drive->icon); + g_clear_object (&drive->symbolic_icon); /* ---------------------------------------------------------------------------------------------------- */ /* in with the new */ - block = udisks_client_get_block_for_drive (gvfs_udisks2_volume_monitor_get_udisks_client (drive->monitor), + block = udisks_client_get_block_for_drive (udisks_client, drive->udisks_drive, FALSE); if (block != NULL) @@ -182,14 +202,29 @@ update_drive (GVfsUDisks2Drive *drive) } drive->can_eject = udisks_drive_get_ejectable (drive->udisks_drive); - udisks_client_get_drive_info (gvfs_udisks2_volume_monitor_get_udisks_client (drive->monitor), +#if UDISKS_CHECK_VERSION(2,0,90) + { + UDisksObject *object = (UDisksObject *) g_dbus_interface_get_object (G_DBUS_INTERFACE (drive->udisks_drive)); + if (object != NULL) + { + info = udisks_client_get_object_info (udisks_client, object); + if (info != NULL) + { + drive->name = g_strdup (udisks_object_info_get_name (info)); + drive->icon = _g_object_ref0 (udisks_object_info_get_icon (info)); + drive->symbolic_icon = _g_object_ref0 (udisks_object_info_get_icon_symbolic (info)); + } + } + } +#else + udisks_client_get_drive_info (udisks_client, drive->udisks_drive, NULL, /* drive_name */ &drive->name, &drive->icon, NULL, /* media_desc */ NULL); /* media_icon */ - +#endif /* ---------------------------------------------------------------------------------------------------- */ /* fallbacks */ @@ -203,6 +238,8 @@ update_drive (GVfsUDisks2Drive *drive) } if (drive->icon == NULL) drive->icon = g_themed_icon_new ("drive-removable-media"); + if (drive->symbolic_icon == NULL) + drive->symbolic_icon = g_themed_icon_new ("drive-removable-media-symbolic"); /* ---------------------------------------------------------------------------------------------------- */ /* compute whether something changed */ @@ -213,18 +250,23 @@ update_drive (GVfsUDisks2Drive *drive) (g_strcmp0 (old_sort_key, drive->sort_key) == 0) && (g_strcmp0 (old_device_file, drive->device_file) == 0) && (old_dev == drive->dev) && - g_icon_equal (old_icon, drive->icon) + g_icon_equal (old_icon, drive->icon) && + g_icon_equal (old_symbolic_icon, drive->symbolic_icon) ); /* free old values */ g_free (old_name); g_free (old_sort_key); g_free (old_device_file); - if (old_icon != NULL) - g_object_unref (old_icon); + g_clear_object (&old_icon); + g_clear_object (&old_symbolic_icon); /*g_debug ("in update_drive(); has_media=%d changed=%d", drive->has_media, changed);*/ +#if UDISKS_CHECK_VERSION(2,0,90) + g_clear_object (&info); +#endif + return changed; } @@ -304,6 +346,13 @@ gvfs_udisks2_drive_get_icon (GDrive *_drive) return drive->icon != NULL ? g_object_ref (drive->icon) : NULL; } +static GIcon * +gvfs_udisks2_drive_get_symbolic_icon (GDrive *_drive) +{ + GVfsUDisks2Drive *drive = GVFS_UDISKS2_DRIVE (_drive); + return drive->symbolic_icon != NULL ? g_object_ref (drive->symbolic_icon) : NULL; +} + static char * gvfs_udisks2_drive_get_name (GDrive *_drive) { @@ -718,6 +767,7 @@ gvfs_udisks2_drive_drive_iface_init (GDriveIface *iface) { iface->get_name = gvfs_udisks2_drive_get_name; iface->get_icon = gvfs_udisks2_drive_get_icon; + iface->get_symbolic_icon = gvfs_udisks2_drive_get_symbolic_icon; iface->has_volumes = gvfs_udisks2_drive_has_volumes; iface->get_volumes = gvfs_udisks2_drive_get_volumes; iface->is_media_removable = gvfs_udisks2_drive_is_media_removable; |