Browse Source

Fixed window sizes

Artur Efimov 6 years ago
parent
commit
56ace64a0d
1 changed files with 27 additions and 10 deletions
  1. 27 10
      src/FreeOberon.Mod

+ 27 - 10
src/FreeOberon.Mod

@@ -175,7 +175,12 @@ BEGIN e := Editor.NewEditor();
   END;
   IF app.windows # NIL THEN
     e.x := app.windows.x + 1; e.y := app.windows.y + 1;
-    e.w := app.windows.w - 1; e.h := app.windows.h - 1
+    e.w := app.windows.w; e.h := app.windows.h;
+    IF e.x + e.w >= T.charsX THEN e.w := T.charsX - e.x END;
+    IF e.y + e.h >= T.charsY - 1 THEN e.h := T.charsY - e.y - 1 END;
+    IF (e.w < 10) OR (e.h < 3) THEN
+      e.x := 0; e.y := 1; e.w := T.charsX; e.h := T.charsY - 2
+    END
   END;
   e.caption := 'NONAME??.Mod';
   e.caption[6] := CHR(ORD('0') + count DIV 10 MOD 10);
@@ -769,7 +774,8 @@ END HelpAbout;
 
 PROCEDURE TileWindows*(c: OV.Control);
 VAR W, E: OV.Control;
-  count, cols, rows, i, col, x, y, w, h, h2: INTEGER;
+  count, cols, rows, i, col, x, y, w, h, w2, h2: INTEGER;
+  aw, ah, dw, dh: INTEGER; (* Accumulator, delta *)
 BEGIN E := app.windows; count := 0;
   IF E # NIL THEN W := E.next;
     WHILE W # NIL DO
@@ -781,22 +787,30 @@ BEGIN E := app.windows; count := 0;
     ELSE cols := 3
     END;
     rows := count DIV cols; col := 1;
-    x := 0; y := 1; w := T.charsX DIV cols;
+    x := 0; y := 1;
+    w := T.charsX DIV cols; w2 := w;
+    dw := T.charsX MOD cols;
     h := (T.charsY - 2) DIV rows;
+    dh := (T.charsY - 2) MOD rows;
+    IF h < 2 THEN h := 2; dh := 0 END;
+    aw := dw; ah := 0;
     W := E.next; i := 0;
     WHILE W # NIL DO
-      IF i # rows - 1 THEN h2 := h
-      ELSE h2 := T.charsY - y - 1
-      END;
-      OV.WindowResize(W, x, y, w, h2);
+      INC(ah, dh);
+      IF ah < rows THEN h2 := h ELSE h2 := h + 1; DEC(ah, rows) END;
+      OV.WindowResize(W, x, y, w2, h2);
       IF W = E THEN W := NIL ELSE W := W.next END;
-      INC(y, h); INC(i);
+      INC(y, h2); INC(i);
       IF (i = rows) & (col < cols) THEN (* New column *)
-        i := 0; INC(col); INC(x, w); y := 1;
+        i := 0; INC(col); INC(x, w2); y := 1; ah := 0;
+        INC(aw, dw);
+        IF aw < cols THEN w2 := w ELSE w2 := w + 1; DEC(aw, cols) END;
         IF col = cols THEN (* Last column *)
           rows := count - rows * (cols - 1);
           w := T.charsX - x;
-          h := (T.charsY - 2) DIV rows
+          h := (T.charsY - 2) DIV rows;
+          dh := (T.charsY - 2) MOD rows;
+          IF h < 2 THEN h := 2; dh := 0 END
         END
       END
     END
@@ -812,6 +826,9 @@ BEGIN E := app.windows;
     WHILE W # NIL DO
       OV.WindowResize(W, x, y, w, h);
       INC(x); INC(y); DEC(w); DEC(h);
+      IF (w < 10) OR (h < 3) THEN
+        x := 0; y := 1; w := T.charsX; h := T.charsY - 2
+      END;
       IF W = E THEN W := NIL ELSE W := W.next END
     END
   END