diff --git a/ChangeLog b/ChangeLog index 37b3d81d640aad65122d7cef0593cebc02cb4c4c..9d76fa5f9a1e00de9c15a38ce484b6a76be91fbc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-01-07 Benedikt Meurer <benny@xfce.org> + + * thunar-vfs/Makefile.am, thunar-vfs/thunar-vfs-volume-hal.c, + acinclude.m4: Use exo-hal to determine icons and display names + for the volumes. + * thunar-vfs/thunar-vfs-volume-hal.c, + thunar-vfs/thunar-vfs-volume.{c,h}: Do not discard blank discs and + pure audio discs. Bug #2599. + 2007-01-06 Benedikt Meurer <benny@xfce.org> * README, configure.in.in: Requires libexo 0.3.1.13svn. diff --git a/acinclude.m4 b/acinclude.m4 index 1e036e1d51254760f07cf2c4aa7f156a0f7a6760..6a46a37c08833c2fa927cffaa633ea4818df3a25 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -219,6 +219,7 @@ AC_HELP_STRING([--with-volume-manager=@<:@auto/freebsd/hal/none@:>@], [The volum dnl # We need HAL >= 0.5.x and D-BUS >= 0.23 for the HAL volume manager if test x"$ac_bm_thunar_vfs_volume_impl" = x"hal"; then + XDT_CHECK_PACKAGE([EXO_HAL], [exo-hal-0.3], [0.3.1.13]) XDT_CHECK_PACKAGE([HAL], [hal-storage], [0.5.0]) XDT_CHECK_PACKAGE([HAL_DBUS], [dbus-glib-1], [0.23]) fi diff --git a/thunar-vfs/Makefile.am b/thunar-vfs/Makefile.am index f1b7242f6e3102b36b70d02749a6513f9221dd25..9f25cd372df19574f263272414fbf895929b56dd 100644 --- a/thunar-vfs/Makefile.am +++ b/thunar-vfs/Makefile.am @@ -274,10 +274,12 @@ libthunar_vfs_volume_impl_sources = \ thunar-vfs-volume-hal.h libthunar_vfs_1_la_CFLAGS += \ + $(EXO_HAL_CFLAGS) \ $(HAL_CFLAGS) \ $(HAL_DBUS_CFLAGS) libthunar_vfs_1_la_LIBADD += \ + $(EXO_HAL_LIBS) \ $(HAL_LIBS) \ $(HAL_DBUS_LIBS) endif diff --git a/thunar-vfs/thunar-vfs-volume-hal.c b/thunar-vfs/thunar-vfs-volume-hal.c index cc39d7276d2e169d8fb78cf6db5e46106dba7582..ae70a22a82159f48602df8e33eef00c101419dae 100644 --- a/thunar-vfs/thunar-vfs-volume-hal.c +++ b/thunar-vfs/thunar-vfs-volume-hal.c @@ -48,9 +48,10 @@ #include <dbus/dbus-glib-lowlevel.h> -#include <libhal.h> #include <libhal-storage.h> +#include <exo-hal/exo-hal.h> + #include <thunar-vfs/thunar-vfs-exec.h> #include <thunar-vfs/thunar-vfs-private.h> #include <thunar-vfs/thunar-vfs-volume-hal.h> @@ -65,6 +66,8 @@ static ThunarVfsVolumeKind thunar_vfs_volume_hal_get_kind (Thu static const gchar *thunar_vfs_volume_hal_get_name (ThunarVfsVolume *volume); static ThunarVfsVolumeStatus thunar_vfs_volume_hal_get_status (ThunarVfsVolume *volume); static ThunarVfsPath *thunar_vfs_volume_hal_get_mount_point (ThunarVfsVolume *volume); +static const gchar *thunar_vfs_volume_hal_lookup_icon_name (ThunarVfsVolume *volume, + GtkIconTheme *icon_theme); static gboolean thunar_vfs_volume_hal_eject (ThunarVfsVolume *volume, GtkWidget *window, GError **error); @@ -96,6 +99,10 @@ struct _ThunarVfsVolumeHal gchar *device_file; gchar *device_label; + + /* list of possible icons */ + GList *icon_list; + ThunarVfsPath *mount_point; ThunarVfsVolumeKind kind; ThunarVfsVolumeStatus status; @@ -145,6 +152,7 @@ thunar_vfs_volume_hal_class_init (ThunarVfsVolumeHalClass *klass) thunarvfs_volume_class->get_name = thunar_vfs_volume_hal_get_name; thunarvfs_volume_class->get_status = thunar_vfs_volume_hal_get_status; thunarvfs_volume_class->get_mount_point = thunar_vfs_volume_hal_get_mount_point; + thunarvfs_volume_class->lookup_icon_name = thunar_vfs_volume_hal_lookup_icon_name; thunarvfs_volume_class->eject = thunar_vfs_volume_hal_eject; thunarvfs_volume_class->mount = thunar_vfs_volume_hal_mount; thunarvfs_volume_class->unmount = thunar_vfs_volume_hal_unmount; @@ -162,6 +170,9 @@ thunar_vfs_volume_hal_finalize (GObject *object) g_free (volume_hal->device_file); g_free (volume_hal->device_label); + g_list_foreach (volume_hal->icon_list, (GFunc) g_free, NULL); + g_list_free (volume_hal->icon_list); + /* release the mount point (if any) */ if (G_LIKELY (volume_hal->mount_point != NULL)) thunar_vfs_path_unref (volume_hal->mount_point); @@ -203,6 +214,23 @@ thunar_vfs_volume_hal_get_mount_point (ThunarVfsVolume *volume) +static const gchar* +thunar_vfs_volume_hal_lookup_icon_name (ThunarVfsVolume *volume, + GtkIconTheme *icon_theme) +{ + GList *lp; + + /* check if we have atleast one usable icon in our icon_list */ + for (lp = THUNAR_VFS_VOLUME_HAL (volume)->icon_list; lp != NULL; lp = lp->next) + if (gtk_icon_theme_has_icon (icon_theme, lp->data)) + return lp->data; + + /* fallback in thunar_vfs_volume_lookup_icon() */ + return NULL; +} + + + static gboolean thunar_vfs_volume_hal_eject (ThunarVfsVolume *volume, GtkWidget *window, @@ -212,17 +240,6 @@ thunar_vfs_volume_hal_eject (ThunarVfsVolume *volume, gboolean result = TRUE; gchar *quoted; - /* check if the volume is currently mounted (FIXME: Why? Just confusing!) */ -#if 0 - path = thunar_vfs_volume_hal_find_active_mount_point (volume_hal); - if (G_LIKELY (path != NULL)) - { - /* try to unmount the volume first */ - result = thunar_vfs_volume_hal_unmount (volume, window, error); - thunar_vfs_path_unref (path); - } -#endif - /* use exo-eject to eject the device */ quoted = g_shell_quote (volume_hal->udi); result = thunar_vfs_exec_sync ("exo-eject -n -h %s", error, quoted); @@ -447,11 +464,10 @@ thunar_vfs_volume_hal_update (ThunarVfsVolumeHal *volume_hal, LibHalVolume *hv, LibHalDrive *hd) { - const gchar *volume_label; - gchar *desired_mount_point; - gchar *mount_root; - gchar *basename; - gchar *filename; + gchar *desired_mount_point; + gchar *mount_root; + gchar *basename; + gchar *filename; _thunar_vfs_return_if_fail (THUNAR_VFS_IS_VOLUME_HAL (volume_hal)); _thunar_vfs_return_if_fail (hd != NULL); @@ -463,20 +479,24 @@ thunar_vfs_volume_hal_update (ThunarVfsVolumeHal *volume_hal, g_free (volume_hal->device_file); volume_hal->device_file = g_strdup ((hv != NULL) ? libhal_volume_get_device_file (hv) : libhal_drive_get_device_file (hd)); - /* determine the new label */ + /* compute a usable display name for the volume/drive */ g_free (volume_hal->device_label); - volume_label = (hv != NULL) ? libhal_volume_get_label (hv) : libhal_drive_get_model (hd); - if (G_LIKELY (volume_label != NULL && *volume_label != '\0')) - { - /* just use the label provided by HAL */ - volume_hal->device_label = g_strdup (volume_label); - } - else + volume_hal->device_label = (hv == NULL) + ? exo_hal_drive_compute_display_name (context, hd) + : exo_hal_volume_compute_display_name (context, hv, hd); + if (G_UNLIKELY (volume_hal->device_label == NULL)) { /* use the basename of the device file as label */ volume_hal->device_label = g_path_get_basename (volume_hal->device_file); } + /* compute a usable list of icon names for the volume/drive */ + g_list_foreach (volume_hal->icon_list, (GFunc) g_free, NULL); + g_list_free (volume_hal->icon_list); + volume_hal->icon_list = (hv == NULL) + ? exo_hal_drive_compute_icon_list (context, hd) + : exo_hal_volume_compute_icon_list (context, hv, hd); + /* release the previous mount point (if any) */ if (G_LIKELY (volume_hal->mount_point != NULL)) { @@ -488,49 +508,58 @@ thunar_vfs_volume_hal_update (ThunarVfsVolumeHal *volume_hal, switch (libhal_drive_get_type (hd)) { case LIBHAL_DRIVE_TYPE_CDROM: - /* check which kind of CD-ROM/DVD we have */ - switch (libhal_volume_get_disc_type (hv)) + /* check if we have a pure audio CD without any data track */ + if (libhal_volume_disc_has_audio (hv) && !libhal_volume_disc_has_data (hv)) { - case LIBHAL_VOLUME_DISC_TYPE_CDROM: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_CDROM; - break; - - case LIBHAL_VOLUME_DISC_TYPE_CDR: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_CDR; - break; - - case LIBHAL_VOLUME_DISC_TYPE_CDRW: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_CDRW; - break; - - case LIBHAL_VOLUME_DISC_TYPE_DVDROM: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDROM; - break; - - case LIBHAL_VOLUME_DISC_TYPE_DVDRAM: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDRAM; - break; - - case LIBHAL_VOLUME_DISC_TYPE_DVDR: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDR; - break; - - case LIBHAL_VOLUME_DISC_TYPE_DVDRW: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDRW; - break; - - case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDPLUSR; - break; - - case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW: - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDPLUSRW; - break; - - default: - /* unsupported disc type */ - volume_hal->kind = THUNAR_VFS_VOLUME_KIND_UNKNOWN; - break; + /* special treatment for pure audio CDs */ + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_AUDIO_CD; + } + else + { + /* check which kind of CD-ROM/DVD we have */ + switch (libhal_volume_get_disc_type (hv)) + { + case LIBHAL_VOLUME_DISC_TYPE_CDROM: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_CDROM; + break; + + case LIBHAL_VOLUME_DISC_TYPE_CDR: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_CDR; + break; + + case LIBHAL_VOLUME_DISC_TYPE_CDRW: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_CDRW; + break; + + case LIBHAL_VOLUME_DISC_TYPE_DVDROM: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDROM; + break; + + case LIBHAL_VOLUME_DISC_TYPE_DVDRAM: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDRAM; + break; + + case LIBHAL_VOLUME_DISC_TYPE_DVDR: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDR; + break; + + case LIBHAL_VOLUME_DISC_TYPE_DVDRW: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDRW; + break; + + case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSR: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDPLUSR; + break; + + case LIBHAL_VOLUME_DISC_TYPE_DVDPLUSRW: + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_DVDPLUSRW; + break; + + default: + /* unsupported disc type */ + volume_hal->kind = THUNAR_VFS_VOLUME_KIND_UNKNOWN; + break; + } } break; @@ -557,9 +586,10 @@ thunar_vfs_volume_hal_update (ThunarVfsVolumeHal *volume_hal, break; } - /* non-disc drives are always present, otherwise it must be a data disc to be usable */ - if (hv == NULL || !libhal_volume_is_disc (hv) || libhal_volume_disc_has_data (hv)) - volume_hal->status |= THUNAR_VFS_VOLUME_STATUS_PRESENT; + /* either we have a volume, which means we have media, or + * a drive, which means non-pollable then, so it's present + */ + volume_hal->status |= THUNAR_VFS_VOLUME_STATUS_PRESENT; /* check if the volume is currently mounted */ if (hv != NULL && libhal_volume_is_mounted (hv)) @@ -710,6 +740,13 @@ thunar_vfs_volume_manager_hal_class_init (ThunarVfsVolumeManagerHalClass *klass) gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = thunar_vfs_volume_manager_hal_finalize; + + /* initialize exo-hal support */ + if (!exo_hal_init ()) + { + /* atleast warn the user here, so he/she can rebuild libexo with HAL support or ask the admin */ + g_warning ("exo was built without HAL support. Volume management may not work as expected."); + } } @@ -953,13 +990,6 @@ thunar_vfs_volume_manager_hal_device_added (LibHalContext *context, hv = libhal_volume_from_udi (context, udi); if (G_LIKELY (hv != NULL)) { - /* we don't care for anything other than mountable filesystems */ - if (G_UNLIKELY (libhal_volume_get_fsusage (hv) != LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM)) - { - libhal_volume_free (hv); - return; - } - /* determine the UDI of the drive to which this volume belongs */ drive_udi = libhal_volume_get_storage_device_udi (hv); if (G_LIKELY (drive_udi != NULL)) diff --git a/thunar-vfs/thunar-vfs-volume.c b/thunar-vfs/thunar-vfs-volume.c index ea1a976e73d33708bf44ae3e1571026eb723ad35..2fa32a0dc934d127500ed29dc7cf2c87bf063049 100644 --- a/thunar-vfs/thunar-vfs-volume.c +++ b/thunar-vfs/thunar-vfs-volume.c @@ -237,7 +237,8 @@ thunar_vfs_volume_is_disc (ThunarVfsVolume *volume) kind = thunar_vfs_volume_get_kind (volume); - return (kind >= THUNAR_VFS_VOLUME_KIND_CDROM && kind <= THUNAR_VFS_VOLUME_KIND_DVDPLUSRW); + return (kind >= THUNAR_VFS_VOLUME_KIND_CDROM && kind <= THUNAR_VFS_VOLUME_KIND_DVDPLUSRW) + || (kind == THUNAR_VFS_VOLUME_KIND_AUDIO_CD); } @@ -333,6 +334,7 @@ thunar_vfs_volume_is_removable (ThunarVfsVolume *volume) case THUNAR_VFS_VOLUME_KIND_FLOPPY: case THUNAR_VFS_VOLUME_KIND_USBSTICK: case THUNAR_VFS_VOLUME_KIND_AUDIO_PLAYER: + case THUNAR_VFS_VOLUME_KIND_AUDIO_CD: return TRUE; default: @@ -445,6 +447,11 @@ dvdr: return "gnome-dev-ipod"; break; + case THUNAR_VFS_VOLUME_KIND_AUDIO_CD: + if (gtk_icon_theme_has_icon (icon_theme, "gnome-dev-cdrom-audio")) + return "gnome-dev-cdrom-audio"; + goto cdrom; + default: break; } diff --git a/thunar-vfs/thunar-vfs-volume.h b/thunar-vfs/thunar-vfs-volume.h index 5f6879165403fef010a87a7daff633ae2cffc565..cd065dc458c5fb5413056f1d0e636dacbf088130 100644 --- a/thunar-vfs/thunar-vfs-volume.h +++ b/thunar-vfs/thunar-vfs-volume.h @@ -53,6 +53,7 @@ typedef struct _ThunarVfsVolume ThunarVfsVolume; * @THUNAR_VFS_VOLUME_KIND_HARDDISK : Hard disk drives. * @THUNAR_VFS_VOLUME_KIND_USBSTICK : USB sticks. * @THUNAR_VFS_VOLUME_KIND_AUDIO_PLAYER : Portable audio players (i.e. iPod). + * @THUNAR_VFS_VOLUME_KIND_AUDIO_CD : Audio CDs. * * Describes the type of a VFS volume. **/ @@ -72,6 +73,7 @@ typedef enum THUNAR_VFS_VOLUME_KIND_HARDDISK, THUNAR_VFS_VOLUME_KIND_USBSTICK, THUNAR_VFS_VOLUME_KIND_AUDIO_PLAYER, + THUNAR_VFS_VOLUME_KIND_AUDIO_CD, } ThunarVfsVolumeKind; /**