NEW
  AUTO 3,1
*--------------------------------------
MOU.Init		>PUSHW L.DEVNAME.MOUSE
				>PUSHBI 0
				>SYSCALL2 open
				bcc .2

				inc DEVNAME.MOUSE+8
				lda DEVNAME.MOUSE+8
				cmp #'8'
				bne MOU.Init

*				sec
				rts

.2				sta hDevMouse

				clc
				rts
*--------------------------------------
* make sure mouse X,Y always in Screen
*--------------------------------------
MOU.Setup		lda CLIP.Screen+S.RECT.X2+1
				sta MouseClamp+3
				lsr
				sta PTR.Pos+S.POINT.X+1

				lda CLIP.Screen+S.RECT.X2
				sta MouseClamp+2
				ror
				sta PTR.Pos+S.POINT.X

				lda CLIP.Screen+S.RECT.Y2+1
				sta MouseClamp+7
				lsr
				sta PTR.Pos+S.POINT.Y+1

				lda CLIP.Screen+S.RECT.Y2
				sta MouseClamp+6
				ror
				sta PTR.Pos+S.POINT.Y

				>PUSHB hDevMouse
				>PUSHBI IOCTL.CONTROL
				>PUSHW L.MouseClamp
				>SYSCALL2 IOCTL
				bcs .9

				>LDYA L.PTR.SaveBuf
				>STYA CB.PTR+S.CB.DstPtr

*				clc
.9				rts
*--------------------------------------
MOU.Quit		lda hDevMouse
				beq .8

				>PUSHA
				>PUSHBI IOCTL.CLOSE
				>PUSHWZ
				>SYSCALL2 IOCTL

.8				clc
				rts
*--------------------------------------
MOU.CheckOverMenu
.1				ldx MENU.Stack.Cnt
				beq .9

.2				dex
				stx MENU.Stack.Idx
				lda MENU.Stack,x

				>SYSCALL2 GetMemPtr
				>STYA ZPObjPtr

				jsr MOU.InObj
				bcs .3

				lda #PTR.T.ARROW
				jsr PTR.Set
				
				jmp MENU.Enter

.3				ldx MENU.Stack.Idx
				bne .2

				lda	MSG+S.MSG.S
				bit #S.XY.S.CLK
				beq .9

				jsr MENU.DestroyAll

.9				sec
				rts
*--------------------------------------
MOU.CheckOverSysBut
				>LDYA L.RECT.SysBut
				jsr MOU.InRectYA
				bcs .9

				jmp SYSBUT.Enter

.9				jsr SYSBUT.Leave
				sec
MOU.CheckOverSysBut.RTS
				rts
*--------------------------------------
MOU.CheckOverWND
				ldx WND.Stack.Top
				beq MOU.CheckOverSysBut.RTS

.1				stx WND.Stack.Idx

				lda WND.Stack-1,x
				jsr OBJ.GetHWNDA

				jsr MOU.ChkWNDBorders
				bcc MOU.CheckOverSysBut.RTS

				lda ZPWNDPtr
				clc
				adc #S.OBJ.X1
				tay
				lda ZPWNDPtr+1
				adc /S.OBJ.X1
				jsr MOU.InRectYA
				bcs .7					not over this WND

				lda	MSG+S.MSG.S
				bit #S.XY.S.CLK
				beq .2

				jsr WND.Bring2Front

.2				lda ZPWNDPtr
				clc
				adc #S.WND.InnerX1
				tay
				lda ZPWNDPtr+1
				adc /S.WND.InnerX1
				jsr MOU.InRectYA
				bcc .8					in Inner Space

				ldy #S.OBJ.S
				lda (ZPWNDPtr),y
				and #S.WND.S.HASTBAR
				beq .3
				
				ldy #S.WND.TBarY2
				jsr MOU.WNDCmpY
				bcc .3					not in TBAR

				jmp MOU.MoveWND

.3				ldy #S.OBJ.S
				lda (ZPWNDPtr),y
				and #S.WND.S.HASMBAR
				beq .4
				
				ldy	#S.WND.MBarY2
				jsr MOU.WNDCmpY
				bcc .4					not in MBAR

				jsr MBAR.Enter

				bra .5

.4				ldy #S.OBJ.S
				lda (ZPWNDPtr),y
				and #S.WND.S.HASSBAR
				beq .5

				ldy #S.WND.SBarY1
				jsr MOU.WNDCmpY
				bcs .5					not in SBAR



.5				lda #PTR.T.ARROW

.6				jmp PTR.Set

.7				ldx WND.Stack.Idx

				dex
				bne .1

				lda #PTR.T.ARROW
				jsr PTR.Set

.9				sec
				rts
*--------------------------------------
.8				ldy #S.WND.hPTR
				lda (ZPWNDPtr),y
				jsr PTR.Set

				jsr MOU.ToLocal
				
				jsr MOU.ChkWNDChilds
				bcc .99
			
				clc
