commit 7debd613e253d0b8f6f756cb5bddf9e14213dbe3 Author: phantomjinx <p.g.richard...@phantomjinx.co.uk> Date: Thu Mar 17 22:15:11 2011 +0000
Stop infinite display of warning dialog in coverter * If an error occurs in the converter, an error dialog is displayed in the function conversion_scheduler_unlocked. Since this mehtod is called repeatedly every 100ms, then gtkpod will soon run out of resources and crash. * Addition of error page on conversion log window. If an error occurs then append the error to the error page and force the display of the log window. * Record the last error displayed so as not to infinitely repeat text down the error log screen. libgtkpod/file_convert.c | 79 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 76 insertions(+), 3 deletions(-) --- diff --git a/libgtkpod/file_convert.c b/libgtkpod/file_convert.c index dd4d1ba..c67c23c 100644 --- a/libgtkpod/file_convert.c +++ b/libgtkpod/file_convert.c @@ -196,6 +196,7 @@ struct _Conversion { gint log_window_posx; /* last x-position of log window */ gint log_window_posy; /* last x-position of log window */ GtkWidget *notebook; /* notebook */ + GtkWidget *errorview; /* view to report any errors */ GList *textviews; /* list with pages currently added */ GList *pages; /* list with pages currently added */ GtkStatusbar *log_statusbar; /* statusbar of log display */ @@ -203,6 +204,7 @@ struct _Conversion { /* data for background transfer */ GList *transfer_itdbs; /* list with TransferItdbs for background transfer */ + gchar *last_error_msg; /* keep a record of the last error message */ }; struct _ConvTrack { @@ -301,6 +303,19 @@ void file_convert_init() { conversion->notebook = gtk_notebook_new(); gtk_widget_show(conversion->notebook); gtk_box_pack_start(GTK_BOX (vbox), conversion->notebook, TRUE, TRUE, 0); + + /* Add the error view to the log notebook */ + GtkWidget *scrolled_window = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + conversion->errorview = gtk_text_view_new(); + gtk_text_view_set_editable(GTK_TEXT_VIEW(conversion->errorview), FALSE); + gtk_container_add(GTK_CONTAINER (scrolled_window), conversion->errorview); + gtk_widget_show_all(scrolled_window); + gtk_notebook_append_page(GTK_NOTEBOOK (conversion->notebook), scrolled_window, NULL); + + GtkWidget *errorpage = gtk_notebook_get_nth_page(GTK_NOTEBOOK (conversion->notebook), 0); + gtk_notebook_set_tab_label_text(GTK_NOTEBOOK (conversion->notebook), errorpage, _("errors")); + conversion->log_window_posx = G_MININT; conversion->log_window_posy = G_MININT; conversion->log_statusbar = GTK_STATUSBAR ( @@ -563,6 +578,7 @@ static void conversion_log_add_pages(Conversion *conv, gint threads) { gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); conv->pages = g_list_append(conv->pages, scrolled_window); textview = gtk_text_view_new(); + gtk_text_view_set_editable(GTK_TEXT_VIEW(textview), FALSE); gtk_container_add(GTK_CONTAINER (scrolled_window), textview); conv->textviews = g_list_append(conv->textviews, textview); @@ -665,6 +681,61 @@ static void conversion_itdb_first(Conversion *conv, iTunesDB *itdb) { file_convert_unlock(conv); } +/* adds @text to the errorview of the log window. If + * required 'file_convert_lock(conv)' before calling this + * function. */ +static void conversion_log_append_error(Conversion *conv, const gchar *errormsg) { + GtkTextBuffer *textbuffer; + GtkTextIter start, end; + const gchar *run, *ptr, *next; + + g_return_if_fail (conv); + + if (conv->last_error_msg && g_str_equal(conv->last_error_msg, errormsg)) { + /* This message is the same as the previous one + * so avoid repeating ourselves + */ + return; + } + + conv->last_error_msg = g_strdup(errormsg); + + textbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW (conv->errorview)); + gtk_text_buffer_get_end_iter(textbuffer, &end); + + run = ptr = errormsg; + + while (*ptr) { + next = g_utf8_find_next_char(ptr, NULL); + if (*ptr == '\b') { + if (ptr > run) { + gtk_text_buffer_insert(textbuffer, &end, run, ptr - run); + } + run = next; + start = end; + if (gtk_text_iter_backward_char(&start)) { + gtk_text_buffer_delete(textbuffer, &start, &end); + } + } + else if (*ptr == '\r') { + if (ptr > run) { + gtk_text_buffer_insert(textbuffer, &end, run, ptr - run); + } + run = next; + start = end; + gtk_text_iter_set_line_offset(&start, 0); + gtk_text_buffer_delete(textbuffer, &start, &end); + } + ptr = next; + } + if (ptr > run) { + gtk_text_buffer_insert(textbuffer, &end, run, ptr - run); + } + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW (conv->errorview), &end, 0.0, FALSE, 0.0, 0.0); + + gtk_widget_show(conv->log_window); +} + /* adds @text to the textview on page @threadnum of the log window. If * required 'file_convert_lock(conv)' before calling this * function. */ @@ -1267,7 +1338,7 @@ static gboolean conversion_scheduler_unlocked(Conversion *conv) { if (ctr->valid) { ExtraTrackData *etr; if (ctr->errormessage) { - gtkpod_warning(ctr->errormessage); + conversion_log_append_error(conv, ctr->errormessage); debug("Conversion error: %s\n", ctr->errormessage); g_free(ctr->errormessage); ctr->errormessage = NULL; @@ -1435,7 +1506,9 @@ static gboolean conversion_scheduler_unlocked(Conversion *conv) { else { /* error!? */ tri->failed = g_list_prepend(tri->failed, ctr); gchar *buf = conversion_get_track_info(ctr); - gtkpod_warning(_("Transfer of '%s' failed. %s\n\n"), buf, error ? error->message : ""); + gchar *msg = g_strdup_printf(_("Transfer of '%s' failed. %s\n\n"), buf, error ? error->message : ""); + conversion_log_append_error(conv, msg); + g_free(msg); g_free(buf); if (error) { g_error_free(error); @@ -1460,7 +1533,7 @@ static gboolean conversion_scheduler_unlocked(Conversion *conv) { if (tri->valid && ctr->valid) { if (ctr->errormessage) { - gtkpod_warning(ctr->errormessage); + conversion_log_append_error(conv, ctr->errormessage); debug("Conversion error: %s\n", ctr->errormessage); g_free(ctr->errormessage); ctr->errormessage = NULL; ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________ gtkpod-cvs2 mailing list gtkpod-cvs2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2