Browse Source

Editor and OberonVision changes

Arthur Yefimov 3 years ago
parent
commit
31c6bee148
3 changed files with 105 additions and 98 deletions
  1. 49 40
      src/Editor.Mod
  2. 1 1
      src/FreeOberon.Mod
  3. 55 57
      src/OV.Mod

+ 49 - 40
src/Editor.Mod

@@ -16,7 +16,7 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 *)
-IMPORT OV, T := Terminal, G := Graph, Text := EditorText,
+IMPORT OV, T := TermBox, Text := EditorText,
   Strings, StrList, Dir, Out;
 CONST
   stdPath* = 'Programs/';
@@ -509,12 +509,14 @@ RETURN color END GetTokenColor;
 PROCEDURE PutStringH*(x, y: INTEGER; s: ARRAY OF CHAR;
   bg, limit: INTEGER; VAR comLevel: INTEGER);
 VAR i, fg, class, len: INTEGER;
+  tW, tH: INTEGER;
 BEGIN
-  IF limit = 0 THEN limit := T.charsX END;
+  T.Size(tW, tH);
+  IF limit = 0 THEN limit := tW END;
   GetToken(s, 0, class, len, comLevel);
   fg := GetTokenColor(class); i := 0;
   WHILE (s[i] # 0X) & (x < limit) DO
-    T.PutChar(x, y, s[i], fg, bg);
+    T.SetCell(x, y, s[i], fg, bg);
     INC(i); INC(x); DEC(len);
     IF len <= 0 THEN
       GetToken(s, i, class, len, comLevel);
@@ -524,7 +526,7 @@ BEGIN
   DEC(i);
   WHILE (i >= 0) & (s[i] = ' ') DO
     DEC(x);
-    T.PutChar(x, y, 0FAX, 3, bg);
+    T.SetCell(x, y, 0FAX(*!FIXME*), 3, bg);
     DEC(i)
   END
 END PutStringH;
@@ -541,8 +543,8 @@ BEGIN
   WHILE (s[i] # 0X) & (x < limit) DO
     IF i = x1 + 1 THEN sel := FALSE
     ELSIF i = x0 THEN sel := TRUE END;
-    IF sel THEN T.PutChar(x, y, s[i], fgSel, bgSel)
-    ELSE T.PutChar(x, y, s[i], fg, bg) END;
+    IF sel THEN T.SetCell(x, y, s[i], fgSel, bgSel)
+    ELSE T.SetCell(x, y, s[i], fg, bg) END;
     INC(i); INC(x); DEC(len);
     IF len <= 0 THEN
       GetToken(s, i, class, len, comLevel);
@@ -555,11 +557,23 @@ PROCEDURE TextChanged*(c: Editor): BOOLEAN;
 BEGIN RETURN c.text.changed
 END TextChanged;
 
+PROCEDURE CharFill(x, y, w, h: INTEGER; ch: CHAR; fg, bg: INTEGER);
+VAR X, Y: INTEGER;
+BEGIN
+  FOR Y := y TO y + h - 1 DO
+    FOR X := x TO x + w - 1 DO
+      T.SetCell(X, Y, ch, fg, bg)
+    END
+  END
+END CharFill;
+
 PROCEDURE PrintText*(c: Editor);
 VAR L: Text.Line; scrY: INTEGER;
   textY, x0, x1, minX, maxX, maxY, comLevel: INTEGER;
   cursorHandled: BOOLEAN;
-BEGIN T.CharFill(c.x + 1, c.y + 1, c.w - 2, c.h - 2, ' ', 15, c.bg);
+  tW, tH: INTEGER;
+BEGIN T.Size(tW, tH);
+  CharFill(c.x + 1, c.y + 1, c.w - 2, c.h - 2, ' ', 15, c.bg);
   L := c.text.scrFirst; scrY := c.y + 1; textY := c.text.scrY;
   minX := c.x + 1; maxX := c.x + c.w - 1;
   maxY := c.y + c.h - 1; comLevel := L.comLevel;
@@ -571,18 +585,18 @@ BEGIN T.CharFill(c.x + 1, c.y + 1, c.w - 2, c.h - 2, ' ', 15, c.bg);
       PutSelStringH(minX, scrY, L.s, c.bg, maxX, comLevel, 1, 7, x0, x1)
     ELSE PutStringH(minX, scrY, L.s, c.bg, maxX, comLevel)
     END;
-    IF (L = c.text.cur) & (c.text.x + 1 < T.charsX) &
+    IF (L = c.text.cur) & (c.text.x + 1 < tW) &
        ~OV.HasModalWindow(c.app) THEN
       x0 := minX + c.text.x;
       IF c.focused & (x0 <= maxX) THEN
-        T.ShowCursor(TRUE); T.GoToXY(x0, scrY);
+        T.SetCursor(x0, scrY);
         cursorHandled := TRUE
       END
     END;
     L := L.next; INC(scrY); INC(textY);
     IF L # NIL THEN L.comLevel := comLevel END
   END;
-  IF c.focused & ~cursorHandled THEN T.ShowCursor(FALSE) END
+  IF c.focused & ~cursorHandled THEN T.HideCursor END
 END PrintText;
 
 PROCEDURE StartSelection(c: Editor);
@@ -614,7 +628,7 @@ END Order;
 PROCEDURE HandleSelection(c: Editor; dir: INTEGER; viaHoriz: BOOLEAN);
 VAR mod: SET; onLeft, onRight: BOOLEAN;
 BEGIN
-  IF ~G.ShiftPressed() THEN c.text.selected := FALSE
+  IF FALSE (*!FIXME ~T.ShiftPressed()*) THEN c.text.selected := FALSE
   ELSE CheckSelBorders(c, onLeft, onRight);
     IF ~c.text.selected OR (~onLeft & ~onRight) THEN
       StartSelection(c); (* Reset/new selection *)
@@ -689,8 +703,7 @@ BEGIN
   ELSE (* Up *)
     ASSERT(c.text.scrFirst.prev # NIL, 98); ASSERT(c.text.scrY > 0, 99);
     c.text.scrFirst := c.text.scrFirst.prev; DEC(c.text.scrY)
-  END;
-  T.ResetCursorBlink
+  END
 END MoveScreenByLine;
 
 PROCEDURE MoveScreen(c: Editor; delta: INTEGER);
@@ -728,8 +741,7 @@ BEGIN c.text.MaybeRemoveIndent; moved := FALSE;
   IF moved THEN
     IF c.text.x > c.text.cur.len THEN c.text.x := c.text.cur.len END;
     PrintText(c)
-  END;
-  T.ResetCursorBlink
+  END
 END MoveByLine;
 
 (* Moves input cursor up and down by page *)
@@ -753,7 +765,6 @@ BEGIN c.text.MaybeRemoveIndent; i := c.h - 3;
       DEC(i)
     END
   END;
-  T.ResetCursorBlink;
   IF moved THEN PrintText(c) END
 END MoveByPage;
 
@@ -774,8 +785,7 @@ BEGIN
       MoveByLine(c, FALSE, TRUE);
       c.text.x := c.text.cur.len;
     END
-  END;
-  T.ResetCursorBlink
+  END
 END MoveInLine;
 
 (* Moves input cursor left and right by one word *)
@@ -801,7 +811,7 @@ END MoveByWord;
 PROCEDURE MoveToLineEdge(c: Editor; end: BOOLEAN);
 VAR onLeft, onRight: BOOLEAN;
 BEGIN
-  IF G.ShiftPressed() THEN
+  IF FALSE (*!FIXME T.ShiftPressed()*) THEN
     IF ~c.text.selected THEN StartSelection(c)
     ELSE
       CheckSelBorders(c, onLeft, onRight);
@@ -822,7 +832,6 @@ BEGIN
   ELSE (* Home *)
     IF c.text.x > 0 THEN c.text.x := 0 END
   END;
-  T.ResetCursorBlink;
   PrintText(c)
 END MoveToLineEdge;
 
@@ -944,7 +953,7 @@ BEGIN OV.WindowMouseDown(c, x, y, button);
       t.cur := L; t.y := y + t.scrY;
       IF x > L.len THEN x := L.len END;
       t.x := x;
-      T.GoToXY(c.x + x + 1, c.y + y + 1)
+      T.SetCursor(c.x + x + 1, c.y + y + 1)
     END;
     PrintText(c(Editor))
   END
@@ -960,7 +969,7 @@ END EditorMouseMove;
 
 PROCEDURE EditorTextInput(c: OV.Control; ch: CHAR);
 BEGIN
-  IF ch # 0X THEN c(Editor).text.InsertChar(ch); T.ResetCursorBlink;
+  IF ch # 0X THEN c(Editor).text.InsertChar(ch);
     c(Editor).text.selected := FALSE; PrintText(c(Editor))
   END
 END EditorTextInput;
@@ -971,36 +980,36 @@ BEGIN E := c(Editor);
   (*IF E.text.changed THEN cancel := TRUE END*) (*!TODO Ask*)
 END EditorClose;
 
-PROCEDURE EditorKeyDown*(c: OV.Control; key: G.Key);
-BEGIN OV.WindowKeyDown(c, key);
-  CASE key.code OF
-    G.kLeft:
-    IF key.mod * G.mCtrl # {} THEN MoveByWord(c(Editor), FALSE)
+PROCEDURE EditorKeyDown*(c: OV.Control; E: T.Event);
+BEGIN OV.WindowKeyDown(c, E);
+  CASE E.key OF
+    T.kLeft:
+    IF E.mod * T.mCtrl # {} THEN MoveByWord(c(Editor), FALSE)
     ELSE MoveInLine(c(Editor), FALSE)
     END;
     PrintText(c(Editor))
-  | G.kRight:
-    IF key.mod * G.mCtrl # {} THEN MoveByWord(c(Editor), TRUE)
+  | T.kRight:
+    IF E.mod * T.mCtrl # {} THEN MoveByWord(c(Editor), TRUE)
     ELSE MoveInLine(c(Editor), TRUE)
     END;
     PrintText(c(Editor))
-  | G.kUp:        MoveByLine(c(Editor), FALSE, FALSE)
-  | G.kDown:      MoveByLine(c(Editor), TRUE, FALSE)
-  | G.kHome:      MoveToLineEdge(c(Editor), FALSE)
-  | G.kEnd:       MoveToLineEdge(c(Editor), TRUE)
-  | G.kPgUp:      MoveByPage(c(Editor), FALSE)
-  | G.kPgDn:      MoveByPage(c(Editor), TRUE)
-  | G.kBackspace: HandleBackspace(c(Editor))
-  | G.kDel:       HandleDelete(c(Editor))
-  | G.kEnter, G.kEnterPad: HandleEnter(c(Editor))
-  | G.kTab:       HandleTab(c(Editor), key.mod * G.mShift # {})
+  | T.kUp:        MoveByLine(c(Editor), FALSE, FALSE)
+  | T.kDown:      MoveByLine(c(Editor), TRUE, FALSE)
+  | T.kHome:      MoveToLineEdge(c(Editor), FALSE)
+  | T.kEnd:       MoveToLineEdge(c(Editor), TRUE)
+  | T.kPgUp:      MoveByPage(c(Editor), FALSE)
+  | T.kPgDn:      MoveByPage(c(Editor), TRUE)
+  | T.kBackspace: HandleBackspace(c(Editor))
+  | T.kDel:       HandleDelete(c(Editor))
+  | T.kEnter, T.kEnterPad: HandleEnter(c(Editor))
+  | T.kTab:       HandleTab(c(Editor), E.mod * T.mShift # {})
   ELSE END
 END EditorKeyDown;
 
 PROCEDURE EditorGetFocus*(c: OV.Control);
 BEGIN
   IF OV.windowMethod.getFocus # NIL THEN OV.windowMethod.getFocus(c) END;
-  G.StartTextInput; T.ShowCursor(TRUE)
+  T.SetCursor(c.x, c.y) (*!FIXME correct?*)
 END EditorGetFocus;
 
 PROCEDURE EditorRefresh(c: OV.Control);

+ 1 - 1
src/FreeOberon.Mod

@@ -1164,5 +1164,5 @@ BEGIN
   IF ~Init() THEN Out.String('Could not initialize.'); Out.Ln
   ELSE OV.RunApp(app)
   END;
-  G.Close
+  T.Close
 END FreeOberon.

+ 55 - 57
src/OV.Mod

@@ -16,7 +16,7 @@ GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
 *)
-IMPORT G := Graph, T := Terminal, Strings, StrList, Out, SYSTEM;
+IMPORT G := Graph, T := TermBox, Strings, StrList, Out, SYSTEM;
 CONST
   dblClickDelay* = 500;
 
@@ -599,7 +599,7 @@ TYPE
     refresh*: PROCEDURE (c: Control);
     click*: PROCEDURE (c: Control);
     dblClick*: PROCEDURE (c: Control);
-    keyDown*: PROCEDURE (c: Control; key: G.Key);
+    keyDown*: PROCEDURE (c: Control; E: T.Event);
     textInput*: PROCEDURE (c: Control; ch: CHAR);
     getFocus*: PROCEDURE (c: Control);
     lostFocus*: PROCEDURE (c: Control);
@@ -990,8 +990,8 @@ BEGIN c.focused := TRUE
 END ControlGetFocus;
 
 PROCEDURE ControlLostFocus*(c: Control);
-BEGIN c.focused := FALSE; G.StopTextInput;
-  T.ShowCursor(FALSE); NeedRedraw(c.app)
+BEGIN c.focused := FALSE;
+  T.HideCursor; NeedRedraw(c.app)
 END ControlLostFocus;
 
 PROCEDURE ControlClick*(c: Control);
@@ -1187,25 +1187,25 @@ PROCEDURE MenuKeyDown*(c: Control; key: G.Key);
 VAR p, p2, br: Control; found: BOOLEAN;
 BEGIN
   CASE key.code OF
-    G.kUp, G.kDown:
+    T.kUp, T.kDown:
     IF c.parent # c.app.menu THEN
       p := c;
       REPEAT
-        IF key.code = G.kUp THEN p := p.prev ELSE p := p.next END
+        IF key.code = T.kUp THEN p := p.prev ELSE p := p.next END
       UNTIL (p = c) OR (p.caption # '-') & (p.status # disabled);
       c.status := normal; p.status := selected; SetFocus(p);
       NeedRedraw(c.app)
     END
-  | G.kLeft, G.kRight: p := c;
+  | T.kLeft, T.kRight: p := c;
     WHILE p.parent # p.app.menu DO p := p.parent END;
-    IF key.code = G.kLeft THEN p := p.prev ELSE p := p.next END;
+    IF key.code = T.kLeft THEN p := p.prev ELSE p := p.next END;
     p.status := open;
     p2 := FindSelectedChild(p);
     IF p2 = NIL THEN p2 := p END;
     SetFocus(p2);
     NeedRedraw(c.app)
-  | G.kEnter: c.do.click(c)
-  | G.kEsc:
+  | T.kEnter: c.do.click(c)
+  | T.kEsc:
     IF c.parent.parent = c.app.menu THEN
       c.parent.status := normal; UnsetFocus(c.app)
     ELSE
@@ -1736,13 +1736,13 @@ PROCEDURE EditKeyDown*(c: Control; key: G.Key);
 VAR e: Edit; redraw: BOOLEAN;
 BEGIN e := c(Edit); redraw := TRUE;
   CASE key.code OF
-    G.kLeft: IF e.pos > 0 THEN DEC(e.pos) END
-  | G.kRight: IF e.pos < e.len THEN INC(e.pos) END
-  | G.kBackspace:
+    T.kLeft: IF e.pos > 0 THEN DEC(e.pos) END
+  | T.kRight: IF e.pos < e.len THEN INC(e.pos) END
+  | T.kBackspace:
     IF e.pos > 0 THEN DeleteChar(e.caption, e.pos - 1, e.len); DEC(e.pos) END
-  | G.kDel: IF e.pos < e.len THEN DeleteChar(e.caption, e.pos, e.len) END
-  | G.kHome: e.pos := 0
-  | G.kEnd: e.pos := e.len
+  | T.kDel: IF e.pos < e.len THEN DeleteChar(e.caption, e.pos, e.len) END
+  | T.kHome: e.pos := 0
+  | T.kEnd: e.pos := e.len
   ELSE redraw := FALSE
   END;
   IF redraw THEN NeedRedraw(c.app); T.ResetCursorBlink END
@@ -1907,14 +1907,14 @@ VAR C: ColumnList; sb: Scrollbar;
   h, cur: INTEGER;
 BEGIN C := c(ColumnList); sb := C.scrollbar; cur := C.cur; h := C.h - 1;
   CASE key.code OF
-    G.kLeft: DEC(cur, h)
-  | G.kRight: INC(cur, h)
-  | G.kUp: DEC(cur)
-  | G.kDown: INC(cur)
-  | G.kHome: cur := sb.cur * h
-  | G.kEnd: cur := (sb.cur + C.cols) * h - 1
-  | G.kPgUp: DEC(cur, C.cols * h); DEC(sb.cur, C.cols)
-  | G.kPgDn: INC(cur, C.cols * h); INC(sb.cur, C.cols)
+    T.kLeft: DEC(cur, h)
+  | T.kRight: INC(cur, h)
+  | T.kUp: DEC(cur)
+  | T.kDown: INC(cur)
+  | T.kHome: cur := sb.cur * h
+  | T.kEnd: cur := (sb.cur + C.cols) * h - 1
+  | T.kPgUp: DEC(cur, C.cols * h); DEC(sb.cur, C.cols)
+  | T.kPgDn: INC(cur, C.cols * h); INC(sb.cur, C.cols)
   ELSE END;
   ColumnListSetCur(C, cur)
 END ColumnListKeyDown;
@@ -2213,12 +2213,12 @@ BEGIN p := c.children;
   END ;
 RETURN p END FindDefaultControl;
 
-PROCEDURE WindowKeyDown*(c: Control; key: G.Key);
+PROCEDURE WindowKeyDown*(c: Control; E: T.Event);
 VAR d: Control;
 BEGIN
-  CASE key.code OF
-    G.kEsc: IF c(Window).closeOnEsc THEN CloseCurWindow(c) END
-  | G.kEnter: d := FindDefaultControl(c);
+  CASE E.key OF
+    T.kEsc: IF c(Window).closeOnEsc THEN CloseCurWindow(c) END
+  | T.kEnter: d := FindDefaultControl(c);
     IF (d # NIL) & (d.do.click # NIL) THEN d.do.click(d) END
   ELSE END
 END WindowKeyDown;
@@ -2336,9 +2336,9 @@ VAR m: Menu;
   handled: BOOLEAN;
 BEGIN handled := FALSE; hotkey := key.code;
   IF (hotkey # 0) & ~HasModalWindow(app) THEN
-    IF key.mod * G.mCtrl  # {} THEN INC(hotkey, 100H) END;
-    IF key.mod * G.mAlt   # {} THEN INC(hotkey, 200H) END;
-    IF key.mod * G.mShift # {} THEN INC(hotkey, 400H) END;
+    IF key.mod * T.mCtrl  # {} THEN INC(hotkey, 100H) END;
+    IF key.mod * T.mAlt   # {} THEN INC(hotkey, 200H) END;
+    IF key.mod * T.mShift # {} THEN INC(hotkey, 400H) END;
     m := FindMenuWithHotkey(app.menu, hotkey);
     IF m # NIL THEN handled := TRUE;
       IF m.do.click # NIL THEN m.do.click(m) END
@@ -2389,22 +2389,29 @@ BEGIN worked := FALSE; p := app.cur;
   END ;
 RETURN worked END OnTabPress;
 
+PROCEDURE OnTextInput(app: App; ch: CHAR);
+BEGIN
+  IF (app.cur # NIL) & (app.cur.do.textInput # NIL) THEN
+    app.cur.do.textInput(app.cur, ch)
+  END
+END OnTextInput;
+
 PROCEDURE OnKeyDown(app: App; key: G.Key);
 VAR handled: BOOLEAN; p: Control;
 BEGIN handled := FALSE; p := app.cur;
-  IF (key.mod * (G.mCtrl + G.mAlt + G.mShift) # {}) OR
-     (G.kF1 <= key.code) & (key.code <= G.kF12) OR
-     (key.code = G.kPause) THEN
+  IF (key.mod * (T.mCtrl + T.mAlt + T.mShift) # {}) OR
+     (T.kF1 <= key.code) & (key.code <= T.kF12) OR
+     (key.code = T.kPause) THEN
     handled := CheckHotkey(app, key);
-    IF ~handled & (key.mod * G.mAlt # {}) THEN
+    IF ~handled & (key.mod * T.mAlt # {}) THEN
       handled := CheckMenuOpenKey(app, key)
     END
   END;
   IF ~handled THEN
-    IF (key.code = G.kEnter) & (key.mod * G.mAlt # {}) THEN
+    IF (key.code = T.kEnter) & (key.mod * T.mAlt # {}) THEN
       T.ToggleFullscreen
     ELSIF p # NIL THEN
-      IF (key.code # G.kTab) OR ~OnTabPress(app, key.mod * G.mShift # {}) THEN
+      IF (key.code # T.kTab) OR ~OnTabPress(app, key.mod * T.mShift # {}) THEN
         IF p.do.keyDown # NIL THEN p.do.keyDown(p, key) END;
         IF (p.parent # NIL) & (p.parent IS Window) &
            (p.parent.do.keyDown # NIL) THEN
@@ -2412,16 +2419,10 @@ BEGIN handled := FALSE; p := app.cur;
         END
       END
     END
-  END
+  END;
+  (*!FIXME OnTextInput(app, E.ch) ??*)
 END OnKeyDown;
 
-PROCEDURE OnTextInput(app: App; ch: CHAR);
-BEGIN
-  IF (app.cur # NIL) & (app.cur.do.textInput # NIL) THEN
-    app.cur.do.textInput(app.cur, ch)
-  END
-END OnTextInput;
-
 PROCEDURE GetWindowAt(app: App; x, y: INTEGER): Control;
 VAR p, br: Control;
 BEGIN
@@ -2494,22 +2495,19 @@ BEGIN x := event.x DIV T.charW; y := event.y DIV T.charH;
 END OnMouseUp;
 
 PROCEDURE RunApp*(app: App);
-VAR event: G.Event;
+VAR E: T.Event;
 BEGIN
   app.quit := FALSE;
   DrawApp(app);
   REPEAT
-    G.WaitEvents(50);
-    WHILE G.PollEvent(event) DO
-      CASE event.type OF
-        G.mouseMove: OnMouseMove(app, event)
-      | G.mouseDown: OnMouseDown(app, event)
-      | G.mouseUp: OnMouseUp(app, event)
-      | G.keyDown: OnKeyDown(app, event.key)
-      | G.textInput: OnTextInput(app, event.ch)
-      | G.quit: app.quit := TRUE
-      ELSE
-      END
+    T.WaitEvent(E);
+    CASE E.type OF
+      T.mouseMove: OnMouseMove(app, E)
+    | T.mouseDown: OnMouseDown(app, E)
+    | T.mouseUp: OnMouseUp(app, E)
+    | T.key: OnKeyDown(app, E);
+    | T.quit: app.quit := TRUE
+    ELSE
     END;
     T.Act;
     IF app.needRedraw THEN DrawApp(app) END;