.99				rts
*--------------------------------------
MOU.MoveWND		lda	MSG+S.MSG.S
				bit #S.XY.S.DRAGSTART
				beq .8

				lda ZPWNDPtr
				clc
				adc #S.OBJ.X1
				tay
				lda ZPWNDPtr+1
				adc /S.OBJ.X1
	
				jmp PTR.SetRect

.8				lda #PTR.T.MOVE
				jmp PTR.Set
*--------------------------------------
MOU.ChkWNDChilds

				jsr WND.GetChilds
				beq .9

.1				jsr MOU.InObj
				bcs .7					not over this Child

				jsr OBJ.Enter
				bra .8

.7				jsr OBJ.Leave

.8				jsr OBJ.GetNext
				bne .1

.9
MOU.ChkWNDChilds.9
				sec
				rts
*--------------------------------------
MOU.ChkWNDBorders
				ldy #S.OBJ.F
				lda (ZPWNDPtr),y
				and #S.OBJ.F.BORDER
				beq MOU.ChkWNDChilds.9

				stz IY

				ldy #S.OBJ.X1
				lda (ZPWNDPtr),y
				sec
				sbc #1
				eor MSG+S.MSG.X1
				bne .1

				iny
				lda (ZPWNDPtr),y
				sbc #0
				eor MSG+S.MSG.X1+1
				bne .1

				lda #PTR.T.RESIZEX
				sta IY

.1				ldy #S.OBJ.Y1
				lda (ZPWNDPtr),y
				sec
				sbc #1
				eor MSG+S.MSG.Y1
				bne .3

				iny
				lda (ZPWNDPtr),y
				sbc #0
				eor MSG+S.MSG.Y1+1
				bne .3

				lda IY
				beq .2

				lda #PTR.T.RESIZEXY1
				jmp PTR.Set

.2				lda #PTR.T.RESIZEY
				sta IY

.3				ldy #S.OBJ.X2
				lda (ZPWNDPtr),y
				clc
				adc #1
				eor MSG+S.MSG.X1
				bne .5

				iny
				lda (ZPWNDPtr),y
				adc #0
				eor MSG+S.MSG.X1+1
				bne .5

				lda IY
				beq .4

				lda #PTR.T.RESIZEXY2
				jmp PTR.Set

.4				lda #PTR.T.RESIZEX
				sta IY

.5				ldy #S.OBJ.Y2
				lda (ZPWNDPtr),y
				clc
				adc #1
				eor MSG+S.MSG.Y1
				bne .7

				iny
				lda (ZPWNDPtr),y
				adc #0
				eor MSG+S.MSG.Y1+1
				bne .7

				lda #PTR.T.RESIZEXY1
.6				jmp PTR.Set

.7				lda IY
				bne .6

.9				sec
				rts
*--------------------------------------
MOU.InObj		lda ZPObjPtr
				clc
				adc #S.OBJ.X1
				tay
				lda ZPObjPtr+1
				adc /S.OBJ.X1
*--------------------------------------			
MOU.InRectYA	>STYA ZPRECTPtr

				ldy #S.RECT.X1

				lda MSG+S.MSG.X1
				cmp (ZPRECTPtr),y
				iny
				lda MSG+S.MSG.X1+1
				sbc (ZPRECTPtr),y
				bcc .9

				iny						#S.RECT.Y1

				lda MSG+S.MSG.Y1
				cmp (ZPRECTPtr),y
				iny
				lda MSG+S.MSG.Y1+1
				sbc (ZPRECTPtr),y
				bcc .9

				iny						#S.RECT.X2

				lda (ZPRECTPtr),y
				cmp MSG+S.MSG.X1
				iny
				lda (ZPRECTPtr),y
				sbc MSG+S.MSG.X1+1
				bcc .9

				iny						#S.RECT.Y2

				lda (ZPRECTPtr),y
				cmp MSG+S.MSG.Y1
				iny
				lda (ZPRECTPtr),y
				sbc MSG+S.MSG.Y1+1
				bcc .9

				clc
				rts

.9				sec
.99				rts
*--------------------------------------
MOU.WNDCmpY		lda (ZPWNDPtr),y
				cmp MSG+S.MSG.Y1
				iny
				lda (ZPWNDPtr),y
				sbc MSG+S.MSG.Y1+1
				rts
*--------------------------------------
MOU.ToLocal		ldy #S.WND.InnerX1

				lda MSG+S.MSG.X1
				sec
				sbc (ZPWNDPtr),y
				sta MSG+S.MSG.X1
				
				iny

				lda MSG+S.MSG.X1+1
				sbc (ZPWNDPtr),y
				sta MSG+S.MSG.X1+1
				
				iny						#S.WND.InnerY1

				lda MSG+S.MSG.Y1
				sec
				sbc (ZPWNDPtr),y
				sta MSG+S.MSG.Y1
				
				iny

				lda MSG+S.MSG.Y1+1
				sbc (ZPWNDPtr),y
				sta MSG+S.MSG.Y1+1
				
				rts
*--------------------------------------
MAN
SAVE usr/src/lib/libgui.s.mou
LOAD usr/src/lib/libgui.s
ASM
