DEFINITION MODULE IntuiMacros;
(*$ LargeVars:=FALSE NameChk:=FALSE *)
(* 19-Aug-92 /bp *)
(*
 * Diese Prozeduren sind in der Schnittstelle
 * der Programmiersprache C als Macros definiert.
 *
 * In Modula-2 müssen diese als Prozeduren ver-
 * wirklicht werden. Die ersten drei Prozeduren
 * zerlegen den Code, der von Intuition bei einer
 * Menuauswahl geliefert wird in die einzelnen
 * Teile, während die anderen drei Prozeduren
 * einen solchen Wert zusammensetzen.
 *)

IMPORT S:SYSTEM, I:IntuitionD;

PROCEDURE MenuNum(code{0}: CARDINAL): CARDINAL;
PROCEDURE ItemNum(code{0}: CARDINAL): CARDINAL;
PROCEDURE SubNum(code{0}: CARDINAL): CARDINAL;

PROCEDURE ShiftMenu(code{0}: CARDINAL): CARDINAL;
PROCEDURE ShiftItem(code{0}: CARDINAL): CARDINAL;
PROCEDURE ShiftSub(code{0}: CARDINAL): CARDINAL;
(*
 In der vorherigen Version wurde die Prozedur ShiftSub fälschlicherweise
 ShiftNum genannt. Damit bestehende Programme die diese Funktion unter
 dem altent Namen verwenden, ist sie hier noch enthalten.
 Alle neuen Programme sollten die identische Funktion ShiftSub verwenden.
*)
PROCEDURE ShiftNum(code{0}: CARDINAL): CARDINAL;

(*
 * Macros für GadTools:
 * Menu und MenuItem können ab V36 ein Feld userData enthalten,
 * das durch GadToolsL.CreateMenusA initialisiert wird.
 * Die beiden folgenden Prozeduren liefern den Inhalt des Feldes.
 * Sinnvoller wäre allerdings ein Typ ExtMenu(Item), dessen Feld
 * userData gleich den gewünschten (Long)typ hat.
 *)
TYPE
  ExtMenu = RECORD
    m: I.Menu;
    userData: S.ADDRESS;
  END;
  ExtMenuPtr = POINTER TO ExtMenu;
  ExtMenuItem = RECORD
    i: I.MenuItem;
    userData: S.ADDRESS;
  END;
  ExtMenuItemPtr = POINTER TO ExtMenuItem;

PROCEDURE MenuUserData(m{8}: I.MenuPtr): S.ADDRESS;

PROCEDURE MenuItemUserData(i{8}: I.MenuItemPtr): S.ADDRESS;

END IntuiMacros.
