Re: [PATCH] Fix autorun + mounts outside /media
- From: David Zeuthen <david fubar dk>
- To: Christian Neumair <cneumair gnome org>
- Cc: nautilus-list gnome org
- Subject: Re: [PATCH] Fix autorun + mounts outside /media
- Date: Tue, 29 Apr 2008 01:57:25 -0400
Hey Christian,
Sorry for the lag - my main laptop's PSU was broken and was only fixed
today.
On Sun, 2008-04-20 at 00:39 +0200, Christian Neumair wrote:
> [removing gvfs-list, this is only relevant for nautilus-list]
>
> El jue, 17-04-2008 a las 17:17 -0400, David Zeuthen escribió:
> > On Thu, 2008-04-17 at 20:59 +0200, Christian Neumair wrote:
> > > I intentionally moved autorun inhibition to the mount operation
> > > callbacks, since it may take may take longer than the inhibition/allow
> > > GTimeout to mount a volume.
> > >
> > > Therefore, could you please modify the patch to reflect the old
> > > semantics of nautilus_file_operations_mount_volume() /
> > > volume_mount_cb(), just with s^inhibit^allow^?
> >
> > Sorry, I probably should have noted this in the ChangeLog. I changed
> > that because it was racy; the signal handler for mount_added from the
> > volume monitor was triggered before the callback saying that mounting
> > completed. Thinking about it I'm not sure if that's just a gvfs bug, if
> > it's desired behavior of if we leave it to be undefined. Tricky.
> >
> > (...) Either way, we should probably increase the timeout.
>
> I do not think that during mount operations a fixed timeout does make
> sense. Mount operations can take very long (out-of-process
> authentication, slow network etc.).
>
> Speaking about timing, the following two situations may occur:
> * volume monitor emission happens before mount callback
> * volume monitor emission happens after mount callback
>
> To handle both, my proposal would be to migrate to the following API:
>
> nautilus_allow_autorun_for_volume (GVolume *volume)
> * called right before g_volume_mount()
> * just sets "nautilus-allow-autorun"
>
> nautilus_allow_autorun_for_volume_finish (GVolume *volume)
> * called from volume mount callback
> * just installs the remove_allow_volume() timeout, iff the volume's
> "nautilus-allow-volume" property is set.
>
> This would account for both situations.
Here's an updated patch that attempts to do this. Thanks.
David
Index: ChangeLog
===================================================================
--- ChangeLog (revision 14108)
+++ ChangeLog (working copy)
@@ -1,3 +1,31 @@
+2008-04-29 David Zeuthen <davidz redhat com>
+
+ * libnautilus-private/nautilus-autorun.c:
+ * libnautilus-private/nautilus-autorun.h:
+ * libnautilus-private/nautilus-file-operations.c:
+ (volume_mount_cb), (nautilus_file_operations_mount_volume):
+ * libnautilus-private/nautilus-file-operations.h:
+ * libnautilus-private/nautilus-mime-actions.c:
+ (activation_mount_not_mounted_callback):
+ * libnautilus-private/nautilus-vfs-file.c:
+ (vfs_file_mount_callback):
+ * src/nautilus-application.c: (startup_volume_mount_cb),
+ (volume_added_callback):
+ * src/nautilus-places-sidebar.c: (open_selected_bookmark),
+ (mount_shortcut_cb):
+ * src/nautilus-window-manage-views.c: (mount_not_mounted_callback):
+ Fix how autorunning works. Instead of inhibiting autorunning
+ every time we run something, we turn things around and instead
+ allow automounting only in the instance where Nautilus automounted
+ something itself. So in essence this patch is s/inhibit/allow/.
+ This fixes an annoying problem where Nautilus would do autorun
+ everytime something was mounted even from the command line. A
+ consequence of this are windows popping up and other annoyances.
+ This patch fixes that problem.
+
+ * src/nautilus-x-content-bar.c: (nautilus_x_content_bar_init):
+ Make sure the label is ellipsized.
+
2008-04-27 Cosimo Cecchi <cosimoc gnome org>
* libnautilus-private/nautilus-file-operations.c: (delete_files),
Index: src/nautilus-application.c
===================================================================
--- src/nautilus-application.c (revision 14108)
+++ src/nautilus-application.c (working copy)
@@ -171,9 +171,7 @@
GAsyncResult *res,
gpointer user_data)
{
- if (g_volume_mount_finish (G_VOLUME (source_object), res, NULL)) {
- nautilus_inhibit_autorun_for_volume (G_VOLUME (source_object));
- }
+ g_volume_mount_finish (G_VOLUME (source_object), res, NULL);
}
static void
@@ -1344,7 +1342,7 @@
if (eel_preferences_get_boolean (NAUTILUS_PREFERENCES_MEDIA_AUTOMOUNT) &&
g_volume_should_automount (volume) &&
g_volume_can_mount (volume)) {
- nautilus_file_operations_mount_volume (NULL, volume, FALSE);
+ nautilus_file_operations_mount_volume (NULL, volume, TRUE);
}
}
Index: src/nautilus-window-manage-views.c
===================================================================
--- src/nautilus-window-manage-views.c (revision 14108)
+++ src/nautilus-window-manage-views.c (working copy)
@@ -913,7 +913,6 @@
window->details->mount_error = NULL;
g_error_free (error);
} else {
- nautilus_inhibit_autorun_for_file (G_FILE (source_object));
nautilus_file_invalidate_all_attributes (window->details->determine_view_file);
nautilus_file_call_when_ready (window->details->determine_view_file,
NAUTILUS_FILE_ATTRIBUTE_INFO |
Index: src/nautilus-places-sidebar.c
===================================================================
--- src/nautilus-places-sidebar.c (revision 14108)
+++ src/nautilus-places-sidebar.c (working copy)
@@ -1304,7 +1304,7 @@
GVolume *volume;
gtk_tree_model_get (model, &iter, PLACES_SIDEBAR_COLUMN_VOLUME, &volume, -1);
if (volume != NULL) {
- nautilus_file_operations_mount_volume (NULL, volume, TRUE);
+ nautilus_file_operations_mount_volume (NULL, volume, FALSE);
g_object_unref (volume);
}
}
@@ -1419,7 +1419,7 @@
-1);
if (volume != NULL) {
- nautilus_file_operations_mount_volume (NULL, volume, TRUE);
+ nautilus_file_operations_mount_volume (NULL, volume, FALSE);
g_object_unref (volume);
}
}
Index: src/nautilus-x-content-bar.c
===================================================================
--- src/nautilus-x-content-bar.c (revision 14108)
+++ src/nautilus-x-content-bar.c (working copy)
@@ -271,7 +271,9 @@
hbox = GTK_WIDGET (bar);
bar->priv->label = gtk_label_new (NULL);
- gtk_box_pack_start (GTK_BOX (bar), bar->priv->label, FALSE, FALSE, 0);
+ gtk_label_set_ellipsize (GTK_LABEL (bar->priv->label), PANGO_ELLIPSIZE_END);
+ gtk_misc_set_alignment (GTK_MISC (bar->priv->label), 0.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (bar), bar->priv->label, TRUE, TRUE, 0);
bar->priv->button = gtk_button_new ();
gtk_box_pack_end (GTK_BOX (hbox), bar->priv->button, FALSE, FALSE, 0);
Index: libnautilus-private/nautilus-mime-actions.c
===================================================================
--- libnautilus-private/nautilus-mime-actions.c (revision 14108)
+++ libnautilus-private/nautilus-mime-actions.c (working copy)
@@ -1258,7 +1258,6 @@
g_error_free (error);
} else {
location = nautilus_file_get_location (file);
- nautilus_inhibit_autorun_for_file (location);
g_object_unref (G_OBJECT (location));
}
Index: libnautilus-private/nautilus-autorun.c
===================================================================
--- libnautilus-private/nautilus-autorun.c (revision 14108)
+++ libnautilus-private/nautilus-autorun.c (working copy)
@@ -1353,54 +1353,31 @@
return NULL;
}
-
-static GList *inhibit_mount_handling_for = NULL;
-
-
static gboolean
-remove_inhibit_file_cb (gpointer data)
+remove_allow_volume (gpointer data)
{
- GFile *file = data;
- GList *l;
+ GVolume *volume = data;
- l = g_list_find (inhibit_mount_handling_for, file);
- if (l != NULL) {
- inhibit_mount_handling_for = g_list_delete_link (inhibit_mount_handling_for, l);
- g_object_unref (file);
- }
-
+ g_object_set_data (G_OBJECT (volume), "nautilus-allow-autorun", NULL);
return FALSE;
}
void
-nautilus_inhibit_autorun_for_file (GFile *file)
+nautilus_allow_autorun_for_volume (GVolume *volume)
{
- inhibit_mount_handling_for = g_list_prepend (inhibit_mount_handling_for, g_object_ref (file));
- g_timeout_add_full (0,
- 5000,
- remove_inhibit_file_cb,
- g_object_ref (file),
- g_object_unref);
+ g_object_set_data (G_OBJECT (volume), "nautilus-allow-autorun", GINT_TO_POINTER (1));
}
-static gboolean
-remove_inhibit_volume (gpointer data)
-{
- GVolume *volume = data;
-
- g_object_set_data (G_OBJECT (volume), "nautilus-inhibit-autorun", NULL);
- return FALSE;
-}
-
void
-nautilus_inhibit_autorun_for_volume (GVolume *volume)
+nautilus_allow_autorun_for_volume_finish (GVolume *volume)
{
- g_object_set_data (G_OBJECT (volume), "nautilus-inhibit-autorun", GINT_TO_POINTER (1));
- g_timeout_add_full (0,
- 5000,
- remove_inhibit_volume,
- g_object_ref (volume),
- g_object_unref);
+ if (g_object_get_data (G_OBJECT (volume), "nautilus-allow-autorun") != NULL) {
+ g_timeout_add_full (0,
+ 5000,
+ remove_allow_volume,
+ g_object_ref (volume),
+ g_object_unref);
+ }
}
static gboolean
@@ -1420,17 +1397,16 @@
static gboolean
should_autorun_mount (GMount *mount)
{
- GFile *root, *file;
- GList *l;
+ GFile *root;
GVolume *enclosing_volume;
gboolean ignore_autorun;
- ignore_autorun = FALSE;
+ ignore_autorun = TRUE;
enclosing_volume = g_mount_get_volume (mount);
if (enclosing_volume != NULL) {
- if (g_object_get_data (G_OBJECT (enclosing_volume), "nautilus-inhibit-autorun") != NULL) {
- ignore_autorun = TRUE;
- g_object_set_data (G_OBJECT (enclosing_volume), "nautilus-inhibit-autorun", NULL);
+ if (g_object_get_data (G_OBJECT (enclosing_volume), "nautilus-allow-autorun") != NULL) {
+ ignore_autorun = FALSE;
+ g_object_set_data (G_OBJECT (enclosing_volume), "nautilus-allow-autorun", NULL);
}
}
@@ -1443,18 +1419,6 @@
root = g_mount_get_root (mount);
- for (l = inhibit_mount_handling_for; l != NULL; l = l->next) {
- file = l->data;
- if (g_file_has_prefix (file, root)) {
- ignore_autorun = TRUE;
-
- inhibit_mount_handling_for = g_list_delete_link (inhibit_mount_handling_for, l);
- g_object_unref (file);
-
- break;
- }
- }
-
/* only do autorun on local files or files where g_volume_should_automount() returns TRUE */
ignore_autorun = TRUE;
if ((g_file_is_native (root) && !should_skip_native_mount_root (root)) ||
Index: libnautilus-private/nautilus-autorun.h
===================================================================
--- libnautilus-private/nautilus-autorun.h (revision 14108)
+++ libnautilus-private/nautilus-autorun.h (working copy)
@@ -89,7 +89,7 @@
void nautilus_autorun_launch_for_mount (GMount *mount, GAppInfo *app_info);
-void nautilus_inhibit_autorun_for_volume (GVolume *volume);
-void nautilus_inhibit_autorun_for_file (GFile *file);
+void nautilus_allow_autorun_for_volume (GVolume *volume);
+void nautilus_allow_autorun_for_volume_finish (GVolume *volume);
#endif /* NAUTILUS_AUTORUN_H */
Index: libnautilus-private/nautilus-vfs-file.c
===================================================================
--- libnautilus-private/nautilus-vfs-file.c (revision 14108)
+++ libnautilus-private/nautilus-vfs-file.c (working copy)
@@ -239,7 +239,6 @@
res, &error);
nautilus_file_operation_complete (op, mounted_on, error);
if (mounted_on) {
- nautilus_inhibit_autorun_for_file (mounted_on);
g_object_unref (mounted_on);
}
if (error) {
Index: libnautilus-private/nautilus-file-operations.c
===================================================================
--- libnautilus-private/nautilus-file-operations.c (revision 14108)
+++ libnautilus-private/nautilus-file-operations.c (working copy)
@@ -2030,11 +2030,9 @@
GError *error;
char *primary;
char *name;
- gboolean inhibit_autorun;
- inhibit_autorun = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (mount_op), "inhibit-autorun"));
-
error = NULL;
+ nautilus_allow_autorun_for_volume_finish (G_VOLUME (source_object));
if (!g_volume_mount_finish (G_VOLUME (source_object), res, &error)) {
if (error->code != G_IO_ERROR_FAILED_HANDLED) {
name = g_volume_get_name (G_VOLUME (source_object));
@@ -2046,12 +2044,8 @@
g_free (primary);
}
g_error_free (error);
- } else {
- if (inhibit_autorun) {
- nautilus_inhibit_autorun_for_volume (G_VOLUME (source_object));
- }
}
-
+
g_object_unref (mount_op);
}
@@ -2059,12 +2053,13 @@
void
nautilus_file_operations_mount_volume (GtkWindow *parent_window,
GVolume *volume,
- gboolean inhibit_autorun)
+ gboolean allow_autorun)
{
GMountOperation *mount_op;
mount_op = eel_mount_operation_new (parent_window);
- g_object_set_data (G_OBJECT (mount_op), "inhibit-autorun", GINT_TO_POINTER (inhibit_autorun));
+ if (allow_autorun)
+ nautilus_allow_autorun_for_volume (volume);
g_volume_mount (volume, 0, mount_op, NULL, volume_mount_cb, mount_op);
}
Index: libnautilus-private/nautilus-file-operations.h
===================================================================
--- libnautilus-private/nautilus-file-operations.h (revision 14108)
+++ libnautilus-private/nautilus-file-operations.h (working copy)
@@ -93,7 +93,7 @@
gboolean check_trash);
void nautilus_file_operations_mount_volume (GtkWindow *parent_window,
GVolume *volume,
- gboolean inhibit_autorun);
+ gboolean allow_autorun);
void nautilus_file_operations_copy (GList *files,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]