; Newsfilter module, written by Vincent Lefvre

; $Id: newsfilter 2.2 2003/05/17 23:05:05 vlefevre Exp $

; When the user clicks on the Debatch button in Pluto, NewsFilter:filter
; is executed before the debatch occurs.

; Note: when the filter file is executed, Pluto must not be quit before
; the filter task has terminated.

		GET	h:RegNames
		GET	h:SWINames
		GET	h:RCSsupport

; If you don't have the Tracker library, comment out the
; following GET line and uncomment the two macros.

		GET	h:DebugHdr

;		MACRO
;$label		DBSET	$flags, $cc
;$label
;		MEND
;
;		MACRO
;$label		DBF	$argstr, $cc
;$label
;		MEND

		GBLL	Debug
Debug		SETL	{FALSE}

		GETVERS	"$Revision: 2.2 $"
		GETDATE	"$Date: 2003/05/17 23:05:05 $"

		GBLS	NAME
NAME		SETS	"Newsfilter"
		GBLS	AUTHOR
AUTHOR		SETS	"Vincent Lefvre"
		GBLS	VERSION
VERSION		SETS	VERS:CC:" (":CC:DATE:CC:")"

		^	0
		#	4	;Task handle.
PTH		#	4	;Task handle of Pluto.
FTH		#	4	;Task handle of filter.
FREG		#	4	;Filter routine or 0.
FLAG		#	1	;Mouse click flag.
		#	3
BUFFER		#	256	;Buffer.
MBUFF		#	20	;Mouse buffer.
		[	Debug
STACK		#	256	;Stack.
		]
SIZE		#	0	;--> size of workspace.

MCLICK		EQU	6	;Mouse click.

TaskCloseDown	EQU	&400C3	;Message: TaskCloseDown.

Service_FMI	EQU	&87	;Service: Filter Manager Installed.
Service_FMD	EQU	&88	;Service: Filter Manager Dying.

		AREA	Newsfilter, CODE, PIC, READONLY
		ENTRY

BaseAddr	DCD	RM_Start  -BaseAddr
		DCD	RM_Init   -BaseAddr
		DCD	RM_Die    -BaseAddr
		DCD	RM_Service-BaseAddr
		DCD	RM_Title  -BaseAddr
		DCD	RM_Help   -BaseAddr
		DCD	RM_HCtable-BaseAddr
		DCD	0,0,0,0,0
		DCD	RM_Flags  -BaseAddr

RM_Flags	DCD	1		;32-bit compatible.

messages	DCD	TaskCloseDown

; Note: zero word follows.

ServiceTable	DCD	0, RM_FastServ-BaseAddr, Service_FMI, Service_FMD, 0

task		DCB	"TASK"
prg		DCB	"/NewsFilter:filter",0

		ALIGN

; **********
; Start code
; **********

RM_Start	LDR	R6, [R12]	;R6: pointer to workspace.
		[	Debug
		ADD	SP, R6, #SIZE
		DBF	"RM_Start\n"
		]

		LDR	R0, [R6]	;Task handle or 0.
		TEQ	R0, #0
		BEQ	start2
		LDR	R1, task	;"TASK".
		SWI	Wimp_CloseDown
		MOV	R0, #0
		STR	R0, [R6]	;Reset task handle.

start2		ADR	R2, RM_Title
		MOV	R0, #300	;Last Wimp version known: 3.00.
		LDR	R1, task	;"TASK".
		ADR	R3, messages	;List of the accepted user messages.
		SWI	XWimp_Initialise
		LDRVS	R1, task	;If init failed, try ROS 2.00...
		MOVVS	R0, #200
		SWIVS	XWimp_Initialise
		ADRVS	R3, RM_Title
		SWIVS	OS_ExitAndDie
		STR	R1, [R6]	;Store task handle.
		DBF	"Started (task handle: &%1h)        \n"

