summaryrefslogtreecommitdiff
path: root/src/fe-text
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2000-05-28 22:53:35 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2000-05-28 22:53:35 +0000
commit8c06612a28a3bbe269565dd8a3cb07751719888e (patch)
tree075ca8fbfa731d9d7169218128fbdc2a7815e64c /src/fe-text
parent34c127babe34f5ac6d1876bdea809049d2b88af8 (diff)
downloadirssi-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.c3
-rw-r--r--src/fe-text/gui-windows.c81
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)