Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=gfpm.git;a=commitdiff;h=0a6b331096e498e2b2f37dc17767ecd12a0952fc
commit 0a6b331096e498e2b2f37dc17767ecd12a0952fc Author: Priyank <priy...@frugalware.org> Date: Sat May 30 14:51:16 2009 +0530 Added a progress bar to the log viewer * this fixes the window freeze problem especially when reading huge log files * closes #3715, #3716 diff --git a/data/gfpm.glade b/data/gfpm.glade index 69f6bbb..1b462be 100644 --- a/data/gfpm.glade +++ b/data/gfpm.glade @@ -2371,58 +2371,85 @@ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <property name="border_width">5</property> <property name="label_xalign">0</property> - <property name="shadow_type">out</property> <child> <widget class="GtkAlignment" id="alignment6"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <widget class="GtkHPaned" id="hpaned2"> + <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="border_width">6</property> - <property name="resize_mode">queue</property> + <property name="orientation">vertical</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow8"> - <property name="width_request">160</property> + <widget class="GtkHPaned" id="hpaned2"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> + <property name="border_width">6</property> + <property name="resize_mode">queue</property> + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow8"> + <property name="width_request">160</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <widget class="GtkTreeView" id="log_tvw"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="headers_visible">False</property> + </widget> + </child> + </widget> + <packing> + <property name="resize">False</property> + <property name="shrink">True</property> + </packing> + </child> <child> - <widget class="GtkTreeView" id="log_tvw"> + <widget class="GtkScrolledWindow" id="scrolledwindow10"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="headers_visible">False</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <widget class="GtkTextView" id="log_txtvw"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + </child> </widget> + <packing> + <property name="resize">True</property> + <property name="shrink">True</property> + </packing> </child> </widget> <packing> - <property name="resize">False</property> - <property name="shrink">True</property> + <property name="position">0</property> </packing> </child> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow10"> + <widget class="GtkAlignment" id="alignment1"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> + <property name="bottom_padding">3</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> <child> - <widget class="GtkTextView" id="log_txtvw"> + <widget class="GtkProgressBar" id="log_progress"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="show_text">True</property> + <property name="text" translatable="yes">Reading log file... please wait</property> </widget> </child> </widget> <packing> - <property name="resize">True</property> - <property name="shrink">True</property> + <property name="expand">False</property> + <property name="position">1</property> </packing> </child> </widget> diff --git a/src/gfpm-logviewer.c b/src/gfpm-logviewer.c index 21d94d0..cbfa1a8 100644 --- a/src/gfpm-logviewer.c +++ b/src/gfpm-logviewer.c @@ -47,6 +47,7 @@ static GtkWidget *gfpm_logviewer_dlg; static GtkWidget *gfpm_logviewer_tvw; static GtkWidget *gfpm_logviewer_txtvw; static GtkWidget *gfpm_logviewer_sizelabel; +static GtkWidget *gfpm_logviewer_progressbar; static void _gfpm_logviewer_populate (void); static void _gfpm_logviewer_populate_txtvw (const char *text); @@ -71,6 +72,7 @@ gfpm_logviewer_init (void) gfpm_logviewer_tvw = gfpm_get_widget ("log_tvw"); gfpm_logviewer_txtvw = gfpm_get_widget ("log_txtvw"); gfpm_logviewer_sizelabel = gfpm_get_widget ("log_size_label"); + gfpm_logviewer_progressbar = gfpm_get_widget ("log_progress"); renderer = gtk_cell_renderer_text_new (); g_object_set (renderer, "xalign", 0.0, NULL); @@ -109,6 +111,8 @@ _gfpm_logviewer_populate (void) GList *master = NULL; LogViewItem *li = NULL; struct stat fstat; + char *command = NULL; + unsigned int lines = 0; if ((fp=fopen(LOG_FILE,"r"))==NULL) { @@ -125,13 +129,42 @@ _gfpm_logviewer_populate (void) gtk_label_set_text (GTK_LABEL(gfpm_logviewer_sizelabel), sizetxt); g_free (sizetxt); } + + /* display a nice progress bar for huge log files */ + /* for that we need the number of lines in the log file */ + command = g_strdup_printf ("wc -l %s | cut -d ' ' -f1", LOG_FILE); + FILE *ft = popen (command, "r"); + if (ft) + { + char ln[PATH_MAX+1] = ""; + fgets (ln, PATH_MAX, ft); + lines = atoi (ln); + } + g_free (command); + g_print ("%s contains %d lines\n", LOG_FILE, lines); + + unsigned int iter_lines = 0; + float progress = 0; + float prev_progress = 0; while (fgets(line,PATH_MAX,fp)) { char *ptr = NULL; - + fwutil_trim (line); if (!strlen(line)) continue; + + /* update progress */ + progress = (float) iter_lines / lines; + + if ((progress-prev_progress)>=0.01) + { + //g_print ("progress: %0.2f prev_progress: %0.2f \n", progress, prev_progress); + gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR(gfpm_logviewer_progressbar), progress); + prev_progress = progress; + } + iter_lines++; + if (line[0] == '[' && line[15] == ']') { struct tm *t; @@ -188,7 +221,9 @@ _gfpm_logviewer_populate (void) } } } - + /* hide the progress bar */ + gtk_widget_hide (gfpm_logviewer_progressbar); + /* add the master list */ store = gtk_tree_store_new (1, G_TYPE_STRING); _______________________________________________ Frugalware-git mailing list Frugalware-git@frugalware.org http://frugalware.org/mailman/listinfo/frugalware-git