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

Reply via email to