diff options
author | Timo Sirainen <cras@irssi.org> | 2000-05-28 22:53:35 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2000-05-28 22:53:35 +0000 |
commit | 8c06612a28a3bbe269565dd8a3cb07751719888e (patch) | |
tree | 075ca8fbfa731d9d7169218128fbdc2a7815e64c /src/fe-text | |
parent | 34c127babe34f5ac6d1876bdea809049d2b88af8 (diff) | |
download | irssi-8c06612a28a3bbe269565dd8a3cb07751719888e.zip |
text buffer fixes
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@247 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-text')
-rw-r--r-- | src/fe-text/gui-printtext.c | 3 | ||||
-rw-r--r-- | src/fe-text/gui-windows.c | 81 |
2 files changed, 57 insertions, 27 deletions
diff --git a/src/fe-text/gui-printtext.c b/src/fe-text/gui-printtext.c index 85024c90..366a1a89 100644 --- a/src/fe-text/gui-printtext.c +++ b/src/fe-text/gui-printtext.c @@ -82,6 +82,9 @@ static TEXT_CHUNK_REC *create_text_chunk(GUI_WINDOW_REC *gui) ptr = rec->buffer; memcpy(buffer, &ptr, sizeof(char *)); + } else { + /* just to be safe */ + mark_temp_eol(rec); } gui->cur_text = rec; diff --git a/src/fe-text/gui-windows.c b/src/fe-text/gui-windows.c index 6c949886..5e2cf838 100644 --- a/src/fe-text/gui-windows.c +++ b/src/fe-text/gui-windows.c @@ -36,6 +36,8 @@ #define DEFAULT_INDENT_POS 10 +#define DEBUG_TEXTBUFFER + static int window_create_override; static GUI_WINDOW_REC *gui_window_init(WINDOW_REC *window, MAIN_WINDOW_REC *parent) @@ -178,34 +180,58 @@ static int gui_window_update_bottom(GUI_WINDOW_REC *gui, int lines) return last_linecount; } +#define is_window_bottom(gui) \ + ((gui)->ypos >= -1 && (gui)->ypos <= (gui)->parent->last_line-(gui)->parent->first_line) +/*FIXME: remove ((gui)->startline == (gui)->bottom_startline && \ + (gui)->subline >= (gui)->bottom_subline)*/ + 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); 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.. */ + 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--; - gui->ypos++; - return; + if (!gui->bottom) { + gui->ypos++; + return; + } } - lines = gui_window_update_bottom(gui, 1); - - if (!gui->bottom) { + if ((gui)->ypos >= -1 && (gui)->ypos <= (gui)->parent->last_line-(gui)->parent->first_line-1) { gui->ypos++; return; } - if (gui->subline >= lines) { - /* after screen gets full after /CLEAR we end up here.. */ - gui->startline = gui->startline->next; - gui->subline = 0; - + 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) @@ -219,6 +245,13 @@ void gui_window_newline(GUI_WINDOW_REC *gui, int visible) scroll_up(gui->parent->first_line, gui->parent->last_line); move(gui->parent->last_line, 0); clrtoeol(); } + +#ifdef DEBUG_TEXTBUFFER + if (gui->startline != gui->bottom_startline && + g_list_find(gui->bottom_startline, gui->startline) != NULL) { + g_warning("startline > bottom_startline! SHOULDN'T HAPPEN!"); + } +#endif } static LINE_CACHE_REC *gui_window_line_cache(GUI_WINDOW_REC *gui, LINE_REC *line) @@ -257,7 +290,7 @@ static LINE_CACHE_REC *gui_window_line_cache(GUI_WINDOW_REC *gui, LINE_REC *line color = (color & ATTR_UNDERLINE) | *ptr; } else switch (*ptr) { case LINE_CMD_OVERFLOW: - g_error("buffer overflow!"); + g_error("buffer overflow! (cache)"); case LINE_CMD_UNDERLINE: color ^= ATTR_UNDERLINE; break; @@ -380,7 +413,7 @@ static void single_line_draw(GUI_WINDOW_REC *gui, int ypos, LINE_CACHE_SUB_REC * continue; } else switch ((unsigned char) *text) { case LINE_CMD_OVERFLOW: - g_error("buffer overflow!"); + g_error("buffer overflow! (draw)"); case LINE_CMD_EOL: return; case LINE_CMD_UNDERLINE: @@ -474,10 +507,6 @@ void gui_window_redraw(WINDOW_REC *window) screen_refresh(); } -#define is_window_bottom(gui) \ - ((gui)->startline == (gui)->bottom_startline && \ - (gui)->subline >= (gui)->bottom_subline) - static void gui_window_scroll_up(GUI_WINDOW_REC *gui, int lines) { LINE_REC *line; @@ -511,7 +540,8 @@ static void gui_window_scroll_down(GUI_WINDOW_REC *gui, int lines) LINE_REC *line; int count, linecount; - if (is_window_bottom(gui)) + if (((gui)->startline == (gui)->bottom_startline && \ + (gui)->subline >= (gui)->bottom_subline)) return; count = lines+gui->subline; gui->ypos += gui->subline; @@ -534,6 +564,10 @@ static void gui_window_scroll_down(GUI_WINDOW_REC *gui, int lines) } if (count == 0) { + if (gui->startline->next == NULL) { + gui->subline = linecount; + break; + } gui->startline = gui->startline->next; break; } @@ -544,10 +578,6 @@ static void gui_window_scroll_down(GUI_WINDOW_REC *gui, int lines) break; } - if (gui->startline->next == NULL) { - gui->subline = linecount; - break; - } gui->startline = gui->startline->next; } @@ -683,7 +713,7 @@ GList *gui_window_find_text(WINDOW_REC *window, gchar *text, GList *startline, i else if ((guchar) *ptr == LINE_CMD_EOL) break; else if ((guchar) *ptr == LINE_CMD_OVERFLOW) - g_error("buffer overflow!"); + g_error("buffer overflow! (find)"); } } str[n] = '\0'; @@ -726,11 +756,8 @@ static void gui_window_horiz_resize(WINDOW_REC *window) gui->bottom_startline = gui->startline; gui->bottom_subline = gui->subline; - /* remove the empty lines from the end */ - if (gui->bottom && gui->startline == gui->lines) - gui->empty_linecount = (gui->parent->last_line-gui->parent->first_line); - else - gui->empty_linecount = 0; + gui->bottom = TRUE; + gui->empty_linecount = (gui->parent->last_line-gui->parent->first_line)-gui->ypos; } void gui_window_resize(WINDOW_REC *window, int ychange, int xchange) |