/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
+ * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Claws Mail team
*
* 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
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
logwin->buffer = buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
+ g_object_ref(G_OBJECT(logwin->buffer));
+ gtk_text_view_set_buffer(GTK_TEXT_VIEW(text), NULL);
+ logwin->hidden = TRUE;
+
gtk_text_buffer_get_start_iter(buffer, &iter);
- gtk_text_buffer_create_mark(buffer, "end", &iter, FALSE);
+ logwin->end_mark = gtk_text_buffer_create_mark(buffer, "end", &iter, FALSE);
+
g_signal_connect(G_OBJECT(text), "populate-popup",
G_CALLBACK(log_window_popup_menu_extend), logwin);
gtk_container_add(GTK_CONTAINER(scrolledwin), text);
gtk_text_buffer_create_tag(buffer, "warn",
"foreground-gdk", &logwin->warn_color,
NULL);
- gtk_text_buffer_create_tag(buffer, "error",
+ logwin->error_tag = gtk_text_buffer_create_tag(buffer, "error",
"foreground-gdk", &logwin->error_color,
NULL);
gtk_text_buffer_create_tag(buffer, "input",
gtk_text_buffer_create_tag(buffer, "output",
"foreground-gdk", &logwin->out_color,
NULL);
-
- g_object_ref(G_OBJECT(logwin->buffer));
- gtk_text_view_set_buffer(GTK_TEXT_VIEW(logwin->text), NULL);
- logwin->hidden = TRUE;
}
void log_window_show(LogWindow *logwin)
gtk_widget_show(logwin->window);
}
+static void log_window_jump_to_error(LogWindow *logwin)
+{
+ GtkTextIter iter;
+ gtk_text_buffer_get_end_iter(logwin->buffer, &iter);
+ if (!gtk_text_iter_backward_to_tag_toggle(&iter, logwin->error_tag))
+ return;
+
+ gtk_text_iter_backward_line(&iter);
+ gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(logwin->text), &iter, 0, TRUE, 0, 0);
+}
+
+void log_window_show_error(LogWindow *logwin)
+{
+ log_window_show(logwin);
+ log_window_jump_to_error(logwin);
+}
+
void log_window_set_clipping(LogWindow *logwin, gboolean clip, guint clip_length)
{
g_return_if_fail(logwin != NULL);
if (head)
gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, head, -1,
tag, NULL);
- gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, logtext->text, -1,
- tag, NULL);
+ if (!g_utf8_validate(logtext->text, -1, NULL)) {
+ gchar * mybuf = g_malloc(strlen(logtext->text)*2 +1);
+ conv_localetodisp(mybuf, strlen(logtext->text)*2 +1, logtext->text);
+ gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, mybuf, -1,
+ tag, NULL);
+ g_free(mybuf);
+ } else {
+ gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, logtext->text, -1,
+ tag, NULL);
+ }
gtk_text_buffer_get_start_iter(buffer, &iter);
if (logwindow->clip)
log_window_clip (logwindow, logwindow->clip_length);
- gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1);
if (!logwindow->hidden) {
- gtk_text_view_scroll_to_iter(text, &iter, 0, TRUE, 0, 0);
- gtk_text_buffer_place_cursor(buffer, &iter);
+ GtkAdjustment *vadj = text->vadjustment;
+ gfloat upper = vadj->upper - vadj->page_size;
+ if (vadj->value == upper)
+ gtk_text_view_scroll_mark_onscreen(text, logwindow->end_mark);
}
return FALSE;