h52197 s 00233/00000/00000 d D 1.1 91/03/08 04:49:08 hopkins 1 0 c date and time created 91/03/08 04:49:08 by hopkins e u U f e 0 t T I 1 % % ClassTrackingCanvas, a tnt canvas with external tracking properties % systemdict /track_first_event null put systemdict /track_event null put /track_start_event {systemdict /track_first_event 3 -1 roll put} def /trackx {track_event /XLocation get} def /tracky {track_event /YLocation get} def /trackdx {trackx track_first_event /XLocation get sub} def /trackdy {tracky track_first_event /YLocation get sub} def /track_is_timed {track_event /istimed 2 copy known {get} {pop pop false} ifelse} def /ClassTrackingCanvas ClassCanvas [] classbegin /Trackable? true def /track_time 0 def /track_lev 0 def % % subclasses responsibility % /onselect nullproc def /onadjust nullproc def % % send an event to the tracking process % /track_send { % event action -- 1 index begin /ClientData exch def /Canvas self def /Name /tRackEvent def end sendevent } def % % tracking service interface % /TrackStart { % event -- list true .1 blockinputqueue % determine multi click dup /TimeStampMS get track_time sub UserProfile /MultiClickThresh get le {track_lev} 0 ifelse 1 add /track_lev exch promote /track_time 1 index /TimeStampMS get promote { newprocessgroup currentprocess /ProcessName (HyperNeWS tracker) put currentprocess /track_evt 3 -1 roll put clear createevent dup begin /Name /tRackEvent def end expressinterest unblockinputqueue InteractionLock { self setcanvas currentprocess /track_state null put currentprocess /track_evt get /track_first_event 1 index store /Name get dup AdjustButton eq { pop onadjust } { MenuButton eq {onmenu} {onselect} ifelse } ifelse } monitor currentprocess /track_evt undef systemdict /track_first_event null put systemdict /track_event null put } fork soften /tracker exch promote pop /Default true } def /TrackStop { % event -- { currentprocess /track_mvd known /mouse_up /mouse_click ifelse exit } track_send /tracker unpromote } def /TrackCancel { % event -- {/mouse_cancel exit} track_send /tracker unpromote } def /TrackMotion { % event -- {currentprocess /track_mvd true put $track_proc} track_send } def classend def % % Track utillities % /mouseevent { % -- event currentprocess /track_evt 2 copy known {get} {pop pop createevent} ifelse } def /mouselevel { % -- multi-click-level mouseevent /Canvas get dup null ne { /track_lev 2 copy known {get} {pop pop 0} ifelse } {pop 0} ifelse } def % % low level track procedure % /trackable { % -- boolean currentprocess dup /track_evt known exch /track_state known and } def /track_state { % -- status trackable { currentprocess /track_state get null eq { 10 dict begin currentprocess /track_state undef /$track_proc { currentprocess /track_state track_event put /mouse_drag exit } def { awaitevent /track_event 1 index store /ClientData get exec } loop end } {/mouse_drag} ifelse } {/mouse_cancel} ifelse } def /track { % proc -- status trackable { 10 dict begin /$track_proc exch cvx def /track_event currentprocess /track_evt get store $track_proc currentprocess /track_state get dup null ne { /track_event exch store $track_proc } {pop} ifelse currentprocess /track_state undef { awaitevent /track_event 1 index store /ClientData get exec } loop end } {pop /mouse_cancel} ifelse } def /track_time_select { % proc -- $track_time 0 eq {track_event /istimed false put} if track_event /TimeStampMS get $track_time ge { /$track_time currenttimems $track_delay add store createevent begin /TimeStampMS $track_time def /Name /tRackEvent def /ClientData {currentprocess /track_mvd true put $track_proc} def /istimed true def currentdict end sendevent } if cvx exec } def /track_time { % threshms delayms proc -- status trackable { 10 dict begin /$track_proc [3 -1 roll //track_time_select /exec load] cvx def /$track_delay 3 -1 roll 10 max def /$track_time 0 def /track_event currentprocess /track_evt get store $track_proc /$track_delay exch 10 max store currentprocess /track_state undef { awaitevent /track_event 1 index store dup /istimed known { dup begin currentcursorlocation /YLocation exch def /XLocation exch def end } if /ClientData get exec } loop end } {pop pop pop /mouse_cancel} ifelse } def currentdict /track_time_select undef /track_timed { % threshms delayms proc -- status trackable { [/track_event cvx /istimed /known cvx [6 -1 roll cvx] cvx /if load] cvx track_time } {pop pop pop /mouse_cancel} ifelse } def /track_once { % proc -- status trackable { /track_event mouseevent store cvx exec currentprocess /track_evt undef currentprocess /track_state undef /mouse_up } {pop /mouse_cancel} ifelse } def /track_overlay { % proc -- status [/erasepage load 3 -1 roll cvx /exec load] cvx matrix currentmatrix currentcanvas dup createoverlay setcanvas 1 index setmatrix 3 -1 roll track 3 1 roll erasepage setcanvas setmatrix } def E 1