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 <[EMAIL PROTECTED]> + + * 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 <[EMAIL PROTECTED]> * 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,
-- nautilus-list mailing list nautilus-list@gnome.org http://mail.gnome.org/mailman/listinfo/nautilus-list