summaryrefslogtreecommitdiff
path: root/src/fe-text/gui-windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe-text/gui-windows.c')
-rw-r--r--src/fe-text/gui-windows.c1056
1 files changed, 37 insertions, 1019 deletions
diff --git a/src/fe-text/gui-windows.c b/src/fe-text/gui-windows.c
index 835a77cd..57a2b488 100644
--- a/src/fe-text/gui-windows.c
+++ b/src/fe-text/gui-windows.c
@@ -1,7 +1,7 @@
/*
gui-windows.c : irssi
- Copyright (C) 1999 Timo Sirainen
+ Copyright (C) 1999-2001 Timo Sirainen
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
@@ -24,66 +24,34 @@
#include "settings.h"
#include "special-vars.h"
-#include "formats.h"
-
#include "screen.h"
#include "gui-entry.h"
#include "gui-windows.h"
#include "gui-printtext.h"
-#ifdef HAVE_REGEX_H
-# include <regex.h>
-#endif
-
-/* how often to scan line cache for lines not accessed for a while (ms) */
-#define LINE_CACHE_CHECK_TIME (5*60*1000)
-/* how long to keep line cache in memory (seconds) */
-#define LINE_CACHE_KEEP_TIME (10*60)
-
-static int linecache_tag;
static int window_create_override;
-static int default_indent_pos;
static char *prompt, *prompt_window;
-static GUI_WINDOW_REC *gui_window_init(WINDOW_REC *window, MAIN_WINDOW_REC *parent)
+static GUI_WINDOW_REC *gui_window_init(WINDOW_REC *window,
+ MAIN_WINDOW_REC *parent)
{
GUI_WINDOW_REC *gui;
- window->width = COLS;
- window->height = parent->lines;
+ window->width = parent->width;
+ window->height = parent->height;
gui = g_new0(GUI_WINDOW_REC, 1);
gui->parent = parent;
-
- gui->bottom = TRUE;
- gui->line_cache = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal);
- gui->line_chunk = g_mem_chunk_new("line chunk", sizeof(LINE_REC),
- sizeof(LINE_REC)*100, G_ALLOC_AND_FREE);
- gui->empty_linecount = parent->lines-1;
-
+ gui->view = textbuffer_view_create(textbuffer_create(),
+ window->width, window->height,
+ settings_get_int("indent"));
return gui;
}
-int line_cache_destroy(void *key, LINE_CACHE_REC *cache)
-{
- g_free_not_null(cache->lines);
- g_free(cache);
-
- return TRUE;
-}
-
static void gui_window_deinit(GUI_WINDOW_REC *gui)
{
- g_hash_table_foreach(gui->line_cache, (GHFunc) line_cache_destroy, NULL);
- g_hash_table_destroy(gui->line_cache);
-
- g_slist_foreach(gui->text_chunks, (GFunc) g_free, NULL);
- g_slist_free(gui->text_chunks);
-
- g_mem_chunk_destroy(gui->line_chunk);
- g_list_free(gui->lines);
-
+ textbuffer_view_destroy(gui->view);
g_free(gui);
}
@@ -141,557 +109,32 @@ static void gui_window_destroyed(WINDOW_REC *window)
mainwindow_destroy(parent);
}
-void gui_window_clear(WINDOW_REC *window)
-{
- MAIN_WINDOW_REC *parent;
-
- g_return_if_fail(window != NULL);
-
- parent = WINDOW_GUI(window)->parent;
- gui_window_deinit(WINDOW_GUI(window));
- window->gui_data = gui_window_init(window, parent);
-
- window->lines = 0;
-
- if (is_window_visible(window))
- gui_window_redraw(window);
-}
-
-/* update bottom_startline and bottom_subline of window. */
-static int gui_window_update_bottom(GUI_WINDOW_REC *gui, int lines)
-{
- int linecount, last_linecount;
-
- if (gui->bottom_startline == NULL)
- return -1;
-
- for (; lines < 0; lines++) {
- if (gui->bottom_subline > 0) {
- gui->bottom_subline--;
- continue;
- }
-
- if (gui->bottom_startline->prev == NULL)
- return -1;
- gui->bottom_startline = gui->bottom_startline->prev;
-
- linecount = gui_window_get_linecount(gui, gui->bottom_startline->data);
- gui->bottom_subline = linecount-1;
- }
-
- last_linecount = -1;
- for (; lines > 0; lines--) {
- last_linecount = linecount =
- gui_window_get_linecount(gui, gui->bottom_startline->data);
-
- if (linecount > gui->bottom_subline+1)
- gui->bottom_subline++;
- else {
- gui->bottom_subline = 0;
- if (gui->bottom_startline->next == NULL)
- break;
- gui->bottom_startline = gui->bottom_startline->next;
- }
- }
-
- return last_linecount;
-}
-
-void gui_window_newline(GUI_WINDOW_REC *gui, int visible)
-{
- /* FIXME: I'm pretty sure this could be done cleaner :) */
- int lines;
-
- g_return_if_fail(gui != NULL);
- g_return_if_fail(gui->bottom_startline != NULL);
- g_return_if_fail(gui->startline != NULL);
-
- gui->xpos = 0;
-
- lines = gui_window_get_linecount(gui, gui->bottom_startline->data);
- if (gui->bottom_subline >= lines) {
- /* after screen gets full after /CLEAR we end up here.. */
- gui->bottom_startline = gui->bottom_startline->next;
- gui->bottom_subline = 0;
- }
-
- lines = gui_window_get_linecount(gui, gui->startline->data);
- if (gui->subline >= lines) {
- /* after screen gets full after /CLEAR we end up here.. */
- if (gui->startline->next == NULL)
- g_warning("gui_window_newline(): bug #1");
- else
- gui->startline = gui->startline->next;
- gui->subline = 0;
- }
-
- if (gui->empty_linecount > 0) {
- /* window buffer height isn't even the size of the screen yet */
- gui->empty_linecount--;
- if (!gui->bottom) {
- gui->ypos++;
- return;
- }
- }
-
- if (gui->ypos >= -1 && gui->ypos < gui->parent->lines-1) {
- gui->ypos++;
- return;
- }
-
- if (!gui->bottom || (gui->startline == gui->bottom_startline &&
- gui->subline >= gui->bottom_subline)) {
- lines = gui_window_update_bottom(gui, 1);
-
- if (!gui->bottom) {
- gui->ypos++;
- return;
- }
- } else {
- lines = gui_window_get_linecount(gui, gui->startline->data);
- }
-
- if (lines > 1+gui->subline)
- gui->subline++;
- else {
- if (gui->startline->next == NULL)
- g_warning("gui_window_newline(): bug #2");
- else
- gui->startline = gui->startline->next;
- gui->subline = 0;
- }
-
- if (visible) {
- WINDOW *cwin;
-
-#ifdef USE_CURSES_WINDOWS
- cwin = gui->parent->curses_win;
-#else
- cwin = stdscr;
- setscrreg(gui->parent->first_line, gui->parent->last_line);
-#endif
- scrollok(cwin, TRUE);
- wscrl(cwin, 1);
- scrollok(cwin, FALSE);
- }
-}
-
-static LINE_CACHE_REC *gui_window_line_cache(GUI_WINDOW_REC *gui,
- LINE_REC *line)
-{
- LINE_CACHE_REC *rec;
- LINE_CACHE_SUB_REC *sub;
- GSList *lines;
- unsigned char cmd;
- char *ptr, *last_space_ptr;
- int xpos, pos, indent_pos, last_space, last_color, color;
-
- g_return_val_if_fail(line->text != NULL, NULL);
-
- rec = g_new(LINE_CACHE_REC, 1);
- rec->last_access = time(NULL);
-
- xpos = 0; color = 0; indent_pos = default_indent_pos;
- last_space = last_color = 0; last_space_ptr = NULL; sub = NULL;
-
- rec->count = 1; lines = NULL;
- for (ptr = line->text;;) {
- if (*ptr == '\0') {
- /* command */
- ptr++;
- cmd = *ptr;
- ptr++;
-
- if (cmd == LINE_CMD_EOL || cmd == LINE_CMD_FORMAT)
- break;
-
- if (cmd == LINE_CMD_CONTINUE) {
- char *tmp;
-
- memcpy(&tmp, ptr, sizeof(char *));
- ptr = tmp;
- continue;
- }
-
- if ((cmd & 0x80) == 0) {
- /* set color */
- color = (color & ATTR_UNDERLINE) | cmd;
- } else switch (cmd) {
- case LINE_CMD_UNDERLINE:
- color ^= ATTR_UNDERLINE;
- break;
- case LINE_CMD_COLOR0:
- color = color & ATTR_UNDERLINE;
- break;
- case LINE_CMD_COLOR8:
- color &= 0xfff0;
- color |= 8|ATTR_COLOR8;
- break;
- case LINE_CMD_BLINK:
- color |= 0x80;
- break;
- case LINE_CMD_INDENT:
- /* set indentation position here - don't do
- it if we're too close to right border */
- if (xpos < COLS-5) indent_pos = xpos;
- break;
- }
- continue;
- }
-
- if (xpos == COLS && sub != NULL &&
- (last_space <= indent_pos || last_space <= 10)) {
- /* long word, remove the indentation from this line */
- xpos -= sub->indent;
- sub->indent = 0;
- }
-
- if (xpos == COLS) {
- xpos = indent_pos;
-
- sub = g_new(LINE_CACHE_SUB_REC, 1);
- if (last_space > indent_pos && last_space > 10) {
- /* go back to last space */
- color = last_color;
- ptr = last_space_ptr;
- while (*ptr == ' ') ptr++;
- } else {
- /* long word, no indentation in next line */
- xpos = 0;
- sub->continues = TRUE;
- }
-
- sub->start = ptr;
- sub->indent = xpos;
- sub->color = color;
-
- lines = g_slist_append(lines, sub);
- rec->count++;
-
- last_space = 0;
- continue;
- }
-
- xpos++;
- if (*ptr++ == ' ') {
- last_space = xpos-1;
- last_space_ptr = ptr;
- last_color = color;
- }
- }
-
- if (rec->count < 2)
- rec->lines = NULL;
- else {
- rec->lines = g_new(LINE_CACHE_SUB_REC, rec->count-1);
- for (pos = 0; lines != NULL; pos++) {
- memcpy(&rec->lines[pos], lines->data, sizeof(LINE_CACHE_SUB_REC));
-
- g_free(lines->data);
- lines = g_slist_remove(lines, lines->data);
- }
- }
-
- g_hash_table_insert(gui->line_cache, line, rec);
- return rec;
-}
-
-void gui_window_cache_remove(GUI_WINDOW_REC *gui, LINE_REC *line)
-{
- LINE_CACHE_REC *cache;
-
- g_return_if_fail(gui != NULL);
- g_return_if_fail(line != NULL);
-
- cache = g_hash_table_lookup(gui->line_cache, line);
- if (cache != NULL) {
- g_hash_table_remove(gui->line_cache, line);
- line_cache_destroy(NULL, cache);
- }
-}
-
-int gui_window_get_linecount(GUI_WINDOW_REC *gui, LINE_REC *line)
-{
- LINE_CACHE_REC *cache;
-
- g_return_val_if_fail(gui != NULL, -1);
- g_return_val_if_fail(line != NULL, -1);
-
- cache = g_hash_table_lookup(gui->line_cache, line);
- if (cache == NULL)
- cache = gui_window_line_cache(gui, line);
- else
- cache->last_access = time(NULL);
-
- return cache->count;
-}
-
-static void single_line_draw(GUI_WINDOW_REC *gui, int ypos,
- LINE_CACHE_SUB_REC *rec, const char *text,
- const char *text_end)
-{
- WINDOW *cwin;
- char *tmp;
- int xpos, color;
-
- if (rec == NULL) {
- xpos = 0; color = 0;
- } else {
- xpos = rec->indent;
- color = rec->color;
- }
-
-#ifdef USE_CURSES_WINDOWS
- cwin = gui->parent->curses_win;
-#else
- cwin = stdscr;
- ypos += gui->parent->first_line;
-#endif
- wmove(cwin, ypos, xpos);
- set_color(cwin, color);
-
- while (text != text_end) {
- if (*text == '\0') {
- /* command */
- text++;
- if ((*text & 0x80) == 0) {
- /* set color */
- color = (color & ATTR_UNDERLINE) | *text;
- } else if (*text == (char) LINE_CMD_CONTINUE) {
- /* jump to next block */
- memcpy(&tmp, text+1, sizeof(char *));
- text = tmp;
- continue;
- } else switch ((unsigned char) *text) {
- case LINE_CMD_EOL:
- case LINE_CMD_FORMAT:
- return;
- case LINE_CMD_UNDERLINE:
- color ^= ATTR_UNDERLINE;
- break;
- case LINE_CMD_COLOR0:
- color = color & ATTR_UNDERLINE;
- break;
- case LINE_CMD_COLOR8:
- color &= 0xfff0;
- color |= 8|ATTR_COLOR8;
- break;
- case LINE_CMD_BLINK:
- color |= 0x80;
- break;
- }
- set_color(cwin, color);
- text++;
- continue;
- }
-
- if (((unsigned char) *text & 127) >= 32)
- waddch(cwin, (unsigned char) *text);
- else {
- /* low-ascii */
- set_color(cwin, ATTR_REVERSE);
- waddch(cwin, (*text & 127)+'A'-1);
- set_color(cwin, color);
- }
- text++;
- }
-}
-
-int gui_window_line_draw(GUI_WINDOW_REC *gui, LINE_REC *line, int ypos, int skip, int max)
-{
- LINE_CACHE_REC *cache;
- LINE_CACHE_SUB_REC *sub;
- char *pos, *next_pos;
- int n;
-
- g_return_val_if_fail(gui != NULL, -1);
- g_return_val_if_fail(line != NULL, -1);
-
- cache = g_hash_table_lookup(gui->line_cache, line);
- if (cache == NULL)
- cache = gui_window_line_cache(gui, line);
- else
- cache->last_access = time(NULL);
-
- if (max < 0) max = cache->count;
-
- for (n = skip; n < cache->count && max > 0; n++, ypos++, max--) {
- sub = n == 0 ? NULL : &cache->lines[n-1];
- pos = sub == NULL ? line->text : sub->start;
- next_pos = (n+1 < cache->count) ?
- cache->lines[n].start : NULL;
-
- single_line_draw(gui, ypos, sub, pos, next_pos);
- }
-
-#ifdef USE_CURSES_WINDOWS
- screen_refresh(gui->parent->curses_win);
-#else
- screen_refresh(NULL);
-#endif
-
- return cache->count;
-}
-
-void gui_window_redraw(WINDOW_REC *window)
+void gui_window_resize(WINDOW_REC *window, int width, int height)
{
GUI_WINDOW_REC *gui;
- WINDOW *cwin;
- GList *line;
- int ypos, lines, skip, max;
-
- g_return_if_fail(window != NULL);
gui = WINDOW_GUI(window);
-#ifdef USE_CURSES_WINDOWS
- cwin = gui->parent->curses_win;
-#else
- cwin = stdscr;
-#endif
-
- /* clear the lines first */
- set_color(cwin, 0);
-#ifdef USE_CURSES_WINDOWS
- for (ypos = 0; ypos <= gui->parent->lines; ypos++) {
-#else
- for (ypos = gui->parent->first_line; ypos <= gui->parent->last_line; ypos++) {
-#endif
- wmove(cwin, ypos, 0);
- wclrtoeol(cwin);
- }
-
- skip = gui->subline;
- ypos = 0;
- for (line = gui->startline; line != NULL; line = line->next) {
- LINE_REC *rec = line->data;
-
- max = gui->parent->lines-1 - ypos+1;
- if (max < 0) break;
-
- lines = gui_window_line_draw(gui, rec, ypos, skip, max);
- ypos += lines-skip;
- skip = 0;
- }
-
- screen_refresh(cwin);
-}
-
-static void gui_window_scroll_up(GUI_WINDOW_REC *gui, int lines)
-{
- LINE_REC *line;
- int count, linecount;
-
- if (gui->startline == NULL)
- return;
-
- count = lines-gui->subline; gui->ypos += gui->subline;
- gui->subline = 0;
-
- while (gui->startline->prev != NULL && count > 0) {
- gui->startline = gui->startline->prev;
-
- line = gui->startline->data;
- linecount = gui_window_get_linecount(gui, line);
- count -= linecount;
- gui->ypos += linecount;
- }
- if (count < 0) {
- gui->subline = -count;
- gui->ypos -= -count;
- }
-
- gui->bottom = is_window_bottom(gui);
-}
-
-#define is_scrolled_bottom(gui) \
- ((gui)->startline == (gui)->bottom_startline && \
- (gui)->subline >= (gui)->bottom_subline)
-
-static void gui_window_scroll_down(GUI_WINDOW_REC *gui, int lines)
-{
- LINE_REC *line;
- int count, linecount;
-
- if (is_scrolled_bottom(gui))
- return;
-
- count = lines+gui->subline; gui->ypos += gui->subline;
- gui->subline = 0;
-
- while (count > 0) {
- line = gui->startline->data;
-
- linecount = gui_window_get_linecount(gui, line);
- count -= linecount;
- gui->ypos -= linecount;
-
- if (gui->startline == gui->bottom_startline &&
- linecount+count > gui->bottom_subline) {
- /* reached the last screenful of text */
- gui->subline = gui->bottom_subline;
- gui->ypos += linecount;
- gui->ypos -= gui->subline;
- break;
- }
-
- if (count == 0) {
- if (gui->startline->next == NULL) {
- gui->subline = linecount;
- break;
- }
- gui->startline = gui->startline->next;
- break;
- }
-
- if (count < 0) {
- gui->subline = linecount+count;
- gui->ypos += -count;
- break;
- }
-
- if (gui->startline->next == NULL) {
- g_warning("gui_window_scroll_down(): bug");
- break;
- }
- gui->startline = gui->startline->next;
- }
-
- gui->bottom = is_window_bottom(gui);
+ window->width = width;
+ window->height = height;
+ textbuffer_view_resize(gui->view, width, height);
}
void gui_window_scroll(WINDOW_REC *window, int lines)
{
- GUI_WINDOW_REC *gui;
-
g_return_if_fail(window != NULL);
- gui = WINDOW_GUI(window);
-
- if (lines < 0) {
- if (gui->startline == NULL || gui->startline->prev == NULL)
- return;
- gui_window_scroll_up(gui, -lines);
- } else {
- if (is_scrolled_bottom(gui))
- return;
- gui_window_scroll_down(gui, lines);
- }
-
- if (is_window_visible(window))
- gui_window_redraw(window);
+ textbuffer_view_scroll(WINDOW_GUI(window)->view, lines);
signal_emit("gui page scrolled", 1, window);
}
-void gui_window_update_ypos(GUI_WINDOW_REC *gui)
+void gui_window_scroll_line(WINDOW_REC *window, LINE_REC *line)
{
- GList *tmp;
-
- g_return_if_fail(gui != NULL);
+ g_return_if_fail(window != NULL);
+ g_return_if_fail(line != NULL);
- gui->ypos = -gui->subline-1;
- for (tmp = gui->startline; tmp != NULL; tmp = tmp->next)
- gui->ypos += gui_window_get_linecount(gui, tmp->data);
+ textbuffer_view_scroll_line(WINDOW_GUI(window)->view, line);
+ signal_emit("gui page scrolled", 1, window);
}
void window_update_prompt(void)
@@ -745,16 +188,15 @@ static void window_update_prompt_window_item(WI_ITEM_REC *item)
void gui_window_reparent(WINDOW_REC *window, MAIN_WINDOW_REC *parent)
{
MAIN_WINDOW_REC *oldparent;
- int ychange;
oldparent = WINDOW_GUI(window)->parent;
if (oldparent == parent)
return;
WINDOW_GUI(window)->parent = parent;
-
- ychange = parent->lines - oldparent->lines;
- if (ychange != 0) gui_window_resize(window, ychange, FALSE);
+ if (parent->height != oldparent->height ||
+ parent->width != oldparent->width)
+ gui_window_resize(window, parent->width, parent->height);
}
static MAIN_WINDOW_REC *mainwindow_find_unsticky(void)
@@ -772,7 +214,7 @@ static MAIN_WINDOW_REC *mainwindow_find_unsticky(void)
return active_mainwin;
}
-static void signal_window_changed(WINDOW_REC *window)
+static void signal_window_changed(WINDOW_REC *window, WINDOW_REC *old_window)
{
MAIN_WINDOW_REC *parent;
@@ -802,442 +244,13 @@ static void signal_window_changed(WINDOW_REC *window)
}
active_mainwin->active = window;
- screen_refresh_freeze();
- window_update_prompt();
- gui_window_redraw(window);
- screen_refresh_thaw();
-}
-
-void gui_window_line2text(LINE_REC *line, int coloring, GString *str)
-{
- unsigned char cmd;
- char *ptr, *tmp;
-
- g_return_if_fail(line != NULL);
- g_return_if_fail(str != NULL);
-
- g_string_truncate(str, 0);
-
- for (ptr = line->text;;) {
- if (*ptr != 0) {
- g_string_append_c(str, *ptr);
- ptr++;
- continue;
- }
-
- ptr++;
- cmd = (unsigned char) *ptr;
- ptr++;
-
- if (cmd == LINE_CMD_EOL || cmd == LINE_CMD_FORMAT) {
- /* end of line */
- break;
- }
-
- if (cmd == LINE_CMD_CONTINUE) {
- /* line continues in another address.. */
- memcpy(&tmp, ptr, sizeof(char *));
- ptr = tmp;
- continue;
- }
-
- if (!coloring) {
- /* no colors, skip coloring commands */
- continue;
- }
-
- if ((cmd & 0x80) == 0) {
- /* set color */
- g_string_sprintfa(str, "\004%c%c",
- (cmd & 0x0f)+'0',
- ((cmd & 0xf0) >> 4)+'0');
- } else switch (cmd) {
- case LINE_CMD_UNDERLINE:
- g_string_append_c(str, 31);
- break;
- case LINE_CMD_COLOR0:
- g_string_sprintfa(str, "\004%c%c",
- '0', FORMAT_COLOR_NOCHANGE);
- break;
- case LINE_CMD_COLOR8:
- g_string_sprintfa(str, "\004%c%c",
- '8', FORMAT_COLOR_NOCHANGE);
- break;
- case LINE_CMD_BLINK:
- g_string_sprintfa(str, "\004%c", FORMAT_STYLE_BLINK);
- break;
- case LINE_CMD_INDENT:
- break;
- }
- }
-}
-
-GList *gui_window_find_text(WINDOW_REC *window, GList *startline,
- int level, int nolevel, const char *text,
- int regexp, int fullword, int case_sensitive)
-{
-#ifdef HAVE_REGEX_H
- regex_t preg;
-#endif
- GList *tmp;
- GList *matches;
- GString *str;
-
- g_return_val_if_fail(window != NULL, NULL);
- g_return_val_if_fail(text != NULL, NULL);
-
- if (regexp) {
-#ifdef HAVE_REGEX_H
- int flags = REG_EXTENDED | REG_NOSUB |
- (case_sensitive ? 0 : REG_ICASE);
- if (regcomp(&preg, text, flags) != 0)
- return NULL;
-#else
- return NULL;
-#endif
- }
-
- matches = NULL;
- str = g_string_new(NULL);
-
- if (startline == NULL)
- startline = WINDOW_GUI(window)->lines;
-
- for (tmp = startline; tmp != NULL; tmp = tmp->next) {
- LINE_REC *rec = tmp->data;
-
- if ((rec->level & level) == 0 || (rec->level & nolevel) != 0)
- continue;
-
- if (*text == '\0') {
- /* no search word, everything matches */
- matches = g_list_append(matches, rec);
- continue;
- }
-
- gui_window_line2text(rec, FALSE, str);
-
- if (
-#ifdef HAVE_REGEX_H
- regexp ? regexec(&preg, str->str, 0, NULL, 0) == 0 :
-#endif
- fullword ? strstr_full_case(str->str, text,
- !case_sensitive) != NULL :
- case_sensitive ? strstr(str->str, text) != NULL :
- stristr(str->str, text) != NULL) {
- /* matched */
- matches = g_list_append(matches, rec);
- }
- }
-#ifdef HAVE_REGEX_H
- if (regexp) regfree(&preg);
-#endif
- g_string_free(str, TRUE);
- return matches;
-}
-
-static void gui_update_bottom_startline(GUI_WINDOW_REC *gui)
-{
- GList *tmp;
- int linecount, total;
-
- if (gui->empty_linecount == 0) {
- /* no empty lines in screen, don't try to keep the old
- bottom startline */
- gui->bottom_startline = NULL;
- }
-
- total = 0;
- for (tmp = g_list_last(gui->lines); tmp != NULL; tmp = tmp->prev) {
- LINE_REC *line = tmp->data;
-
- linecount = gui_window_get_linecount(gui, line);
- if (tmp == gui->bottom_startline) {
- /* keep the old one, make sure that subline is ok */
- if (gui->bottom_subline > linecount+1)
- gui->bottom_subline = linecount+1;
- gui->empty_linecount = gui->parent->lines-total-
- gui->bottom_subline;
- return;
- }
-
- total += linecount;
- if (total >= gui->parent->lines) {
- gui->bottom_startline = tmp;
- gui->bottom_subline = total-gui->parent->lines;
- gui->empty_linecount = 0;
- return;
- }
- }
-
- /* not enough lines so we must be at the beginning of the window */
- gui->bottom_startline = gui->lines;
- gui->bottom_subline = 0;
- gui->empty_linecount = gui->parent->lines-total;
-}
-
-static void gui_window_horiz_resize(WINDOW_REC *window)
-{
- GUI_WINDOW_REC *gui;
- int linecount, diff;
-
- gui = WINDOW_GUI(window);
- if (gui->lines == NULL) return;
-
- g_hash_table_foreach_remove(gui->line_cache, (GHRFunc) line_cache_destroy, NULL);
-
- linecount = gui_window_get_linecount(gui, gui->startline->data);
- if (gui->subline > linecount+1)
- gui->subline = linecount+1;
-
- gui_window_update_ypos(gui);
- gui_update_bottom_startline(gui);
-
- if (gui->bottom) {
- if (g_list_find(gui->startline,
- gui->bottom_startline->data) == NULL ||
- (gui->startline == gui->bottom_startline &&
- gui->subline > gui->bottom_subline)) {
- gui->startline = gui->bottom_startline;
- gui->subline = gui->bottom_subline;
- gui_window_update_ypos(gui);
- } else {
- diff = gui->ypos+1-gui->parent->lines;
- if (diff > 0) gui_window_scroll(window, diff);
- }
- }
-}
-
-void gui_window_resize(WINDOW_REC *window, int ychange, int xchange)
-{
- GUI_WINDOW_REC *gui;
-
- gui = WINDOW_GUI(window);
-
- window->width = COLS;
- window->height = gui->parent->lines;
-
- if (xchange) {
- /* window width changed, we'll need to recalculate a
- few things.. */
- gui_window_horiz_resize(window);
- return;
- }
-
- if (ychange < 0 && gui->empty_linecount > 0) {
- /* empty space at the bottom of the screen - just eat it. */
- gui->empty_linecount += ychange;
- if (gui->empty_linecount >= 0)
- ychange = 0;
- else {
- ychange = gui->empty_linecount;
- gui->empty_linecount = 0;
- }
- }
-
- if (ychange > 0 && gui->bottom && gui->empty_linecount > 0)
- gui->empty_linecount += ychange;
- else {
- gui_window_update_bottom(WINDOW_GUI(window), -ychange);
- gui_window_scroll(window, -ychange);
-
- if (ychange > 0 && gui->bottom &&
- gui->ypos+1 < gui->parent->lines) {
- gui->empty_linecount += gui->parent->lines-gui->ypos-1;
- }
- }
-}
-
-static int window_remove_linecache(void *key, LINE_CACHE_REC *cache,
- time_t *now)
-{
- if (cache->last_access+LINE_CACHE_KEEP_TIME > *now)
- return FALSE;
-
- line_cache_destroy(NULL, cache);
- return TRUE;
-}
-
-static int sig_check_linecache(void)
-{
- GSList *tmp;
- time_t now;
-
- now = time(NULL);
- for (tmp = windows; tmp != NULL; tmp = tmp->next) {
- WINDOW_REC *rec = tmp->data;
-
- g_hash_table_foreach_remove(WINDOW_GUI(rec)->line_cache,
- (GHRFunc) window_remove_linecache,
- &now);
- }
- return 1;
-}
-
-static char *line_read_format(unsigned const char **text)
-{
- GString *str;
- char *ret;
-
- str = g_string_new(NULL);
- for (;;) {
- if (**text == '\0') {
- if ((*text)[1] == LINE_CMD_EOL) {
- /* leave text at \0<eof> */
- break;
- }
- if ((*text)[1] == LINE_CMD_FORMAT_CONT) {
- /* leave text at \0<format_cont> */
- break;
- }
- (*text)++;
-
- if (**text == LINE_CMD_FORMAT) {
- /* move text to start after \0<format> */
- (*text)++;
- break;
- }
-
- if (**text == LINE_CMD_CONTINUE) {
- unsigned char *tmp;
-
- memcpy(&tmp, (*text)+1, sizeof(char *));
- *text = tmp;
- continue;
- } else if (**text & 0x80)
- (*text)++;
- continue;
- }
-
- g_string_append_c(str, (char) **text);
- (*text)++;
- }
-
- ret = str->str;
- g_string_free(str, FALSE);
- return ret;
-}
-
-static char *gui_window_line_get_format(WINDOW_REC *window, LINE_REC *line,
- GString *raw)
-{
- const unsigned char *text;
- char *module, *format_name, *args[MAX_FORMAT_PARAMS], *ret;
- TEXT_DEST_REC dest;
- int formatnum, argcount;
-
- text = (const unsigned char *) line->text;
-
- /* skip the beginning of the line until we find the format */
- g_free(line_read_format(&text));
- if (text[1] == LINE_CMD_FORMAT_CONT) {
- g_string_append_c(raw, '\0');
- g_string_append_c(raw, (char)LINE_CMD_FORMAT_CONT);
- return NULL;
- }
-
- /* read format information */
- module = line_read_format(&text);
- format_name = line_read_format(&text);
+ if (old_window != NULL && !is_window_visible(old_window))
+ textbuffer_view_set_window(WINDOW_GUI(old_window)->view, NULL);
- if (raw != NULL) {
- g_string_append_c(raw, '\0');
- g_string_append_c(raw, (char)LINE_CMD_FORMAT);
+ textbuffer_view_set_window(WINDOW_GUI(window)->view,
+ parent->curses_win);
- g_string_append(raw, module);
-
- g_string_append_c(raw, '\0');
- g_string_append_c(raw, (char)LINE_CMD_FORMAT);
-
- g_string_append(raw, format_name);
- }
-
- formatnum = format_find_tag(module, format_name);
- if (formatnum == -1)
- ret = NULL;
- else {
- argcount = 0;
- memset(args, 0, sizeof(args));
- while (*text != '\0' || text[1] != LINE_CMD_EOL) {
- args[argcount] = line_read_format(&text);
- if (raw != NULL) {
- g_string_append_c(raw, '\0');
- g_string_append_c(raw,
- (char)LINE_CMD_FORMAT);
-
- g_string_append(raw, args[argcount]);
- }
- argcount++;
- }
-
- /* get the format text */
- format_create_dest(&dest, NULL, NULL, line->level, window);
- ret = format_get_text_theme_charargs(current_theme,
- module, &dest,
- formatnum, args);
- while (argcount > 0)
- g_free(args[--argcount]);
- }
-
- g_free(module);
- g_free(format_name);
-
- return ret;
-}
-
-void gui_window_reformat_line(WINDOW_REC *window, LINE_REC *line)
-{
- GUI_WINDOW_REC *gui;
- TEXT_DEST_REC dest;
- GString *raw;
- char *str, *tmp, *prestr, *linestart, *leveltag;
-
- gui = WINDOW_GUI(window);
-
- raw = g_string_new(NULL);
- str = gui_window_line_get_format(window, line, raw);
-
- if (str == NULL && raw->len == 2 &&
- raw->str[1] == (char)LINE_CMD_FORMAT_CONT) {
- /* multiline format, format explained in one the
- following lines. remove this line. */
- gui_window_line_remove(window, line, FALSE);
- } else if (str != NULL) {
- /* FIXME: ugly ugly .. and this can't handle
- non-formatted lines.. */
- g_string_append_c(raw, '\0');
- g_string_append_c(raw, (char)LINE_CMD_EOL);
-
- gui_window_line_text_free(gui, line);
-
- gui->temp_line = line;
- gui->temp_line->text = gui->cur_text->buffer+gui->cur_text->pos;
- gui->cur_text->lines++;
- gui->eol_marked = FALSE;
-
- format_create_dest(&dest, NULL, NULL, line->level, window);
-
- linestart = format_get_line_start(current_theme, &dest, line->time);
- leveltag = format_get_level_tag(current_theme, &dest);
-
- prestr = g_strconcat(linestart == NULL ? "" : linestart,
- leveltag, NULL);
- g_free_not_null(linestart);
- g_free_not_null(leveltag);
-
- tmp = format_add_linestart(str, prestr);
- g_free(str);
- g_free(prestr);
-
- format_send_to_gui(&dest, tmp);
- g_free(tmp);
-
- gui_window_line_append(gui, raw->str, raw->len);
-
- gui->eol_marked = TRUE;
- gui->temp_line = NULL;
- }
- g_string_free(raw, TRUE);
+ window_update_prompt();
}
static void sig_check_window_update(WINDOW_REC *window)
@@ -1248,6 +261,8 @@ static void sig_check_window_update(WINDOW_REC *window)
static void read_settings(void)
{
+ GSList *tmp;
+
SIGNAL_FUNC funcs[] = {
(SIGNAL_FUNC) window_update_prompt,
(SIGNAL_FUNC) window_update_prompt_server,
@@ -1255,8 +270,6 @@ static void read_settings(void)
(SIGNAL_FUNC) window_update_prompt_window_item
};
- default_indent_pos = settings_get_int("indent");
-
if (prompt != NULL) {
special_vars_remove_signals(prompt, 4, funcs);
special_vars_remove_signals(prompt_window, 4, funcs);
@@ -1266,6 +279,13 @@ static void read_settings(void)
prompt = g_strdup(settings_get_str("prompt"));
prompt_window = g_strdup(settings_get_str("prompt_window"));
+ for (tmp = windows; tmp != NULL; tmp = tmp->next) {
+ WINDOW_REC *rec = tmp->data;
+
+ textbuffer_view_set_default_indent(WINDOW_GUI(rec)->view,
+ settings_get_int("indent"));
+ }
+
special_vars_add_signals(prompt, 4, funcs);
special_vars_add_signals(prompt_window, 4, funcs);
@@ -1281,7 +301,6 @@ void gui_windows_init(void)
prompt = NULL; prompt_window = NULL;
window_create_override = -1;
- linecache_tag = g_timeout_add(LINE_CACHE_CHECK_TIME, (GSourceFunc) sig_check_linecache, NULL);
read_settings();
signal_add("gui window create override", (SIGNAL_FUNC) sig_window_create_override);
@@ -1294,7 +313,6 @@ void gui_windows_init(void)
void gui_windows_deinit(void)
{
- g_source_remove(linecache_tag);
g_free_not_null(prompt);
g_free_not_null(prompt_window);