0.8.6claws51
[claws.git] / src / logwindow.c
index 3226267d1f6531eefb06faa652b85074a10e7478..47875dbb512c60d5a0c1d11059fab1bdf0965acd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999,2000 Hiroyuki Yamamoto
+ * Copyright (C) 1999-2002 Hiroyuki Yamamoto
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include "logwindow.h"
 #include "utils.h"
 #include "gtkutils.h"
-
-static LogWindow *logwindow;
-
-static void key_pressed(GtkWidget *widget, GdkEventKey *event,
-                       LogWindow *logwin);
+#include "prefs_common.h"
+#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_append (gpointer        source,
+                        gpointer        data);
+void log_window_clear  (GtkWidget      *text);
 
 LogWindow *log_window_create(void)
 {
@@ -47,17 +54,20 @@ LogWindow *log_window_create(void)
        GtkWidget *scrolledwin;
        GtkWidget *text;
 
-       debug_print(_("Creating log window...\n"));
+       debug_print("Creating log window...\n");
        logwin = g_new0(LogWindow, 1);
 
        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",
                           GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete), NULL);
        gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
                           GTK_SIGNAL_FUNC(key_pressed), logwin);
+       gtk_signal_connect(GTK_OBJECT(window), "hide",
+                          GTK_SIGNAL_FUNC(hide_cb), logwin);
        gtk_widget_realize(window);
 
        scrolledwin = gtk_scrolled_window_new(NULL, NULL);
@@ -72,12 +82,12 @@ LogWindow *log_window_create(void)
                            (GTK_SCROLLED_WINDOW(scrolledwin)));
        gtk_container_add(GTK_CONTAINER(scrolledwin), text);
        gtk_widget_show(text);
+       gtk_text_freeze(GTK_TEXT(text));
 
        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;
 }
@@ -114,41 +124,61 @@ void log_window_init(LogWindow *logwin)
 
 void log_window_show(LogWindow *logwin)
 {
+       GtkText *text = GTK_TEXT(logwin->text);
+
        gtk_widget_hide(logwin->window);
+
+       gtk_text_thaw(text);
+       text->vadj->value = text->vadj->upper - text->vadj->page_size;
+       gtk_signal_emit_by_name(GTK_OBJECT(text->vadj), "value_changed");
+
        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);
 
-       text = GTK_TEXT(logwindow->text);
+       if (prefs_common.cliplog && !prefs_common.loglength)
+               return;
 
-       /*gtk_text_freeze(text);*/
+       text = GTK_TEXT(logwindow->text);
 
-       switch (type) {
+       switch (logtext->type) {
+       case LOG_MSG:
+               color = &logwindow->msg_color;
+               head = "* ";
+               break;
        case LOG_WARN:
                color = &logwindow->warn_color;
-               head = "*** ";
+               head = "** ";
                break;
        case LOG_ERROR:
                color = &logwindow->error_color;
                head = "*** ";
                break;
-       case LOG_MSG:
-               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_insert(text, NULL, color, NULL, logtext->text, -1);
+       if (prefs_common.cliplog)
+              log_window_clear (GTK_WIDGET (text));
+}
 
-       /*gtk_text_thaw(text);*/
+static void hide_cb(GtkWidget *widget, LogWindow *logwin)
+{
+       if (GTK_TEXT(logwin->text)->freeze_count == 0)
+               gtk_text_freeze(GTK_TEXT(logwin->text));
 }
 
 static void key_pressed(GtkWidget *widget, GdkEventKey *event,
@@ -157,3 +187,38 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event,
        if (event && event->keyval == GDK_Escape)
                gtk_widget_hide(logwin->window);
 }
+
+void log_window_clear(GtkWidget *textw)
+{
+        guint length;
+       guint point;
+       gboolean was_frozen = FALSE;
+       GtkText *text = GTK_TEXT(textw);
+       
+       length = gtk_text_get_length (text);
+       debug_print("Log window length: %u\n", length);
+       
+       if (length > prefs_common.loglength) {
+               /* find the end of the first line after the cut off
+                * point */
+                       point = length - prefs_common.loglength;
+               while (point < length && GTK_TEXT_INDEX(text, point) != '\n')
+                       point++;
+               /* erase the 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);
+       }
+}
+
+