diff options
author | Timo Sirainen <cras@irssi.org> | 2001-04-14 22:24:56 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2001-04-14 22:24:56 +0000 |
commit | adb7eced395ba88816a365768fee56e04a0a0ec5 (patch) | |
tree | d4eedd91f292418468acf3eb68aef9bdfe4d3563 /src/fe-text/mainwindows.c | |
parent | d98fddd79647e9387ecbf674f317b02f4b78d7e2 (diff) | |
download | irssi-adb7eced395ba88816a365768fee56e04a0a0ec5.zip |
Rewrote text buffer handling in windows - try #3.
/SET scrollback_save_formats + /SB REDRAW is broken currently. There's some
other minor things that might need to be changed.
This time it allows the same window to be visible multiple times in screen,
like you could make a new split window where to scroll back and find
something while still seeing the new messages at the other window, this
however doesn't work yet but it should be quite easy to make it :)
I've tested that pretty much everything should work with this, new lines can
be added at any position and lines can be removed from any position and
screen should be updated properly. Screen resizing should also work
perfectly now (maybe it did previously too, not sure) and hopefully now we
won't see any of those ugly strange bugs some people were having. Also this
time the same code isn't written 2-3 times to do some specific thing, like
scrolling has now only one view_scroll() function instead of the 3 separate
functions it used to have :)
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1442 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-text/mainwindows.c')
-rw-r--r-- | src/fe-text/mainwindows.c | 146 |
1 files changed, 82 insertions, 64 deletions
diff --git a/src/fe-text/mainwindows.c b/src/fe-text/mainwindows.c index 479df26b..751d9d9e 100644 --- a/src/fe-text/mainwindows.c +++ b/src/fe-text/mainwindows.c @@ -36,6 +36,7 @@ GSList *mainwindows; MAIN_WINDOW_REC *active_mainwin; static int reserved_up, reserved_down; +static int screen_width, screen_height; static MAIN_WINDOW_REC *find_window_with_room(void) { @@ -47,7 +48,7 @@ static MAIN_WINDOW_REC *find_window_with_room(void) for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space = rec->lines; + space = rec->height; if (space >= WINDOW_MIN_SIZE+NEW_WINDOW_SIZE && space > biggest) { biggest = space; biggest_rec = rec; @@ -60,21 +61,24 @@ static MAIN_WINDOW_REC *find_window_with_room(void) #ifdef USE_CURSES_WINDOWS static void create_curses_window(MAIN_WINDOW_REC *window) { - window->curses_win = newwin(window->lines, COLS, window->first_line, 0); + window->curses_win = newwin(window->height, window->width, + window->first_line, 0); idlok(window->curses_win, 1); } #endif -static void mainwindow_resize(MAIN_WINDOW_REC *window, int ychange, int xchange) +static void mainwindow_resize(MAIN_WINDOW_REC *window, int xdiff, int ydiff) { GSList *tmp; - if (ychange == 0 && !xchange) return; + if (xdiff == 0 && ydiff == 0) + return; - window->lines = window->last_line-window->first_line+1; + window->width += xdiff; + window->height = window->last_line-window->first_line+1; #ifdef USE_CURSES_WINDOWS #ifdef HAVE_CURSES_WRESIZE - wresize(window->curses_win, window->lines, COLS); + wresize(window->curses_win, window->height, window->width); mvwin(window->curses_win, window->first_line, 0); #else delwin(window->curses_win); @@ -87,10 +91,11 @@ static void mainwindow_resize(MAIN_WINDOW_REC *window, int ychange, int xchange) if (rec->gui_data != NULL && WINDOW_GUI(rec)->parent == window) - gui_window_resize(rec, ychange, xchange); + gui_window_resize(rec, window->width, window->height); } - gui_window_redraw(window->active); + textbuffer_view_set_window(WINDOW_GUI(window->active)->view, + window->curses_win); signal_emit("mainwindow resized", 1, window); } @@ -104,7 +109,8 @@ void mainwindows_recreate(void) #ifdef USE_CURSES_WINDOWS create_curses_window(rec); #endif - gui_window_redraw(rec->active); + textbuffer_view_set_window(WINDOW_GUI(rec->active)->view, + rec->curses_win); } } @@ -120,27 +126,29 @@ MAIN_WINDOW_REC *mainwindow_create(void) active_mainwin = rec; rec->first_line = reserved_up; - rec->last_line = LINES-1-reserved_down-rec->statusbar_lines; - rec->lines = rec->last_line-rec->first_line+1; + rec->last_line = screen_height-1 - + reserved_down-rec->statusbar_lines; + rec->width = screen_width; + rec->height = rec->last_line-rec->first_line+1; } else { parent = WINDOW_GUI(active_win)->parent; - if (parent->lines < WINDOW_MIN_SIZE+NEW_WINDOW_SIZE) + if (parent->height < WINDOW_MIN_SIZE+NEW_WINDOW_SIZE) parent = find_window_with_room(); if (parent == NULL) return NULL; /* not enough space */ - space = (parent->lines-parent->statusbar_lines)/2; + space = (parent->height-parent->statusbar_lines)/2; rec->first_line = parent->first_line; rec->last_line = rec->first_line + space-rec->statusbar_lines; - rec->lines = rec->last_line-rec->first_line+1; + rec->height = rec->last_line-rec->first_line+1; parent->first_line = rec->last_line+1+rec->statusbar_lines; - parent->lines = parent->last_line-parent->first_line+1; + parent->height = parent->last_line-parent->first_line+1; - mainwindow_resize(parent, -space-1, FALSE); + mainwindow_resize(parent, 0, -space-1); } #ifdef USE_CURSES_WINDOWS - rec->curses_win = newwin(rec->lines, COLS, rec->first_line, 0); + rec->curses_win = newwin(rec->height, rec->width, rec->first_line, 0); refresh(); #endif @@ -196,14 +204,14 @@ static void mainwindows_add_space(int first_line, int last_line) rec = mainwindows_find_lower(last_line); if (rec != NULL) { rec->first_line = first_line; - mainwindow_resize(rec, size, FALSE); + mainwindow_resize(rec, 0, size); return; } rec = mainwindows_find_upper(first_line); if (rec != NULL) { rec->last_line = last_line-rec->statusbar_lines; - mainwindow_resize(rec, size, FALSE); + mainwindow_resize(rec, 0, size); } } @@ -280,7 +288,7 @@ GSList *mainwindows_get_sorted(int reverse) return list; } -static void mainwindows_resize_too_small(int ychange, int xchange) +static void mainwindows_resize_too_small(int xdiff, int ydiff) { GSList *sorted, *tmp; int space, moved; @@ -291,8 +299,8 @@ static void mainwindows_resize_too_small(int ychange, int xchange) for (tmp = sorted; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space = rec->lines; - if (ychange == 0 || space <= 0) { + space = rec->height; + if (ydiff == 0 || space <= 0) { if (moved > 0) { rec->first_line -= moved; rec->last_line -= moved; @@ -301,17 +309,17 @@ static void mainwindows_resize_too_small(int ychange, int xchange) continue; } - if (space > -ychange) space = -ychange; - ychange += space; + if (space > -ydiff) space = -ydiff; + ydiff += space; rec->first_line -= moved; moved += space; rec->last_line -= space; - mainwindow_resize(rec, -space, xchange); + mainwindow_resize(rec, xdiff, -space); } g_slist_free(sorted); } -static void mainwindows_resize_smaller(int ychange, int xchange) +static void mainwindows_resize_smaller(int xdiff, int ydiff) { GSList *sorted, *tmp; int space; @@ -320,40 +328,40 @@ static void mainwindows_resize_smaller(int ychange, int xchange) for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space += rec->lines-WINDOW_MIN_SIZE; + space += rec->height-WINDOW_MIN_SIZE; } - if (space < -ychange) { + if (space < -ydiff) { /* not enough space, use different algorithm */ - mainwindows_resize_too_small(ychange, xchange); + mainwindows_resize_too_small(xdiff, ydiff); return; } /* resize windows that have space */ sorted = mainwindows_get_sorted(TRUE); - for (tmp = sorted; tmp != NULL && ychange < 0; tmp = tmp->next) { + for (tmp = sorted; tmp != NULL && ydiff < 0; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space = rec->lines-WINDOW_MIN_SIZE; + space = rec->height-WINDOW_MIN_SIZE; if (space <= 0) { - rec->first_line += ychange; - rec->last_line += ychange; + rec->first_line += ydiff; + rec->last_line += ydiff; signal_emit("mainwindow moved", 1, rec); continue; } if (space <= 0) space = 1; - if (space > -ychange) space = -ychange; - rec->last_line += ychange; - ychange += space; - rec->first_line += ychange; + if (space > -ydiff) space = -ydiff; + rec->last_line += ydiff; + ydiff += space; + rec->first_line += ydiff; - mainwindow_resize(rec, -space, xchange); + mainwindow_resize(rec, xdiff, -space); } g_slist_free(sorted); } -static void mainwindows_resize_bigger(int ychange, int xchange) +static void mainwindows_resize_bigger(int xdiff, int ydiff) { GSList *sorted, *tmp; int moved, space; @@ -363,8 +371,8 @@ static void mainwindows_resize_bigger(int ychange, int xchange) for (tmp = sorted; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space = rec->lines-WINDOW_MIN_SIZE; - if (ychange == 0 || (space >= 0 && tmp->next != NULL)) { + space = rec->height-WINDOW_MIN_SIZE; + if (ydiff == 0 || (space >= 0 && tmp->next != NULL)) { if (moved > 0) { rec->first_line += moved; rec->last_line += moved; @@ -376,41 +384,48 @@ static void mainwindows_resize_bigger(int ychange, int xchange) if (space < 0 && tmp->next != NULL) { /* space below minimum */ space = -space; - if (space > ychange) space = ychange; + if (space > ydiff) space = ydiff; } else { /* lowest window - give all the extra space for it */ - space = ychange; + space = ydiff; } - ychange -= space; + ydiff -= space; rec->first_line += moved; moved += space; rec->last_line += moved; - mainwindow_resize(rec, space, xchange); + mainwindow_resize(rec, xdiff, space); } g_slist_free(sorted); } -void mainwindows_resize_horiz(int xchange) +void mainwindows_resize_horiz(int xdiff) { GSList *tmp; for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - mainwindow_resize(rec, 0, xchange); + mainwindow_resize(rec, xdiff, 0); } } -void mainwindows_resize(int ychange, int xchange) +void mainwindows_resize(int width, int height) { + int xdiff, ydiff; + + xdiff = width-screen_width; + ydiff = height-screen_height; + screen_width = width; + screen_height = height; + screen_refresh_freeze(); - if (ychange < 0) - mainwindows_resize_smaller(ychange, xchange); - else if (ychange > 0) - mainwindows_resize_bigger(ychange, xchange); - else if (xchange != 0) - mainwindows_resize_horiz(xchange); + if (ydiff < 0) + mainwindows_resize_smaller(xdiff, ydiff); + else if (ydiff > 0) + mainwindows_resize_bigger(xdiff, ydiff); + else if (xdiff != 0) + mainwindows_resize_horiz(xdiff); irssi_redraw(); screen_refresh_thaw(); @@ -435,7 +450,7 @@ int mainwindows_reserve_lines(int count, int up) ret = reserved_down; reserved_down += count; - window = mainwindows_find_upper(LINES); + window = mainwindows_find_upper(screen_height); if (window != NULL) window->last_line -= count; } @@ -462,14 +477,14 @@ static int mainwindow_grow(MAIN_WINDOW_REC *window, int count) /* shrink lower window */ shrink_win = mainwindows_find_lower(window->last_line); - if (shrink_win != NULL && shrink_win->lines-count >= WINDOW_MIN_SIZE) { + if (shrink_win != NULL && shrink_win->height-count >= WINDOW_MIN_SIZE) { window->last_line += count; shrink_win->first_line += count; } else { /* shrink upper window */ shrink_win = mainwindows_find_upper(window->first_line); if (shrink_win == NULL || - shrink_win->lines-count < WINDOW_MIN_SIZE) + shrink_win->height-count < WINDOW_MIN_SIZE) return FALSE; window->first_line -= count; @@ -484,7 +499,7 @@ static int mainwindow_shrink(MAIN_WINDOW_REC *window, int count) { MAIN_WINDOW_REC *grow_win; - if (window->lines-count < WINDOW_MIN_SIZE) + if (window->height-count < WINDOW_MIN_SIZE) return FALSE; grow_win = mainwindows_find_lower(window->last_line); @@ -505,7 +520,7 @@ static int mainwindow_shrink(MAIN_WINDOW_REC *window, int count) void mainwindow_set_size(MAIN_WINDOW_REC *window, int size) { - size -= window->lines; + size -= window->height; if (size < 0) mainwindow_shrink(window, size); else @@ -551,7 +566,7 @@ static void cmd_window_size(const char *data) if (!is_numeric(data, 0)) return; size = atoi(data); - size -= WINDOW_GUI(active_win)->parent->lines; + size -= WINDOW_GUI(active_win)->parent->height; if (size == 0) return; ltoa(sizestr, size < 0 ? -size : size); @@ -571,7 +586,7 @@ static void cmd_window_balance(void) windows = g_slist_length(mainwindows); if (windows == 1) return; - avail_size = LINES-reserved_up-reserved_down; + avail_size = screen_height - reserved_up-reserved_down; unit_size = avail_size/windows; bigger_units = avail_size%windows; @@ -580,11 +595,11 @@ static void cmd_window_balance(void) for (tmp = sorted; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - old_size = rec->lines; + old_size = rec->height; rec->first_line = last_line+1; rec->last_line = rec->first_line-1 + unit_size - rec->statusbar_lines; - rec->lines = rec->last_line-rec->first_line+1; + rec->height = rec->last_line-rec->first_line+1; if (bigger_units > 0) { rec->last_line++; @@ -592,7 +607,7 @@ static void cmd_window_balance(void) } last_line = rec->last_line + rec->statusbar_lines; - mainwindow_resize(rec, rec->lines-old_size, FALSE); + mainwindow_resize(rec, rec->height-old_size, FALSE); } g_slist_free(sorted); @@ -847,6 +862,9 @@ static void cmd_window_stick(const char *data) void mainwindows_init(void) { + screen_width = COLS; + screen_height = LINES; + mainwindows = NULL; active_mainwin = NULL; reserved_up = reserved_down = 0; |