diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fe-text/mainwindows.c | 68 | ||||
-rw-r--r-- | src/fe-text/screen.c | 9 | ||||
-rw-r--r-- | src/fe-text/textbuffer-view.c | 4 |
3 files changed, 35 insertions, 46 deletions
diff --git a/src/fe-text/mainwindows.c b/src/fe-text/mainwindows.c index 603f6226..b2f84217 100644 --- a/src/fe-text/mainwindows.c +++ b/src/fe-text/mainwindows.c @@ -93,7 +93,7 @@ static void mainwindow_resize(MAIN_WINDOW_REC *window, int xdiff, int ydiff) window->width += xdiff; window->height = window->last_line-window->first_line+1; - mainwindow_set_screen_size(window); + mainwindow_set_screen_size(window); mainwindow_resize_windows(window); textbuffer_view_set_window(WINDOW_GUI(window->active)->view, @@ -337,59 +337,41 @@ GSList *mainwindows_get_sorted(int reverse) return list; } -static void mainwindows_resize_too_small(int xdiff, int ydiff) -{ - GSList *sorted, *tmp; - int space, moved; - - /* terminal is too small - just take the space whereever possible */ - sorted = mainwindows_get_sorted(FALSE); - moved = 0; - for (tmp = sorted; tmp != NULL; tmp = tmp->next) { - MAIN_WINDOW_REC *rec = tmp->data; - - space = rec->height; - if (ydiff == 0 || space <= 0) { - if (moved > 0) { - rec->first_line -= moved; - rec->last_line -= moved; - signal_emit("mainwindow moved", 1, rec); - } - continue; - } - - if (space > -ydiff) space = -ydiff; - ydiff += space; - rec->first_line -= moved; - moved += space; - rec->last_line -= space; - mainwindow_resize(rec, xdiff, -space); - } - g_slist_free(sorted); -} - static void mainwindows_resize_smaller(int xdiff, int ydiff) { + MAIN_WINDOW_REC *rec; GSList *sorted, *tmp; int space; - space = 0; - for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) { - MAIN_WINDOW_REC *rec = tmp->data; + for (;;) { + sorted = mainwindows_get_sorted(TRUE); + space = 0; + for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) { + rec = tmp->data; + space += MAIN_WINDOW_TEXT_HEIGHT(rec)-WINDOW_MIN_SIZE; + } - space += MAIN_WINDOW_TEXT_HEIGHT(rec)-WINDOW_MIN_SIZE; - } + if (space >= -ydiff) + break; - if (space < -ydiff) { - /* not enough space, use different algorithm */ - mainwindows_resize_too_small(xdiff, ydiff); - return; + rec = sorted->data; + sorted = g_slist_remove(sorted, rec); + + if (sorted != NULL) { + /* terminal is too small - destroy the + uppest window and try again */ + mainwindow_destroy(rec); + } else { + /* only one window in screen.. just force the resize */ + rec->last_line += ydiff; + mainwindow_resize(rec, xdiff, ydiff); + return; + } } /* resize windows that have space */ - sorted = mainwindows_get_sorted(TRUE); for (tmp = sorted; tmp != NULL && ydiff < 0; tmp = tmp->next) { - MAIN_WINDOW_REC *rec = tmp->data; + rec = tmp->data; space = MAIN_WINDOW_TEXT_HEIGHT(rec)-WINDOW_MIN_SIZE; if (space <= 0) { diff --git a/src/fe-text/screen.c b/src/fe-text/screen.c index f04fd905..dff77c64 100644 --- a/src/fe-text/screen.c +++ b/src/fe-text/screen.c @@ -282,8 +282,15 @@ void screen_window_clear(SCREEN_WINDOW *window) void screen_window_move(SCREEN_WINDOW *window, int x, int y, int width, int height) { + /* some checks to make sure the window is visible in screen, + otherwise curses could get nasty and not show our window anymore. */ + if (width < 1) width = 1; + if (height < 1) height = 1; + if (x+width > screen_width) x = screen_width-width; + if (y+height > screen_height) y = screen_height-height; + #ifdef HAVE_CURSES_WRESIZE - if (window->width != width || window->height != height) + if (window->width != width || window->height != height) wresize(window->win, height, width); if (window->x != x || window->y != y) mvwin(window->win, y, x); diff --git a/src/fe-text/textbuffer-view.c b/src/fe-text/textbuffer-view.c index 1ae85fbf..12191f05 100644 --- a/src/fe-text/textbuffer-view.c +++ b/src/fe-text/textbuffer-view.c @@ -601,8 +601,8 @@ void textbuffer_view_resize(TEXT_BUFFER_VIEW_REC *view, int width, int height) view->cache = textbuffer_cache_get(view->siblings, width); } - view->width = width; - view->height = height; + view->width = width > 10 ? width : 10; + view->height = height > 1 ? height : 1; if (view->buffer->first_line == NULL) { view->empty_linecount = height; |