
(*=============================================================================
:Program.       MoreIntuition
:Contents.
:Contents.
:Author.        Michael `Mick' Hohmann
:Address.       Carl-Schilling-Str. 10; 8701 Kirchheim
:Address.       UUCP: mickh@imart.franken.de
:Phone.         09 31 / 54 1 55
:Copyright.     Copyrighted Software by ImageArts
:Language.      Oberon
:Translator.    AmigaOberon 2.39d
:History.       v1.0  Added LockFrontPubScr()
:History.       v1.21 totally rewritten
:History.       v1.3  translated to Oberon
:Thanx.         an Bernd Möllemann, Jürgen Weinelt und Steffen Reith
:Thanx.          für ihre Hilfe bei der Erstellung der Algorithmen
=============================================================================*)

MODULE MoreIntuition;

IMPORT
  E:=Exec,
  I:=Intuition,
  SYSTEM,
  Strings;


CONST
  versionString      = "$VER: MoreIntuition 1.21 (Thursday 23 Jul 1992)";


TYPE
  String             = ARRAY I.maxPubScreenName+1 OF CHAR;
  StringPtr          = POINTER TO String;

(* ************************************************************************** *)

PROCEDURE LockFrontPubScr*(VAR pubName:ARRAY OF CHAR):I.ScreenPtr;

VAR pubScr,frontScr  : I.ScreenPtr;
    pubScrList       : E.ListPtr;
    pubNamePtr       : StringPtr;
    rootScr          : I.ScreenPtr;
    intuiLock        : LONGINT;
    dummy            : BOOLEAN;

BEGIN

  (** Initialisierungen **)
  pubScr:=NIL;
  rootScr:=NIL;
  dummy:=TRUE;

  IF pubName="" THEN
    (** Pointer des vordersten Screens holen **)
    intuiLock:=I.LockIBase(0);
    frontScr:=I.int^.firstScreen;
    I.UnlockIBase(intuiLock);

    (** PubScreenListe locken **)
    pubScrList:=I.LockPubScreenList();

    (** Sucht nach dem vordersten Screen in der PubScreenListe **)
    LOOP
      pubNamePtr:=SYSTEM.VAL(StringPtr,I.NextPubScreen(pubScr,pubName));
      pubScr:=I.LockPubScreen(pubNamePtr^);

      IF (pubScr=NIL) OR (pubScr=rootScr) THEN pubScr:=I.LockPubScreen(NIL); EXIT END;
      IF (pubScr=frontScr) THEN EXIT END;

      I.UnlockPubScreen(NIL,pubScr);

      IF dummy THEN
       rootScr:=pubScr;
       dummy:=FALSE
      END
    END;

    (** PubScreenList unlocken **)
    I.UnlockPubScreenList()
  ELSE
   pubScr:=I.LockPubScreen(pubName)
  END;

 (** Und nun den Pointer auf den gelockten Screen zurückgeben **)
 RETURN pubScr

END LockFrontPubScr;

(* ************************************************************************** *)

BEGIN

END MoreIntuition.
