0.8.6claws51
[claws.git] / src / logwindow.c
index 98298298486eb590dccb89e51edb225996445f68..47875dbb512c60d5a0c1d11059fab1bdf0965acd 100644 (file)
 #include "utils.h"
 #include "gtkutils.h"
 #include "prefs_common.h"
-
-static LogWindow *logwindow;
+#include "log.h"
+#include "hooks.h"
 
 static void hide_cb    (GtkWidget      *widget,
                         LogWindow      *logwin);
 static void key_pressed        (GtkWidget      *widget,
                         GdkEventKey    *event,
                         LogWindow      *logwin);
-void log_window_clear(GtkWidget *text);
+void log_window_append (gpointer        source,
+                        gpointer        data);
+void log_window_clear  (GtkWidget      *text);
 
 LogWindow *log_window_create(void)
 {
@@ -85,8 +87,7 @@ LogWindow *log_window_create(void)
        logwin->window = window;
        logwin->scrolledwin = scrolledwin;
        logwin->text = text;
-
-       logwindow = logwin;
+       logwin->hook_id = hooks_register_hook(LOG_APPEND_TEXT_HOOKLIST, log_window_append, logwin);
 
        return logwin;
 }
@@ -134,17 +135,24 @@ void log_window_show(LogWindow *logwin)
        gtk_widget_show(logwin->window);
 }
 
-void log_window_append(const gchar *str, LogType type)
+void log_window_append(gpointer source, gpointer data)
 {
+       LogText *logtext = (LogText *) source;
+       LogWindow *logwindow = (LogWindow *) data;
        GtkText *text;
        GdkColor *color = NULL;
        gchar *head = NULL;
 
+       g_return_if_fail(logtext != NULL);
+       g_return_if_fail(logtext->text != NULL);
        g_return_if_fail(logwindow != NULL);
 
+       if (prefs_common.cliplog && !prefs_common.loglength)
+               return;
+
        text = GTK_TEXT(logwindow->text);
 
-       switch (type) {
+       switch (logtext->type) {
        case LOG_MSG:
                color = &logwindow->msg_color;
                head = "* ";
@@ -162,7 +170,7 @@ void log_window_append(const gchar *str, LogType type)
        }
 
        if (head) gtk_text_insert(text, NULL, color, NULL, head, -1);
-       gtk_text_insert(text, NULL, color, NULL, str, -1);
+       gtk_text_insert(text, NULL, color, NULL, logtext->text, -1);
        if (prefs_common.cliplog)
               log_window_clear (GTK_WIDGET (text));
 }
@@ -180,45 +188,37 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event,
                gtk_widget_hide(logwin->window);
 }
 
-#define LOG_AVG_LINE_LEN 80
-void log_window_clear(GtkWidget *text)
+void log_window_clear(GtkWidget *textw)
 {
         guint length;
        guint point;
+       gboolean was_frozen = FALSE;
+       GtkText *text = GTK_TEXT(textw);
        
-       length = gtk_text_get_length (GTK_TEXT (text));
-       debug_print(_("Log window length: %u\n"), length);
+       length = gtk_text_get_length (text);
+       debug_print("Log window length: %u\n", length);
        
        if (length > prefs_common.loglength) {
-               gchar *lf;
                /* find the end of the first line after the cut off
                 * point */
                        point = length - prefs_common.loglength;
-               
-               do {
-                       gchar *str;
-                       if ((str = gtk_editable_get_chars (GTK_EDITABLE (text),
-                                       point, point + LOG_AVG_LINE_LEN))) {
-                               if ((lf = strchr(str, '\n')) != NULL)
-                                       point += lf - str;
-                               else 
-                                       point += strlen(str);
-                               g_free(str);
-                       } else
-                               break;
-               } while (lf == NULL);
-                               
-               gtk_text_freeze (GTK_TEXT (text));
-               
+               while (point < length && GTK_TEXT_INDEX(text, point) != '\n')
+                       point++;
                /* erase the text */
-               gtk_text_set_point (GTK_TEXT (text), 0);
-               if (!gtk_text_forward_delete (GTK_TEXT (text), point + 1))
-                       debug_print (_("Error clearing log\n"));
-               gtk_text_thaw (GTK_TEXT (text));
-               gtk_text_set_point (GTK_TEXT (text),
-                                   gtk_text_get_length (GTK_TEXT (text)));
+               if (text->freeze_count) {
+                       was_frozen = TRUE;
+                       gtk_text_thaw(text);
+               }
+               gtk_text_set_point (text, 0);
+               gtk_text_freeze(text);
+               if (!gtk_text_forward_delete (text, point + 1))
+                       debug_print("Error clearing log\n");
+               gtk_text_thaw(text);
+               gtk_text_set_point(text,
+                                  gtk_text_get_length (GTK_TEXT (text)));
+               if (was_frozen)
+                       gtk_text_freeze(text);
        }
-       
 }