Sfoglia il codice sorgente

Command line arguments, Window management

Artur Efimov 6 anni fa
parent
commit
df178c78d8
3 ha cambiato i file con 99 aggiunte e 16 eliminazioni
  1. 87 11
      src/FreeOberon.Mod
  2. 10 3
      src/OV.Mod
  3. 2 2
      src/Terminal.Mod

+ 87 - 11
src/FreeOberon.Mod

@@ -16,11 +16,10 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with Free Oberon.  If not, see <http://www.gnu.org/licenses/>.
 *)
-IMPORT G := Graph, T := Terminal, Files,
+IMPORT G := Graph, T := Terminal, Files, Modules,
        OV, Editor, Term, Config, Strings, Out;
 CONST
-  needFullscreen = TRUE;
-  version* = '1.0.2';
+  version* = '1.0.4';
 
   (* Direction of Selection *)
   dirLeft  = 0;
@@ -53,6 +52,7 @@ TYPE
     s: ARRAY 256 OF CHAR;
     next: StrList
   END;
+  Fnames = ARRAY 32, 256 OF CHAR;
 
 VAR
   progBuf: ARRAY 16300 OF CHAR; (* For interacting with a launched program *)
@@ -767,6 +767,56 @@ BEGIN
   END
 END HelpAbout;
 
+PROCEDURE TileWindows*(c: OV.Control);
+VAR W, E: OV.Control;
+  count, cols, rows, i, col, x, y, w, h, h2: INTEGER;
+BEGIN E := app.windows; count := 0;
+  IF E # NIL THEN W := E.next;
+    WHILE W # NIL DO
+      INC(count);
+      IF W = E THEN W := NIL ELSE W := W.next END
+    END;
+    IF count < 4 THEN cols := 1
+    ELSIF count < 9 THEN cols := 2
+    ELSE cols := 3
+    END;
+    rows := count DIV cols; col := 1;
+    x := 0; y := 1; w := T.charsX DIV cols;
+    h := (T.charsY - 2) DIV rows;
+    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);
+      IF W = E THEN W := NIL ELSE W := W.next END;
+      INC(y, h); INC(i);
+      IF (i = rows) & (col < cols) THEN (* New column *)
+        i := 0; INC(col); INC(x, w); y := 1;
+        IF col = cols THEN (* Last column *)
+          rows := count - rows * (cols - 1);
+          w := T.charsX - x;
+          h := (T.charsY - 2) DIV rows
+        END
+      END
+    END
+  END
+END TileWindows;
+
+PROCEDURE CascadeWindows*(c: OV.Control);
+VAR W, E: OV.Control;
+  x, y, w, h: INTEGER;
+BEGIN E := app.windows;
+  x := 0; y := 1; w := T.charsX; h := T.charsY - 2;
+  IF E # NIL THEN W := E.next;
+    WHILE W # NIL DO
+      OV.WindowResize(W, x, y, w, h);
+      INC(x); INC(y); DEC(w); DEC(h);
+      IF W = E THEN W := NIL ELSE W := W.next END
+    END
+  END
+END CascadeWindows;
+
 PROCEDURE InitIDE;
 VAR w: OV.Window;
     m, m2: OV.Menu;
@@ -875,12 +925,9 @@ BEGIN
   (*!TODO*) m.children.prev.status := OV.disabled;
   OV.AddMenu(app, m);
   m := OV.NewMenu('&Window', '', 0, NIL);
-  OV.Add(m, OV.NewMenu('&Tile', '', 0, NIL));
-  (*!TODO*) m.children.prev.status := OV.disabled;
-  OV.Add(m, OV.NewMenu('C&ascade', '', 0, NIL));
-  (*!TODO*) m.children.prev.status := OV.disabled;
-  OV.Add(m, OV.NewMenu('Cl&ose all', '', 0, NIL));
-  (*!TODO*) m.children.prev.status := OV.disabled;
+  OV.Add(m, OV.NewMenu('&Tile', '', 0, TileWindows));
+  OV.Add(m, OV.NewMenu('C&ascade', '', 0, CascadeWindows));
+  OV.Add(m, OV.NewMenu('Cl&ose all', '', 0, OV.CloseAllWindows));
   OV.Add(m, OV.NewMenu('-', '', 0, NIL));
   OV.Add(m, OV.NewMenu('&Size/Move', 'Ctrl+F5', OV.hCtrlF5, NIL));
   OV.Add(m, OV.NewMenu('&Zoom', 'F5', OV.hF5, OV.ZoomCurWindow));
