
;---;  AppIcon.r  ;------------------------------------------------------------
*
*	****	AppIcon support routines    ****
*
*	Author		Daniel Weber
*	Version		1.00
*	Last Revision	12.11.93
*	Identifier	app_defined
*       Prefix		app_	(AppIcon)
*				 ŻŻŻ
*	Functions	InitAppIconImage	(CALL_)
*			InitAppIcon		(bsr)
*			RemAppIcon		(bsr)
*			OnAppIcon		(bsr)
*			OffApIcon		(bsr)
*
*	Notes		- the workbench.library and icon.library must already
*			  be open.
*			- every pointer etc. is stored in my AppIcon Structure
*			- InitAppIconImage needs cws_wbmessage (from startup4.r)
*
;------------------------------------------------------------------------------

	IFND	app_defined
app_defined	SET	1

;------------------
app_oldbase	EQU __BASE
	base	app_base
app_base:

;------------------
	opt	sto,o+,ow-,q+,qw-		;all optimisations on


;------------------
	incdir	'include:','routines:'
	include	ports.r
	include	structs.r



;------------------------------------------------------------------------------
*
* InitAppIconImage	- Initialize AppIcon Image
*
* Grap the current icon assigned to 'this' program.
*
* INPUT:	A0	AppIcon Structure (AppIconStruct_ from Structs.r)
*
* RESULT:	D0	Pointer to Image buffer or zero if failed
*
* NOTE:		This routines changes the main structure datas only if
*		it didn't failed.
*
;------------------------------------------------------------------------------

	IFD	xxx_InitAppIconImage
InitAppIconImage:
	movem.l	d0-a6,-(a7)
	clr.l	(a7)				;faked return value (error)
	move.l	a0,a4
	moveq	#0,d7
	moveq	#0,d4
	move.l	cws_homedir(pc),d1		;homedir support
	move.l	cws_wbmessage(pc),d0
	beq	.out
	move.l	d0,a3
	move.l	36(a3),d0			;sm_ArgList
	beq	.out
	move.l	d0,a3
	move.l	(a3),d1				;wa_Lock
.cd:	move.l	DosBase(pc),a6
	jsr	-126(a6)			;_LVOCurrentDir
	move.l	d0,d7
	move.l	4(a3),a0			;wa_Name
	move.l	IconBase(pc),a6
	jsr	-132(a6)		;_LVOGetDiskObjectNew (get .info file)
	exg	d0,d7
	move.l	d0,d1				;oldlock
	move.l	DosBase(pc),a6
	jsr	-126(a6)			;_LVOCurrentDir
	move.l	d7,d4				;d4: DiskObject
	beq.s	.out

	move.l	d7,a0
	move.l	18+4(a0),a3			;gg_GadgetRender +do_gadget
	move.w	4(a3),d0			;ig_Width
	move.w	6(a3),d6			;ig_Height
	move.w	d0,d5
	addq.l	#7,d0
	addq.l	#8,d0
	and.b	#$f0,d0
	mulu	d6,d0
	lsr.l	#3,d0
	mulu	8(a3),d0			;*depth (word*word, should be ok)
	move.l	d0,d7
	beq.s	.out				;no image dimensions (?)
	moveq	#20,d1				;ig_SIZEOF
	add.l	d1,d0
	move.l	#$10002,d1			;memf_chip + memf_clear
	move.l	4.w,a6
	jsr	-684(a6)			;AllocVec()	
	move.l	d0,a1
	move.l	a1,d0
	beq.s	.out

	movem.w	d5/d6,4(a1)			;set width and height
	move.w	8(a3),8(a1)			;depth
	move.b	14(a3),14(a1)			;PlanePic
	move.l	10(a3),a3			;ImageData
	lea	20(a1),a1			;ig_SIZEOF
	move.l	a1,-20+10(a1)			;ImageData

.loop:	move.b	(a3)+,(a1)+			;copy image
	subq.l	#1,d7
	bne.s	.loop

	movem.w	d5/d6,app_ai_Width(a4)
	move.l	d0,app_ai_pic(a4)		;gg_GadgetRender

	move.l	d0,app_AppImage(a4)
	move.l	d0,(a7)				;set return value
