/*
* 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 "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);
+#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)
{
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_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);
(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;
}
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);
+ 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 = "* ";
+ 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));
}
+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,
LogWindow *logwin)
{
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;
- gchar *str;
+ 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 {
- 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 += LOG_AVG_LINE_LEN;
- g_free(str);
- } 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);
}
-
}