@@ -916,15 +963,44 @@ BEGIN
   OV.AddStatusbar(app, OV.NewQuickBtn('Local menu', 'Alt+F10', 0, NIL))
 END InitIDE;
 
+PROCEDURE OpenFiles(VAR fnames: Fnames);
+VAR i: INTEGER;
+BEGIN i := 0;
+  WHILE (i < LEN(fnames)) & (fnames[i] # '') DO
+    DoOpenFile(fnames[i]); INC(i)
+  END;
+  IF i # 0 THEN OV.NextWindow(app.windows) END
+END OpenFiles;
+
+PROCEDURE ParseArgs(VAR fs, sw: BOOLEAN;
+    VAR fnames: Fnames);
+VAR i, nofnames: INTEGER;
+  s: ARRAY 256 OF CHAR;
+BEGIN fs := TRUE; sw := FALSE; i := 0; nofnames := 0;
+  WHILE i # Modules.ArgCount DO
+    Modules.GetArg(i, s);
+    IF s = '-window' THEN fs := FALSE
+    ELSIF s = '-software' THEN sw := TRUE
+    ELSIF nofnames < LEN(fnames) THEN
+      COPY(s, fnames[nofnames]); INC(nofnames)
+    END;
+    INC(i)
+  END;
+  IF nofnames < LEN(fnames) THEN fnames[nofnames][0] := 0X END
+END ParseArgs;
+
 PROCEDURE Init(): BOOLEAN;
-VAR success: BOOLEAN;
+VAR success, fs, sw: BOOLEAN;
+  fnames: Fnames;
 BEGIN
   success := FALSE;
-  IF T.Init(needFullscreen) THEN
+  ParseArgs(fs, sw, fnames);
+  IF T.Init(fs, sw) THEN
     InitIDE;
     needWindowed := TRUE;
     blockToggle := FALSE;
     ResetSysModules;
+    OpenFiles(fnames);
     success := TRUE
   ELSE Out.String('Terminal init failed.'); Out.Ln
   END;

+ 10 - 3
src/OV.Mod

@@ -981,7 +981,7 @@ BEGIN DrawMenuCaption(c, x, y);
       IF x + w + 3 > T.charsX THEN x := T.charsX - w - 3 END;
       DrawSubmenuFrame(x - 1, y + 1, w + 4, h + 2);
       p := c.children; openMenu := NIL;
-      REPEAT (* Do't draw the submenu until all items are drawn *)
+      REPEAT (* Don't draw the submenu until all items are drawn *)
         IF p.status = open THEN openMenu := p; p.status := selected END;
         p.do.draw(p, x, y); p := p.next
       UNTIL p = c.children;
@@ -1090,8 +1090,10 @@ PROCEDURE MenuClick*(c: Control);
 VAR p: Control;
 BEGIN
   IF c.children = NIL THEN
-    SetFocus(c.app, NIL);
-    IF c.onClick # NIL THEN c.onClick(c) END
+    IF c.status # disabled THEN
+      SetFocus(c.app, NIL);
+      IF c.onClick # NIL THEN c.onClick(c) END
+    END
   ELSE c.status := open;
     p := FindSelectedChild(c);
     IF p = NIL THEN p := c END;
@@ -1565,6 +1567,11 @@ BEGIN
   END
 END CloseCurWindow;
 
+PROCEDURE CloseAllWindows*(c: Control);
+BEGIN
+  WHILE c.app.windows # NIL DO CloseCurWindow(c) END
+END CloseAllWindows;
+
 PROCEDURE RefreshDisplay*(c: Control);
 BEGIN T.ClearScreen; NeedRedraw(c.app)
 END RefreshDisplay;

+ 2 - 2
src/Terminal.Mod

@@ -325,13 +325,13 @@ BEGIN
   RETURN success
 END LoadMedia;
 
-PROCEDURE Init*(fullscreen: BOOLEAN): BOOLEAN;
+PROCEDURE Init*(fullscreen, software: BOOLEAN): BOOLEAN;
 VAR success: BOOLEAN; options: SET;
 BEGIN
   success := FALSE; isFullscreen := fullscreen;
   options := {G.buffered, G.initMouse, G.spread};
-  (*INCL(options, G.software);*)
   IF fullscreen THEN INCL(options, G.fullscreen) END;
+  IF software THEN INCL(options, G.software) END;
   G.Settings(640, 400, options);
   G.SetSizeStep(charW, charH);
   screen := G.Init();