X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=src%2Fwindows.c;h=fafa566edf670842173455564a3fb74dbb2b7673;hb=a565aeeff8d8599654b5c309298ec0ff95cdd5aa;hp=c87b6cea98d6b1ebcdbd6cc7b285359af64cf2e0;hpb=d701e79e9297470b56315eefd431c62c9aba28b2;p=plomrogue diff --git a/src/windows.c b/src/windows.c index c87b6ce..fafa566 100644 --- a/src/windows.c +++ b/src/windows.c @@ -20,16 +20,12 @@ */ static void refit_pad(); - - /* Update geometry (sizes, positions) of window "w" and its successors in the * window chain. For the positioning algorithm place_win() is used. */ static void update_wins(struct Win * w); static void place_win(struct Win * w); - - /* Draw scroll hint (a line saying that there are "dist" more elements of * "unit" further into the direction symbolized by the "dir" char) into virtual * screen pad, onto an appropriate edge of either a window or the screen; the @@ -43,13 +39,9 @@ static void scroll_hint(struct yx_uint16 fsize, char dir, uint16_t dist, static void winscroll_hint(struct Win * w, char dir, uint16_t dist); static void padscroll_hint(char dir, uint16_t dist); - - /* Draw contents of all windows in window chain from window "w" onwards. */ static void draw_wins(struct Win * w); - - /* draw_win_borderlines() draws the vertical and horizontal borders of window * "w" sans corners into the virtual screen "pad", and draws the top border * line as the windows' title bar (highlighted if the window is described @@ -67,8 +59,6 @@ static void draw_wins_borderlines(struct Win * w, struct Win * w_active, WINDOW * pad); static void draw_wins_bordercorners(struct Win * w, WINDOW * pad); - - /* Shift active window forwards / backwards in window chain. */ static void shift_win_forward(); static void shift_win_backward(); @@ -117,13 +107,13 @@ static void update_wins(struct Win * w) static void place_win(struct Win * w) { - /* First window goes into the upper-left corner. */ + /* If w is first window, it goes into the top left corner. */ w->start.x = 0; w->start.y = 1; /* Leave space for title bar. */ if (0 != w->prev) { - /* Non-first window fallbacks to: fit rightwards of rightmost border. */ + /* If not, fit w's top left to top right of last top predecessor. */ struct Win * w_top = w->prev; while (w_top->start.y != 1) { @@ -131,9 +121,7 @@ static void place_win(struct Win * w) } w->start.x = w_top->start.x + w_top->framesize.x + 1; - /* Fit window below its predecessor if that one directly thrones over - * empty space wide and high enough. - */ + /* Fit w's top left to bottom left of its ->prev if enough space. */ uint16_t w_prev_maxy = w->prev->start.y + w->prev->framesize.y; if ( w->framesize.x <= w->prev->framesize.x && w->framesize.y < world.wmeta->padsize.y - w_prev_maxy) @@ -142,36 +130,31 @@ static void place_win(struct Win * w) w->start.y = w_prev_maxy + 1; } - /* Failing that, try to open a new sub column below the nearest - * predecessor window that thrones over enough empty space. + /* Failing that, try to fit w' top left to the top right of the last + * predecessor w_test 1) not followed by windows with a left corner + * further rightwards than its own 2) with enough space rightwards for w + * until the bottom right of w_thr directly throning over it 3) and with + * this same space extending far enough to the bottom for fitting in w. */ else { - struct Win * w_up = w->prev; - struct Win * w_upup = w_up; - uint16_t widthdiff; - while (w_up != w_top) + struct Win * w_test = w->prev; + struct Win * w_thr; + while (w_test != w_top) { - w_upup = w_up->prev; - while (1) - { - if (w_up->start.y != w_upup->start.y) - { - break; - } - w_upup = w_upup->prev; - } - w_prev_maxy = w_upup->start.y + w_upup->framesize.y; - widthdiff = (w_upup->start.x + w_upup->framesize.x) - - (w_up->start.x + w_up->framesize.x); - if ( w->framesize.y < world.wmeta->padsize.y - w_prev_maxy - && w->framesize.x < widthdiff) + w_thr = w_test->prev; + for (; w_test->start.y <= w_thr->start.y; w_thr = w_thr->prev); + uint16_t w_thr_bottom = w_thr->start.y + w_thr->framesize.y; + uint16_t free_width = (w_thr->start.x + w_thr->framesize.x) + - (w_test->start.x + w_test->framesize.x); + if ( w->framesize.y < world.wmeta->padsize.y - w_thr_bottom + && w->framesize.x < free_width) { - w->start.x = w_up->start.x + w_up->framesize.x + 1 ; - w->start.y = w_prev_maxy + 1; + w->start.x = w_test->start.x + w_test->framesize.x + 1; + w->start.y = w_thr_bottom + 1; break; } - w_up = w_upup; + w_test = w_thr; } } }