소스 검색

Maximized Free Oberon windows stay maximized on resize

Arthur Yefimov 2 년 전
부모
커밋
0f4fb71a9e
3개의 변경된 파일28개의 추가작업 그리고 2개의 파일을 삭제
  1. 17 0
      src/FreeOberon.Mod
  2. 3 1
      src/Graph.Mod
  3. 8 1
      src/OV.Mod

+ 17 - 0
src/FreeOberon.Mod

@@ -70,6 +70,8 @@ VAR
   terminalNeedRedraw: BOOLEAN; (* Used when a compiled program is running *)
   terminalNeedRedraw: BOOLEAN; (* Used when a compiled program is running *)
   terminalMouseShown: BOOLEAN; (* Same *)
   terminalMouseShown: BOOLEAN; (* Same *)
 
 
+  lastW, lastH: INTEGER; (* Last screen size *)
+
 (* Language Dialog *)
 (* Language Dialog *)
 
 
 PROCEDURE LanguageButtonClick*(c: OV.Control);
 PROCEDURE LanguageButtonClick*(c: OV.Control);
@@ -695,12 +697,27 @@ BEGIN
   END
   END
 END EditCutClipboard;
 END EditCutClipboard;
 
 
+PROCEDURE OnResize(w, h: INTEGER);
+VAR o, br: OV.Window;
+BEGIN
+  o := app.windows; br := o;
+  REPEAT
+    IF (o.w = lastW) & (o.h = lastH - 2) & (o.x = 0) & (o.y = 1) THEN
+      o.x := 0; o.y := 1; o.w := w; o.h := h - 2
+    END;
+    o := o.next(OV.Window)
+  UNTIL o = br;
+  lastW := w; lastH := h
+END OnResize;
+
 PROCEDURE InitIDE;
 PROCEDURE InitIDE;
 VAR w: OV.Window;
 VAR w: OV.Window;
   m, m2: OV.Menu;
   m, m2: OV.Menu;
   s, q: FoStrings.String;
   s, q: FoStrings.String;
 BEGIN
 BEGIN
   app := OV.NewApp();
   app := OV.NewApp();
+  T.Size(lastW, lastH);
+  OV.SetOnResize(app, OnResize);
   FileNew(app.menu);
   FileNew(app.menu);
 
 
   FoStrings.Get('menuFile', s);
   FoStrings.Get('menuFile', s);

+ 3 - 1
src/Graph.Mod

@@ -464,7 +464,7 @@ BEGIN scaled := FALSE;
       IF wasTarget THEN Target(NIL) END
       IF wasTarget THEN Target(NIL) END
     ELSE opt := {Al.convertBitmap};
     ELSE opt := {Al.convertBitmap};
       IF smooth IN W.options THEN
       IF smooth IN W.options THEN
-      	opt := opt + {Al.minLinear, Al.magLinear}
+        opt := opt + {Al.minLinear, Al.magLinear}
       END;
       END;
       Al.set_new_bitmap_flags(opt);
       Al.set_new_bitmap_flags(opt);
       W.bmp := Al.create_bitmap(w, h);
       W.bmp := Al.create_bitmap(w, h);
@@ -932,6 +932,8 @@ BEGIN isCurTarget := target = W;
     W.winW := Al.get_display_width(W.display);
     W.winW := Al.get_display_width(W.display);
     W.winH := Al.get_display_height(W.display);
     W.winH := Al.get_display_height(W.display);
     W.w := w; W.h := h;
     W.w := w; W.h := h;
+    ApplySizeStep(W, w, h);
+    W.lastW := W.w; W.lastH := W.h;
     ResetWindowBitmap(W);
     ResetWindowBitmap(W);
     Al.register_event_source(queue, Al.get_display_event_source(W.display));
     Al.register_event_source(queue, Al.get_display_event_source(W.display));
     IF isCurTarget THEN Target(W) END;
     IF isCurTarget THEN Target(W) END;

+ 8 - 1
src/OV.Mod

@@ -681,6 +681,7 @@ TYPE
     cur*: Control;
     cur*: Control;
     dragged*: Control;
     dragged*: Control;
     dragX*, dragY*: INTEGER;
     dragX*, dragY*: INTEGER;
+    onResize: PROCEDURE (w, h: INTEGER);
     lastMouseDownTime*: INTEGER;
     lastMouseDownTime*: INTEGER;
     quit*: BOOLEAN;
     quit*: BOOLEAN;
     needRedraw*: BOOLEAN;
     needRedraw*: BOOLEAN;
@@ -2279,6 +2280,7 @@ BEGIN app.windows := NIL;
   app.statusbar := NewMenu('ROOT', '', 0, NIL); app.statusbar.app := app;
   app.statusbar := NewMenu('ROOT', '', 0, NIL); app.statusbar.app := app;
   app.statusText[0] := 0X;
   app.statusText[0] := 0X;
   app.dragged := NIL; app.dragX := 0; app.dragY := 0;
   app.dragged := NIL; app.dragX := 0; app.dragY := 0;
+  app.onResize := NIL;
   app.cur := NIL;
   app.cur := NIL;
   app.lastMouseDownTime := 0;
   app.lastMouseDownTime := 0;
   app.quit := FALSE;
   app.quit := FALSE;
@@ -2292,6 +2294,10 @@ VAR a: App;
 BEGIN NEW(a); InitApp(a); RETURN a
 BEGIN NEW(a); InitApp(a); RETURN a
 END NewApp;
 END NewApp;
 
 
+PROCEDURE SetOnResize*(a: App; p: PROCEDURE (w, h: INTEGER));
+BEGIN a.onResize := p
+END SetOnResize;
+
 PROCEDURE RefreshAppMenu*(menu: Menu);
 PROCEDURE RefreshAppMenu*(menu: Menu);
 VAR p, br: Control;
 VAR p, br: Control;
   x, y: INTEGER;
   x, y: INTEGER;
@@ -2506,7 +2512,8 @@ END OnMouse;
 
 
 PROCEDURE OnResize(app: App; E: T.Event);
 PROCEDURE OnResize(app: App; E: T.Event);
 BEGIN
 BEGIN
-  app.needRedraw := TRUE
+  app.needRedraw := TRUE;
+  IF app.onResize # NIL THEN app.onResize(E.w, E.h) END
 END OnResize;
 END OnResize;
 
 
 PROCEDURE RunApp*(app: App);
 PROCEDURE RunApp*(app: App);