\ 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 = ;
