Re: PATCH: use timeouts for progress dialogs
- From: Frank Worsley <fworsley shaw ca>
- To: Dave Camp <dave ximian com>
- Cc: nautilus-list gnome org, jdub perkypants org
- Subject: Re: PATCH: use timeouts for progress dialogs
- Date: Mon, 05 Aug 2002 19:20:57 -0700
> @@ -400,7 +436,10 @@ nautilus_file_operations_progress_new_fi
> char *progress_count;
>
> g_return_if_fail (NAUTILUS_IS_FILE_OPERATIONS_PROGRESS
> (progress));
> - g_return_if_fail (GTK_WIDGET_REALIZED (progress));
> +
> + if (!GTK_WIDGET_REALIZED (progress)) {
> + return;
> + }
>
> Should this be here?
I dunno, not sure why the return_if_fail was there in the first place.
I've removed it.
> Somewhere in here you should probably update start_time, in case a pause
> happens twice before the timeout happens (it's not likely, but you
> should probably take care of it anyway).
Done. Also changed it so that start_time is first set when the timeout
is created in _new(), not in _init().
- Frank
Index: libnautilus-private/nautilus-file-operations.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations.c,v
retrieving revision 1.153
diff -u -p -r1.153 nautilus-file-operations.c
--- libnautilus-private/nautilus-file-operations.c 12 Jul 2002 18:36:13 -0000 1.153
+++ libnautilus-private/nautilus-file-operations.c 6 Aug 2002 02:20:12 -0000
@@ -73,7 +73,6 @@ typedef struct {
GnomeVFSXferOverwriteMode overwrite_mode;
GtkWidget *parent_view;
TransferKind kind;
- gboolean show_progress_dialog;
void (* done_callback) (GHashTable *debuting_uris, gpointer data);
gpointer done_callback_data;
GHashTable *debuting_uris;
@@ -280,14 +279,10 @@ static void
create_transfer_dialog (const GnomeVFSXferProgressInfo *progress_info,
TransferInfo *transfer_info)
{
- if (!transfer_info->show_progress_dialog) {
- return;
- }
-
g_return_if_fail (transfer_info->progress_dialog == NULL);
transfer_info->progress_dialog = nautilus_file_operations_progress_new
- (transfer_info->operation_title, "", "", "", 0, 0);
+ (transfer_info->operation_title, "", "", "", 0, 0, TRUE);
/* Treat clicking on the close box or use of the escape key
* the same as clicking cancel.
@@ -307,8 +302,6 @@ create_transfer_dialog (const GnomeVFSXf
GTK_WINDOW (transfer_info->progress_dialog),
GTK_WINDOW (gtk_widget_get_toplevel (transfer_info->parent_view)));
}
-
- gtk_widget_show (GTK_WIDGET (transfer_info->progress_dialog));
}
static void
@@ -800,6 +793,9 @@ handle_transfer_vfs_error (const GnomeVF
/* transfer error, prompt the user to continue or stop */
+ /* stop timeout while waiting for user */
+ nautilus_file_operations_progress_pause_timeout (transfer_info->progress_dialog);
+
formatted_source_name = NULL;
formatted_target_name = NULL;
@@ -958,6 +954,8 @@ handle_transfer_vfs_error (const GnomeVF
g_free (formatted_source_name);
g_free (formatted_target_name);
+ nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
return error_dialog_result;
case GNOME_VFS_XFER_ERROR_MODE_ABORT:
@@ -999,6 +997,8 @@ handle_transfer_overwrite (const GnomeVF
int result;
char *text, *formatted_name;
+ nautilus_file_operations_progress_pause_timeout (transfer_info->progress_dialog);
+
/* Handle special case files such as Trash, mount links and home directory */
if (is_special_link (progress_info->target_name)) {
formatted_name = extract_and_ellipsize_file_name_for_dialog
@@ -1025,6 +1025,8 @@ handle_transfer_overwrite (const GnomeVF
g_free (text);
g_free (formatted_name);
+ nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
return GNOME_VFS_XFER_OVERWRITE_ACTION_SKIP;
}
@@ -1044,6 +1046,9 @@ handle_transfer_overwrite (const GnomeVF
(parent_for_error_dialog (transfer_info), TRUE, text,
_("Conflict while copying"),
_("Replace"), _("Skip"), NULL);
+
+ nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
switch (result) {
case 0:
return GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE;
@@ -1059,6 +1064,8 @@ handle_transfer_overwrite (const GnomeVF
_("Conflict while copying"),
_("Replace All"), _("Replace"), _("Skip"), NULL);
+ nautilus_file_operations_progress_resume_timeout (transfer_info->progress_dialog);
+
switch (result) {
case 0:
return GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE_ALL;
@@ -1688,7 +1695,6 @@ nautilus_file_operations_copy_move (cons
gboolean target_is_trash;
gboolean is_desktop_trash_link;
gboolean duplicate;
- gboolean all_local;
IconPositionIterator *icon_position_iterator;
@@ -1712,7 +1718,6 @@ nautilus_file_operations_copy_move (cons
*/
source_uri_list = NULL;
target_uri_list = NULL;
- all_local = TRUE;
duplicate = copy_action != GDK_ACTION_MOVE;
for (p = item_uris; p != NULL; p = p->next) {
/* Filter out special Nautilus link files */
@@ -1750,11 +1755,6 @@ nautilus_file_operations_copy_move (cons
target_uri_list = g_list_prepend (target_uri_list, target_uri);
source_uri_list = g_list_prepend (source_uri_list, source_uri);
- if (all_local && (!gnome_vfs_uri_is_local (source_uri)
- || !gnome_vfs_uri_is_local (target_uri))) {
- all_local = FALSE;
- }
-
if (duplicate
&& !gnome_vfs_uri_equal (source_dir_uri, target_dir_uri)) {
duplicate = FALSE;
@@ -1823,11 +1823,6 @@ nautilus_file_operations_copy_move (cons
transfer_info->kind = TRANSFER_MOVE_TO_TRASH;
- /* Do an arbitrary guess that an operation will take very little
- * time and the progress shouldn't be shown.
- */
- transfer_info->show_progress_dialog =
- !all_local || g_list_length ((GList *) item_uris) > 20;
} else if ((move_options & GNOME_VFS_XFER_REMOVESOURCE) != 0) {
/* localizers: progress dialog title */
transfer_info->operation_title = _("Moving files");
@@ -1840,11 +1835,6 @@ nautilus_file_operations_copy_move (cons
transfer_info->kind = TRANSFER_MOVE;
- /* Do an arbitrary guess that an operation will take very little
- * time and the progress shouldn't be shown.
- */
- transfer_info->show_progress_dialog =
- !all_local || g_list_length ((GList *) item_uris) > 20;
} else if ((move_options & GNOME_VFS_XFER_LINK_ITEMS) != 0) {
/* when creating links, handle name conflicts automatically */
move_options |= GNOME_VFS_XFER_USE_UNIQUE_NAMES;
@@ -1858,8 +1848,7 @@ nautilus_file_operations_copy_move (cons
transfer_info->cleanup_name = _("Finishing Creating Links...");
transfer_info->kind = TRANSFER_LINK;
- transfer_info->show_progress_dialog =
- g_list_length ((GList *)item_uris) > 20;
+
} else {
/* localizers: progress dialog title */
transfer_info->operation_title = _("Copying files");
@@ -1871,8 +1860,6 @@ nautilus_file_operations_copy_move (cons
transfer_info->cleanup_name = "";
transfer_info->kind = TRANSFER_COPY;
- /* always show progress during copy */
- transfer_info->show_progress_dialog = TRUE;
}
/* we'll need to check for copy into Trash and for moving/copying the Trash itself */
@@ -2140,7 +2127,6 @@ nautilus_file_operations_delete (const G
uri_list = g_list_reverse (uri_list);
transfer_info = transfer_info_new (parent_view);
- transfer_info->show_progress_dialog = TRUE;
/* localizers: progress dialog title */
transfer_info->operation_title = _("Deleting files");
@@ -2176,7 +2162,6 @@ do_empty_trash (GtkWidget *parent_view)
if (trash_dir_list != NULL) {
/* set up the move parameters */
transfer_info = transfer_info_new (parent_view);
- transfer_info->show_progress_dialog = TRUE;
/* localizers: progress dialog title */
transfer_info->operation_title = _("Emptying the Trash");
Index: libnautilus-private/nautilus-file-operations-progress.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations-progress.c,v
retrieving revision 1.36
diff -u -p -r1.36 nautilus-file-operations-progress.c
--- libnautilus-private/nautilus-file-operations-progress.c 17 Apr 2002 12:29:10 -0000 1.36
+++ libnautilus-private/nautilus-file-operations-progress.c 6 Aug 2002 02:20:12 -0000
@@ -55,6 +55,8 @@
#define MINIMUM_TIME_UP 1000
+#define SHOW_TIMEOUT 1200
+
static GdkPixbuf *empty_jar_pixbuf, *full_jar_pixbuf;
static void nautilus_file_operations_progress_class_init (NautilusFileOperationsProgressClass *klass);
@@ -83,10 +85,17 @@ struct NautilusFileOperationsProgressDet
gulong files_total;
gulong bytes_total;
- /* system time (microseconds) when dialog was mapped */
+ /* system time (microseconds) when show timeout was started */
gint64 start_time;
+ /* system time (microseconds) when dialog was mapped */
+ gint64 show_time;
+
+ /* time remaining in show timeout if it's paused and resumed */
+ guint remaining_time;
+
guint delayed_close_timeout_id;
+ guint delayed_show_timeout_id;
int progress_jar_position;
};
@@ -124,7 +133,7 @@ static void
nautilus_file_operations_progress_update (NautilusFileOperationsProgress *progress)
{
double fraction;
-
+
if (progress->details->bytes_total == 0) {
/* We haven't set up the file count yet, do not update
* the progress bar until we do.
@@ -191,6 +200,11 @@ nautilus_file_operations_progress_destro
progress->details->delayed_close_timeout_id = 0;
}
+ if (progress->details->delayed_show_timeout_id != 0) {
+ g_source_remove (progress->details->delayed_show_timeout_id);
+ progress->details->delayed_show_timeout_id = 0;
+ }
+
EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object));
}
@@ -228,7 +242,7 @@ map_callback (GtkWidget *widget)
EEL_CALL_PARENT (GTK_WIDGET_CLASS, map, (widget));
- progress->details->start_time = eel_get_system_time ();
+ progress->details->show_time = eel_get_system_time ();
}
static gboolean
@@ -335,13 +349,28 @@ nautilus_file_operations_progress_class_
}
+static gboolean
+delayed_show_callback (gpointer callback_data)
+{
+ NautilusFileOperationsProgress *progress;
+
+ progress = NAUTILUS_FILE_OPERATIONS_PROGRESS (callback_data);
+
+ progress->details->delayed_show_timeout_id = 0;
+
+ gtk_widget_show (GTK_WIDGET (progress));
+
+ return FALSE;
+}
+
NautilusFileOperationsProgress *
nautilus_file_operations_progress_new (const char *title,
const char *operation_string,
const char *from_prefix,
const char *to_prefix,
gulong total_files,
- gulong total_bytes)
+ gulong total_bytes,
+ gboolean use_timeout)
{
GtkWidget *widget;
NautilusFileOperationsProgress *progress;
@@ -359,6 +388,12 @@ nautilus_file_operations_progress_new (c
progress->details->from_prefix = from_prefix;
progress->details->to_prefix = to_prefix;
+
+ if (use_timeout) {
+ progress->details->start_time = eel_get_system_time ();
+ progress->details->delayed_show_timeout_id =
+ g_timeout_add (SHOW_TIMEOUT, delayed_show_callback, progress);
+ }
return progress;
}
@@ -400,7 +435,6 @@ nautilus_file_operations_progress_new_fi
char *progress_count;
g_return_if_fail (NAUTILUS_IS_FILE_OPERATIONS_PROGRESS (progress));
- g_return_if_fail (GTK_WIDGET_REALIZED (progress));
progress->details->from_prefix = from_prefix;
progress->details->to_prefix = to_prefix;
@@ -485,7 +519,7 @@ nautilus_file_operations_progress_done (
g_assert (progress->details->start_time != 0);
/* compute time up in milliseconds */
- time_up = (eel_get_system_time () - progress->details->start_time) / 1000;
+ time_up = (eel_get_system_time () - progress->details->show_time) / 1000;
if (time_up >= MINIMUM_TIME_UP) {
gtk_object_destroy (GTK_OBJECT (progress));
return;
@@ -498,4 +532,48 @@ nautilus_file_operations_progress_done (
(MINIMUM_TIME_UP - time_up,
delayed_close_callback,
progress);
+}
+
+void
+nautilus_file_operations_progress_pause_timeout (NautilusFileOperationsProgress *progress)
+{
+ guint time_up;
+
+ if (progress->details->delayed_show_timeout_id == 0) {
+ progress->details->remaining_time = 0;
+ return;
+ }
+
+ time_up = (eel_get_system_time () - progress->details->start_time) / 1000;
+
+ if (time_up >= SHOW_TIMEOUT) {
+ progress->details->remaining_time = 0;
+ return;
+ }
+
+ g_source_remove (progress->details->delayed_show_timeout_id);
+ progress->details->delayed_show_timeout_id = 0;
+ progress->details->remaining_time = SHOW_TIMEOUT - time_up;
+}
+
+void
+nautilus_file_operations_progress_resume_timeout (NautilusFileOperationsProgress *progress)
+{
+ if (progress->details->delayed_show_timeout_id != 0) {
+ return;
+ }
+
+ if (progress->details->remaining_time <= 0) {
+ return;
+ }
+
+ progress->details->delayed_show_timeout_id =
+ g_timeout_add (progress->details->remaining_time,
+ delayed_show_callback,
+ progress);
+
+ progress->details->start_time = eel_get_system_time () -
+ 1000 * (SHOW_TIMEOUT - progress->details->remaining_time);
+
+ progress->details->remaining_time = 0;
}
Index: libnautilus-private/nautilus-file-operations-progress.h
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-file-operations-progress.h,v
retrieving revision 1.10
diff -u -p -r1.10 nautilus-file-operations-progress.h
--- libnautilus-private/nautilus-file-operations-progress.h 27 Nov 2001 01:46:16 -0000 1.10
+++ libnautilus-private/nautilus-file-operations-progress.h 6 Aug 2002 02:20:12 -0000
@@ -55,7 +55,8 @@ NautilusFileOperationsProgress *nautilus
const char *from_prefix,
const char *to_prefix,
gulong files_total,
- gulong bytes_total);
+ gulong bytes_total,
+ gboolean use_timeout);
void nautilus_file_operations_progress_done (NautilusFileOperationsProgress *dialog);
void nautilus_file_operations_progress_set_progress_title (NautilusFileOperationsProgress *dialog,
const char *progress_title);
@@ -77,5 +78,7 @@ void nautilus
void nautilus_file_operations_progress_update_sizes (NautilusFileOperationsProgress *dialog,
gulong bytes_done_in_file,
gulong bytes_done);
+void nautilus_file_operations_progress_pause_timeout (NautilusFileOperationsProgress *progress);
+void nautilus_file_operations_progress_resume_timeout (NautilusFileOperationsProgress *progress);
#endif /* NAUTILUS_FILE_OPERATIONS_PROGRESS_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]