home *** CD-ROM | disk | FTP | other *** search
- \ mouse server action
- \ the whole screen is devided into 16x16 pixel sections. When pressing one
- \ of the mouse keys, the apprpriate action is taken.
- terminals also
- create mouse-indexes here 64 128 * chars dup allot erase
- create mouse-actions here 256 cells dup allot erase
- : action>index \ ( action -- i )
- false locals| index action |
- 256 1 do mouse-actions i cells+ token@ action = if i is index leave then loop
- index if index exit then
- 256 1 do mouse-actions i cells+ @ 0=
- if action mouse-actions i cells+ token! i is index leave then
- loop
- index 0= abort" No mouse action available"
- index ;
-
- 0 constant mouse-x
- 0 constant mouse-y
- 0 constant mouse-button
- 0 constant mouse-field
-
- code get-mouse-position ( -- )
- h# 1c swix
- r0 r0 1 #asr mov
- r0 'body mouse-x pcr str
- r2 'body mouse-button pcr str
- r1 r1 1 #asr mov
- r3 'body (lines) adr
- r3 r3 ) ldr
- r1 r3 r1 sub
- r1 1 decr
- r1 'body mouse-y pcr str
- r0 r0 4 #asr mov
- r1 r1 4 #asr mov
- r0 r0 r1 7 #asl add
- r1 h# 1fff # mov
- r0 r0 r1 and
- r1 'body mouse-indexes adr
- r0 r0 r1 ib byte ldr
- r1 'body mouse-actions adr
- r0 r1 r0 2 #asl add
- r0 'body mouse-field pcr str c;
-
- create mouse-par 64 allot
- code set-mouse-speed ( buffer -- )
- r0 d# 21 # mov
- r1 mouse-par adr
- 7 swix c;
- : slow-mouse 2 mouse-par c! 1 mouse-par 1+ c! 1 mouse-par 2+ c! set-mouse-speed ;
- : fast-mouse 2 mouse-par c! 3 mouse-par 1+ c! 3 mouse-par 2+ c! set-mouse-speed ;
-
- : mouse-action-cell ( action x y -- )
- 2>r action>index 2r> 7 lshift + mouse-indexes + c! ;
- : mouse-action-field ( action upper-x upper-y width height )
- locals| height width upper-y upper-x action |
- upper-y height bounds
- do upper-x width bounds
- do action i j mouse-action-cell loop
- loop ;
- : mouse-action-p-field
- locals| height width upper-y upper-x action |
- upper-y 4 rshift height 4 rshift bounds
- do upper-x 4 rshift width 4 rshift bounds
- do action i j mouse-action-cell loop
- loop ;
- : r-butt? ( -- f) mouse-button 1 = ;
- : m-butt? ( -- f) mouse-button 2 = ;
- : l-butt? ( -- f) mouse-button 4 = ;
-
- task: mouse-server
- : do-mouse-action
- multi mouse-server activate
- 1 set-mouse
- begin 100 ms get-mouse-position mouse-button
- if mouse-field @ single ?execute multi slow-mouse
- else fast-mouse
- then
- again ;
-