<<>> <> <> <> <> <> <> <> <> <> <<>> <> <> <<>> DIRECTORY RefTab, Rope, TIPFriendsTypes, TIPUser, UserInput, UserInputGetActions, Vector2; TIPPrivate: CEDAR DEFINITIONS = BEGIN TIPTable: TYPE ~ TIPUser.TIPTable; TIPScreenCoords: TYPE ~ TIPUser.TIPScreenCoords; TIPScreenCoordsRec: TYPE ~ TIPUser.TIPScreenCoordsRec; TIPTime: TYPE ~ TIPUser.TIPTime; TIPClient: TYPE = REF TIPClientRec; -- Handle on a TIP input process TIPClientRec: TYPE = PRIVATE RECORD [ parseInfo: TIPParseInfo, -- increeks and parse tables for matching notifyProc: TIPNotifyProc ¬ NIL, -- notification of table recognised events buttonProc: TIPButtonProc ¬ NIL, -- special button handling (for Cedar InputFocus) clientData: REF ANY ¬ NIL, -- returned to client when notifyProc or buttonProc is called <> matcher: PROCESS -- the parser process ]; maxTIPNesting: NAT = 10; TIPParseInfo: TYPE = REF TIPParseInfoRec; TIPParseInfoRec: TYPE = RECORD [ inCreek, localCreek, timeCreek: UserInput.Handle, creekStack: ARRAY [0..maxTIPNesting) OF UserInput.Handle, tableHead: TIPTable ]; TIPNotifyProc: TYPE = TIPFriendsTypes.TIPNotifyProc; TIPButtonProc: TYPE = TIPFriendsTypes.TIPButtonProc; MouseEvent: TYPE = TIPFriendsTypes.MouseEvent; CreateTIPClient: PROC [notify: TIPNotifyProc ¬ NIL, buttons: TIPButtonProc ¬ NIL, clientData: REF ANY, name: Rope.ROPE ¬ NIL] RETURNS [self: TIPClient]; <> <> <<>> StartTIPClient: PROC [tipClient: TIPClient]; <> GetInputHandle: PROC [tipClient: TIPClient] RETURNS [handle: UserInput.Handle]; GetParseInfo: PROC [tipClient: TIPClient] RETURNS [parseInfo: TIPParseInfo]; GetClientData: PROC [tipClient: TIPClient] RETURNS [clientData: REF ANY]; DestroyClient: PROC [self: TIPClient]; <> CreateParseInfo: PROC [parseTable: TIPTable ¬ NIL, name: Rope.ROPE ¬ NIL] RETURNS [new: TIPParseInfo]; <> <> WideParseOneEvent: PROC [parseInfo: TIPParseInfo] RETURNS [result: LIST OF REF ANY]; <> PushTIPTable: PROC [user: TIPClient, table: TIPTable, opaque: BOOL]; <> PopTIPTable: PROC [user: TIPClient] RETURNS [old: TIPTable]; <> DiscardTypeAhead: PROC [user: TIPClient]; <> ResetTIPContext: PROC [user: TIPClient, table: TIPTable, notify: TIPNotifyProc, interrupt: BOOL ¬ FALSE]; <> <> InterruptTIP: UNSAFE PROC [self: TIPClient]; <> <> WideMatchEvent: PROC [parseInfo: TIPParseInfo, a: UserInputGetActions.InputActionBody] RETURNS [result: LIST OF REF ¬ NIL]; stdChar: REF CHAR; stdCoords: TIPScreenCoords; stdTrackballChange: REF Vector2.VEC; stdThumbwheelChange: REF INTEGER; stdTime: TIPTime; <> BuildNewTIPTable: PROC [file: Rope.ROPE] RETURNS [table: TIPTable ¬ NIL, option: KeyOption]; DefaultTable: PROC [printKeys: BOOL] RETURNS [table: TIPTable]; GetTIPFilePrefix: PROC[hadError: BOOL] RETURNS [rope: Rope.ROPE]; EnsureEqualTables: PROC [t1, t2: TIPTable]; version: CHAR = '1; -- table syntax version number predTable: RefTab.Ref; -- table for user defined predicates KeyOption: TYPE = {none, printKeys, defaultKeys}; Symbol: TYPE = {OptionSym, Small, Fast, FastMouse, SlowMouse, PrintKeys, DefaultKeys, Opaque, Select, Trigger, Enable, From, Endcase, End, While, And, Up, Down, Mouse, After, Before, RightArrow, Comma, Semicolon, LeftCurly, RightCurly, Greater, Dot, VertBar, Char, Coords, Time, KeyIdent, Ident, Number, String, Illegal, Trackball, Thumbwheel, TrackballChange, ThumbwheelChange}; nrOfErrors: CARDINAL = 30; errorText: REF ARRAY [0..nrOfErrors] OF Rope.ROPE; InitBuilder: PROC; END. The syntax of "compiled" tip table files follows: capital letters, numbers and parens are character literals lower case id's are names of syntax equations id* means 0 or more instances is a primitive of some sort such as text file = TIPTABLE version opaque link ignore variant version = opaque = flag link = N --none-- | P --printKeys-- | D --defaultKeys-- ignore = up down move up = flag down = flag move = flag variant = S small | F fast small = choiceseries fast = choice U choicearray D choicearray time time = choice choicearray = ( choiceitem* ) choiceitem = ( key choice ) choiceseries = ( choice* ) choice = ( term* ) term = 1 keytrigger | 2 --mousetrigger-- | 3 timetrigger | 4 keyenable | 5 predenable | 6 --CHAR-- | 7 --COORDS-- | 8 choiceseries | 9 results | A key2Enable | B keyEnableList | C --TIME-- keytrigger = key keystate key = keystate = U --up-- | D --down-- timetrigger = timeoutflavor msecs timeoutflavor = G --gt-- | L --lt-- msecs = high low high = low = keyenable = key keystate key2Enable = keyenable keyenable keyEnableList = ( keyenable* ) predenable = atom results = ( result* ) result = 1 atom | 2 --TIPUser.stdChar-- | 3 | 4 len | 5 --TIPScreenCoords-- | 6 --TIPUser.stdTime-- flag = T | F -- true or false atom = len pname pname = len = stored as series of characters. length limited to 255 chars stored as 4 bytes and stored as themselves