.out:	tst.l	d4
	beq.s	.done
	move.l	d4,a0
	move.l	IconBase(pc),a6
	jsr	_LVOFreeDiskObject(a6)
.done:	movem.l	(a7)+,d0-a6
	rts
	ENDC


;------------------------------------------------------------------------------
*
* InitAppIcon	- Initialize an AppIcon
*
* INPUT:	A0	AppIcon Structure (AppIconStruct_ from Structs.r)
*		A1	Message Port Structure (use PortStruct_ from Structs.r)
*
* RESULT:	D0	AppIcon Message Port or zero if failed (CCR)
*
;------------------------------------------------------------------------------

InitAppIcon:
	movem.l	d2-a6,-(a7)
	exg	a0,a1
	bsr	MakePort
	move.l	d0,app_AppPort(a1)
	beq.s	\error
	move.l	d0,a2
	clr.b	LN_PRI(a2)
	clr.l	LN_NAME(a2)
	move.l	a2,d0
\error:	movem.l	(a7)+,d2-a6
	rts



;------------------------------------------------------------------------------
*
* RemAppIcon	- Remove an AppIcon
*
* INPUT:	A0	AppIcon Structure (AppIconStruct_ from Structs.r)
*
* RESULT:	none
*
;------------------------------------------------------------------------------

RemAppIcon:
	movem.l	d0-a6,-(a7)
	move.l	a0,a2
	bsr	OffAppIcon			;remove AppIcon
	move.l	app_AppPort(a2),d0
	beq.s	1$
	move.l	d0,a0
	bsr	UnMakePort			;free Port
1$:	clr.l	app_AppPort(a2)
	move.l	app_AppImage(a2),d0
	beq.s	2$
	move.l	d0,a1				;free Image Buffer
	move.l	4.w,a6
	jsr	-690(a6)			;FreeVec()
2$:	movem.l	(a7)+,d0-a6
	rts



;------------------------------------------------------------------------------
*
* OnAppIcon	- Display AppIcon
*
* INPUT:	D0	id (this variable is strictly for your own use and is
*			    ignored by workbench)
*		D1	userdata (only for your own use - see above)
*		A0	AppIcon Structure (AppIconStruct_ from Structs.r)
*
* RESULT:	D0	AppIcon Structure or zero if failed (CCR)
*
;------------------------------------------------------------------------------

OnAppIcon:
	movem.l	d1-a6,-(a7)
	move.l	a0,a4
	lea	app_AppText(a4),a0		;icon text
	move.l	app_AppPort(a4),d0
	beq.s	1$
	move.l	d0,a1				;msgport
	sub.l	a2,a2				;no lock
	lea	app_AppIconDef(a4),a3		;diskobj
	move.l	a4,-(a7)
	sub.l	a4,a4				;no tag list
	move.l	WorkbenchBase(pc),a6
	jsr	-60(a6)				;AddAppIconA
	move.l	(a7)+,a4
	move.l	d0,app_AppIcon(a4)
	beq.s	1$
	move.l	a4,d0
1$:	movem.l	(a7)+,d1-a6
	rts



;------------------------------------------------------------------------------
*
* OffAppIcon	- Remove AppIcon from Workbench
*
* INPUT:	A0	AppIcon Structure (AppIconStruct_ from Structs.r)
*
* RESULT:	none
*
;------------------------------------------------------------------------------

OffAppIcon:
	movem.l	d0-a6,-(a7)
	move.l	a0,a4
	move.l	app_AppIcon(a4),d0
	beq.s	1$
	move.l	d0,a0
	move.l	WorkbenchBase(pc),a6
	jsr	-66(a6)			;RemoveAppIcon()
	clr.l	app_AppIcon(a4)
1$:	movem.l	(a7)+,d0-a6
	rts


;--------------------------------------------------------------------

	base	app_oldbase
	opt	rcl

;------------------
	ENDIF

 end

