; TopIconBar module v1.08 by Vincent Lefvre - 24/08/1996
; (Public Domain)

; When the mouse reaches the bottom of the screen and all the buttons are
; released, the icon bar is automatically topped. Then, if the menu button
; is pressed, the icon bar is untopped (if MENU_OPT is TRUE).

		GET	h:RegNames
		GET	h:SWINames

INTERVAL	EQU	10		;Interval in cs for Wimp_PollIdle.

		GBLL	MENU_OPT
MENU_OPT	SETL	{TRUE}		;TRUE: menu button option.

		^	0
		#	4		;Task handle.
BUFFER		#	256		;Buffer.
SIZE		#	0

		AREA	TopIconBar, CODE, PIC, READONLY
		ENTRY

BaseAddr	DCD	RM_Start  -BaseAddr
		DCD	RM_Init   -BaseAddr
		DCD	RM_Die    -BaseAddr
		DCD	0
		DCD	RM_Title  -BaseAddr
		DCD	RM_Help   -BaseAddr
		DCD	0

task		DCB	"TASK"

RM_Title	DCB	"TopIconBar",0

		[	MENU_OPT
RM_Help		DCB	"TopIconBar",9,"1.08 (24 Aug 1996) by Vincent Lefvre",0
		|
RM_Help		DCB	"TopIconBar",9,"1.07 (24 Aug 1996) by Vincent Lefvre",0
		]

RM_Start	LDR	R6, [R12]	;Pointer to workspace.

		LDR	R0, [R6]	;Task handle or 0.
		TEQ	R0, #0
		LDRNE	R1, task	;"TASK".
		SWINE	Wimp_CloseDown
		MOVNE	R0, #0
		STRNE	R0, [R6]	;Reset task handle.

		MOV	R0, #200	;Minimum RISC OS 2.
		LDR	R1, task	;"TASK".
		ADR	R2, RM_Title
		SWI	XWimp_Initialise
		ADRVS	R3, RM_Title
		SWIVS	OS_ExitAndDie
		STR	R1, [R6]	;Store task handle.

loop		SWI	OS_ReadMonotonicTime
		ADD	R2, R0, #INTERVAL
		MOV	R0, #0		;Mask.
		ADD	R1, R6, #BUFFER	;256-byte block.
		SWI	Wimp_PollIdle

		TEQ	R0, #17		;UserMessage?
		TEQNE	R0, #18		;UserMessage_Recorded?
		LDREQ	R0, [R1, #16]	;Message code.
		TEQEQ	R0, #0		;Quit?
		ADREQ	R3, RM_Title
		SWIEQ	OS_ExitAndDie	;Die if quit.

		SWI	Wimp_GetPointerInfo
		LDMIB	R1, {R0,R2}	;Mouse y and button state.
		[	MENU_OPT
		TEQ	R0, #0
		MOVNE	R7, #0		;R7 = 0 if y != 0. Loop if y != 0
		EOREQS	R0, R2, R7	;or a button except menu is pressed
		BNE	loop		;or menu is pressed iff R7 == 0.
		|
		ORRS	R0, R0, R2	;Loop if y != 0 (mouse not at bottom)
		BNE	loop		;or a button is pressed.
		]

		MOV	R0, #-2
		STR	R0, [R1]	;Window handle: -2 (icon bar).
		SWI	Wimp_GetWindowState
		LDR	R0, [R1, #32]	;Window flags.
		[	MENU_OPT
		MOV	R7, #2		;R7 = 2.
		AND	R0, R0, #1<<17	;Icon bar fully visible?
		TEQ	R2, R0, LSR #16
		|
		TST	R0, #1<<17	;Z = 1 if icon bar is not fully visible.
		]
		MOVEQ	R0, #&1DC	;Insert a Shift-F12 if Z = 1.
		SWIEQ	Wimp_ProcessKey
		B	loop		;Loop.

RM_Init		STMFD	SP!, {LR}
		LDR	R2, [R12]	;R2: pointer to workspace or 0.
		TEQ	R2, #0
		MOVEQ	R0, #6		;Executed unless re-init.
		MOVEQ	R3, #SIZE
		SWIEQ	XOS_Module	;Claim.
		LDMVSFD	SP!, {PC}	;Return with V=1 if not enough memory.
		STREQ	R2, [R12]	;Pointer to workspace.
reset_taskh	MOV	R0, #0
		STR	R0, [R2]	;Reset task handle.
		LDMFD	SP!, {PC}^

RM_Die		STMFD	SP!, {LR}
		LDR	R2, [R12]
		LDR	R0, [R2]	;Task handle or 0.
		TEQ	R0, #0
		LDMEQFD	SP, {PC}^	;Return if 0.
		LDR	R1, task	;"TASK".
		SWI	XWimp_CloseDown
		B	reset_taskh	;Reset task handle and return.

		END
