summaryrefslogtreecommitdiff
path: root/src/fe-text/mainwindows.c
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2001-10-20 10:01:29 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2001-10-20 10:01:29 +0000
commit113486564fc1a5fd60013385a1c4f1ab1c6904a8 (patch)
tree84003bcf0e862ba1a1580ae4cc692044e3ff403d /src/fe-text/mainwindows.c
parent0d4de36c6e62b574c383cf6e43781aa1c531e2f2 (diff)
downloadirssi-113486564fc1a5fd60013385a1c4f1ab1c6904a8.zip
Fixed restoring split windows layout. Some other split window resizing fixes
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@1854 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src/fe-text/mainwindows.c')
-rw-r--r--src/fe-text/mainwindows.c132
1 files changed, 89 insertions, 43 deletions
diff --git a/src/fe-text/mainwindows.c b/src/fe-text/mainwindows.c
index e1d3f097..603f6226 100644
--- a/src/fe-text/mainwindows.c
+++ b/src/fe-text/mainwindows.c
@@ -35,7 +35,7 @@
GSList *mainwindows;
MAIN_WINDOW_REC *active_mainwin;
-static int reserved_top, reserved_bottom;
+int screen_reserved_top, screen_reserved_bottom;
static int old_screen_width, old_screen_height;
#define mainwindow_create_screen(window) \
@@ -61,7 +61,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->height;
+ space = MAIN_WINDOW_TEXT_HEIGHT(rec);
if (space >= WINDOW_MIN_SIZE+NEW_WINDOW_SIZE && space > biggest) {
biggest = space;
biggest_rec = rec;
@@ -178,12 +178,13 @@ MAIN_WINDOW_REC *mainwindow_create(void)
if (mainwindows == NULL) {
active_mainwin = rec;
- rec->first_line = reserved_top;
- rec->last_line = screen_height-1 - reserved_bottom;
+ rec->first_line = screen_reserved_top;
+ rec->last_line = screen_height-1 - screen_reserved_bottom;
rec->height = rec->last_line-rec->first_line+1;
} else {
parent = WINDOW_MAIN(active_win);
- if (parent->height < WINDOW_MIN_SIZE+NEW_WINDOW_SIZE)
+ if (MAIN_WINDOW_TEXT_HEIGHT(parent) <
+ WINDOW_MIN_SIZE+NEW_WINDOW_SIZE)
parent = find_window_with_room();
if (parent == NULL)
return NULL; /* not enough space */
@@ -376,7 +377,7 @@ static void mainwindows_resize_smaller(int xdiff, int ydiff)
for (tmp = mainwindows; tmp != NULL; tmp = tmp->next) {
MAIN_WINDOW_REC *rec = tmp->data;
- space += rec->height-WINDOW_MIN_SIZE;
+ space += MAIN_WINDOW_TEXT_HEIGHT(rec)-WINDOW_MIN_SIZE;
}
if (space < -ydiff) {
@@ -390,7 +391,7 @@ static void mainwindows_resize_smaller(int xdiff, int ydiff)
for (tmp = sorted; tmp != NULL && ydiff < 0; tmp = tmp->next) {
MAIN_WINDOW_REC *rec = tmp->data;
- space = rec->height-WINDOW_MIN_SIZE;
+ space = MAIN_WINDOW_TEXT_HEIGHT(rec)-WINDOW_MIN_SIZE;
if (space <= 0) {
rec->first_line += ydiff;
rec->last_line += ydiff;
@@ -419,7 +420,7 @@ static void mainwindows_resize_bigger(int xdiff, int ydiff)
for (tmp = sorted; tmp != NULL; tmp = tmp->next) {
MAIN_WINDOW_REC *rec = tmp->data;
- space = rec->height-WINDOW_MIN_SIZE;
+ space = MAIN_WINDOW_TEXT_HEIGHT(rec)-WINDOW_MIN_SIZE;
if (ydiff == 0 || (space >= 0 && tmp->next != NULL)) {
if (moved > 0) {
rec->first_line += moved;
@@ -488,10 +489,10 @@ int mainwindows_reserve_lines(int top, int bottom)
ret = -1;
if (top != 0) {
- g_return_val_if_fail(top > 0 || reserved_top > top, -1);
+ g_return_val_if_fail(top > 0 || screen_reserved_top > top, -1);
- ret = reserved_top;
- reserved_top += top;
+ ret = screen_reserved_top;
+ screen_reserved_top += top;
window = mainwindows_find_lower(-1);
if (window != NULL) {
@@ -501,10 +502,10 @@ int mainwindows_reserve_lines(int top, int bottom)
}
if (bottom != 0) {
- g_return_val_if_fail(bottom > 0 || reserved_bottom > bottom, -1);
+ g_return_val_if_fail(bottom > 0 || screen_reserved_bottom > bottom, -1);
- ret = reserved_bottom;
- reserved_bottom += bottom;
+ ret = screen_reserved_bottom;
+ screen_reserved_bottom += bottom;
window = mainwindows_find_upper(screen_height);
if (window != NULL) {
@@ -551,60 +552,104 @@ static void mainwindows_resize_two(MAIN_WINDOW_REC *grow_win,
gui_window_redraw(shrink_win->active);
}
-static int mainwindow_grow(MAIN_WINDOW_REC *window, int count)
+static int try_shrink_lower(MAIN_WINDOW_REC *window, int count)
{
MAIN_WINDOW_REC *shrink_win;
- /* shrink lower window */
shrink_win = mainwindows_find_lower(window->last_line);
- if (shrink_win != NULL && shrink_win->height-count >= WINDOW_MIN_SIZE) {
+ if (shrink_win != NULL &&
+ MAIN_WINDOW_TEXT_HEIGHT(shrink_win)-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->height-count < WINDOW_MIN_SIZE)
- return FALSE;
+ mainwindows_resize_two(window, shrink_win, count);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+static int try_shrink_upper(MAIN_WINDOW_REC *window, int count)
+{
+ MAIN_WINDOW_REC *shrink_win;
+
+ shrink_win = mainwindows_find_upper(window->first_line);
+ if (shrink_win != NULL &&
+ MAIN_WINDOW_TEXT_HEIGHT(shrink_win)-count >= WINDOW_MIN_SIZE) {
window->first_line -= count;
shrink_win->last_line -= count;
+ mainwindows_resize_two(window, shrink_win, count);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static int mainwindow_grow(MAIN_WINDOW_REC *window, int count,
+ int resize_lower)
+{
+ if (!resize_lower || !try_shrink_lower(window, count)) {
+ if (!try_shrink_upper(window, count)) {
+ if (resize_lower || !try_shrink_lower(window, count))
+ return FALSE;
+ }
}
- mainwindows_resize_two(window, shrink_win, count);
return TRUE;
}
-static int mainwindow_shrink(MAIN_WINDOW_REC *window, int count)
+static int try_grow_lower(MAIN_WINDOW_REC *window, int count)
{
MAIN_WINDOW_REC *grow_win;
- if (window->height-count < WINDOW_MIN_SIZE)
- return FALSE;
-
grow_win = mainwindows_find_lower(window->last_line);
if (grow_win != NULL) {
window->last_line -= count;
grow_win->first_line -= count;
- } else {
- grow_win = mainwindows_find_upper(window->first_line);
- if (grow_win == NULL) return FALSE;
+ mainwindows_resize_two(grow_win, window, count);
+ }
+
+ return grow_win != NULL;
+}
+
+static int try_grow_upper(MAIN_WINDOW_REC *window, int count)
+{
+ MAIN_WINDOW_REC *grow_win;
+ grow_win = mainwindows_find_upper(window->first_line);
+ if (grow_win != NULL) {
window->first_line += count;
grow_win->last_line += count;
+ mainwindows_resize_two(grow_win, window, count);
+ }
+
+ return grow_win != NULL;
+}
+
+static int mainwindow_shrink(MAIN_WINDOW_REC *window, int count, int resize_lower)
+{
+ if (MAIN_WINDOW_TEXT_HEIGHT(window)-count < WINDOW_MIN_SIZE)
+ return FALSE;
+
+ if (!resize_lower || !try_grow_lower(window, count)) {
+ if (!try_grow_upper(window, count)) {
+ if (resize_lower || !try_grow_lower(window, count))
+ return FALSE;
+ }
}
- mainwindows_resize_two(grow_win, window, count);
return TRUE;
}
-void mainwindow_set_size(MAIN_WINDOW_REC *window, int size)
+/* Change the window height - the height includes the lines needed for
+ statusbars. If resize_lower is TRUE, the lower window is first tried
+ to be resized instead of upper window. */
+void mainwindow_set_size(MAIN_WINDOW_REC *window, int height, int resize_lower)
{
- size -= window->height;
- if (size < 0)
- mainwindow_shrink(window, -size);
+ height -= window->height;
+ if (height < 0)
+ mainwindow_shrink(window, -height, resize_lower);
else
- mainwindow_grow(window, size);
+ mainwindow_grow(window, height, resize_lower);
}
/* SYNTAX: WINDOW GROW [<lines>] */
@@ -616,7 +661,7 @@ static void cmd_window_grow(const char *data)
count = *data == '\0' ? 1 : atoi(data);
window = WINDOW_MAIN(active_win);
- if (!mainwindow_grow(window, count)) {
+ if (!mainwindow_grow(window, count, FALSE)) {
printformat_window(active_win, MSGLEVEL_CLIENTNOTICE,
TXT_WINDOW_TOO_SMALL);
}
@@ -628,7 +673,7 @@ static void cmd_window_shrink(const char *data)
int count;
count = *data == '\0' ? 1 : atoi(data);
- if (!mainwindow_shrink(WINDOW_MAIN(active_win), count)) {
+ if (!mainwindow_shrink(WINDOW_MAIN(active_win), count, FALSE)) {
printformat_window(active_win, MSGLEVEL_CLIENTNOTICE,
TXT_WINDOW_TOO_SMALL);
}
@@ -643,7 +688,8 @@ static void cmd_window_size(const char *data)
if (!is_numeric(data, 0)) return;
size = atoi(data);
- size -= WINDOW_MAIN(active_win)->height;
+ size -= WINDOW_MAIN(active_win)->height -
+ WINDOW_MAIN(active_win)->statusbar_lines;
if (size == 0) return;
ltoa(sizestr, size < 0 ? -size : size);
@@ -663,12 +709,12 @@ static void cmd_window_balance(void)
windows = g_slist_length(mainwindows);
if (windows == 1) return;
- avail_size = screen_height - reserved_top-reserved_bottom;
+ avail_size = screen_height - screen_reserved_top-screen_reserved_bottom;
unit_size = avail_size/windows;
bigger_units = avail_size%windows;
sorted = mainwindows_get_sorted(FALSE);
- last_line = reserved_top;
+ last_line = screen_reserved_top;
for (tmp = sorted; tmp != NULL; tmp = tmp->next) {
MAIN_WINDOW_REC *rec = tmp->data;
@@ -995,7 +1041,7 @@ void mainwindows_init(void)
mainwindows = NULL;
active_mainwin = NULL;
- reserved_top = reserved_bottom = 0;
+ screen_reserved_top = screen_reserved_bottom = 0;
command_bind("window grow", NULL, (SIGNAL_FUNC) cmd_window_grow);
command_bind("window shrink", NULL, (SIGNAL_FUNC) cmd_window_shrink);