summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--thunar/thunar-browser.c120
-rw-r--r--thunar/thunar-browser.h11
-rw-r--r--thunar/thunar-device-monitor.c80
-rw-r--r--thunar/thunar-gio-extensions.c132
-rw-r--r--thunar/thunar-gio-extensions.h3
-rw-r--r--thunar/thunar-launcher.c126
-rw-r--r--thunar/thunar-shortcuts-view.c57
-rw-r--r--thunar/thunar-tree-model.c33
-rw-r--r--thunar/thunar-window.c33
9 files changed, 237 insertions, 358 deletions
diff --git a/thunar/thunar-browser.c b/thunar/thunar-browser.c
index cd0c29da..a608518b 100644
--- a/thunar/thunar-browser.c
+++ b/thunar/thunar-browser.c
@@ -32,7 +32,7 @@
typedef struct _PokeFileData PokeFileData;
-typedef struct _PokeVolumeData PokeVolumeData;
+typedef struct _PokeDeviceData PokeDeviceData;
@@ -58,12 +58,12 @@ struct _PokeFileData
gpointer user_data;
};
-struct _PokeVolumeData
+struct _PokeDeviceData
{
ThunarBrowser *browser;
- GVolume *volume;
+ ThunarDevice *device;
ThunarFile *mount_point;
- ThunarBrowserPokeVolumeFunc func;
+ ThunarBrowserPokeDeviceFunc func;
gpointer user_data;
};
@@ -150,20 +150,20 @@ thunar_browser_poke_file_data_free (PokeFileData *poke_data)
-static PokeVolumeData *
-thunar_browser_poke_volume_data_new (ThunarBrowser *browser,
- GVolume *volume,
- ThunarBrowserPokeVolumeFunc func,
+static PokeDeviceData *
+thunar_browser_poke_device_data_new (ThunarBrowser *browser,
+ ThunarDevice *device,
+ ThunarBrowserPokeDeviceFunc func,
gpointer user_data)
{
- PokeVolumeData *poke_data;
+ PokeDeviceData *poke_data;
_thunar_return_val_if_fail (THUNAR_IS_BROWSER (browser), NULL);
- _thunar_return_val_if_fail (G_IS_VOLUME (volume), NULL);
+ _thunar_return_val_if_fail (THUNAR_IS_DEVICE (device), NULL);
- poke_data = g_slice_new0 (PokeVolumeData);
+ poke_data = g_slice_new0 (PokeDeviceData);
poke_data->browser = g_object_ref (browser);
- poke_data->volume = g_object_ref (volume);
+ poke_data->device = g_object_ref (device);
poke_data->func = func;
poke_data->user_data = user_data;
@@ -173,16 +173,16 @@ thunar_browser_poke_volume_data_new (ThunarBrowser *browser,
static void
-thunar_browser_poke_volume_data_free (PokeVolumeData *poke_data)
+thunar_browser_poke_device_data_free (PokeDeviceData *poke_data)
{
_thunar_return_if_fail (poke_data != NULL);
_thunar_return_if_fail (THUNAR_IS_BROWSER (poke_data->browser));
- _thunar_return_if_fail (G_IS_VOLUME (poke_data->volume));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (poke_data->device));
g_object_unref (poke_data->browser);
- g_object_unref (poke_data->volume);
+ g_object_unref (poke_data->device);
- g_slice_free (PokeVolumeData, poke_data);
+ g_slice_free (PokeDeviceData, poke_data);
}
@@ -549,137 +549,123 @@ thunar_browser_poke_file (ThunarBrowser *browser,
static void
-thunar_browser_poke_volume_file_finish (GFile *location,
+thunar_browser_poke_device_file_finish (GFile *location,
ThunarFile *file,
GError *error,
gpointer user_data)
{
- PokeVolumeData *poke_data = user_data;
+ PokeDeviceData *poke_data = user_data;
_thunar_return_if_fail (G_IS_FILE (location));
_thunar_return_if_fail (user_data != NULL);
_thunar_return_if_fail (THUNAR_IS_BROWSER (poke_data->browser));
- _thunar_return_if_fail (G_IS_VOLUME (poke_data->volume));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (poke_data->device));
if (poke_data->func != NULL)
{
- (poke_data->func) (poke_data->browser, poke_data->volume, file, error,
+ (poke_data->func) (poke_data->browser, poke_data->device, file, error,
poke_data->user_data);
}
- thunar_browser_poke_volume_data_free (poke_data);
+ thunar_browser_poke_device_data_free (poke_data);
}
static void
-thunar_browser_poke_volume_finish (GObject *object,
- GAsyncResult *result,
+thunar_browser_poke_device_finish (ThunarDevice *device,
+ const GError *error,
gpointer user_data)
{
- PokeVolumeData *poke_data = user_data;
- GError *error = NULL;
- GMount *mount;
+ PokeDeviceData *poke_data = user_data;
GFile *mount_point;
- _thunar_return_if_fail (G_IS_VOLUME (object));
- _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
_thunar_return_if_fail (user_data != NULL);
_thunar_return_if_fail (THUNAR_IS_BROWSER (poke_data->browser));
- _thunar_return_if_fail (G_IS_VOLUME (poke_data->volume));
- _thunar_return_if_fail (G_VOLUME (object) == poke_data->volume);
-
- if (!g_volume_mount_finish (G_VOLUME (object), result, &error))
- {
- if (error->domain == G_IO_ERROR)
- {
- if (error->code == G_IO_ERROR_ALREADY_MOUNTED)
- g_clear_error (&error);
- }
- }
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (poke_data->device));
+ _thunar_return_if_fail (device == poke_data->device);
if (error == NULL)
{
- mount = g_volume_get_mount (poke_data->volume);
- mount_point = g_mount_get_root (mount);
+ mount_point = thunar_device_get_root (device);
/* resolve the ThunarFile for the mount point asynchronously
* and defer cleaning up the poke data until that has finished */
thunar_file_get_async (mount_point, NULL,
- thunar_browser_poke_volume_file_finish,
+ thunar_browser_poke_device_file_finish,
poke_data);
g_object_unref (mount_point);
- g_object_unref (mount);
}
else
{
if (poke_data->func != NULL)
{
- (poke_data->func) (poke_data->browser, poke_data->volume, NULL, error,
+ (poke_data->func) (poke_data->browser, poke_data->device, NULL, (GError *) error,
poke_data->user_data);
}
- thunar_browser_poke_volume_data_free (poke_data);
+ thunar_browser_poke_device_data_free (poke_data);
}
}
/**
- * thunar_browser_poke_volume:
+ * thunar_browser_poke_device:
* @browser : a #ThunarBrowser.
- * @volume : a #GVolume.
+ * @device : a #ThunarDevice.
* @widget : a #GtkWidget, a #GdkScreen or %NULL.
- * @func : a #ThunarBrowserPokeVolumeFunc callback or %NULL.
+ * @func : a #ThunarBrowserPokeDeviceFunc callback or %NULL.
* @user_data : pointer to arbitrary user data or %NULL.
*
- * This function checks if @volume is mounted or not. If it is, it loads
+ * This function checks if @device is mounted or not. If it is, it loads
* a #ThunarFile for the mount root and calls @func. If it is not mounted,
- * it first mounts the volume asynchronously and calls @func with the
+ * it first mounts the device asynchronously and calls @func with the
* #ThunarFile corresponding to the mount root when the mounting is finished.
*
* The #ThunarFile passed to @func will be %NULL if, and only if mounting
- * the @volume failed. The #GError passed to @func will be set if, and only if
+ * the @device failed. The #GError passed to @func will be set if, and only if
* mounting failed.
**/
void
-thunar_browser_poke_volume (ThunarBrowser *browser,
- GVolume *volume,
+thunar_browser_poke_device (ThunarBrowser *browser,
+ ThunarDevice *device,
gpointer widget,
- ThunarBrowserPokeVolumeFunc func,
+ ThunarBrowserPokeDeviceFunc func,
gpointer user_data)
{
GMountOperation *mount_operation;
- PokeVolumeData *poke_data;
- GMount *mount;
+ PokeDeviceData *poke_data;
GFile *mount_point;
_thunar_return_if_fail (THUNAR_IS_BROWSER (browser));
- _thunar_return_if_fail (G_IS_VOLUME (volume));
+ _thunar_return_if_fail (THUNAR_DEVICE (device));
- if (thunar_g_volume_is_mounted (volume))
+ if (thunar_device_is_mounted (device))
{
- mount = g_volume_get_mount (volume);
- mount_point = g_mount_get_root (mount);
+ mount_point = thunar_device_get_root (device);
- poke_data = thunar_browser_poke_volume_data_new (browser, volume, func, user_data);
+ poke_data = thunar_browser_poke_device_data_new (browser, device, func, user_data);
thunar_file_get_async (mount_point, NULL,
- thunar_browser_poke_volume_file_finish,
+ thunar_browser_poke_device_file_finish,
poke_data);
g_object_unref (mount_point);
- g_object_unref (mount);
}
else
{
- poke_data = thunar_browser_poke_volume_data_new (browser, volume, func, user_data);
+ poke_data = thunar_browser_poke_device_data_new (browser, device, func, user_data);
mount_operation = thunar_browser_mount_operation_new (widget);
- g_volume_mount (volume, G_MOUNT_MOUNT_NONE, mount_operation, NULL,
- thunar_browser_poke_volume_finish, poke_data);
+ thunar_device_mount (device,
+ mount_operation,
+ NULL,
+ thunar_browser_poke_device_finish,
+ poke_data);
g_object_unref (mount_operation);
}
@@ -730,7 +716,7 @@ thunar_browser_poke_location_file_finish (GFile *location,
* @browser : a #ThunarBrowser.
* @location : a #GFile.
* @widget : a #GtkWidget, a #GdkScreen or %NULL.
- * @func : a #ThunarBrowserPokeVolumeFunc callback or %NULL.
+ * @func : a #ThunarBrowserPokeDeviceFunc callback or %NULL.
* @user_data : pointer to arbitrary user data or %NULL.
*
* Pokes a #GFile to see what's behind it.
diff --git a/thunar/thunar-browser.h b/thunar/thunar-browser.h
index f0ebce9a..78e86074 100644
--- a/thunar/thunar-browser.h
+++ b/thunar/thunar-browser.h
@@ -22,6 +22,7 @@
#define __THUNAR_BROWSER_H__
#include <thunar/thunar-file.h>
+#include <thunar/thunar-device.h>
G_BEGIN_DECLS
@@ -39,8 +40,8 @@ typedef void (*ThunarBrowserPokeFileFunc) (ThunarBrowser *browser,
GError *error,
gpointer user_data);
-typedef void (*ThunarBrowserPokeVolumeFunc) (ThunarBrowser *browser,
- GVolume *volume,
+typedef void (*ThunarBrowserPokeDeviceFunc) (ThunarBrowser *browser,
+ ThunarDevice *volume,
ThunarFile *mount_point,
GError *error,
gpointer user_data);
@@ -68,10 +69,10 @@ void thunar_browser_poke_file (ThunarBrowser *browser,
gpointer widget,
ThunarBrowserPokeFileFunc func,
gpointer user_data);
-void thunar_browser_poke_volume (ThunarBrowser *browser,
- GVolume *volume,
+void thunar_browser_poke_device (ThunarBrowser *browser,
+ ThunarDevice *device,
gpointer widget,
- ThunarBrowserPokeVolumeFunc func,
+ ThunarBrowserPokeDeviceFunc func,
gpointer user_data);
void thunar_browser_poke_location (ThunarBrowser *browser,
GFile *location,
diff --git a/thunar/thunar-device-monitor.c b/thunar/thunar-device-monitor.c
index c70ff7a8..284c7f83 100644
--- a/thunar/thunar-device-monitor.c
+++ b/thunar/thunar-device-monitor.c
@@ -37,6 +37,7 @@ enum
DEVICE_ADDED,
DEVICE_REMOVED,
DEVICE_CHANGED,
+ DEVICE_PRE_UNMOUNT,
LAST_SIGNAL
};
@@ -61,6 +62,9 @@ static void thunar_device_monitor_mount_removed (GVolumeMonit
static void thunar_device_monitor_mount_changed (GVolumeMonitor *volume_monitor,
GMount *mount,
ThunarDeviceMonitor *monitor);
+static void thunar_device_monitor_mount_pre_unmount (GVolumeMonitor *volume_monitor,
+ GMount *mount,
+ ThunarDeviceMonitor *monitor);
@@ -69,12 +73,14 @@ struct _ThunarDeviceMonitorClass
GObjectClass __parent__;
/* signals */
- void (*device_added) (ThunarDeviceMonitor *monitor,
- ThunarDevice *device);
- void (*device_removed) (ThunarDeviceMonitor *monitor,
- ThunarDevice *device);
- void (*device_changed) (ThunarDeviceMonitor *monitor,
- ThunarDevice *device);
+ void (*device_added) (ThunarDeviceMonitor *monitor,
+ ThunarDevice *device);
+ void (*device_removed) (ThunarDeviceMonitor *monitor,
+ ThunarDevice *device);
+ void (*device_changed) (ThunarDeviceMonitor *monitor,
+ ThunarDevice *device);
+ void (*device_pre_unmount) (ThunarDeviceMonitor *monitor,
+ ThunarDevice *device);
};
struct _ThunarDeviceMonitor
@@ -89,11 +95,6 @@ struct _ThunarDeviceMonitor
GList *hidden_volumes;
};
-struct _ThunarDevice
-{
-
-};
-
static guint device_monitor_signals[LAST_SIGNAL];
@@ -118,8 +119,8 @@ thunar_device_monitor_class_init (ThunarDeviceMonitorClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ThunarDeviceMonitorClass, device_added),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
device_monitor_signals[DEVICE_REMOVED] =
g_signal_new (I_("device-removed"),
@@ -127,8 +128,8 @@ thunar_device_monitor_class_init (ThunarDeviceMonitorClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ThunarDeviceMonitorClass, device_removed),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
device_monitor_signals[DEVICE_CHANGED] =
g_signal_new (I_("device-changed"),
@@ -136,8 +137,17 @@ thunar_device_monitor_class_init (ThunarDeviceMonitorClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ThunarDeviceMonitorClass, device_changed),
NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE, 1, G_TYPE_POINTER);
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
+
+ device_monitor_signals[DEVICE_PRE_UNMOUNT] =
+ g_signal_new (I_("device-pre-unmount"),
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (ThunarDeviceMonitorClass, device_pre_unmount),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1, G_TYPE_OBJECT);
}
@@ -179,6 +189,7 @@ thunar_device_monitor_init (ThunarDeviceMonitor *monitor)
g_signal_connect (monitor->volume_monitor, "mount-added", G_CALLBACK (thunar_device_monitor_mount_added), monitor);
g_signal_connect (monitor->volume_monitor, "mount-removed", G_CALLBACK (thunar_device_monitor_mount_removed), monitor);
g_signal_connect (monitor->volume_monitor, "mount-changed", G_CALLBACK (thunar_device_monitor_mount_changed), monitor);
+ g_signal_connect (monitor->volume_monitor, "mount-pre-unmount", G_CALLBACK (thunar_device_monitor_mount_pre_unmount), monitor);
}
@@ -594,6 +605,41 @@ thunar_device_monitor_mount_changed (GVolumeMonitor *volume_monitor,
static void
+thunar_device_monitor_mount_pre_unmount (GVolumeMonitor *volume_monitor,
+ GMount *mount,
+ ThunarDeviceMonitor *monitor)
+{
+ ThunarDevice *device;
+ GVolume *volume;
+
+ _thunar_return_if_fail (G_IS_VOLUME_MONITOR (volume_monitor));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE_MONITOR (monitor));
+ _thunar_return_if_fail (monitor->volume_monitor == volume_monitor);
+ _thunar_return_if_fail (G_IS_MOUNT (mount));
+
+ /* check if we have a device for this mount */
+ device = g_hash_table_lookup (monitor->devices, mount);
+ if (device == NULL)
+ {
+ /* maybe a volume device? */
+ volume = g_mount_get_volume (mount);
+ if (volume != NULL)
+ {
+ device = g_hash_table_lookup (monitor->devices, volume);
+ g_object_unref (volume);
+ }
+ }
+
+ if (device != NULL)
+ {
+ /* notify */
+ g_signal_emit (G_OBJECT (monitor), device_monitor_signals[DEVICE_PRE_UNMOUNT], 0, device);
+ }
+}
+
+
+
+static void
thunar_device_monitor_list_prepend (gpointer key,
gpointer value,
gpointer user_data)
diff --git a/thunar/thunar-gio-extensions.c b/thunar/thunar-gio-extensions.c
index 1432fff2..be4933e3 100644
--- a/thunar/thunar-gio-extensions.c
+++ b/thunar/thunar-gio-extensions.c
@@ -417,138 +417,6 @@ thunar_g_file_list_free (GList *list)
-#ifdef HAVE_GIO_UNIX
-static gboolean
-thunar_g_mount_is_internal (GMount *mount)
-{
- const gchar *point_mount_path;
- gboolean is_internal = FALSE;
- GFile *root;
- GList *lp;
- GList *mount_points;
- gchar *mount_path;
-
- _thunar_return_val_if_fail (G_IS_MOUNT (mount), FALSE);
-
- /* determine the mount path */
- root = g_mount_get_root (mount);
- mount_path = g_file_get_path (root);
- g_object_unref (root);
-
- /* assume non-internal if we cannot determine the path */
- if (mount_path == NULL)
- return FALSE;
-
- if (g_unix_is_mount_path_system_internal (mount_path))
- {
- /* mark as internal */
- is_internal = TRUE;
- }
- else
- {
- /* get a list of all mount points */
- mount_points = g_unix_mount_points_get (NULL);
-
- /* search for the mount point associated with the mount entry */
- for (lp = mount_points; !is_internal && lp != NULL; lp = lp->next)
- {
- point_mount_path = g_unix_mount_point_get_mount_path (lp->data);
-
- /* check if this is the mount point we are looking for */
- if (g_strcmp0 (mount_path, point_mount_path) == 0)
- {
- /* mark as internal if the user cannot mount this device */
- if (!g_unix_mount_point_is_user_mountable (lp->data))
- is_internal = TRUE;
- }
-
- /* free the mount point, we no longer need it */
- g_unix_mount_point_free (lp->data);
- }
-
- /* free the mount point list */
- g_list_free (mount_points);
- }
-
- g_free (mount_path);
-
- return is_internal;
-}
-#endif
-
-
-
-gboolean
-thunar_g_volume_is_removable (GVolume *volume)
-{
- gboolean can_eject = FALSE;
- gboolean can_mount = FALSE;
- gboolean can_unmount = FALSE;
- gboolean is_removable = FALSE;
- gboolean is_internal = FALSE;
- GDrive *drive;
- GMount *mount;
-
- _thunar_return_val_if_fail (G_IS_VOLUME (volume), FALSE);
-
- /* check if the volume can be ejected */
- can_eject = g_volume_can_eject (volume);
-
- /* determine the drive for the volume */
- drive = g_volume_get_drive (volume);
- if (drive != NULL)
- {
- /*check if the drive media can be removed */
- is_removable = g_drive_is_media_removable (drive);
-
- /* release the drive */
- g_object_unref (drive);
- }
-
- /* determine the mount for the volume (if it is mounted at all) */
- mount = g_volume_get_mount (volume);
- if (mount != NULL)
- {
-#ifdef HAVE_GIO_UNIX
- is_internal = thunar_g_mount_is_internal (mount);
-#endif
-
- /* check if the volume can be unmounted */
- can_unmount = g_mount_can_unmount (mount);
-
- /* release the mount */
- g_object_unref (mount);
- }
-
- /* determine whether the device can be mounted */
- can_mount = g_volume_can_mount (volume);
-
- return (!is_internal) && (can_eject || can_unmount || is_removable || can_mount);
-}
-
-
-
-gboolean
-thunar_g_volume_is_mounted (GVolume *volume)
-{
- gboolean is_mounted = FALSE;
- GMount *mount;
-
- _thunar_return_val_if_fail (G_IS_VOLUME (volume), FALSE);
-
- /* determine the mount for this volume (if it is mounted at all) */
- mount = g_volume_get_mount (volume);
- if (mount != NULL)
- {
- is_mounted = TRUE;
- g_object_unref (mount);
- }
-
- return is_mounted;
-}
-
-
-
gboolean
thunar_g_app_info_launch (GAppInfo *info,
GFile *working_directory,
diff --git a/thunar/thunar-gio-extensions.h b/thunar/thunar-gio-extensions.h
index c6e8cf79..c9129482 100644
--- a/thunar/thunar-gio-extensions.h
+++ b/thunar/thunar-gio-extensions.h
@@ -69,9 +69,6 @@ GList *thunar_g_file_list_prepend (GList *list,
GList *thunar_g_file_list_copy (GList *list);
void thunar_g_file_list_free (GList *list);
-gboolean thunar_g_volume_is_removable (GVolume *volume);
-gboolean thunar_g_volume_is_mounted (GVolume *volume);
-
gboolean thunar_g_app_info_launch (GAppInfo *info,
GFile *working_directory,
GList *path_list,
diff --git a/thunar/thunar-launcher.c b/thunar/thunar-launcher.c
index 6bfe3664..72cdf621 100644
--- a/thunar/thunar-launcher.c
+++ b/thunar/thunar-launcher.c
@@ -41,6 +41,7 @@
#include <thunar/thunar-private.h>
#include <thunar/thunar-sendto-model.h>
#include <thunar/thunar-stock.h>
+#include <thunar/thunar-device-monitor.h>
@@ -100,7 +101,7 @@ static void thunar_launcher_action_open_in_new_window (GtkAc
ThunarLauncher *launcher);
static void thunar_launcher_action_sendto_desktop (GtkAction *action,
ThunarLauncher *launcher);
-static void thunar_launcher_action_sendto_volume (GtkAction *action,
+static void thunar_launcher_action_sendto_device (GtkAction *action,
ThunarLauncher *launcher);
static void thunar_launcher_widget_destroyed (ThunarLauncher *launcher,
GtkWidget *widget);
@@ -144,7 +145,7 @@ struct _ThunarLauncher
GtkWidget *widget;
- GVolumeMonitor *volume_monitor;
+ ThunarDeviceMonitor *device_monitor;
ThunarSendtoModel *sendto_model;
gint sendto_idle_id;
};
@@ -262,10 +263,10 @@ thunar_launcher_init (ThunarLauncher *launcher)
/* setup the "Send To" support */
launcher->sendto_model = thunar_sendto_model_get_default ();
- /* the "Send To" menu also displays removable devices from the volume monitor */
- launcher->volume_monitor = g_volume_monitor_get ();
- g_signal_connect_swapped (launcher->volume_monitor, "volume-added", G_CALLBACK (thunar_launcher_update), launcher);
- g_signal_connect_swapped (launcher->volume_monitor, "volume-removed", G_CALLBACK (thunar_launcher_update), launcher);
+ /* the "Send To" menu also displays removable devices from the device monitor */
+ launcher->device_monitor = thunar_device_monitor_get ();
+ g_signal_connect_swapped (launcher->device_monitor, "device-added", G_CALLBACK (thunar_launcher_update), launcher);
+ g_signal_connect_swapped (launcher->device_monitor, "device-removed", G_CALLBACK (thunar_launcher_update), launcher);
}
@@ -305,9 +306,9 @@ thunar_launcher_finalize (GObject *object)
/* release the reference on the action group */
g_object_unref (launcher->action_group);
- /* disconnect from the volume monitor used for the "Send To" menu */
- g_signal_handlers_disconnect_by_func (launcher->volume_monitor, thunar_launcher_update, launcher);
- g_object_unref (launcher->volume_monitor);
+ /* disconnect from the device monitor used for the "Send To" menu */
+ g_signal_handlers_disconnect_by_func (launcher->device_monitor, thunar_launcher_update, launcher);
+ g_object_unref (launcher->device_monitor);
/* release the reference on the sendto model */
g_object_unref (launcher->sendto_model);
@@ -1319,66 +1320,56 @@ thunar_launcher_poke_data_free (ThunarLauncherPokeData *data)
static void
-thunar_launcher_sendto_volume (ThunarLauncher *launcher,
- GVolume *volume,
+thunar_launcher_sendto_device (ThunarLauncher *launcher,
+ ThunarDevice *device,
GList *files)
{
ThunarApplication *application;
- GMount *mount;
GFile *mount_point;
_thunar_return_if_fail (THUNAR_IS_LAUNCHER (launcher));
- _thunar_return_if_fail (G_IS_VOLUME (volume));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
- if (!thunar_g_volume_is_mounted (volume))
+ if (!thunar_device_is_mounted (device))
return;
- mount = g_volume_get_mount (volume);
- if (mount != NULL)
+ mount_point = thunar_device_get_root (device);
+ if (mount_point != NULL)
{
- mount_point = g_mount_get_root (mount);
-
- /* copy the files onto the specified volume */
+ /* copy the files onto the specified device */
application = thunar_application_get ();
thunar_application_copy_into (application, launcher->widget, files, mount_point, NULL);
g_object_unref (application);
g_object_unref (mount_point);
- g_object_unref (mount);
}
}
static void
-thunar_launcher_sendto_mount_finish (GObject *object,
- GAsyncResult *result,
+thunar_launcher_sendto_mount_finish (ThunarDevice *device,
+ const GError *error,
gpointer user_data)
{
ThunarLauncherMountData *data = user_data;
- GVolume *volume = G_VOLUME (object);
- GError *error = NULL;
- gchar *volume_name;
+ gchar *device_name;
- _thunar_return_if_fail (G_IS_VOLUME (object));
- _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
_thunar_return_if_fail (user_data != NULL);
_thunar_return_if_fail (THUNAR_IS_LAUNCHER (data->launcher));
- if (!g_volume_mount_finish (volume, result, &error))
+ if (error != NULL)
{
- /* tell the user that we were unable to mount the volume, which is
+ /* tell the user that we were unable to mount the device, which is
* required to send files to it */
- volume_name = g_volume_get_name (volume);
- thunar_dialogs_show_error (data->launcher->widget, error, _("Failed to mount \"%s\""),
- volume_name);
- g_free (volume_name);
-
- g_error_free (error);
+ device_name = thunar_device_get_name (device);
+ thunar_dialogs_show_error (data->launcher->widget, error, _("Failed to mount \"%s\""), device_name);
+ g_free (device_name);
}
else
{
- thunar_launcher_sendto_volume (data->launcher, volume, data->files);
+ thunar_launcher_sendto_device (data->launcher, device, data->files);
}
thunar_launcher_mount_data_free (data);
@@ -1387,13 +1378,13 @@ thunar_launcher_sendto_mount_finish (GObject *object,
static void
-thunar_launcher_action_sendto_volume (GtkAction *action,
+thunar_launcher_action_sendto_device (GtkAction *action,
ThunarLauncher *launcher)
{
ThunarLauncherMountData *data;
GMountOperation *mount_operation;
GtkWidget *window;
- GVolume *volume;
+ ThunarDevice *device;
GList *files;
_thunar_return_if_fail (GTK_IS_ACTION (action));
@@ -1404,13 +1395,13 @@ thunar_launcher_action_sendto_volume (GtkAction *action,
if (G_UNLIKELY (files == NULL))
return;
- /* determine the volume to which to send */
- volume = g_object_get_qdata (G_OBJECT (action), thunar_launcher_handler_quark);
- if (G_UNLIKELY (volume == NULL))
+ /* determine the device to which to send */
+ device = g_object_get_qdata (G_OBJECT (action), thunar_launcher_handler_quark);
+ if (G_UNLIKELY (device == NULL))
return;
- /* make sure to mount the volume first, if it's not already mounted */
- if (!thunar_g_volume_is_mounted (volume))
+ /* make sure to mount the device first, if it's not already mounted */
+ if (!thunar_device_is_mounted (device))
{
/* determine the toplevel window */
window = gtk_widget_get_toplevel (launcher->widget);
@@ -1421,15 +1412,18 @@ thunar_launcher_action_sendto_volume (GtkAction *action,
/* allocate a GTK+ mount operation */
mount_operation = gtk_mount_operation_new (GTK_WINDOW (window));
- /* try to mount the volume and later start sending the files */
- g_volume_mount (volume, G_MOUNT_MOUNT_NONE, mount_operation, NULL,
- thunar_launcher_sendto_mount_finish, data);
+ /* try to mount the device and later start sending the files */
+ thunar_device_mount (device,
+ mount_operation,
+ NULL,
+ thunar_launcher_sendto_mount_finish,
+ data);
g_object_unref (mount_operation);
}
else
{
- thunar_launcher_sendto_volume (launcher, volume, files);
+ thunar_launcher_sendto_device (launcher, device, files);
}
/* cleanup */
@@ -1461,11 +1455,11 @@ thunar_launcher_sendto_idle (gpointer user_data)
gboolean linkable = TRUE;
GIcon *icon;
GList *handlers;
- GList *volumes;
+ GList *devices;
GList *lp;
gchar *name;
gchar *tooltip;
- gchar *volume_name;
+ gchar *device_name;
gint n_selected_files;
gint n = 0;
@@ -1509,31 +1503,23 @@ thunar_launcher_sendto_idle (gpointer user_data)
if (G_UNLIKELY (launcher->ui_addons_merge_id == 0))
launcher->ui_addons_merge_id = gtk_ui_manager_new_merge_id (launcher->ui_manager);
- /* determine the currently active volumes */
- volumes = g_volume_monitor_get_volumes (launcher->volume_monitor);
+ /* determine the currently active devices */
+ devices = thunar_device_monitor_get_devices (launcher->device_monitor);
/* add removable (and writable) drives and media */
- for (lp = volumes; lp != NULL; lp = lp->next, ++n)
+ for (lp = devices; lp != NULL; lp = lp->next, ++n)
{
- /* skip non-removable or disc media (CD-ROMs aren't writable by Thunar) */
- /* TODO skip non-writable volumes like CD-ROMs here */
- if (!thunar_g_volume_is_removable (lp->data))
- {
- g_object_unref (lp->data);
- continue;
- }
-
- /* generate a unique name and tooltip for the volume */
- volume_name = g_volume_get_name (lp->data);
+ /* generate a unique name and tooltip for the device */
+ device_name = thunar_device_get_name (lp->data);
name = g_strdup_printf ("thunar-launcher-sendto%d-%p", n, launcher);
tooltip = g_strdup_printf (ngettext ("Send the selected file to \"%s\"",
"Send the selected files to \"%s\"",
- n_selected_files), volume_name);
+ n_selected_files), device_name);
- /* allocate a new action for the volume */
- action = gtk_action_new (name, volume_name, tooltip, NULL);
+ /* allocate a new action for the device */
+ action = gtk_action_new (name, device_name, tooltip, NULL);
g_object_set_qdata_full (G_OBJECT (action), thunar_launcher_handler_quark, lp->data, g_object_unref);
- g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (thunar_launcher_action_sendto_volume), launcher);
+ g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (thunar_launcher_action_sendto_device), launcher);
gtk_action_group_add_action (launcher->action_group, action);
gtk_ui_manager_add_ui (launcher->ui_manager, launcher->ui_addons_merge_id,
"/main-menu/file-menu/sendto-menu/placeholder-sendto-actions",
@@ -1543,7 +1529,7 @@ thunar_launcher_sendto_idle (gpointer user_data)
name, name, GTK_UI_MANAGER_MENUITEM, FALSE);
g_object_unref (action);
- icon = g_volume_get_icon (lp->data);
+ icon = thunar_device_get_icon (lp->data);
if (G_LIKELY (icon != NULL))
{
gtk_action_set_gicon (action, icon);
@@ -1553,11 +1539,11 @@ thunar_launcher_sendto_idle (gpointer user_data)
/* cleanup */
g_free (name);
g_free (tooltip);
- g_free (volume_name);
+ g_free (device_name);
}
- /* free the volumes list */
- g_list_free (volumes);
+ /* free the devices list */
+ g_list_free (devices);
/* determine the sendto handlers for the selected files */
handlers = thunar_sendto_model_get_matching (launcher->sendto_model, launcher->selected_files);
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 19d095ba..3e3b985f 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -1408,17 +1408,17 @@ thunar_shortcuts_view_poke_location_finish (ThunarBrowser *browser,
static void
-thunar_shortcuts_view_poke_volume_finish (ThunarBrowser *browser,
- GVolume *volume,
+thunar_shortcuts_view_poke_device_finish (ThunarBrowser *browser,
+ ThunarDevice *device,
ThunarFile *mount_point,
GError *error,
gpointer user_data)
{
gboolean new_window = GPOINTER_TO_UINT (user_data);
- gchar *volume_name;
+ gchar *device_name;
_thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (browser));
- _thunar_return_if_fail (G_IS_VOLUME (volume));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
if (error == NULL)
{
@@ -1428,10 +1428,10 @@ thunar_shortcuts_view_poke_volume_finish (ThunarBrowser *browser,
}
else
{
- volume_name = g_volume_get_name (volume);
+ device_name = thunar_device_get_name (device);
thunar_dialogs_show_error (GTK_WIDGET (browser), error,
- _("Failed to mount \"%s\""), volume_name);
- g_free (volume_name);
+ _("Failed to mount \"%s\""), device_name);
+ g_free (device_name);
}
}
@@ -1466,10 +1466,10 @@ thunar_shortcuts_view_open (ThunarShortcutsView *view,
THUNAR_SHORTCUTS_MODEL_COLUMN_LOCATION, &location,
-1);
- if (G_LIKELY (FALSE && device != NULL))
- {/* TODO */
- thunar_browser_poke_volume (THUNAR_BROWSER (view), (GVolume *)device, view,
- thunar_shortcuts_view_poke_volume_finish,
+ if (G_LIKELY (device != NULL))
+ {
+ thunar_browser_poke_device (THUNAR_BROWSER (view), device, view,
+ thunar_shortcuts_view_poke_device_finish,
GUINT_TO_POINTER (new_window));
}
else if (file != NULL)
@@ -1563,7 +1563,7 @@ thunar_shortcuts_view_eject (ThunarShortcutsView *view)
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
- /* determine the volume/mount for the shortcut at the given tree iterator */
+ /* determine the device/mount for the shortcut at the given tree iterator */
gtk_tree_model_get (model, &iter, THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE, &device, -1);
_thunar_return_if_fail (THUNAR_IS_DEVICE (device));
@@ -1585,23 +1585,23 @@ thunar_shortcuts_view_eject (ThunarShortcutsView *view)
static void
-thunar_shortcuts_view_poke_volume_mount_finish (ThunarBrowser *browser,
- GVolume *volume,
+thunar_shortcuts_view_poke_device_mount_finish (ThunarBrowser *browser,
+ ThunarDevice *device,
ThunarFile *mount_point,
GError *error,
gpointer ignored)
{
- gchar *volume_name;
+ gchar *device_name;
_thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (browser));
- _thunar_return_if_fail (G_IS_VOLUME (volume));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
if (error != NULL)
{
- volume_name = g_volume_get_name (volume);
+ device_name = thunar_device_get_name (device);
thunar_dialogs_show_error (GTK_WIDGET (browser), error,
- _("Failed to mount \"%s\""), volume_name);
- g_free (volume_name);
+ _("Failed to mount \"%s\""), device_name);
+ g_free (device_name);
}
}
@@ -1613,7 +1613,7 @@ thunar_shortcuts_view_mount (ThunarShortcutsView *view)
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
- GVolume *volume;
+ ThunarDevice *device;
_thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
@@ -1627,17 +1627,16 @@ thunar_shortcuts_view_mount (ThunarShortcutsView *view)
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
/* determine the file for the shortcut at the given tree iterator */
- volume = NULL;
- /*gtk_tree_model_get (model, &iter,
- THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
- -1);*/
+ gtk_tree_model_get (model, &iter,
+ THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE, &device,
+ -1);
- if (G_LIKELY (volume != NULL))
+ if (G_LIKELY (device != NULL))
{
- thunar_browser_poke_volume (THUNAR_BROWSER (view), volume, view,
- thunar_shortcuts_view_poke_volume_mount_finish,
+ thunar_browser_poke_device (THUNAR_BROWSER (view), device, view,
+ thunar_shortcuts_view_poke_device_mount_finish,
NULL);
- g_object_unref (volume);
+ g_object_unref (device);
}
}
}
@@ -1685,7 +1684,7 @@ thunar_shortcuts_view_unmount (ThunarShortcutsView *view)
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
- /* determine the volume/mount for the shortcut at the given tree iterator */
+ /* determine the device/mount for the shortcut at the given tree iterator */
gtk_tree_model_get (model, &iter, THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE, &device, -1);
_thunar_return_if_fail (THUNAR_IS_DEVICE (device));
diff --git a/thunar/thunar-tree-model.c b/thunar/thunar-tree-model.c
index 4cbf0e59..4c5df5a0 100644
--- a/thunar/thunar-tree-model.c
+++ b/thunar/thunar-tree-model.c
@@ -118,6 +118,9 @@ static void thunar_tree_model_file_changed (ThunarFil
static void thunar_tree_model_device_added (ThunarDeviceMonitor *device_monitor,
ThunarDevice *device,
ThunarTreeModel *model);
+static void thunar_tree_model_device_pre_unmount (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
+ ThunarTreeModel *model);
static void thunar_tree_model_device_removed (ThunarDeviceMonitor *device_monitor,
ThunarDevice *device,
ThunarTreeModel *model);
@@ -304,6 +307,7 @@ thunar_tree_model_init (ThunarTreeModel *model)
/* connect to the volume monitor */
model->device_monitor = thunar_device_monitor_get ();
g_signal_connect (model->device_monitor, "device-added", G_CALLBACK (thunar_tree_model_device_added), model);
+ g_signal_connect (model->device_monitor, "device-pre-unmount", G_CALLBACK (thunar_tree_model_device_pre_unmount), model);
g_signal_connect (model->device_monitor, "device-removed", G_CALLBACK (thunar_tree_model_device_removed), model);
g_signal_connect (model->device_monitor, "device-changed", G_CALLBACK (thunar_tree_model_device_changed), model);
@@ -1017,33 +1021,24 @@ thunar_tree_model_device_changed (ThunarDeviceMonitor *device_monitor,
}
-#if 0
+
static void
-thunar_tree_model_mount_pre_unmount (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarTreeModel *model)
+thunar_tree_model_device_pre_unmount (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
+ ThunarTreeModel *model)
{
- GVolume *volume;
- GNode *node;
+ GNode *node;
- _thunar_return_if_fail (G_IS_VOLUME_MONITOR (volume_monitor));
- _thunar_return_if_fail (model->volume_monitor == volume_monitor);
- _thunar_return_if_fail (G_IS_MOUNT (mount));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE_MONITOR (device_monitor));
+ _thunar_return_if_fail (model->device_monitor == device_monitor);
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
_thunar_return_if_fail (THUNAR_IS_TREE_MODEL (model));
- /* determine the mount to which this mount belongs */
- volume = g_mount_get_volume (mount);
-
- if (volume == NULL)
- return;
-
/* lookup the node for the volume (if visible) */
for (node = model->root->children; node != NULL; node = node->next)
- if (THUNAR_TREE_MODEL_ITEM (node->data)->volume == volume)
+ if (THUNAR_TREE_MODEL_ITEM (node->data)->device == device)
break;
- g_object_unref (volume);
-
/* check if we have a node */
if (G_UNLIKELY (node == NULL))
return;
@@ -1058,7 +1053,7 @@ thunar_tree_model_mount_pre_unmount (GVolumeMonitor *volume_monitor,
/* add the dummy node */
thunar_tree_model_node_insert_dummy (node, model);
}
-#endif
+
static void
diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c
index b4acb6c8..53d2457b 100644
--- a/thunar/thunar-window.c
+++ b/thunar/thunar-window.c
@@ -60,6 +60,7 @@
#include <thunar/thunar-tree-pane.h>
#include <thunar/thunar-window.h>
#include <thunar/thunar-window-ui.h>
+#include <thunar/thunar-device-monitor.h>
#include <glib.h>
@@ -207,8 +208,8 @@ static void thunar_window_menu_item_deselected (GtkWidget
static void thunar_window_notify_loading (ThunarView *view,
GParamSpec *pspec,
ThunarWindow *window);
-static void thunar_window_mount_pre_unmount (GVolumeMonitor *volume_monitor,
- GMount *mount,
+static void thunar_window_device_pre_unmount (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
ThunarWindow *window);
static gboolean thunar_window_merge_idle (gpointer user_data);
static void thunar_window_merge_idle_destroy (gpointer user_data);
@@ -254,8 +255,8 @@ struct _ThunarWindow
GtkActionGroup *action_group;
GtkUIManager *ui_manager;
- /* to be able to change folder on "mount-pre-unmount" if required */
- GVolumeMonitor *volume_monitor;
+ /* to be able to change folder on "device-pre-unmount" if required */
+ ThunarDeviceMonitor *device_monitor;
/* closures for the menu_item_selected()/menu_item_deselected() callbacks */
GClosure *menu_item_selected_closure;
@@ -757,8 +758,8 @@ thunar_window_init (ThunarWindow *window)
window->scroll_to_files = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, g_object_unref);
/* connect to the volume monitor */
- window->volume_monitor = g_volume_monitor_get ();
- g_signal_connect (window->volume_monitor, "mount-pre-unmount", G_CALLBACK (thunar_window_mount_pre_unmount), window);
+ window->device_monitor = thunar_device_monitor_get ();
+ g_signal_connect (window->device_monitor, "device-pre-unmount", G_CALLBACK (thunar_window_device_pre_unmount), window);
/* allocate a closure for the menu_item_selected() callback */
window->menu_item_selected_closure = g_cclosure_new_object (G_CALLBACK (thunar_window_menu_item_selected), G_OBJECT (window));
@@ -1012,8 +1013,8 @@ thunar_window_finalize (GObject *object)
g_closure_unref (window->menu_item_selected_closure);
/* disconnect from the volume monitor */
- g_signal_handlers_disconnect_matched (window->volume_monitor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, window);
- g_object_unref (window->volume_monitor);
+ g_signal_handlers_disconnect_matched (window->device_monitor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, window);
+ g_object_unref (window->device_monitor);
/* disconnect from the ui manager */
g_signal_handlers_disconnect_matched (window->ui_manager, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, window);
@@ -2771,17 +2772,17 @@ thunar_window_notify_loading (ThunarView *view,
static void
-thunar_window_mount_pre_unmount (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarWindow *window)
+thunar_window_device_pre_unmount (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
+ ThunarWindow *window)
{
ThunarFile *file;
GtkAction *action;
GFile *mount_point;
- _thunar_return_if_fail (G_IS_VOLUME_MONITOR (volume_monitor));
- _thunar_return_if_fail (window->volume_monitor == volume_monitor);
- _thunar_return_if_fail (G_IS_MOUNT (mount));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE_MONITOR (device_monitor));
+ _thunar_return_if_fail (window->device_monitor == device_monitor);
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
_thunar_return_if_fail (THUNAR_IS_WINDOW (window));
/* nothing to do if we don't have a current directory */
@@ -2789,10 +2790,10 @@ thunar_window_mount_pre_unmount (GVolumeMonitor *volume_monitor,
return;
/* try to get the ThunarFile for the mount point from the file cache */
- mount_point = g_mount_get_root (mount);
+ mount_point = thunar_device_get_root (device);
file = thunar_file_cache_lookup (mount_point);
g_object_unref (mount_point);
-
+g_message ("%p file", file);
if (G_UNLIKELY (file == NULL))
return;