[Xfce4-commits] <thunar:jannis/new-shortcuts-pane> Initial work on gphoto2 and detecting linked mounts/volumes.
Jannis Pohlmann
noreply at xfce.org
Fri Nov 25 03:10:01 CET 2011
Updating branch refs/heads/jannis/new-shortcuts-pane
to 92ff6996ea58f5f772164f803c19978eb82ad54c (commit)
from 7f5f9814d999ad873d451cf605476f3020ed73f1 (commit)
commit 92ff6996ea58f5f772164f803c19978eb82ad54c
Author: Jannis Pohlmann <jannis at xfce.org>
Date: Fri Nov 25 02:07:17 2011 +0000
Initial work on gphoto2 and detecting linked mounts/volumes.
thunar/thunar-enum-types.c | 1 +
thunar/thunar-enum-types.h | 1 +
thunar/thunar-shortcut-group.c | 23 ++++++++--
thunar/thunar-shortcut-group.h | 43 ++++++++++---------
thunar/thunar-shortcut.c | 90 +++++++++++++++++++++++++++++++--------
thunar/thunar-shortcut.h | 2 +
thunar/thunar-shortcuts-view.c | 89 ++++++++++++++++++++++++++++-----------
thunar/thunar-shortcuts-view.h | 2 +
8 files changed, 182 insertions(+), 69 deletions(-)
diff --git a/thunar/thunar-enum-types.c b/thunar/thunar-enum-types.c
index 6893656..374d25c 100644
--- a/thunar/thunar-enum-types.c
+++ b/thunar/thunar-enum-types.c
@@ -350,6 +350,7 @@ thunar_shortcut_type_get_type (void)
{ THUNAR_SHORTCUT_REGULAR_MOUNT, "THUNAR_SHORTCUT_REGULAR_MOUNT", "regular-mount", },
{ THUNAR_SHORTCUT_ARCHIVE_MOUNT, "THUNAR_SHORTCUT_ARCHIVE_MOUNT", "archive-mount", },
{ THUNAR_SHORTCUT_NETWORK_MOUNT, "THUNAR_SHORTCUT_NETWORK_MOUNT", "network-mount", },
+ { THUNAR_SHORTCUT_DEVICE_MOUNT, "THUNAR_SHORTCUT_DEVICE_MOUNT", "device-mount", },
{ 0, NULL, NULL, },
};
diff --git a/thunar/thunar-enum-types.h b/thunar/thunar-enum-types.h
index 609de31..68b1f5c 100644
--- a/thunar/thunar-enum-types.h
+++ b/thunar/thunar-enum-types.h
@@ -309,6 +309,7 @@ typedef enum
THUNAR_SHORTCUT_REGULAR_MOUNT = 1 << 5,
THUNAR_SHORTCUT_ARCHIVE_MOUNT = 1 << 6,
THUNAR_SHORTCUT_NETWORK_MOUNT = 1 << 7,
+ THUNAR_SHORTCUT_DEVICE_MOUNT = 1 << 8,
} ThunarShortcutType;
GType thunar_shortcut_type_get_type (void) G_GNUC_CONST;
diff --git a/thunar/thunar-shortcut-group.c b/thunar/thunar-shortcut-group.c
index 68d8965..258877a 100644
--- a/thunar/thunar-shortcut-group.c
+++ b/thunar/thunar-shortcut-group.c
@@ -591,13 +591,26 @@ thunar_shortcut_group_find_shortcut_by_file (ThunarShortcutGroup *group,
ThunarFile *file,
ThunarShortcut **result)
{
+ _thunar_return_val_if_fail (THUNAR_IS_SHORTCUT_GROUP (group), FALSE);
+ _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE);
+
+ return thunar_shortcut_group_find_shortcut_by_location (group, file->gfile, result);
+}
+
+
+
+gboolean
+thunar_shortcut_group_find_shortcut_by_location (ThunarShortcutGroup *group,
+ GFile *location,
+ ThunarShortcut **result)
+{
ThunarShortcut *shortcut;
- gboolean has_shortcut = FALSE;
- GList *children;
- GList *iter;
+ gboolean has_shortcut = FALSE;
+ GList *children;
+ GList *iter;
_thunar_return_val_if_fail (THUNAR_IS_SHORTCUT_GROUP (group), FALSE);
- _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE);
+ _thunar_return_val_if_fail (G_IS_FILE (location), FALSE);
children = gtk_container_get_children (GTK_CONTAINER (group->shortcuts));
@@ -608,7 +621,7 @@ thunar_shortcut_group_find_shortcut_by_file (ThunarShortcutGroup *group,
{
shortcut = THUNAR_SHORTCUT (iter->data);
- if (thunar_shortcut_matches_file (shortcut, file))
+ if (thunar_shortcut_matches_location (shortcut, location))
{
if (result != NULL)
*result = shortcut;
diff --git a/thunar/thunar-shortcut-group.h b/thunar/thunar-shortcut-group.h
index eed1d66..b21bcc6 100644
--- a/thunar/thunar-shortcut-group.h
+++ b/thunar/thunar-shortcut-group.h
@@ -37,27 +37,30 @@ typedef struct _ThunarShortcutGroupPrivate ThunarShortcutGroupPrivate;
typedef struct _ThunarShortcutGroupClass ThunarShortcutGroupClass;
typedef struct _ThunarShortcutGroup ThunarShortcutGroup;
-GType thunar_shortcut_group_get_type (void) G_GNUC_CONST;
+GType thunar_shortcut_group_get_type (void) G_GNUC_CONST;
-GtkWidget *thunar_shortcut_group_new (const gchar *label,
- ThunarShortcutType accepted_types);
-gboolean thunar_shortcut_group_try_add_shortcut (ThunarShortcutGroup *group,
- ThunarShortcut *shortcut);
-void thunar_shortcut_group_unselect_shortcuts (ThunarShortcutGroup *group,
- ThunarShortcut *exception);
-void thunar_shortcut_group_unprelight_shortcuts (ThunarShortcutGroup *group,
- ThunarShortcut *exception);
-void thunar_shortcut_group_cancel_activations (ThunarShortcutGroup *group,
- ThunarShortcut *exception);
-void thunar_shortcut_group_update_selection (ThunarShortcutGroup *group,
- ThunarFile *file);
-void thunar_shortcut_group_remove_volume_shortcut (ThunarShortcutGroup *group,
- GVolume *volume);
-void thunar_shortcut_group_remove_mount_shortcut (ThunarShortcutGroup *group,
- GMount *mount);
-gboolean thunar_shortcut_group_find_shortcut_by_file (ThunarShortcutGroup *group,
- ThunarFile *file,
- ThunarShortcut **result);
+GtkWidget *thunar_shortcut_group_new (const gchar *label,
+ ThunarShortcutType accepted_types);
+gboolean thunar_shortcut_group_try_add_shortcut (ThunarShortcutGroup *group,
+ ThunarShortcut *shortcut);
+void thunar_shortcut_group_unselect_shortcuts (ThunarShortcutGroup *group,
+ ThunarShortcut *exception);
+void thunar_shortcut_group_unprelight_shortcuts (ThunarShortcutGroup *group,
+ ThunarShortcut *exception);
+void thunar_shortcut_group_cancel_activations (ThunarShortcutGroup *group,
+ ThunarShortcut *exception);
+void thunar_shortcut_group_update_selection (ThunarShortcutGroup *group,
+ ThunarFile *file);
+void thunar_shortcut_group_remove_volume_shortcut (ThunarShortcutGroup *group,
+ GVolume *volume);
+void thunar_shortcut_group_remove_mount_shortcut (ThunarShortcutGroup *group,
+ GMount *mount);
+gboolean thunar_shortcut_group_find_shortcut_by_file (ThunarShortcutGroup *group,
+ ThunarFile *file,
+ ThunarShortcut **result);
+gboolean thunar_shortcut_group_find_shortcut_by_location (ThunarShortcutGroup *group,
+ GFile *location,
+ ThunarShortcut **result);
G_END_DECLS
diff --git a/thunar/thunar-shortcut.c b/thunar/thunar-shortcut.c
index 66fa959..80f49d9 100644
--- a/thunar/thunar-shortcut.c
+++ b/thunar/thunar-shortcut.c
@@ -505,7 +505,11 @@ thunar_shortcut_finalize (GObject *object)
g_object_unref (shortcut->file);
if (shortcut->volume != NULL)
- g_object_unref (shortcut->volume);
+ {
+ g_signal_handlers_disconnect_matched (shortcut->volume, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, 0, shortcut);
+ g_object_unref (shortcut->volume);
+ }
if (shortcut->mount != NULL)
g_object_unref (shortcut->mount);
@@ -1111,8 +1115,9 @@ thunar_shortcut_name_changed (ThunarShortcut *shortcut)
static void
thunar_shortcut_volume_changed (ThunarShortcut *shortcut)
{
- GIcon *icon;
- gchar *name;
+ GMount *mount;
+ GIcon *icon;
+ gchar *name;
_thunar_return_if_fail (THUNAR_IS_SHORTCUT (shortcut));
@@ -1136,6 +1141,33 @@ thunar_shortcut_volume_changed (ThunarShortcut *shortcut)
icon = g_volume_get_icon (shortcut->volume);
thunar_shortcut_set_icon (shortcut, icon);
g_object_unref (icon);
+
+ if (g_volume_can_eject (shortcut->volume))
+ {
+ gtk_widget_set_visible (shortcut->action_button, TRUE);
+ }
+ else
+ {
+ /* check if we have a mount now */
+ mount = g_volume_get_mount (shortcut->volume);
+ if (mount != NULL)
+ {
+ /* show the disconnect button if the mount is removable */
+ if (g_mount_can_unmount (mount) || g_mount_can_eject (mount))
+ gtk_widget_set_visible (shortcut->action_button, TRUE);
+ else
+ gtk_widget_set_visible (shortcut->action_button, FALSE);
+
+ /* release the mount */
+ g_object_unref (mount);
+ }
+ else
+ {
+ /* we neither have a removable volume nor a removabl mount,
+ * so hide the disconnect button */
+ gtk_widget_set_visible (shortcut->action_button, FALSE);
+ }
+ }
}
else
{
@@ -1159,7 +1191,8 @@ thunar_shortcut_mount_changed (ThunarShortcut *shortcut)
if (!thunar_shortcut_matches_types (shortcut,
THUNAR_SHORTCUT_REGULAR_MOUNT
| THUNAR_SHORTCUT_ARCHIVE_MOUNT
- | THUNAR_SHORTCUT_NETWORK_MOUNT))
+ | THUNAR_SHORTCUT_NETWORK_MOUNT
+ | THUNAR_SHORTCUT_DEVICE_MOUNT))
{
return;
}
@@ -1210,6 +1243,7 @@ thunar_shortcut_shortcut_type_changed (ThunarShortcut *shortcut)
case THUNAR_SHORTCUT_REGULAR_MOUNT:
case THUNAR_SHORTCUT_ARCHIVE_MOUNT:
case THUNAR_SHORTCUT_NETWORK_MOUNT:
+ case THUNAR_SHORTCUT_DEVICE_MOUNT:
thunar_shortcut_mount_changed (shortcut);
break;
@@ -1643,10 +1677,22 @@ thunar_shortcut_set_volume (ThunarShortcut *shortcut,
return;
if (shortcut->volume != NULL)
- g_object_unref (shortcut->volume);
+ {
+ /* disconnect from the volume */
+ g_signal_handlers_disconnect_matched (volume, G_SIGNAL_MATCH_DATA,
+ 0, 0, 0, NULL, shortcut);
+
+ g_object_unref (shortcut->volume);
+ }
if (volume != NULL)
- shortcut->volume = g_object_ref (volume);
+ {
+ shortcut->volume = g_object_ref (volume);
+
+ /* connect to the volume */
+ g_signal_connect_swapped (volume, "changed",
+ G_CALLBACK (thunar_shortcut_volume_changed), shortcut);
+ }
else
shortcut->volume = NULL;
@@ -2086,8 +2132,6 @@ thunar_shortcut_unmount (ThunarShortcut *shortcut)
_thunar_return_if_fail (THUNAR_IS_SHORTCUT (shortcut));
- g_debug ("shortcut unmount");
-
/* check if we are currently mounting/ejecting something */
if (shortcut->state != THUNAR_SHORTCUT_STATE_NORMAL)
{
@@ -2104,13 +2148,9 @@ thunar_shortcut_unmount (ThunarShortcut *shortcut)
if (shortcut->mount != NULL)
{
- g_debug (" have mount");
-
/* only handle mounts that can be unmounted here */
if (g_mount_can_unmount (shortcut->mount))
{
- g_debug (" mount can unmount");
-
/* start spinning */
thunar_shortcut_set_spinning (shortcut, TRUE, THUNAR_SHORTCUT_STATE_EJECTING);
@@ -2303,17 +2343,29 @@ gboolean
thunar_shortcut_matches_file (ThunarShortcut *shortcut,
ThunarFile *file)
{
+ _thunar_return_val_if_fail (THUNAR_IS_SHORTCUT (shortcut), FALSE);
+ _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE);
+
+ return thunar_shortcut_matches_location (shortcut, file->gfile);
+}
+
+
+
+gboolean
+thunar_shortcut_matches_location (ThunarShortcut *shortcut,
+ GFile *location)
+{
gboolean matches = FALSE;
GVolume *shortcut_volume;
GMount *mount;
GFile *mount_point;
- GFile *shortcut_file;
+ GFile *shortcut_location;
_thunar_return_val_if_fail (THUNAR_IS_SHORTCUT (shortcut), FALSE);
- _thunar_return_val_if_fail (THUNAR_IS_FILE (file), FALSE);
+ _thunar_return_val_if_fail (G_IS_FILE (location), FALSE);
/* get the file and volume of the view */
- shortcut_file = thunar_shortcut_get_location (shortcut);
+ shortcut_location = thunar_shortcut_get_location (shortcut);
shortcut_volume = thunar_shortcut_get_volume (shortcut);
/* check if we have a volume */
@@ -2326,7 +2378,7 @@ thunar_shortcut_matches_file (ThunarShortcut *shortcut,
mount_point = g_mount_get_root (mount);
/* select the shortcut if the mount point and the selected file are equal */
- if (g_file_equal (file->gfile, mount_point))
+ if (g_file_equal (location, mount_point))
matches = TRUE;
/* release mount point and mount */
@@ -2339,16 +2391,16 @@ thunar_shortcut_matches_file (ThunarShortcut *shortcut,
mount_point = g_mount_get_root (shortcut->mount);
/* select the shortcut if the mount point and the selected file are equal */
- if (g_file_equal (file->gfile, mount_point))
+ if (g_file_equal (location, mount_point))
matches = TRUE;
/* release mount point and mount */
g_object_unref (mount_point);
}
- else if (shortcut_file != NULL)
+ else if (shortcut_location != NULL)
{
/* select the shortcut if the bookmark and the selected file are equal */
- if (g_file_equal (file->gfile, shortcut_file))
+ if (g_file_equal (location, shortcut_location))
matches = TRUE;
}
diff --git a/thunar/thunar-shortcut.h b/thunar/thunar-shortcut.h
index 4cd0bc2..c28b373 100644
--- a/thunar/thunar-shortcut.h
+++ b/thunar/thunar-shortcut.h
@@ -90,6 +90,8 @@ void thunar_shortcut_unmount (ThunarShortcut *shor
void thunar_shortcut_disconnect (ThunarShortcut *shortcut);
gboolean thunar_shortcut_matches_file (ThunarShortcut *shortcut,
ThunarFile *file);
+gboolean thunar_shortcut_matches_location (ThunarShortcut *shortcut,
+ GFile *location);
G_END_DECLS
diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c
index 2f69d1e..eae6082 100644
--- a/thunar/thunar-shortcuts-view.c
+++ b/thunar/thunar-shortcuts-view.c
@@ -246,7 +246,8 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view)
THUNAR_SHORTCUT_REGULAR_VOLUME
| THUNAR_SHORTCUT_EJECTABLE_VOLUME
| THUNAR_SHORTCUT_REGULAR_MOUNT
- | THUNAR_SHORTCUT_ARCHIVE_MOUNT);
+ | THUNAR_SHORTCUT_ARCHIVE_MOUNT
+ | THUNAR_SHORTCUT_DEVICE_MOUNT);
gtk_box_pack_start (GTK_BOX (view->group_box), group, FALSE, TRUE, 0);
gtk_widget_show (group);
@@ -801,32 +802,44 @@ thunar_shortcuts_view_mount_added (ThunarShortcutsView *view,
{
/* read information from the mount */
location = g_mount_get_root (mount);
- eject_icon = g_themed_icon_new ("media-eject");
- /* determine the shortcut type */
- if (g_file_has_uri_scheme (location, "file"))
- shortcut_type = THUNAR_SHORTCUT_REGULAR_MOUNT;
- else if (g_file_has_uri_scheme (location, "archive"))
- shortcut_type = THUNAR_SHORTCUT_ARCHIVE_MOUNT;
- else
- shortcut_type = THUNAR_SHORTCUT_NETWORK_MOUNT;
-
- /* create a shortcut for the mount */
- shortcut = g_object_new (THUNAR_TYPE_SHORTCUT,
- "shortcut-type", shortcut_type,
- "location", location,
- "mount", mount,
- "eject-icon", eject_icon,
- "hidden", FALSE,
- "mutable", FALSE,
- "persistent", FALSE,
- NULL);
-
- /* add the shortcut to the view */
- thunar_shortcuts_view_add_shortcut (view, shortcut);
+ /* skip gphoto2 mounts as those are always associated with a volume,
+ * only add a new shortcut if we have none for the mount point yet */
+ if (!g_file_has_uri_scheme (location, "gphoto2")
+ && thunar_shortcuts_view_has_location (view, location))
+ {
+ /* create an eject icon */
+ eject_icon = g_themed_icon_new ("media-eject");
+
+ /* determine the shortcut type */
+ if (g_file_has_uri_scheme (location, "file"))
+ shortcut_type = THUNAR_SHORTCUT_REGULAR_MOUNT;
+ else if (g_file_has_uri_scheme (location, "archive"))
+ shortcut_type = THUNAR_SHORTCUT_ARCHIVE_MOUNT;
+ else if (g_file_has_uri_scheme (location, "gphoto2"))
+ shortcut_type = THUNAR_SHORTCUT_DEVICE_MOUNT;
+ else
+ shortcut_type = THUNAR_SHORTCUT_NETWORK_MOUNT;
+
+ /* create a shortcut for the mount */
+ shortcut = g_object_new (THUNAR_TYPE_SHORTCUT,
+ "shortcut-type", shortcut_type,
+ "location", location,
+ "mount", mount,
+ "eject-icon", eject_icon,
+ "hidden", FALSE,
+ "mutable", FALSE,
+ "persistent", FALSE,
+ NULL);
+
+ /* add the shortcut to the view */
+ thunar_shortcuts_view_add_shortcut (view, shortcut);
+
+ /* release eject icon */
+ g_object_unref (eject_icon);
+ }
- /* release volume information */
- g_object_unref (eject_icon);
+ /* release the mount point */
g_object_unref (location);
}
}
@@ -1360,6 +1373,32 @@ thunar_shortcuts_view_has_file (ThunarShortcutsView *view,
+gboolean
+thunar_shortcuts_view_has_location (ThunarShortcutsView *view,
+ GFile *location)
+{
+ gboolean has_location = FALSE;
+ GList *groups;
+ GList *iter;
+
+ _thunar_return_val_if_fail (THUNAR_IS_SHORTCUTS_VIEW (view), FALSE);
+ _thunar_return_val_if_fail (G_IS_FILE (location), FALSE);
+
+ groups = gtk_container_get_children (GTK_CONTAINER (view->group_box));
+
+ for (iter = groups; !has_location && iter != NULL; iter = iter->next)
+ {
+ if (thunar_shortcut_group_find_shortcut_by_location (iter->data, location, NULL))
+ has_location = TRUE;
+ }
+
+ g_list_free (groups);
+
+ return has_location;
+}
+
+
+
void
thunar_shortcuts_view_add_file (ThunarShortcutsView *view,
ThunarFile *file)
diff --git a/thunar/thunar-shortcuts-view.h b/thunar/thunar-shortcuts-view.h
index 73b72c4..d614bd1 100644
--- a/thunar/thunar-shortcuts-view.h
+++ b/thunar/thunar-shortcuts-view.h
@@ -41,6 +41,8 @@ GtkWidget *thunar_shortcuts_view_new (void) G_GNUC_MALLOC;
gboolean thunar_shortcuts_view_has_file (ThunarShortcutsView *view,
ThunarFile *file);
+gboolean thunar_shortcuts_view_has_location (ThunarShortcutsView *view,
+ GFile *location);
void thunar_shortcuts_view_add_file (ThunarShortcutsView *view,
ThunarFile *file);
void thunar_shortcuts_view_select_by_file (ThunarShortcutsView *view,
More information about the Xfce4-commits
mailing list