loop		MOV	R0, #&3800	;Mask: &3831.
		ORR	R0, R0, #&31
		ADD	R1, R6, #BUFFER
		SWI	XWimp_Poll
		ADR	R3, RM_Title
		SWIVS	OS_ExitAndDie
		TEQ	R0, #17		;UserMessage?
		TEQNE	R0, #18		;UserMessage_Recorded?
		BNE	mouseclick	;No, branch.
		LDR	R0, [R1, #16]	;Message code.
		TEQ	R0, #0		;Quit?
		DBF	"Quit        \n", EQ
		SWIEQ	OS_ExitAndDie	;Yes, die.
		SUB	R0, R0, #&40000
		TEQ	R0, #&C3	;TaskCloseDown?
		BNE	mouseclick	;No, branch.
		DBF	"TaskCloseDown   \n"
		LDR	R0, [R6, #FTH]	;Task handle of child.
		MOVS	R0, R0, LSL #16
		BEQ	loop		;Branch if no child waited.
		LDR	R2, [R1, #4]	;Handle of task that has closed down.
		EORS	R0, R0, R2, LSL #16 ;Is it the child?
		BNE	loop		;No, loop.
		DBF	"Child has exited\n"
		STR	R0, [R6, #FTH]	;Reset child task handle.
		ADD	R1, R6, #MBUFF	;Mouse buffer...
		B	send_click	;Send the click...

mouseclick	TEQ	R0, #MCLICK	;Mouse click?
		BNE	loop		;No, loop
		DBF	"Mouse click, start NewsFilter:filter\n"
		ADR	R0, prg
		SWI	XWimp_StartTask	;Execute NewsFilter:filter.
		BVS	send_click
		TEQ	R0, #0		;Child has exited?
		STRNE	R0, [R6, #FTH]	;No, store task handle,
		LDMNEIA	R1, {R7-R11}
		ADDNE	R0, R6, #MBUFF
		STMNEIA	R0, {R7-R11}	;save the mouse buffer
		BNE	loop		;and loop.
		DBF	"Child has immediately exited\n"
send_click	DBF	"Send click to Pluto\n"
		MOV	R0, #MCLICK	;Send mouse click to Pluto...
		STRB	R0, [R6, #FLAG]	;Set mouse click flag.
		LDR	R2, [R6, #PTH]	;Pluto's task handle.
		SWI	XWimp_SendMessage
		B	loop

; ***********************
; Desktop_Newsfilter code
; ***********************

Desktop		MOV	R6, LR
		MOV	R2, R0
		ADR	R1, RM_Title
		MOV	R0, #2
		SWI	XOS_Module	;Enter Newsfilter.
		MOV	PC, R6

; *******************
; Initialisation code
; *******************

RM_Init		DBSET	DebugOn :OR: UseTracker
		DBF	"RM_Init\n"
		LDR	R2, [R12]	;Pointer to workspace or 0.
		ADDS	R6, LR, #0	;Make sure that V is cleared.
		TEQ	R2, #0
		BNE	init2		;Branch if re-init.
		MOV	R0, #6		;Executed unless re-init.
		MOV	R3, #SIZE
		SWI	XOS_Module	;Claim.
		MOVVS	PC, R6		;Return with V=1 if not enough memory.
		STR	R2, [R12]	;Pointer to workspace.

init2		BL	params
		SWI	XFilter_RegisterPostFilter
		MOVVS	R1, #0		;R1 = 0 if error (FM not present?).
		STR	R1, [R2, #FREG]
reset_taskh	SUBS	R0, R0, R0	;R0 = 0 and V is cleared.
		STR	R0, [R2]	;Reset task handle.
		STR	R0, [R2, #FTH]	;Reset task handle of filter.
		STRB	R0, [R2, #FLAG]	;Reset mouse click flag.
		MOV	PC, R6		;Return with V=0.

; *****************
; Finalisation code
; *****************

RM_Die		DBF	"RM_Die\n"
		LDR	R2, [R12]	;Pointer to workspace.
		MOV	R6, LR
		LDR	R0, [R2]	;Task handle or 0.
		LDR	R1, task	;"TASK".
		TEQ	R0, #0
		SWINE	XWimp_CloseDown
		LDR	R1, [R2, #FREG]	;Filter routine or 0.
		TEQ	R1, #0		;Filter registered?
		BLNE	params		;Yes, deregister...
		SWINE	XFilter_DeRegisterPostFilter
		B	reset_taskh	;Reset task handle.

; *********
; Some data
; *********

RM_HCtable	DCB	"Desktop_"
RM_Title	DCB	NAME,0
		ALIGN
		DCD	Desktop-BaseAddr,0,0,Help_Desktop-BaseAddr
		DCB	0

RM_Help		DCB	NAME,9,VERSION," by ",AUTHOR,0
Help_Desktop	DCB	"Do not use *",27,0,", use *Desktop instead.",0

taskname	DCB	"Pluto",0
		[	Debug
		ALIGN
		]
titlebar	DCB	"Pluto:  Boxes List",0
		ALIGN

; ************
; Service code
; ************

		DCD	ServiceTable-BaseAddr
RM_Service	MOV	R0, R0		;Magic instruction for Ursula kernel.
		TEQ	R1, #Service_FMI
		TEQNE	R1, #Service_FMD
		MOVNE	PC, LR		;Return if neither FMI nor FMD.
RM_FastServ	TEQ	R1, #Service_FMI
		BEQ	FM_Installed
FM_Dying	STMFD	SP!, {R2,LR}	;Filter Manager Dying.
		LDR	R2, [R12]	;Pointer to workspace.
		MOV	R14, #0
		STR	R14, [R2, #FREG]
		LDMFD	SP!, {R2,PC}
FM_Installed	STMFD	SP!, {R0-R4,LR}	;Filter Manager Installed.
		LDR	R2, [R12]	;Pointer to workspace.
		BL	params
		SWI	XFilter_RegisterPostFilter
		MOVVS	R1, #0		;R1 = 0 if error.
		STR	R1, [R2, #FREG]
		LDMFD	SP!, {R0-R4,PC}

; **************
; Routine params
; **************

params		ADR	R0, RM_Title	;Filter name: Newsfilter.
		ADR	R1, filter	;Filter routine.
		MOV	R3, #0		;Apply filter to all tasks.
		MVN	R4, #1<<6	;Event mask: mouse click.
		MOV	PC, LR		;Return.

; **************
; Filter routine
; **************

filter		STMFD	SP!, {R0-R4,LR}
		LDR	R3, [R1, #8]	;Buttons
		LDR	R4, [R1, #16]	;Icon handle.
		TEQ	R3, #4		;Select pressed (only)?
		TEQNE	R3, #1		;or Adjust pressed (only)?
		TEQEQ	R4, #1		;Icon handle = 1?
		LDMNEFD	SP!, {R0-R4,PC}	;No, return.
		DBF	"Filter: Select or Adjust pressed on icon 1\n"
		MOV	R0, R2		;Task handle.
		SWI	XTaskManager_TaskNameFromHandle
		LDMVSFD	SP!, {R0-R4,PC}	;Return if error.
		ADR	R4, taskname
cmp_tasknames	LDRB	R2, [R0], #1	;Compare task names...
		LDRB	R3, [R4], #1
		TEQ	R3, R2
		LDMNEFD	SP!, {R0-R4,PC}	;Return if not Pluto.
		TEQ	R3, #0
		BNE	cmp_tasknames
		DBF	"Filter: task is Pluto\n"
		LDR	R0, [R1, #12]	;Window handle.
		ADD	R1, R12, #BUFFER+1
		STR	R0, [R12, #BUFFER]
		SWI	XWimp_GetWindowInfo
		LDMVSFD	SP!, {R0-R4,PC}	;Return if error.
		LDR	R0, [R12, #BUFFER+60]
		TST	R0, #1		;Title bar contains text?
		TSTNE	R0, #1<<8	;Title bar data is indirected?
		LDMEQFD	SP!, {R0-R4,PC}	;No, return.
		LDR	R0, [R12, #BUFFER+76]
		ADR	R4, titlebar
cmp_titlebar	LDRB	R2, [R0], #1	;Boxes List window?
		LDRB	R3, [R4], #1
		CMP	R2, #20
		BCC	cmp_end
		TEQ	R3, R2
		BEQ	cmp_titlebar
cmp_end		TEQ	R3, #0
		LDMNEFD	SP!, {R0-R4,PC}	;Return if not the Boxes List window.
		DBF	"Filter: Boxes List window\n"
		LDRB	R0, [R12, #FLAG]
		TEQ	R0, #0		;Mouse click flag set?
		STRNEB	R3, [R12, #FLAG] ;Yes, reset
		LDMNEFD	SP!, {R0-R4,PC}	;and return.
		LDR	R0, [SP, #8]	;Pluto's current task handle.
		LDR	R2, [R12]	;Newsfilter's task handle.
		STR	R0, [R12, #PTH]	;Save Pluto's task handle.
		TEQ	R2, #0
		LDMEQFD	SP!, {R0-R4,PC}	;Return if task not initialised.
		LDR	R1, [SP, #4]
		MOV	R0, #MCLICK	;Mouse click.
		SWI	XWimp_SendMessage
		DBF	"Filter: event not passed to Pluto...\n", VC
		ADDVC	SP, SP, #4	;Do not pass the event to Pluto...
		MOVVC	R0, #-1
		LDMVCFD	SP!, {R1-R4,PC}
		LDMFD	SP!, {R0-R4,PC}

		END
