# o/mero definitions. Panels: module { PATH: con "/dis/o/mpanel.dis"; Tappl, Trepl: con iota; # Application and viewer trees # Common panel attributes. Individual panels may add more. Atag, # show its tag Ashow, # shown in viewer (not hidden) Aappl, # created by application [id [pid]] Amax: con iota; # One per actual panel. # while the panel should be kept alive. Panel: adt { id: int; # unique panel identifier aid: int; # id supplied by user to appl pid: int; # process id, when supplied by appl. name: string; impl: Pimpl; # implementor container: int; # true for container data: array of byte; vers: int; # qid.vers for data image: array of byte; repl: array of ref Repl; nrepl: int; ok: fn(p: self ref Panel); text: fn(p: self ref Panel) : string; new: fn(name: string): ref Panel; lookup: fn(id: int, rid: int): (ref Panel, ref Repl); newrepl: fn(p: self ref Panel, path: string, t: int): ref Repl; close: fn(p: self ref Panel); closerepl: fn(p: self ref Panel, r: ref Repl); vpost: fn(p: self ref Panel, excl: ref Repl, ev: string); # changes to viewer post: fn(p: self ref Panel, ev: string); # event to appl. put: fn(p: self ref Panel, data: array of byte, off: big): (int, string); putimage: fn(p: self ref Panel, data: array of byte, off: big): (int, string); newdata: fn(p: self ref Panel): string; ctl: fn(r: self ref Panel, r: ref Repl, attr: string): (int, string); # (update, err) ctlstr: fn(r: self ref Panel, r: ref Repl): string; }; # One per replica, including the original application panel. # Referenced from files referring to the replica. # Released when the first file drops its reference to it. Repl: adt { id: int; # position in p.repl array pos: int; # position in parent container vers: int; # qid.vers for panel ctl tree: int; # Tappl or Trepl path: string; dirq: big; dirvers: int; # qid.vers for panel directory attrs: array of string; post: fn(r: self ref Repl, pid: int, ev: string); # event to viewer }; init: fn(dat: Dat, dir: string); dump: fn(); mkqid: fn(id, rid, t: int): big; qid2ids: fn(q: big): (int, int, int); }; # Panel implementation. Provided by panel modules loaded just # to check out that updates made by the user are correct and # to learn of new panel types. Pimpl: module { init: fn(d: Dat): list of string; pinit: fn(p: ref Panels->Panel); rinit: fn(p: ref Panels->Panel, r: ref Panels->Repl); newdata: fn(p: ref Panels->Panel): string; ctl: fn(p: ref Panels->Panel, r: ref Panels->Repl, ctl: list of string): (int, string); #upd., err };