[Xfce4-commits] <thunar:nick/new-shortcuts-pane-model> Port the shortcuts pane to ThunarDevice.
Nick Schermer
noreply at xfce.org
Sun Oct 7 02:10:03 CEST 2012
Updating branch refs/heads/nick/new-shortcuts-pane-model
to 083417bba6399a44bbb5b5bcabaa3b9721fe2fbe (commit)
from a0f743d61115cf90a48d6273f9b569e2b7dad63f (commit)
commit 083417bba6399a44bbb5b5bcabaa3b9721fe2fbe
Author: Nick Schermer <nick at xfce.org>
Date: Sun Oct 7 00:14:12 2012 +0200
Port the shortcuts pane to ThunarDevice.
thunar/thunar-gio-extensions.c | 37 ---
thunar/thunar-gio-extensions.h | 2 -
thunar/thunar-shortcuts-icon-renderer.c | 39 ++--
thunar/thunar-shortcuts-model.c | 452 ++++++++-----------------------
thunar/thunar-shortcuts-model.h | 5 +-
thunar/thunar-shortcuts-view.c | 390 ++++++---------------------
6 files changed, 217 insertions(+), 708 deletions(-)
diff --git a/thunar/thunar-gio-extensions.c b/thunar/thunar-gio-extensions.c
index 288d936..ae52cda 100644
--- a/thunar/thunar-gio-extensions.c
+++ b/thunar/thunar-gio-extensions.c
@@ -578,43 +578,6 @@ thunar_g_volume_is_present (GVolume *volume)
-/**
- * thunar_g_volume_can_eject:
- *
- * If we should show the eject arrow/menu item
- * in the interface.
- *
- * Check if the mount can eject/unmount or else look at
- * the capability of the drive.
- **/
-gboolean
-thunar_g_volume_can_eject (GVolume *volume)
-{
- GMount *mount;
- GDrive *drive;
- gboolean can_eject;
-
- mount = g_volume_get_mount (volume);
- if (mount != NULL)
- {
- can_eject = g_mount_can_eject (mount) || g_mount_can_unmount (mount);
- g_object_unref (mount);
- return can_eject;
- }
-
- drive = g_volume_get_drive (volume);
- if (drive != NULL)
- {
- can_eject = g_drive_can_eject (drive);
- g_object_unref (drive);
- return can_eject;
- }
-
- return FALSE;
-}
-
-
-
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 c7fde60..7afb1dd 100644
--- a/thunar/thunar-gio-extensions.h
+++ b/thunar/thunar-gio-extensions.h
@@ -72,8 +72,6 @@ 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_volume_is_present (GVolume *volume);
-gboolean
-thunar_g_volume_can_eject (GVolume *volume);
gboolean thunar_g_app_info_launch (GAppInfo *info,
GFile *working_directory,
diff --git a/thunar/thunar-shortcuts-icon-renderer.c b/thunar/thunar-shortcuts-icon-renderer.c
index a31f553..3797140 100644
--- a/thunar/thunar-shortcuts-icon-renderer.c
+++ b/thunar/thunar-shortcuts-icon-renderer.c
@@ -28,6 +28,7 @@
#include <thunar/thunar-gobject-extensions.h>
#include <thunar/thunar-icon-factory.h>
#include <thunar/thunar-shortcuts-icon-renderer.h>
+#include <thunar/thunar-device.h>
@@ -36,7 +37,7 @@ enum
{
PROP_0,
PROP_VOLUME,
- PROP_MOUNT,
+ PROP_DEVICE,
PROP_GICON,
};
@@ -71,7 +72,7 @@ struct _ThunarShortcutsIconRenderer
ThunarIconRenderer __parent__;
GVolume *volume;
- GMount *mount;
+ ThunarDevice *device;
GIcon *gicon;
};
@@ -108,15 +109,15 @@ thunar_shortcuts_icon_renderer_class_init (ThunarShortcutsIconRendererClass *kla
EXO_PARAM_READWRITE));
/**
- * ThunarShortcutsIconRenderer:mount:
+ * ThunarShortcutsIconRenderer:device:
*
- * The #GMount for which to render an icon or %NULL to fallback
+ * The #ThunarDevice for which to render an icon or %NULL to fallback
* to the default icon renderering (see #ThunarIconRenderer).
**/
g_object_class_install_property (gobject_class,
- PROP_MOUNT,
- g_param_spec_object ("mount", "mount", "mount",
- G_TYPE_MOUNT,
+ PROP_DEVICE,
+ g_param_spec_object ("device", "device", "device",
+ THUNAR_TYPE_DEVICE,
EXO_PARAM_READWRITE));
/**
@@ -152,8 +153,8 @@ thunar_shortcuts_icon_renderer_finalize (GObject *object)
if (G_UNLIKELY (renderer->volume != NULL))
g_object_unref (renderer->volume);
- if (G_UNLIKELY (renderer->mount != NULL))
- g_object_unref (renderer->mount);
+ if (G_UNLIKELY (renderer->device != NULL))
+ g_object_unref (renderer->device);
if (G_UNLIKELY (renderer->gicon != NULL))
g_object_unref (renderer->gicon);
@@ -177,8 +178,8 @@ thunar_shortcuts_icon_renderer_get_property (GObject *object,
g_value_set_object (value, renderer->volume);
break;
- case PROP_MOUNT:
- g_value_set_object (value, renderer->mount);
+ case PROP_DEVICE:
+ g_value_set_object (value, renderer->device);
break;
case PROP_GICON:
@@ -209,10 +210,10 @@ thunar_shortcuts_icon_renderer_set_property (GObject *object,
renderer->volume = g_value_dup_object (value);
break;
- case PROP_MOUNT:
- if (G_UNLIKELY (renderer->mount != NULL))
- g_object_unref (renderer->mount);
- renderer->mount = g_value_dup_object (value);
+ case PROP_DEVICE:
+ if (G_UNLIKELY (renderer->device != NULL))
+ g_object_unref (renderer->device);
+ renderer->device = g_value_dup_object (value);
break;
case PROP_GICON:
@@ -250,7 +251,7 @@ thunar_shortcuts_icon_renderer_render (GtkCellRenderer *renderer,
/* check if we have a volume set */
if (G_UNLIKELY (shortcuts_icon_renderer->volume != NULL
|| shortcuts_icon_renderer->gicon != NULL
- || shortcuts_icon_renderer->mount != NULL))
+ || shortcuts_icon_renderer->device != NULL))
{
/* load the volume icon */
icon_theme = gtk_icon_theme_get_for_screen (gdk_drawable_get_screen (window));
@@ -261,7 +262,7 @@ thunar_shortcuts_icon_renderer_render (GtkCellRenderer *renderer,
else if (shortcuts_icon_renderer->volume != NULL)
gicon = g_volume_get_icon (shortcuts_icon_renderer->volume);
else
- gicon = g_mount_get_icon (shortcuts_icon_renderer->mount);
+ gicon = thunar_device_get_icon (shortcuts_icon_renderer->device);
icon_info = gtk_icon_theme_lookup_by_gicon (icon_theme, gicon, cell_area->width,
GTK_ICON_LOOKUP_USE_BUILTIN);
@@ -294,8 +295,8 @@ thunar_shortcuts_icon_renderer_render (GtkCellRenderer *renderer,
icon_area.height = gdk_pixbuf_get_height (icon);
}
- if (shortcuts_icon_renderer->volume != NULL
- && !thunar_g_volume_is_mounted (shortcuts_icon_renderer->volume))
+ if (shortcuts_icon_renderer->device != NULL
+ && !thunar_device_is_mounted (shortcuts_icon_renderer->device))
{
/* 50% translucent for unmounted volumes */
temp = exo_gdk_pixbuf_lucent (icon, 50);
diff --git a/thunar/thunar-shortcuts-model.c b/thunar/thunar-shortcuts-model.c
index 79bd03d..68f6ce7 100644
--- a/thunar/thunar-shortcuts-model.c
+++ b/thunar/thunar-shortcuts-model.c
@@ -40,6 +40,7 @@
#include <thunar/thunar-file.h>
#include <thunar/thunar-shortcuts-model.h>
+#include <thunar/thunar-device-monitor.h>
#include <thunar/thunar-private.h>
@@ -106,23 +107,14 @@ static void thunar_shortcuts_model_file_changed (ThunarFile
ThunarShortcutsModel *model);
static void thunar_shortcuts_model_file_destroy (ThunarFile *file,
ThunarShortcutsModel *model);
-static void thunar_shortcuts_model_volume_added (GVolumeMonitor *volume_monitor,
- GVolume *volume,
+static void thunar_shortcuts_model_device_added (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
ThunarShortcutsModel *model);
-static void thunar_shortcuts_model_volume_removed (GVolumeMonitor *volume_monitor,
- GVolume *volume,
+static void thunar_shortcuts_model_device_removed (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
ThunarShortcutsModel *model);
-static void thunar_shortcuts_model_volume_changed (GVolumeMonitor *monitor,
- GVolume *volume,
- ThunarShortcutsModel *model);
-static void thunar_shortcuts_model_mount_added (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarShortcutsModel *model);
-static void thunar_shortcuts_model_mount_removed (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarShortcutsModel *model);
-static void thunar_shortcuts_model_mount_changed (GVolumeMonitor *monitor,
- GMount *mount,
+static void thunar_shortcuts_model_device_changed (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
ThunarShortcutsModel *model);
static void thunar_shortcut_free (ThunarShortcut *shortcut,
@@ -144,17 +136,16 @@ struct _ThunarShortcutsModel
* generated by another model.
*/
#ifndef NDEBUG
- gint stamp;
+ gint stamp;
#endif
- GList *shortcuts;
+ GList *shortcuts;
- GList *hidden_volumes;
- GVolumeMonitor *volume_monitor;
- guint volume_monitor_idle_id;
+ ThunarDeviceMonitor *device_monitor;
+ guint devices_monitor_idle_id;
- GFileMonitor *monitor;
- guint load_idle_id;
+ GFileMonitor *monitor;
+ guint load_idle_id;
};
struct _ThunarShortcut
@@ -169,8 +160,7 @@ struct _ThunarShortcut
GFile *location;
ThunarFile *file;
- GVolume *volume;
- GMount *mount;
+ ThunarDevice *device;
};
@@ -222,13 +212,12 @@ thunar_shortcuts_model_drag_source_init (GtkTreeDragSourceIface *iface)
static gboolean
-thunar_shortcuts_model_volumes_load (gpointer data)
+thunar_shortcuts_model_devices_load (gpointer data)
{
ThunarShortcutsModel *model = THUNAR_SHORTCUTS_MODEL (data);
- ThunarShortcut *shortcut;
- GList *volumes;
- GList *lp;
- GList *mounts;
+ ThunarShortcut *shortcut;
+ GList *devices;
+ GList *lp;
GDK_THREADS_ENTER ();
@@ -247,38 +236,26 @@ thunar_shortcuts_model_volumes_load (gpointer data)
shortcut->gicon = g_themed_icon_new (GTK_STOCK_HARDDISK);
thunar_shortcuts_model_add_shortcut (model, shortcut);
- /* connect to the volume monitor */
- model->volume_monitor = g_volume_monitor_get ();
+ /* connect to the device monitor */
+ model->device_monitor = thunar_device_monitor_get ();
- /* get a list of all volumes available */
- volumes = g_volume_monitor_get_volumes (model->volume_monitor);
- for (lp = volumes; lp != NULL; lp = lp->next)
+ /* get a list of all devices available */
+ devices = thunar_device_monitor_get_devices (model->device_monitor);
+ for (lp = devices; lp != NULL; lp = lp->next)
{
- thunar_shortcuts_model_volume_added (model->volume_monitor, lp->data, model);
+ thunar_shortcuts_model_device_added (model->device_monitor, lp->data, model);
g_object_unref (G_OBJECT (lp->data));
}
- g_list_free (volumes);
-
- /* get a list of all mounts available */
- mounts = g_volume_monitor_get_mounts (model->volume_monitor);
- for (lp = mounts; lp != NULL; lp = lp->next)
- {
- thunar_shortcuts_model_mount_added (model->volume_monitor, lp->data, model);
- g_object_unref (G_OBJECT (lp->data));
- }
- g_list_free (mounts);
+ g_list_free (devices);
GDK_THREADS_LEAVE ();
/* monitor for changes */
- g_signal_connect (model->volume_monitor, "volume-added", G_CALLBACK (thunar_shortcuts_model_volume_added), model);
- g_signal_connect (model->volume_monitor, "volume-removed", G_CALLBACK (thunar_shortcuts_model_volume_removed), model);
- g_signal_connect (model->volume_monitor, "volume-changed", G_CALLBACK (thunar_shortcuts_model_volume_changed), model);
- g_signal_connect (model->volume_monitor, "mount-added", G_CALLBACK (thunar_shortcuts_model_mount_added), model);
- g_signal_connect (model->volume_monitor, "mount-removed", G_CALLBACK (thunar_shortcuts_model_mount_removed), model);
- g_signal_connect (model->volume_monitor, "mount-changed", G_CALLBACK (thunar_shortcuts_model_mount_changed), model);
+ g_signal_connect (model->device_monitor, "device-added", G_CALLBACK (thunar_shortcuts_model_device_added), model);
+ g_signal_connect (model->device_monitor, "device-removed", G_CALLBACK (thunar_shortcuts_model_device_removed), model);
+ g_signal_connect (model->device_monitor, "device-changed", G_CALLBACK (thunar_shortcuts_model_device_changed), model);
- model->volume_monitor_idle_id = 0;
+ model->devices_monitor_idle_id = 0;
return FALSE;
}
@@ -397,7 +374,7 @@ thunar_shortcuts_model_init (ThunarShortcutsModel *model)
#endif
/* load volumes */
- model->volume_monitor_idle_id = g_idle_add_full (G_PRIORITY_LOW, thunar_shortcuts_model_volumes_load, model, NULL);
+ model->devices_monitor_idle_id = g_idle_add_full (G_PRIORITY_LOW, thunar_shortcuts_model_devices_load, model, NULL);
/* add network */
thunar_shortcuts_model_shortcut_network (model);
@@ -419,17 +396,14 @@ thunar_shortcuts_model_finalize (GObject *object)
if (model->load_idle_id != 0)
g_source_remove (model->load_idle_id);
- /* stop volume monitor loading */
- if (model->volume_monitor_idle_id != 0)
- g_source_remove (model->volume_monitor_idle_id);
+ /* stop device monitor loading */
+ if (model->devices_monitor_idle_id != 0)
+ g_source_remove (model->devices_monitor_idle_id);
/* free all shortcuts */
g_list_foreach (model->shortcuts, (GFunc) thunar_shortcut_free, model);
g_list_free (model->shortcuts);
- /* free all hidden volumes */
- g_list_free_full (model->hidden_volumes, g_object_unref);
-
/* detach from the file monitor */
if (model->monitor != NULL)
{
@@ -437,9 +411,9 @@ thunar_shortcuts_model_finalize (GObject *object)
g_object_unref (model->monitor);
}
- /* unlink from the volume monitor */
- g_signal_handlers_disconnect_matched (model->volume_monitor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model);
- g_object_unref (model->volume_monitor);
+ /* unlink from the device monitor */
+ g_signal_handlers_disconnect_matched (model->device_monitor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, model);
+ g_object_unref (model->device_monitor);
(*G_OBJECT_CLASS (thunar_shortcuts_model_parent_class)->finalize) (object);
}
@@ -484,11 +458,8 @@ thunar_shortcuts_model_get_column_type (GtkTreeModel *tree_model,
case THUNAR_SHORTCUTS_MODEL_COLUMN_GICON:
return G_TYPE_ICON;
- case THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME:
- return G_TYPE_VOLUME;
-
- case THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT:
- return G_TYPE_MOUNT;
+ case THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE:
+ return THUNAR_TYPE_DEVICE;
case THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE:
return G_TYPE_BOOLEAN;
@@ -579,10 +550,8 @@ thunar_shortcuts_model_get_value (GtkTreeModel *tree_model,
case THUNAR_SHORTCUTS_MODEL_COLUMN_NAME:
g_value_init (value, G_TYPE_STRING);
- if (G_UNLIKELY (shortcut->volume != NULL))
- g_value_take_string (value, g_volume_get_name (shortcut->volume));
- else if (shortcut->mount != NULL)
- g_value_take_string (value, g_mount_get_name (shortcut->mount));
+ if (G_UNLIKELY (shortcut->device != NULL))
+ g_value_take_string (value, thunar_device_get_name (shortcut->device));
else if (shortcut->name != NULL)
g_value_set_static_string (value, shortcut->name);
else if (shortcut->file != NULL)
@@ -603,14 +572,9 @@ thunar_shortcuts_model_get_value (GtkTreeModel *tree_model,
g_value_set_object (value, shortcut->gicon);
break;
- case THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME:
- g_value_init (value, G_TYPE_VOLUME);
- g_value_set_object (value, shortcut->volume);
- break;
-
- case THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT:
- g_value_init (value, G_TYPE_MOUNT);
- g_value_set_object (value, shortcut->mount);
+ case THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE:
+ g_value_init (value, THUNAR_TYPE_DEVICE);
+ g_value_set_object (value, shortcut->device);
break;
case THUNAR_SHORTCUTS_MODEL_COLUMN_LOCATION:
@@ -627,10 +591,8 @@ thunar_shortcuts_model_get_value (GtkTreeModel *tree_model,
break;
case THUNAR_SHORTCUTS_MODEL_COLUMN_CAN_EJECT:
- if (shortcut->volume != NULL)
- can_eject = thunar_g_volume_can_eject (shortcut->volume);
- else if (shortcut->mount != NULL)
- can_eject = g_mount_can_eject (shortcut->mount) || g_mount_can_unmount (shortcut->mount);
+ if (shortcut->device != NULL)
+ can_eject = thunar_device_can_eject (shortcut->device);
else
can_eject = FALSE;
@@ -800,15 +762,10 @@ thunar_shortcuts_model_sort_func (gconstpointer shortcut_a,
if (a->sort_id != b->sort_id)
return a->sort_id > b->sort_id ? 1 : -1;
- /* properly sort volumes by timestamp */
- if (a->volume != NULL && b->volume != NULL)
- return -g_strcmp0 (g_volume_get_sort_key (a->volume),
- g_volume_get_sort_key (b->volume));
-
- /* properly sort mounts by timestamp */
- if (a->mount != NULL && b->mount != NULL)
- return -g_strcmp0 (g_mount_get_sort_key (a->mount),
- g_mount_get_sort_key (b->mount));
+ /* properly sort devices by timestamp */
+ if (a->device != NULL && b->device != NULL)
+ return -g_strcmp0 (thunar_device_get_sort_key (a->device),
+ thunar_device_get_sort_key (b->device));
return g_strcmp0 (a->name, b->name);
}
@@ -1213,284 +1170,104 @@ thunar_shortcuts_model_file_destroy (ThunarFile *file,
static void
-thunar_shortcuts_model_volume_changed (GVolumeMonitor *volume_monitor,
- GVolume *volume,
- ThunarShortcutsModel *model)
+thunar_shortcuts_model_device_added (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
+ ThunarShortcutsModel *model)
{
- ThunarShortcut *shortcut = NULL;
- GtkTreeIter iter;
- GList *lp;
- gint idx;
- GtkTreePath *path;
+ ThunarShortcut *shortcut;
- _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_VOLUME (volume));
+ _thunar_return_if_fail (THUNAR_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_SHORTCUTS_MODEL (model));
- /* check if the volume is on the hidden list */
- lp = g_list_find (model->hidden_volumes, volume);
- if (lp != NULL)
- {
- /* check if we need to display the volume now */
- if (thunar_g_volume_is_removable (volume))
- {
- /* remove the volume from the list of hidden volumes */
- model->hidden_volumes = g_list_delete_link (model->hidden_volumes, lp);
-
- /* allocate a new shortcut */
- shortcut = g_slice_new0 (ThunarShortcut);
- shortcut->group = THUNAR_SHORTCUT_GROUP_VOLUMES;
- shortcut->volume = volume;
+ /* allocate a new shortcut */
+ shortcut = g_slice_new0 (ThunarShortcut);
+ shortcut->device = g_object_ref (device);
- /* the volume is present now, so we have to display it */
- thunar_shortcuts_model_add_shortcut (model, shortcut);
- }
- }
- else
+ switch (thunar_device_get_kind (device))
{
- /* lookup the shortcut that contains the given volume */
- for (idx = 0, lp = model->shortcuts;
- shortcut == NULL && lp != NULL;
- ++idx, lp = lp->next)
- {
- if (THUNAR_SHORTCUT (lp->data)->volume == volume)
- shortcut = lp->data;
- }
-
- /* verify that we actually found the shortcut */
- _thunar_assert (shortcut != NULL);
- _thunar_assert (shortcut->volume == volume);
-
- /* check if we need to hide the volume now */
- if (!thunar_g_volume_is_removable (volume))
- {
- /* move the volume to the hidden list */
- model->hidden_volumes = g_list_prepend (model->hidden_volumes,
- g_object_ref (volume));
+ case THUNAR_DEVICE_KIND_VOLUME:
+ shortcut->group = THUNAR_SHORTCUT_GROUP_VOLUMES;
+ break;
- /* remove the shortcut from the user interface */
- thunar_shortcuts_model_remove_shortcut (model, shortcut);
- }
- else
- {
- /* generate an iterator for the path */
- GTK_TREE_ITER_INIT (iter, model->stamp, lp);
+ case THUNAR_DEVICE_KIND_MOUNT_LOCAL:
+ shortcut->group = THUNAR_SHORTCUT_GROUP_MOUNTS;
+ break;
- /* tell the view that the volume has changed in some way */
- path = gtk_tree_path_new_from_indices (idx, -1);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
- gtk_tree_path_free (path);
- }
+ case THUNAR_DEVICE_KIND_MOUNT_REMOTE:
+ shortcut->group = THUNAR_SHORTCUT_GROUP_NETWORK_MOUNTS;
+ break;
}
-}
-
-
-
-static void
-thunar_shortcuts_model_volume_added (GVolumeMonitor *volume_monitor,
- GVolume *volume,
- ThunarShortcutsModel *model)
-{
- _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_VOLUME (volume));
- _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_MODEL (model));
-
- /* place the volume on the hidden list */
- model->hidden_volumes = g_list_prepend (model->hidden_volumes, g_object_ref (volume));
- /* let the "changed" handler place the volume where appropriate */
- thunar_shortcuts_model_volume_changed (volume_monitor, volume, model);
+ /* insert in the model */
+ thunar_shortcuts_model_add_shortcut (model, shortcut);
}
static void
-thunar_shortcuts_model_volume_removed (GVolumeMonitor *volume_monitor,
- GVolume *volume,
+thunar_shortcuts_model_device_removed (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
ThunarShortcutsModel *model)
{
GList *lp;
- _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_VOLUME (volume));
+ _thunar_return_if_fail (THUNAR_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_SHORTCUTS_MODEL (model));
- lp = g_list_find (model->hidden_volumes, volume);
- if (G_LIKELY (lp != NULL))
- {
- /* remove the volume from the hidden list and drop our reference */
- model->hidden_volumes = g_list_delete_link (model->hidden_volumes, lp);
- g_object_unref (volume);
- }
- else
- {
- /* must be an active shortcut then... */
- for (lp = model->shortcuts; lp != NULL; lp = lp->next)
- if (THUNAR_SHORTCUT (lp->data)->volume == volume)
- break;
-
- /* something is broken if we don't have a shortcut here */
- _thunar_assert (lp != NULL);
- _thunar_assert (THUNAR_SHORTCUT (lp->data)->volume == volume);
-
- /* drop the shortcut from the model */
- thunar_shortcuts_model_remove_shortcut (model, lp->data);
- }
-}
-
-
-
-static gboolean
-thunar_shortcuts_model_has_location (ThunarShortcutsModel *model,
- GFile *location)
-{
- GList *lp;
- ThunarShortcut *shortcut;
-
- _thunar_return_val_if_fail (THUNAR_IS_SHORTCUTS_MODEL (model), FALSE);
- _thunar_return_val_if_fail (G_IS_FILE (location), FALSE);
-
+ /* find the shortcut */
for (lp = model->shortcuts; lp != NULL; lp = lp->next)
- {
- shortcut = lp->data;
-
- /* check if we have a location that matches */
- if (shortcut->location != NULL
- && g_file_equal (shortcut->location, location))
- return TRUE;
+ if (THUNAR_SHORTCUT (lp->data)->device == device)
+ break;
- /* check if we have a file that matches */
- if (shortcut->file != NULL
- && g_file_equal (thunar_file_get_file (shortcut->file), location))
- return TRUE;
- }
+ /* something is broken if we don't have a shortcut here */
+ _thunar_assert (lp != NULL);
+ _thunar_assert (THUNAR_SHORTCUT (lp->data)->device == device);
- return FALSE;
+ /* drop the shortcut from the model */
+ if (G_LIKELY (lp != NULL))
+ thunar_shortcuts_model_remove_shortcut (model, lp->data);
}
static void
-thunar_shortcuts_model_mount_changed (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarShortcutsModel *model)
+thunar_shortcuts_model_device_changed (ThunarDeviceMonitor *device_monitor,
+ ThunarDevice *device,
+ ThunarShortcutsModel *model)
{
- GList *lp;
- guint idx;
GtkTreeIter iter;
+ GList *lp;
+ gint idx;
GtkTreePath *path;
- _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_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_SHORTCUTS_MODEL (model));
- /* find mount */
+ /* find the shortcut */
for (lp = model->shortcuts, idx = 0; lp != NULL; lp = lp->next, idx++)
- if (THUNAR_SHORTCUT (lp->data)->mount == mount)
+ if (THUNAR_SHORTCUT (lp->data)->device == device)
break;
- if (lp == NULL)
- return;
-
/* something is broken if we don't have a shortcut here */
- _thunar_assert (THUNAR_SHORTCUT (lp->data)->mount == mount);
-
- /* generate an iterator for the path */
- GTK_TREE_ITER_INIT (iter, model->stamp, lp);
-
- /* tell the view that the volume has changed in some way */
- path = gtk_tree_path_new_from_indices (idx, -1);
- gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
- gtk_tree_path_free (path);
-}
-
-
-
-static void
-thunar_shortcuts_model_mount_added (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarShortcutsModel *model)
-{
- GVolume *volume;
- GFile *location;
- ThunarShortcutGroup group;
- ThunarShortcut *shortcut;
-
- _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_SHORTCUTS_MODEL (model));
-
- /* never show shadowed mounts */
- if (g_mount_is_shadowed (mount))
- return;
+ _thunar_assert (lp != NULL);
+ _thunar_assert (THUNAR_SHORTCUT (lp->data)->device == device);
- /* skip mounts with a volume */
- volume = g_mount_get_volume (mount);
- if (volume != NULL)
+ if (G_LIKELY (lp != NULL))
{
- g_object_unref (volume);
- return;
- }
-
- location = g_mount_get_root (mount);
+ /* generate an iterator for the path */
+ GTK_TREE_ITER_INIT (iter, model->stamp, lp);
- /* skip ghoto locations, since those also have a mount
- * and igore locations already in the model */
- if (g_file_has_uri_scheme (location, "gphoto2")
- || thunar_shortcuts_model_has_location (model, location))
- {
- g_object_unref (location);
- return;
+ /* tell the view that the volume has changed in some way */
+ path = gtk_tree_path_new_from_indices (idx, -1);
+ gtk_tree_model_row_changed (GTK_TREE_MODEL (model), path, &iter);
+ gtk_tree_path_free (path);
}
-
- if (g_file_has_uri_scheme (location, "file")
- || g_file_has_uri_scheme (location, "archive"))
- group = THUNAR_SHORTCUT_GROUP_MOUNTS;
- else
- group = THUNAR_SHORTCUT_GROUP_NETWORK_MOUNTS;
-
- /* allocate a new shortcut */
- shortcut = g_slice_new0 (ThunarShortcut);
- shortcut->group = group;
- shortcut->location = location;
- shortcut->mount = g_object_ref (mount);
-
- /* the mount is present now, so we have to display it */
- thunar_shortcuts_model_add_shortcut (model, shortcut);
-}
-
-
-
-static void
-thunar_shortcuts_model_mount_removed (GVolumeMonitor *volume_monitor,
- GMount *mount,
- ThunarShortcutsModel *model)
-{
- GList *lp;
-
- _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_SHORTCUTS_MODEL (model));
-
- /* find mount */
- for (lp = model->shortcuts; lp != NULL; lp = lp->next)
- if (THUNAR_SHORTCUT (lp->data)->mount == mount)
- break;
-
- if (lp == NULL)
- return;
-
- /* something is broken if we don't have a shortcut here */
- _thunar_assert (THUNAR_SHORTCUT (lp->data)->mount == mount);
-
- /* drop the shortcut from the model */
- thunar_shortcuts_model_remove_shortcut (model, lp->data);
}
@@ -1511,11 +1288,8 @@ thunar_shortcut_free (ThunarShortcut *shortcut,
g_object_unref (shortcut->file);
}
- if (G_LIKELY (shortcut->volume != NULL))
- g_object_unref (shortcut->volume);
-
- if (G_LIKELY (shortcut->mount != NULL))
- g_object_unref (shortcut->mount);
+ if (G_LIKELY (shortcut->device != NULL))
+ g_object_unref (shortcut->device);
if (G_LIKELY (shortcut->gicon != NULL))
g_object_unref (shortcut->gicon);
@@ -1581,7 +1355,6 @@ thunar_shortcuts_model_iter_for_file (ThunarShortcutsModel *model,
ThunarFile *file,
GtkTreeIter *iter)
{
- GMount *mount;
GFile *mount_point;
GList *lp;
ThunarShortcut *shortcut;
@@ -1602,24 +1375,19 @@ thunar_shortcuts_model_iter_for_file (ThunarShortcutsModel *model,
}
/* but maybe we have a mounted(!) volume with a matching mount point */
- if (shortcut->volume != NULL)
+ if (shortcut->device != NULL)
{
- mount = g_volume_get_mount (shortcut->volume);
-
- if (G_LIKELY (mount != NULL))
+ mount_point = thunar_device_get_root (shortcut->device);
+ if (mount_point != NULL)
{
- mount_point = g_mount_get_root (mount);
-
- if (G_LIKELY (g_file_equal (mount_point, thunar_file_get_file (file))))
+ if (g_file_equal (mount_point, thunar_file_get_file (file)))
{
GTK_TREE_ITER_INIT (*iter, model->stamp, lp);
g_object_unref (mount_point);
- g_object_unref (mount);
return TRUE;
}
g_object_unref (mount_point);
- g_object_unref (mount);
}
}
}
diff --git a/thunar/thunar-shortcuts-model.h b/thunar/thunar-shortcuts-model.h
index ce5def4..b5d94f6 100644
--- a/thunar/thunar-shortcuts-model.h
+++ b/thunar/thunar-shortcuts-model.h
@@ -41,7 +41,7 @@ typedef struct _ThunarShortcutsModel ThunarShortcutsModel;
* @THUNAR_SHORTCUTS_MODEL_COLUMN_FILE : the index of the file column.
* @THUNAR_SHORTCUTS_MODEL_COLUMN_LOCATION : file of the location.
* @THUNAR_SHORTCUTS_MODEL_COLUMN_GICON : custom image.
- * @THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME : the index of the volume column.
+ * @THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE : the index of the device column.
* @THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE : tells whether a row is mutable.
* @THUNAR_SHORTCUTS_MODEL_COLUMN_EJECT : stock icon name for eject symbol
* @THUNAR_SHORTCUTS_MODEL_COLUMN_SEPARATOR : tells whether a row is a separator.
@@ -57,8 +57,7 @@ typedef enum
THUNAR_SHORTCUTS_MODEL_COLUMN_FILE,
THUNAR_SHORTCUTS_MODEL_COLUMN_LOCATION,
THUNAR_SHORTCUTS_MODEL_COLUMN_GICON,
- THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME,
- THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT,
+ THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE,
THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE,
THUNAR_SHORTCUTS_MODEL_COLUMN_CAN_EJECT,
THUNAR_SHORTCUTS_MODEL_COLUMN_GROUP,
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 720fb44..19d095b 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -32,9 +32,6 @@
#include <gdk/gdkkeysyms.h>
-#ifdef HAVE_LIBNOTIFY
-#include <thunar/thunar-notify.h>
-#endif
#include <thunar/thunar-application.h>
#include <thunar/thunar-browser.h>
#include <thunar/thunar-dialogs.h>
@@ -46,6 +43,7 @@
#include <thunar/thunar-shortcuts-icon-renderer.h>
#include <thunar/thunar-shortcuts-model.h>
#include <thunar/thunar-shortcuts-view.h>
+#include <thunar/thunar-device-monitor.h>
@@ -128,7 +126,7 @@ static void thunar_shortcuts_view_open (Thunar
gboolean new_window);
static void thunar_shortcuts_view_open_in_new_window_clicked (ThunarShortcutsView *view);
static void thunar_shortcuts_view_empty_trash (ThunarShortcutsView *view);
-static void thunar_shortcuts_view_disconnect (ThunarShortcutsView *view);
+static void thunar_shortcuts_view_eject (ThunarShortcutsView *view);
static void thunar_shortcuts_view_mount (ThunarShortcutsView *view);
static void thunar_shortcuts_view_unmount (ThunarShortcutsView *view);
@@ -305,8 +303,7 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view)
gtk_tree_view_column_set_attributes (column, view->icon_renderer,
"gicon", THUNAR_SHORTCUTS_MODEL_COLUMN_GICON,
"file", THUNAR_SHORTCUTS_MODEL_COLUMN_FILE,
- "volume", THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME,
- "mount", THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT,
+ "device", THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE,
"visible", THUNAR_SHORTCUTS_MODEL_COLUMN_NOT_HEADER,
NULL);
@@ -466,7 +463,7 @@ thunar_shortcuts_view_button_release_event (GtkWidget *widget,
if (G_LIKELY (view->pressed_button == (gint) event->button))
{
if (view->pressed_eject_button)
- thunar_shortcuts_view_disconnect (view);
+ thunar_shortcuts_view_eject (view);
/* check if we should simply open or open in new window */
if (G_LIKELY (event->button == 1))
@@ -876,9 +873,7 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
GtkWidget *item;
GtkWidget *window;
gboolean mutable;
- GVolume *volume;
- GMount *mount;
- GMount *volume_mount;
+ ThunarDevice *device;
GList *providers, *lp;
GList *actions = NULL, *tmp;
ThunarShortcutGroup group;
@@ -891,8 +886,7 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
/* check whether the shortcut at the given path is mutable */
gtk_tree_model_get (model, iter,
THUNAR_SHORTCUTS_MODEL_COLUMN_FILE, &file,
- THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
- THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT, &mount,
+ THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE, &device,
THUNAR_SHORTCUTS_MODEL_COLUMN_MUTABLE, &mutable,
THUNAR_SHORTCUTS_MODEL_COLUMN_GROUP, &group,
-1);
@@ -916,7 +910,6 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
- /* check if we have a volume here */
switch (group)
{
case THUNAR_SHORTCUT_GROUP_VOLUMES:
@@ -925,28 +918,23 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
- volume_mount = g_volume_get_mount (volume);
-
/* append the "Mount" item */
item = gtk_image_menu_item_new_with_mnemonic (_("_Mount"));
- gtk_widget_set_visible (item, volume_mount == NULL && g_volume_can_mount (volume));
+ gtk_widget_set_visible (item, thunar_device_can_mount (device));
g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_mount), view);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
/* append the "Unmount" item */
item = gtk_image_menu_item_new_with_mnemonic (_("_Unmount"));
- gtk_widget_set_visible (item, volume_mount != NULL && g_mount_can_unmount (volume_mount));
+ gtk_widget_set_visible (item, thunar_device_can_unmount (device));
g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_unmount), view);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
/* append the "Disconnect" (eject + safely remove drive) item */
item = gtk_image_menu_item_new_with_mnemonic (_("_Eject"));
- gtk_widget_set_visible (item, thunar_g_volume_can_eject (volume));
+ gtk_widget_set_visible (item, thunar_device_can_eject (device));
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
- g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_disconnect), view);
-
- if (volume_mount != NULL)
- g_object_unref (volume_mount);
+ g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_eject), view);
break;
case THUNAR_SHORTCUT_GROUP_MOUNTS:
@@ -958,12 +946,12 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
/* append the "Disconnect" item */
item = gtk_image_menu_item_new_with_mnemonic (_("Disconn_ect"));
- g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_disconnect), view);
+ gtk_widget_set_sensitive (item, thunar_device_can_eject (device));
+ g_signal_connect_swapped (G_OBJECT (item), "activate", G_CALLBACK (thunar_shortcuts_view_eject), view);
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
gtk_widget_show (item);
break;
-
case THUNAR_SHORTCUT_GROUP_TRASH:
/* append a menu separator */
item = gtk_separator_menu_item_new ();
@@ -1065,10 +1053,8 @@ thunar_shortcuts_view_context_menu (ThunarShortcutsView *view,
/* clean up */
if (G_LIKELY (file != NULL))
g_object_unref (G_OBJECT (file));
- if (G_UNLIKELY (volume != NULL))
- g_object_unref (G_OBJECT (volume));
- if (G_UNLIKELY (mount != NULL))
- g_object_unref (G_OBJECT (mount));
+ if (G_UNLIKELY (device != NULL))
+ g_object_unref (G_OBJECT (device));
gtk_tree_path_free (path);
}
@@ -1459,7 +1445,7 @@ thunar_shortcuts_view_open (ThunarShortcutsView *view,
GtkTreeModel *model;
GtkTreeIter iter;
ThunarFile *file;
- GVolume *volume;
+ ThunarDevice *device;
GFile *location;
_thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
@@ -1476,13 +1462,13 @@ thunar_shortcuts_view_open (ThunarShortcutsView *view,
/* determine the file for the shortcut at the given tree iterator */
gtk_tree_model_get (model, &iter,
THUNAR_SHORTCUTS_MODEL_COLUMN_FILE, &file,
- THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
+ THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE, &device,
THUNAR_SHORTCUTS_MODEL_COLUMN_LOCATION, &location,
-1);
- if (G_LIKELY (volume != NULL))
- {
- thunar_browser_poke_volume (THUNAR_BROWSER (view), volume, view,
+ if (G_LIKELY (FALSE && device != NULL))
+ {/* TODO */
+ thunar_browser_poke_volume (THUNAR_BROWSER (view), (GVolume *)device, view,
thunar_shortcuts_view_poke_volume_finish,
GUINT_TO_POINTER (new_window));
}
@@ -1502,8 +1488,8 @@ thunar_shortcuts_view_open (ThunarShortcutsView *view,
if (file != NULL)
g_object_unref (file);
- if (volume != NULL)
- g_object_unref (volume);
+ if (device != NULL)
+ g_object_unref (device);
if (location != NULL)
g_object_unref (location);
@@ -1537,137 +1523,37 @@ thunar_shortcuts_view_empty_trash (ThunarShortcutsView *view)
static void
-thunar_shortcuts_view_eject_volume_finish (GObject *object,
- GAsyncResult *result,
- gpointer user_data)
-{
- ThunarShortcutsView *view = THUNAR_SHORTCUTS_VIEW (user_data);
- GtkWidget *window;
- GVolume *volume = G_VOLUME (object);
- GError *error = NULL;
- gchar *volume_name;
-
- _thunar_return_if_fail (G_IS_VOLUME (object));
- _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
- _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
-
- /* check if there was an error */
- if (!g_volume_eject_with_operation_finish (volume, result, &error))
- {
- /* ignore GIO errors already handled */
- if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_FAILED_HANDLED)
- {
- window = gtk_widget_get_toplevel (GTK_WIDGET (view));
-
- /* display an error dialog to inform the user */
- volume_name = g_volume_get_name (volume);
- thunar_dialogs_show_error (window, error, _("Failed to eject \"%s\""), volume_name);
- g_free (volume_name);
-
- g_error_free (error);
- }
- }
-
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_eject_finish (volume);
-#endif
-
- g_object_unref (view);
-}
-
-
-
-static void
-thunar_shortcuts_view_eject_mount_finish (GObject *object,
- GAsyncResult *result,
- gpointer user_data)
-{
- ThunarShortcutsView *view = THUNAR_SHORTCUTS_VIEW (user_data);
- GtkWidget *window;
- GMount *mount = G_MOUNT (object);
- GError *error = NULL;
- gchar *mount_name;
-
- _thunar_return_if_fail (G_IS_MOUNT (object));
- _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
- _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
-
- /* check if there was an error */
- if (!g_mount_eject_with_operation_finish (mount, result, &error))
- {
- /* ignore GIO errors already handled */
- if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_FAILED_HANDLED)
- {
- window = gtk_widget_get_toplevel (GTK_WIDGET (view));
-
- /* display an error dialog to inform the user */
- mount_name = g_mount_get_name (mount);
- thunar_dialogs_show_error (window, error, _("Failed to eject \"%s\""), mount_name);
- g_free (mount_name);
-
- g_error_free (error);
- }
- }
-
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount_finish (mount);
-#endif
-
- g_object_unref (view);
-}
-
-
-
-static void
-thunar_shortcuts_view_unmount_finish (GObject *object,
- GAsyncResult *result,
- gpointer user_data)
+thunar_shortcuts_view_eject_finish (ThunarDevice *device,
+ const GError *error,
+ gpointer user_data)
{
ThunarShortcutsView *view = THUNAR_SHORTCUTS_VIEW (user_data);
- GtkWidget *window;
- GMount *mount = G_MOUNT (object);
- GError *error = NULL;
- gchar *mount_name;
+ gchar *device_name;
- _thunar_return_if_fail (G_IS_MOUNT (object));
- _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
_thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
/* check if there was an error */
- if (!g_mount_unmount_with_operation_finish (mount, result, &error))
+ if (error != NULL)
{
- /* ignore GIO errors already handled */
- if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_FAILED_HANDLED)
- {
- window = gtk_widget_get_toplevel (GTK_WIDGET (view));
-
- /* display an error dialog to inform the user */
- mount_name = g_mount_get_name (mount);
- thunar_dialogs_show_error (window, error, _("Failed to eject \"%s\""), mount_name);
- g_free (mount_name);
-
- g_error_free (error);
- }
+ /* display an error dialog to inform the user */
+ device_name = thunar_device_get_name (device);
+ thunar_dialogs_show_error (GTK_WIDGET (view), error, _("Failed to eject \"%s\""), device_name);
+ g_free (device_name);
}
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount_finish (mount);
-#endif
-
g_object_unref (view);
}
static void
-thunar_shortcuts_view_disconnect (ThunarShortcutsView *view)
+thunar_shortcuts_view_eject (ThunarShortcutsView *view)
{
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
- GVolume *volume;
- GMount *mount;
- GMount *volume_mount;
+ ThunarDevice *device;
GMountOperation *mount_operation;
GtkWidget *window;
@@ -1675,109 +1561,24 @@ thunar_shortcuts_view_disconnect (ThunarShortcutsView *view)
/* determine the selected item */
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view));
- if (!gtk_tree_selection_get_selected (selection, &model, &iter))
- return;
-
- /* determine the volume/mount for the shortcut at the given tree iterator */
- gtk_tree_model_get (model, &iter,
- THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
- THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT, &mount, -1);
-
- _thunar_return_if_fail (volume == NULL || G_IS_VOLUME (volume));
- _thunar_return_if_fail (mount == NULL || G_IS_MOUNT (mount));
-
- /* prepare a mount operation */
- window = gtk_widget_get_toplevel (GTK_WIDGET (view));
- mount_operation = gtk_mount_operation_new (GTK_WINDOW (window));
-
- if (mount != NULL)
- {
- /* distinguish between ejectable and unmountable mounts */
- if (g_mount_can_eject (mount))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount (mount);
-#endif
-
- /* try ejecting the mount */
- g_mount_eject_with_operation (mount,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_eject_mount_finish,
- g_object_ref (view));
- }
- else if (g_mount_can_unmount (mount))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount (mount);
-#endif
-
- /* try unmounting the mount */
- g_mount_unmount_with_operation (mount,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_unmount_finish,
- g_object_ref (view));
- }
-
- g_object_unref (mount);
- }
- else if (volume != NULL)
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
- if (g_volume_can_eject (volume))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_eject (volume);
-#endif
- /* try ejecting the volume */
- g_volume_eject_with_operation (volume,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_eject_volume_finish,
- g_object_ref (view));
- }
- else
- {
- volume_mount = g_volume_get_mount (volume);
- if (volume_mount != NULL)
- {
- /* distinguish between ejectable and unmountable mounts */
- if (g_mount_can_eject (volume_mount))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount (volume_mount);
-#endif
-
- g_mount_eject_with_operation (mount,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_eject_mount_finish,
- g_object_ref (view));
- }
- else if (g_mount_can_unmount (volume_mount))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount (volume_mount);
-#endif
+ /* determine the volume/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));
- /* try unmounting the mount */
- g_mount_unmount_with_operation (volume_mount,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_unmount_finish,
- g_object_ref (view));
- }
+ /* prepare a mount operation */
+ window = gtk_widget_get_toplevel (GTK_WIDGET (view));
+ mount_operation = gtk_mount_operation_new (GTK_WINDOW (window));
- g_object_unref (volume_mount);
- }
- }
+ /* try to unmount */
+ thunar_device_eject (device,
+ mount_operation,
+ NULL,
+ thunar_shortcuts_view_eject_finish,
+ g_object_ref (view));
- g_object_unref (volume);
+ g_object_unref (G_OBJECT (device));
}
}
@@ -1806,7 +1607,6 @@ thunar_shortcuts_view_poke_volume_mount_finish (ThunarBrowser *browser,
-
static void
thunar_shortcuts_view_mount (ThunarShortcutsView *view)
{
@@ -1827,9 +1627,10 @@ 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 */
- gtk_tree_model_get (model, &iter,
+ volume = NULL;
+ /*gtk_tree_model_get (model, &iter,
THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
- -1);
+ -1);*/
if (G_LIKELY (volume != NULL))
{
@@ -1844,14 +1645,37 @@ thunar_shortcuts_view_mount (ThunarShortcutsView *view)
static void
+thunar_shortcuts_view_unmount_finish (ThunarDevice *device,
+ const GError *error,
+ gpointer user_data)
+{
+ ThunarShortcutsView *view = THUNAR_SHORTCUTS_VIEW (user_data);
+ gchar *device_name;
+
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
+ _thunar_return_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view));
+
+ /* check if there was an error */
+ if (error != NULL)
+ {
+ /* display an error dialog to inform the user */
+ device_name = thunar_device_get_name (device);
+ thunar_dialogs_show_error (GTK_WIDGET (view), error, _("Failed to unmount \"%s\""), device_name);
+ g_free (device_name);
+ }
+
+ g_object_unref (view);
+}
+
+
+
+static void
thunar_shortcuts_view_unmount (ThunarShortcutsView *view)
{
GtkTreeSelection *selection;
GtkTreeModel *model;
GtkTreeIter iter;
- GVolume *volume;
- GMount *mount;
- GMount *volume_mount;
+ ThunarDevice *device;
GMountOperation *mount_operation;
GtkWidget *window;
@@ -1862,65 +1686,21 @@ thunar_shortcuts_view_unmount (ThunarShortcutsView *view)
if (gtk_tree_selection_get_selected (selection, &model, &iter))
{
/* determine the volume/mount for the shortcut at the given tree iterator */
- gtk_tree_model_get (model, &iter,
- THUNAR_SHORTCUTS_MODEL_COLUMN_VOLUME, &volume,
- THUNAR_SHORTCUTS_MODEL_COLUMN_MOUNT, &mount, -1);
-
- _thunar_return_if_fail (volume == NULL || G_IS_VOLUME (volume));
- _thunar_return_if_fail (mount == NULL || G_IS_MOUNT (mount));
+ gtk_tree_model_get (model, &iter, THUNAR_SHORTCUTS_MODEL_COLUMN_DEVICE, &device, -1);
+ _thunar_return_if_fail (THUNAR_IS_DEVICE (device));
/* prepare a mount operation */
window = gtk_widget_get_toplevel (GTK_WIDGET (view));
mount_operation = gtk_mount_operation_new (GTK_WINDOW (window));
- if (mount != NULL)
- {
- /* only handle mounts that can be unmounted here */
- if (g_mount_can_unmount (mount))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount (mount);
-#endif
-
- /* try unmounting the mount */
- g_mount_unmount_with_operation (mount,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_unmount_finish,
- g_object_ref (view));
- }
-
- g_object_unref (mount);
- }
- else if (volume != NULL)
- {
- volume_mount = g_volume_get_mount (volume);
- if (volume_mount != NULL)
- {
- /* only handle mounts that can be unmounted here */
- if (g_mount_can_unmount (volume_mount))
- {
-#ifdef HAVE_LIBNOTIFY
- thunar_notify_unmount (volume_mount);
-#endif
-
- /* try unmounting the mount */
- g_mount_unmount_with_operation (volume_mount,
- G_MOUNT_UNMOUNT_NONE,
- mount_operation,
- NULL,
- thunar_shortcuts_view_unmount_finish,
- g_object_ref (view));
- }
-
- g_object_unref (volume_mount);
- }
-
- g_object_unref (volume);
- }
+ /* try to unmount */
+ thunar_device_unmount (device,
+ mount_operation,
+ NULL,
+ thunar_shortcuts_view_unmount_finish,
+ g_object_ref (view));
- g_object_unref (mount_operation);
+ g_object_unref (G_OBJECT (device));
}
}
More information about the Xfce4-commits
mailing list