diff options
author | Alexander Larsson <alexl@redhat.com> | 2007-11-23 12:45:20 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2007-11-23 12:45:20 +0000 |
commit | e795fcf6c2b27454ed2953e867658aa587e623e6 (patch) | |
tree | 18716640a16b3c420ecc55e61205fc14369748c2 | |
parent | 9c79b4a8a5c2b9f9c46177d2f8ca408cab4e30c3 (diff) | |
download | nautilus-e795fcf6c2b27454ed2953e867658aa587e623e6.tar.gz |
Don't free uninitialized memory.
2007-11-23 Alexander Larsson <alexl@redhat.com>
* libnautilus-private/nautilus-directory-async.c:
Don't free uninitialized memory.
* libnautilus-private/nautilus-file-operations.c:
* libnautilus-private/nautilus-progress-info.[ch]:
Add progress info dialog
svn path=/branches/gio-branch/; revision=13449
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | libnautilus-private/nautilus-directory-async.c | 7 | ||||
-rw-r--r-- | libnautilus-private/nautilus-file-operations.c | 14 | ||||
-rw-r--r-- | libnautilus-private/nautilus-progress-info.c | 242 | ||||
-rw-r--r-- | libnautilus-private/nautilus-progress-info.h | 2 |
5 files changed, 254 insertions, 20 deletions
@@ -1,3 +1,12 @@ +2007-11-23 Alexander Larsson <alexl@redhat.com> + + * libnautilus-private/nautilus-directory-async.c: + Don't free uninitialized memory. + + * libnautilus-private/nautilus-file-operations.c: + * libnautilus-private/nautilus-progress-info.[ch]: + Add progress info dialog + 2007-11-22 Alexander Larsson <alexl@redhat.com> * libnautilus-private/nautilus-file-operations.c: diff --git a/libnautilus-private/nautilus-directory-async.c b/libnautilus-private/nautilus-directory-async.c index 1b51627cb..5877b321d 100644 --- a/libnautilus-private/nautilus-directory-async.c +++ b/libnautilus-private/nautilus-directory-async.c @@ -3446,15 +3446,16 @@ link_info_got_data (NautilusDirectory *directory, nautilus_directory_ref (directory); + uri = NULL; + name = NULL; + icon = NULL; + /* Handle the case where we read the Nautilus link. */ if (result) { nautilus_link_get_link_info_given_file_contents (file_contents, bytes_read, &uri, &name, &icon); } else { /* FIXME bugzilla.gnome.org 42433: We should report this error to the user. */ - uri = NULL; - name = NULL; - icon = NULL; } nautilus_file_ref (file); diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c index 3932b1cfc..0881c6046 100644 --- a/libnautilus-private/nautilus-file-operations.c +++ b/libnautilus-private/nautilus-file-operations.c @@ -103,6 +103,7 @@ typedef struct { #define SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE 15 #define NSEC_PER_SEC 1000000000 +#define NSEC_PER_MSEC 1000000 #define IS_IO_ERROR(__error, KIND) (((__error)->domain == G_IO_ERROR && (__error)->code == G_IO_ERROR_ ## KIND)) @@ -4395,6 +4396,8 @@ report_count_progress (CommonJob *job, source_info->num_files, source_info->num_bytes); nautilus_progress_info_take_details (job->progress, s); } + + nautilus_progress_info_pulse_progress (job->progress); } static void @@ -4786,7 +4789,7 @@ report_copy_progress (CommonJob *job, now = g_thread_gettime (); if (transfer_info->last_report_time != 0 && - ABS (transfer_info->last_report_time - now) < 1 * NSEC_PER_SEC) { + ABS (transfer_info->last_report_time - now) < 100 * NSEC_PER_MSEC) { return; } transfer_info->last_report_time = now; @@ -4820,6 +4823,8 @@ report_copy_progress (CommonJob *job, remaining_time); nautilus_progress_info_take_details (job->progress, s); } + + nautilus_progress_info_set_progress (job->progress, (double)transfer_info->num_bytes / total_size); } static GFile * @@ -5524,8 +5529,6 @@ copy_job (GIOJob *io_job, common = &job->common; common->io_job = io_job; - g_print ("copy job start\n"); - dest_fs_id = NULL; nautilus_progress_info_start (job->common.progress); @@ -5538,10 +5541,6 @@ copy_job (GIOJob *io_job, goto aborted; } - g_print ("source info: %d files, %"G_GINT64_FORMAT" bytes\n", - source_info.num_files, - source_info.num_bytes); - verify_destination (&job->common, job->destination, &dest_fs_id, @@ -5559,7 +5558,6 @@ copy_job (GIOJob *io_job, &source_info, &transfer_info); aborted: - g_print ("copy job done\n"); g_free (dest_fs_id); diff --git a/libnautilus-private/nautilus-progress-info.c b/libnautilus-private/nautilus-progress-info.c index 67d9e9702..5e130025e 100644 --- a/libnautilus-private/nautilus-progress-info.c +++ b/libnautilus-private/nautilus-progress-info.c @@ -25,6 +25,7 @@ #include <config.h> #include <math.h> #include <glib/gi18n.h> +#include <gtk/gtk.h> #include <eel/eel-string.h> #include <eel/eel-glib-extensions.h> #include "nautilus-progress-info.h" @@ -37,7 +38,7 @@ enum { LAST_SIGNAL }; -#define SIGNAL_DELAY_MSEC 1200 +#define SIGNAL_DELAY_MSEC 100 static guint signals[LAST_SIGNAL] = { 0 }; @@ -70,6 +71,10 @@ struct _NautilusProgressInfoClass static GList *active_progress_infos = NULL; +static GtkStatusIcon *status_icon = NULL; +static int n_progress_ops = 0; + + G_LOCK_DEFINE_STATIC(progress_info); G_DEFINE_TYPE (NautilusProgressInfo, nautilus_progress_info, G_TYPE_OBJECT) @@ -174,6 +179,210 @@ nautilus_progress_info_class_init (NautilusProgressInfoClass *klass) } +static gboolean +delete_event (GtkWidget *widget, + GdkEventAny *event) +{ + gtk_widget_hide (widget); + return TRUE; +} + +static GtkWidget * +get_progress_window (void) +{ + static GtkWidget *progress_window = NULL; + GtkWidget *vbox; + + if (progress_window != NULL) { + return progress_window; + } + + progress_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + gtk_window_set_resizable (GTK_WINDOW (progress_window), + FALSE); + + gtk_window_set_title (GTK_WINDOW (progress_window), + _("File operations")); + gtk_window_set_wmclass (GTK_WINDOW (progress_window), + "file_progress", "Nautilus"); + gtk_window_set_type_hint (GTK_WINDOW (progress_window), + GDK_WINDOW_TYPE_HINT_DIALOG); + + vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_border_width (GTK_CONTAINER (vbox), 12); + gtk_widget_show (vbox); + + gtk_container_add (GTK_CONTAINER (progress_window), + vbox); + + g_signal_connect (progress_window, "delete_event", (GCallback)delete_event, NULL); + + status_icon = gtk_status_icon_new_from_icon_name ("stock_folder-copy"); + g_signal_connect_swapped (status_icon, "activate", (GCallback)gtk_window_present, progress_window); + + gtk_status_icon_set_visible (status_icon, FALSE); + + return progress_window; +} + + +typedef struct { + GtkWidget *widget; + NautilusProgressInfo *info; + GtkLabel *status; + GtkLabel *details; + GtkProgressBar *progress_bar; +} ProgressWidgetData; + +static void +progress_widget_data_free (ProgressWidgetData *data) +{ + g_object_unref (data->info); + g_free (data); +} + +static void +update_data (ProgressWidgetData *data) +{ + char *status, *details; + char *markup; + + status = nautilus_progress_info_get_status (data->info); + gtk_label_set_text (data->status, status); + g_free (status); + + details = nautilus_progress_info_get_details (data->info); + markup = g_markup_printf_escaped ("<span size='small'>%s</span>", details); + gtk_label_set_markup (data->details, markup); + g_free (details); + g_free (markup); +} + +static void +update_progress (ProgressWidgetData *data) +{ + double progress; + + progress = nautilus_progress_info_get_progress (data->info); + if (progress < 0) { + gtk_progress_bar_pulse (data->progress_bar); + } else { + gtk_progress_bar_set_fraction (data->progress_bar, progress); + } +} + +static void +op_finished (ProgressWidgetData *data) +{ + gtk_widget_destroy (data->widget); + + n_progress_ops--; + gtk_status_icon_set_tooltip (status_icon, + _("%d file operations active")); + if (n_progress_ops == 0) { + gtk_status_icon_set_visible (status_icon, FALSE); + } +} + +static GtkWidget * +progress_widget_new (NautilusProgressInfo *info) +{ + ProgressWidgetData *data; + GtkWidget *label, *bar; + + data = g_new0 (ProgressWidgetData, 1); + data->info = g_object_ref (info); + + data->widget = gtk_vbox_new (FALSE, 0); + + g_object_set_data_full (G_OBJECT (data->widget), + "data", data, (GDestroyNotify)progress_widget_data_free); + + label = gtk_label_new ("details"); + gtk_widget_set_size_request (label, + 400, -1); + data->status = GTK_LABEL (label); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (data->widget), + label, + FALSE, FALSE, + 2); + + bar = gtk_progress_bar_new (); + data->progress_bar = GTK_PROGRESS_BAR (bar); + gtk_progress_bar_set_pulse_step (data->progress_bar, 0.05); + + gtk_widget_show (bar); + gtk_box_pack_start (GTK_BOX (data->widget), + bar, + FALSE, FALSE, + 2); + + label = gtk_label_new ("status"); + gtk_widget_set_size_request (label, + 400, -1); + data->details = GTK_LABEL (label); + gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + gtk_widget_show (label); + gtk_box_pack_start (GTK_BOX (data->widget), + label, + FALSE, FALSE, + 0); + + update_data (data); + update_progress (data); + + g_signal_connect_swapped (data->info, "changed", (GCallback)update_data, data); + g_signal_connect_swapped (data->info, "progress_changed", (GCallback)update_progress, data); + g_signal_connect_swapped (data->info, "finished", (GCallback)op_finished, data); + + gtk_widget_show (data->widget); + + return data->widget; +} + +static void +handle_new_progress_info (NautilusProgressInfo *info) +{ + GtkWidget *window, *progress; + + window = get_progress_window (); + + progress = progress_widget_new (info); + gtk_box_pack_start (GTK_BOX (GTK_BIN (window)->child), + progress, + FALSE, FALSE, 6); + + gtk_window_present (GTK_WINDOW (window)); + + n_progress_ops++; + gtk_status_icon_set_visible (status_icon, TRUE); + gtk_status_icon_set_tooltip (status_icon, + _("%d file operations active")); +} + +static gboolean +new_op_started_timeout (NautilusProgressInfo *info) +{ + if (!nautilus_progress_info_get_is_finished (info)) { + handle_new_progress_info (info); + } + g_object_unref (info); + return FALSE; +} + +static void +new_op_started (NautilusProgressInfo *info) +{ + g_signal_handlers_disconnect_by_func (info, (GCallback)new_op_started, NULL); + g_timeout_add_seconds (2, + (GSourceFunc)new_op_started_timeout, + g_object_ref (info)); +} + static void nautilus_progress_info_init (NautilusProgressInfo *info) { @@ -182,6 +391,8 @@ nautilus_progress_info_init (NautilusProgressInfo *info) G_LOCK (progress_info); active_progress_infos = g_list_append (active_progress_infos, info); G_UNLOCK (progress_info); + + g_signal_connect (info, "started", (GCallback)new_op_started, NULL); } NautilusProgressInfo * @@ -236,8 +447,12 @@ nautilus_progress_info_get_progress (NautilusProgressInfo *info) double res; G_LOCK (progress_info); - - res = info->progress; + + if (info->activity_mode) { + res = -1.0; + } else { + res = info->progress; + } G_UNLOCK (progress_info); @@ -489,18 +704,29 @@ nautilus_progress_info_set_details (NautilusProgressInfo *info, } void +nautilus_progress_info_pulse_progress (NautilusProgressInfo *info) +{ + G_LOCK (progress_info); + + info->activity_mode = TRUE; + info->progress = 0.0; + info->progress_at_idle = TRUE; + queue_idle (info, FALSE); + + G_UNLOCK (progress_info); +} + +void nautilus_progress_info_set_progress (NautilusProgressInfo *info, - gboolean activity_mode, double current_percent) { G_LOCK (progress_info); - if (activity_mode || /* Always pulse if activity mode */ - info->activity_mode || /* emit on switch from activity mode */ - fabs (current_percent - info->progress) > 0.1 /* Emit on change of 0.1 percent */ + if (info->activity_mode || /* emit on switch from activity mode */ + fabs (current_percent - info->progress) > 0.005 /* Emit on change of 0.5 percent */ ) { + info->activity_mode = FALSE; info->progress = current_percent; - info->progress_at_idle = TRUE; queue_idle (info, FALSE); } diff --git a/libnautilus-private/nautilus-progress-info.h b/libnautilus-private/nautilus-progress-info.h index 80f4e6fdd..878406cdd 100644 --- a/libnautilus-private/nautilus-progress-info.h +++ b/libnautilus-private/nautilus-progress-info.h @@ -72,8 +72,8 @@ void nautilus_progress_info_set_details (NautilusProgressInfo *info void nautilus_progress_info_take_details (NautilusProgressInfo *info, char *details); void nautilus_progress_info_set_progress (NautilusProgressInfo *info, - gboolean activity_mode, double current_percent); +void nautilus_progress_info_pulse_progress (NautilusProgressInfo *info); |