#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)
{
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;
}
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 = "* ";
}
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_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);
}
-
}