Fixed a crash introduced in 0.8.0claws5 when log is cut under
[claws.git] / src / logwindow.c
index a4bccdc378a535c4b57849c82b6bc453e30ba9e4..39ce93654903ab92ec6c235d6331737fb6370814 100644 (file)
 #include "logwindow.h"
 #include "utils.h"
 #include "gtkutils.h"
+#include "prefs_common.h"
 
 static LogWindow *logwindow;
 
 static void key_pressed(GtkWidget *widget, GdkEventKey *event,
                        LogWindow *logwin);
+void log_window_clear(GtkWidget *text);
 
 LogWindow *log_window_create(void)
 {
@@ -52,6 +54,7 @@ LogWindow *log_window_create(void)
 
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(window), _("Protocol log"));
+       gtk_window_set_wmclass(GTK_WINDOW(window), "log_window", "Sylpheed");
        gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
        gtk_widget_set_usize(window, 520, 400);
        gtk_signal_connect(GTK_OBJECT(window), "delete_event",
@@ -128,8 +131,6 @@ void log_window_append(const gchar *str, LogType type)
 
        text = GTK_TEXT(logwindow->text);
 
-       //gtk_text_freeze(text);
-
        switch (type) {
        case LOG_WARN:
                color = &logwindow->warn_color;
@@ -143,12 +144,13 @@ void log_window_append(const gchar *str, LogType type)
                color = &logwindow->msg_color;
                break;
        default:
+               break;
        }
 
        if (head) gtk_text_insert(text, NULL, color, NULL, head, -1);
        gtk_text_insert(text, NULL, color, NULL, str, -1);
-
-       //gtk_text_thaw(text);
+       if (prefs_common.cliplog)
+              log_window_clear (GTK_WIDGET (text));
 }
 
 static void key_pressed(GtkWidget *widget, GdkEventKey *event,
@@ -157,3 +159,46 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (event && event->keyval == GDK_Escape)
                gtk_widget_hide(logwin->window);
 }
+
+#define LOG_AVG_LINE_LEN 80
+void log_window_clear(GtkWidget *text)
+{
+        guint length;
+       guint point;
+       
+       length = gtk_text_get_length (GTK_TEXT (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));
+               
+               /* 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)));
+       }
+       
+}
+
+