/*
* Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws team
+ * Copyright (C) 1999-2007 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
logwin = g_new0(LogWindow, 1);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "logwindow");
gtk_window_set_title(GTK_WINDOW(window), _("Protocol log"));
gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
g_signal_connect(G_OBJECT(window), "delete_event",
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;
+ logwin->never_shown = 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);
logwin->text = text;
logwin->hook_id = hooks_register_hook(LOG_APPEND_TEXT_HOOKLIST, log_window_append, logwin);
+ gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(text), logwin->end_mark);
+
return logwin;
}
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)
GtkTextMark *mark;
logwin->hidden = FALSE;
- gtk_text_view_set_buffer(GTK_TEXT_VIEW(logwin->text), logwin->buffer);
+
+ if (logwin->never_shown)
+ gtk_text_view_set_buffer(GTK_TEXT_VIEW(logwin->text), logwin->buffer);
+
+ logwin->never_shown = FALSE;
mark = gtk_text_buffer_get_mark(buffer, "end");
gtk_text_view_scroll_mark_onscreen(text, mark);
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 ||
+ (upper - vadj->value < 16 && vadj->value < 8))
+ gtk_text_view_scroll_mark_onscreen(text, logwindow->end_mark);
}
return FALSE;
static void hide_cb(GtkWidget *widget, LogWindow *logwin)
{
- gtk_text_view_set_buffer(GTK_TEXT_VIEW(logwin->text), NULL);
logwin->hidden = TRUE;
}