(* ------------------------------------------------------------------------
   :Program.      xDisplay.
   :Contents.     Proceduren zur Erweiterung des Modules 'Display'.
   :Author.       Klaus Hlawaty.
   :Address.      Waldhof
   :Address.      3579 Schrecksbach
   :History.      v2.0 - 09.Sep.91: siehe unten.
   :History.      v2.1 - 16.Nov.91: Oberon v2.13
   :Copyright.    Freeware, ---> bei Fridtjof Siebert.
   :Language.     Oberon
   :Translator.   OBERON v2.13 / OLink v2.13d
   :Imports.      Speed.
   :Remarks.      Dieses Modul erweitert das Modul Display um die
   :Remarks.      Möglichkeiten die Window- und IDCMP-Flags vor
   :Remarks.      OpenWindow zu verändern. Hiermit sind z.B. gzz-Windows
   :Remarks.      oder auch BackdropWindows ohne Gadgets möglich.
   :Support.      Änderung des Orginal-Display-Moduls von
   :Support.        Fridtjof Siebert.
------------------------------------------------------------------------ *)
(*-------------------------------------------------------------------------

   Dieses Modul erweitert das Modul Display um einige zusätzliche
   Möglichkeiten

    - 31.11.90:
      exportiern von globalen Variablen für:
      1.) die IDCMP-Flags der OpenWindow-Procedure und
      2.) die Window-Flags der OpenWindow-Procedure.
      Damit ist es möglich Fenster z.B.: ohne Size-Gadget o.ä. zu öffnen.

    - 31.11.90:
      exportieren der Konstanten mit der Standardeinstellung von
      Display. Diese wird zu Begin WindowFlags zugewiesen und dient
      zum Zurückstellen nach Änderung.

    - 04.01.91:
      exportieren einer Zeigervariablen für firstGadget von NewWindow.

    - 21.08.91:
      Umbau von nDisplay auf xDisplay.

    - 08.09.91:
      Da die Listenverwaltung der Screen und Windowstrukturen von Display
      nicht von exportiert werden, wird sie in xDisplay nicht benutzt.
      D.h. man muß selbst für einwandfreies Schliessen von Screen's und
      Windows sorgen.

-------------------------------------------------------------------------*)


MODULE xDisplay;

IMPORT
      D : Display,
     li : Lists,
      I : Intuition,
      g : Graphics,
      l : Layers,
      e : Exec,
          Speed,
      s : SYSTEM;
CONST

  CWindowFlags * = LONGSET{I.windowSizing, I.windowDrag,    I.windowDepth,
                           I.windowClose,  I.gimmeZeroZero, I.activate};
TYPE

  Window * = RECORD (D.DispEl)
               window *  : I.WindowPtr;
               rastport* : g.RastPort;   (* Window.rp points to this copy of the RP *)
             END;
  WindowPtr * = POINTER TO Window;

VAR
  WindowFlags * : LONGSET; (* Enthält die Window und IDCMPFlags für *)
  IDCMPFlags  * : LONGSET; (* OpenWindow. Weiteres siehe Oben !!!!! *)
  FirstGadget * : I.GadgetPtr; (* Dieser wird vorbesetzt mit NIL    *)

  Elements: li.List;
  n: li.NodePtr;



(*------  OpenWindow:  ------*)


PROCEDURE OpenWindow*(win2:    D.WindowPtr;
                      title:   ARRAY OF CHAR;
                      x,y,w,h: INTEGER;
                      screen:  I.ScreenPtr): BOOLEAN;

VAR nw: I.NewWindow;
    win: WindowPtr;

BEGIN
  LOOP
    NEW(win2.title); IF win2.title=NIL THEN EXIT END;
    win := s.VAL(WindowPtr,win2);
    Speed.StrCopy(title,win2.title^);
    nw.leftEdge    := x;   nw.topEdge     := y;
    nw.width       := w;   nw.height      := h;
    nw.detailPen   := -1;  nw.blockPen    := -1;
    nw.idcmpFlags  := IDCMPFlags;                 (* Zuweisung *)
    nw.flags       := WindowFlags;                (* Zuweisung *)
    nw.firstGadget := FirstGadget;                (* Zuweisung *)
    nw.checkMark   := NIL;
    nw.title       := win.title;
    nw.bitMap      := NIL;
    nw.minWidth    := 128; nw.minHeight   := 24;
    nw.maxWidth    := -1;  nw.maxHeight   := -1;
    nw.screen      := screen;
    IF screen=NIL THEN nw.type   := {I.wbenchScreen}
                  ELSE nw.type   := I.customScreen   END;
    win2.window := I.OpenWindow(nw);
    IF win2.window=NIL THEN EXIT END;
    win.rastport := win.window.rPort^;
    win.rp := s.ADR(win.rastport);
    win.gzz := TRUE;
    D.Init(win2);
    li.AddHead(Elements,win2);
    RETURN TRUE;
  END;
  IF win2.title#NIL THEN DISPOSE(win2.title) END;
  RETURN FALSE;
END OpenWindow;




(*------  OpenWindowX:  ------*)


PROCEDURE OpenWindowX*(win2:    D.WindowPtr;
                       gadg:    I.GadgetPtr;
                       gzz:     BOOLEAN;
                       title:   ARRAY OF CHAR;
                       x,y,w,h: INTEGER;
                       screen:  I.ScreenPtr;
                       activate:BOOLEAN): BOOLEAN;

VAR nw: I.NewWindow;
    win: WindowPtr;

BEGIN
  LOOP
    NEW(win2.title); IF win2.title=NIL THEN EXIT END;
    win := s.VAL(WindowPtr,win2);
    Speed.StrCopy(title,win2.title^);
    nw.leftEdge    := x;   nw.topEdge     := y;
    nw.width       := w;   nw.height      := h;
    nw.detailPen   := -1;  nw.blockPen    := -1;
    nw.idcmpFlags  := IDCMPFlags;                   (* Zuweisung *)
    nw.flags       := WindowFlags;                  (* Zuweisung *)
    IF activate THEN INCL(nw.flags,I.activate) END;
    IF gzz THEN INCL(nw.flags,I.gimmeZeroZero) END;
    nw.firstGadget := gadg; nw.checkMark   := NIL;
    nw.title       := win.title;
    nw.bitMap      := NIL;
    nw.minWidth    := 128; nw.minHeight   := 24;
    nw.maxWidth    := -1;  nw.maxHeight   := -1;
    nw.screen      := screen;
    IF screen=NIL THEN nw.type   := {I.wbenchScreen}
                  ELSE nw.type   := I.customScreen   END;
    win2.window := I.OpenWindow(nw);
    IF win2.window=NIL THEN EXIT END;
    win.rastport := win.window.rPort^;
    win.rp := s.ADR(win.rastport);
    win.gzz := gzz;
    D.Init(win2);
    li.AddHead(Elements,win2);
    RETURN TRUE;
  END;
  IF win2.title#NIL THEN DISPOSE(win2.title) END;
  RETURN FALSE;
END OpenWindowX;

BEGIN (* ---------------  Modulerumpf für Voreinstellung --------------- *)

  WindowFlags := CWindowFlags; (* Setzt die Standart-Display-Einstellung *)
  IDCMPFlags  := LONGSET{};    (* Hier Standart = Kein Flag              *)
  FirstGadget := NIL;          (* Neu                                    *)

END xDisplay.

