diff options
author | Timo Sirainen <cras@irssi.org> | 2000-07-26 23:29:34 +0000 |
---|---|---|
committer | cras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2000-07-26 23:29:34 +0000 |
commit | 091292e079139480315f5cebed6be603e6505618 (patch) | |
tree | 2d2b73a02850be6bf3903657e483fee0c2c4f8f1 /src/fe-text/mainwindows.c | |
parent | 9bf99c0aa603da62bce949ddc9cbca2cbd392dee (diff) | |
download | irssi-091292e079139480315f5cebed6be603e6505618.zip |
Mainwindows use now real curses WINDOWs, this should fix irssi with some
curseses that didn't like setscrreg() (solaris 8).
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@542 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-text/mainwindows.c')
-rw-r--r-- | src/fe-text/mainwindows.c | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/src/fe-text/mainwindows.c b/src/fe-text/mainwindows.c index 1ca9cba5..9b8f29af 100644 --- a/src/fe-text/mainwindows.c +++ b/src/fe-text/mainwindows.c @@ -32,9 +32,6 @@ #define WINDOW_MIN_SIZE 2 #define NEW_WINDOW_SIZE (WINDOW_MIN_SIZE + 1) -#define window_size(window) \ - ((window)->last_line - (window)->first_line+1) - GSList *mainwindows; MAIN_WINDOW_REC *active_mainwin; @@ -50,7 +47,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 = window_size(rec); + space = rec->lines; if (space >= WINDOW_MIN_SIZE+NEW_WINDOW_SIZE && space > biggest) { biggest = space; biggest_rec = rec; @@ -60,12 +57,23 @@ static MAIN_WINDOW_REC *find_window_with_room(void) return biggest_rec; } +static void create_curses_window(MAIN_WINDOW_REC *window) +{ + window->curses_win = + subwin(stdscr, window->lines, COLS, window->first_line, 0); + scrollok(window->curses_win, TRUE); +} + static void mainwindow_resize(MAIN_WINDOW_REC *window, int ychange, int xchange) { GSList *tmp; if (ychange == 0 && !xchange) return; + window->lines = window->last_line-window->first_line+1; + delwin(window->curses_win); + create_curses_window(window); + for (tmp = windows; tmp != NULL; tmp = tmp->next) { WINDOW_REC *rec = tmp->data; @@ -89,21 +97,27 @@ MAIN_WINDOW_REC *mainwindow_create(void) rec->first_line = reserved_up; rec->last_line = LINES-1-reserved_down-rec->statusbar_lines; + rec->lines = rec->last_line-rec->first_line+1; } else { parent = WINDOW_GUI(active_win)->parent; - if (window_size(parent) < WINDOW_MIN_SIZE+NEW_WINDOW_SIZE) + if (parent->lines < WINDOW_MIN_SIZE+NEW_WINDOW_SIZE) parent = find_window_with_room(); if (parent == NULL) return NULL; /* not enough space */ - space = (window_size(parent)-parent->statusbar_lines)/2; + space = (parent->lines-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; parent->first_line = rec->last_line+1+rec->statusbar_lines; + parent->lines = parent->last_line-parent->first_line+1; + delwin(parent->curses_win); + create_curses_window(parent); mainwindow_resize(parent, -space-1, FALSE); } + create_curses_window(rec); mainwindows = g_slist_append(mainwindows, rec); signal_emit("mainwindow created", 1, rec); return rec; @@ -185,6 +199,8 @@ void mainwindow_destroy(MAIN_WINDOW_REC *window) { g_return_if_fail(window != NULL); + delwin(window->curses_win); + mainwindows = g_slist_remove(mainwindows, window); signal_emit("mainwindow destroyed", 1, window); @@ -247,7 +263,7 @@ 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 = window_size(rec); + space = rec->lines; if (ychange == 0 || space <= 0) { if (moved > 0) { rec->first_line -= moved; @@ -276,7 +292,7 @@ static void mainwindows_resize_smaller(int ychange, int xchange) for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space += window_size(rec)-WINDOW_MIN_SIZE; + space += rec->lines-WINDOW_MIN_SIZE; } if (space < -ychange) { @@ -290,7 +306,7 @@ static void mainwindows_resize_smaller(int ychange, int xchange) for (tmp = sorted; tmp != NULL && ychange < 0; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space = window_size(rec)-WINDOW_MIN_SIZE; + space = rec->lines-WINDOW_MIN_SIZE; if (space <= 0) { rec->first_line += ychange; rec->last_line += ychange; @@ -319,7 +335,7 @@ static void mainwindows_resize_bigger(int ychange, int xchange) for (tmp = sorted; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - space = window_size(rec)-WINDOW_MIN_SIZE; + space = rec->lines-WINDOW_MIN_SIZE; if (ychange == 0 || (space >= 0 && tmp->next != NULL)) { if (moved > 0) { rec->first_line += moved; @@ -422,13 +438,13 @@ static void cmd_window_grow(const char *data) /* shrink lower window */ shrink_win = mainwindows_find_lower(window->last_line); - if (shrink_win != NULL && window_size(shrink_win)-count >= WINDOW_MIN_SIZE) { + if (shrink_win != NULL && shrink_win->lines-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 && window_size(shrink_win)-count >= WINDOW_MIN_SIZE) { + if (shrink_win != NULL && shrink_win->lines-count >= WINDOW_MIN_SIZE) { window->first_line -= count; shrink_win->last_line -= count; } else { @@ -449,7 +465,7 @@ static void cmd_window_shrink(const char *data) count = *data == '\0' ? 1 : atoi(data); window = WINDOW_GUI(active_win)->parent; - if (window_size(window)-count < WINDOW_MIN_SIZE) { + if (window->lines-count < WINDOW_MIN_SIZE) { printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, IRCTXT_WINDOW_TOO_SMALL); return; } @@ -478,7 +494,7 @@ static void cmd_window_size(const char *data) if (!is_numeric(data, 0)) return; size = atoi(data); - size -= window_size(WINDOW_GUI(active_win)->parent); + size -= WINDOW_GUI(active_win)->parent->lines; if (size == 0) return; ltoa(sizestr, size < 0 ? -size : size); @@ -507,7 +523,7 @@ static void cmd_window_balance(void) for (tmp = sorted; tmp != NULL; tmp = tmp->next) { MAIN_WINDOW_REC *rec = tmp->data; - old_size = window_size(rec); + old_size = rec->lines; rec->first_line = last_line+1; rec->last_line = rec->first_line-1 + unit_size - rec->statusbar_lines; @@ -518,7 +534,7 @@ static void cmd_window_balance(void) } last_line = rec->last_line + rec->statusbar_lines; - mainwindow_resize(rec, window_size(rec)-old_size, FALSE); + mainwindow_resize(rec, rec->lines-old_size, FALSE); } g_slist_free(sorted); |