ùúùú  Ò  Ò  Ò  Ò  Ò  Ò  Ò  Ò  Ò  Ò******************************************************************************
*	project: gadutil.library example demo
*	 author: Lukasz Szelag
*        e-mail: luk@i17linuxa.ists.pwr.wroc.pl
*           WWW: http://www.pwr.wroc.pl/amiga/amiuser/luk
*	    IRC: #amigapl (Luk)
*
*    converted to assembly language by P-O Yliniemi
*
******************************************************************************

	incdir	include:
	include	"exec/execbase.i"
	include	"libraries/gadtools.i"
	include	"libraries/gadutil.i"
	include	"libraries/gadutil_lib.i"
	include	"LVOs.i"

*------------------------------------- Main ---------------------------------*
main:
	lea.l	MyBSS,a5		; Get pointer to BSS

	lea.l	GUtilName(pc),a1	; Open gadutil.library
	moveq.l	#36,d0
	CallLib	OpenLibrary,_AbsExecBase.w
	move.l	d0,GUtilBase(a5)
	beq.w	.nogutil

	move.l	d0,a0			; Borrow IntuiBase from library
	move.l	gub_IntBase(a0),IntuiBase(a5)

	suba.l	a0,a0			; Lock the default public screen
	CallLib	LockPubScreen,IntuiBase(a5)
	move.l	d0,myscreen(a5)
	beq.w	.noscreen

	move.l	GUtilBase(a5),a6
	lea.l	glist(pc),a0		; Pointer to gadget list pointer
	lea.l	gadgets(pc),a1		; LayoutGadget structures
	move.l	d0,a2			; Screen pointer
	lea.l	LayoutTags(pc),a3	; Tags for LayoutGadgetsA
	CallLib	GU_LayoutGadgetsA	; Initialize all gadgets
	move.l	a0,ginfo(a5)		; Save gadutil's private structure
	beq.w	.unlocksc

	lea.l	window_tags(pc),a1	; Get window tags

	move.l	InnerWidth(a1),d0	; WA_InnerWidth = farright+LEFT_OFFSET
	add.l	farright(pc),d0
	move.l	d0,InnerWidth(a1)

	move.l	InnerHeight(a1),d0	; WA_InnerHeight = farbotton+TOP_OFFSET
	add.l	farbottom(pc),d0
	move.l	d0,InnerHeight(a1)

	suba.l	a0,a0			; Open the window
	CallLib	OpenWindowTagList,IntuiBase(a5)
	move.l	d0,mywindow(a5)
	beq.w	.freegads		; Error opening the window

	move.l	d0,a0			; Refresh everything in the window
	move.l	ginfo(a5),a1
	CallLib	GU_RefreshWindow,GUtilBase(a5)

	move.l	mywindow(a5),a0		; Draw gadget images in another position
	move.l	wd_RPort(a0),a0
	move.w	#50,d0
	move.w	#70,d1
	lea.l	image1(pc),a1
	CallLib	DrawImage,IntuiBase(a5)

	move.l	mywindow(a5),a0		; Draw gadget images in another position
	move.l	wd_RPort(a0),a0
	move.w	#50,d0
	move.w	#110,d1
	lea.l	image2(pc),a1
	CallLib	DrawImage,IntuiBase(a5)

.waitevent:
	move.l	mywindow(a5),a0
	move.l	wd_UserPort(a0),a0
	moveq.l	#1,d0			; Create signal mask for our window
	moveq.l	#0,d1
	move.b	MP_SIGBIT(a0),d1
	lsl.l	d1,d0
	CallLib	Wait,_AbsExecBase.w	; Wait for a message from the window
.getmsg:
	move.l	mywindow(a5),a0		; Get message from UserPort
	move.l	wd_UserPort(a0),a0
	CallLib	GU_GetIMsg,GUtilBase(a5)
	tst.l	d0
	beq.b	.waitevent		; No message - continue waiting

	move.l	d0,a1			; Store important data from message
	move.l	im_Class(a1),d2
	move.w	im_Code(a1),d3
	move.l	im_IAddress(a1),a2
	CallLib	GU_ReplyIMsg		;  and reply the message immediately

	cmp.l	#IDCMP_GADGETUP,d2	; Check for any released gadget
	bne.b	.checkesc
	move.w	gg_GadgetID(a2),d2	; Get gadget ID
	cmp.w	#GDG_DRAWER,d2		; DRAWER_KIND gadget ?
	beq.b	.isdrawer
	cmp.w	#GDG_FILE,d2		; FILE_KIND gadget ?
	beq.b	.isfile
	cmp.w	#GDG_IMAGE,d2		; IMAGE_KIND gadget ?
	bne.b	.getmsg
.isdrawer:
.isfile:
	move.l	myscreen(a5),a0		; Flash screen if one of these gadgets
	CallLib	DisplayBeep,IntuiBase(a5)
	bra.b	.getmsg

.checkesc:
	cmp.l	#IDCMP_VANILLAKEY,d2	; Check for a pressed key
	bne.b	.checkclose
	cmp.w	#27,d3			; ESC = close the window
	beq.b	.closewin
.checkclose
	cmp.l	#IDCMP_CLOSEWINDOW,d2	; Check for window close gadget
	bne.b	.getmsg

*------------------------------- Exit routines ------------------------------*
.closewin:
	move.l	mywindow(a5),a0
	CallLib	CloseWindow,IntuiBase(a5)
.freegads:
	move.l	ginfo(a5),a0		; Free all gadgets
	CallLib	GU_FreeLayoutGadgets,GUtilBase(a5)
.unlocksc:
	suba.l	a0,a0			; No name pointer
	move.l	myscreen(a5),a1		; Pointer to the locked screen
	CallLib	UnlockPubScreen,IntuiBase(a5)
.noscreen:
	move.l	GUtilBase(a5),a1	; Close gadutil.library
	CallLib	CloseLibrary,_AbsExecBase.w
.nogutil:
	moveq.l	#0,d0			; Return 0 and exit
	rts
				
GUtilName:
	dc.b	"gadutil.library",0
	even	

*------------------------------ Gadget datas -------------------------------*
* It's  very useful to define absolute gadget's position in the window. Note:
* it's only for the first gadget - other gadgets may be positioned relatively
* to each other.  Also these values are used to compute the right size of the
* window  (see  tags WA_InnerWidth and WA_InnerHeight). It means that gadutil
* will compute the final size of the window for you!
*----------------------------------------------------------------------------*

LEFT_OFFSET:	equ	10
TOP_OFFSET:	equ	10

*------------------------- Standard gadtools tags ---------------------------*
GT_tags:	dc.l	GT_Underscore,	'_',	TAG_DONE

*------------------------ Datas for LayoutGadgetsA --------------------------*
* The  following  variables  will  be  further  filled  by  gadutil  internal
* routines. Aren't ya familar with these yet ? Just refer to gadutil autodocs
* and it'll becomes clear at once !
*----------------------------------------------------------------------------*

LayoutTags:
	dc.l	GU_RightExtreme,	farright
	dc.l	GU_LowerExtreme,	farbottom
	dc.l	GU_MinimumIDCMP,	winIDCMP
	dc.l	TAG_DONE

farright:	dc.l	0
farbottom:	dc.l	0

*----------------------------------------------------------------------------*
* Here we can define all gadgets ! It's very simple task - you don't need any
* GUI  editor  since  gadget's  positions may be specified relatively to each
* other !
*----------------------------------------------------------------------------*

GDG_BOX1:	equ	0
GDG_BOX2:	equ	1
GDG_BOX3:	equ	2
GDG_BOX4:	equ	3
GDG_BOX5:	equ	4
GDG_BOX6:	equ	5
GDG_DRAWER:	equ	6
GDG_FILE:	equ	7
GDG_PROGRESS:	equ	8
GDG_IMAGE:	equ	9

box1:
	dc.l	GU_GadgetKind,  BEVELBOX_KIND
	dc.l	GU_GadgetText,  box1text
	dc.l	GUBB_Recessed,  TRUE
	dc.l	GUBB_FrameType, BFT_RIDGE
	dc.l	GUBB_TextColor, 2
	dc.l	GUBB_Flags,     BB_TEXT_ABOVE_LEFT!BB_SUNAT_UL
	dc.l	GUBB_3DText,    TRUE
	dc.l	GU_Left,        LEFT_OFFSET
	dc.l	GU_Top,         TOP_OFFSET
	dc.l	GU_Width,       300
	dc.l	GU_Height,      30
	dc.l	TAG_DONE

box1text:
	dc.b	"Recessed3D FrameType = BFT_RIDGE",0
	even
	
box2:
	dc.l	GU_GadgetKind,  BEVELBOX_KIND
	dc.l	GU_GadgetText,  box2text
	dc.l	GUBB_Recessed,  TRUE
	dc.l	GUBB_FrameType, BFT_RIDGE
	dc.l	GUBB_TextColor, 2
	dc.l	GUBB_Flags,     BB_TEXT_ABOVE_LEFT
	dc.l	GU_LeftRel,     GDG_BOX1
	dc.l	GU_AlignTop,    GDG_BOX1
	dc.l	GU_DupeWidth,   GDG_BOX1
	dc.l	GU_DupeHeight,  GDG_BOX1
	dc.l	TAG_DONE

box2text:
	dc.b	"Recessed FrameType = BFT_RIDGE",0
	even
	
box3:
	dc.l	GU_GadgetKind,  BEVELBOX_KIND
	dc.l	GU_GadgetText,  box3text
	dc.l	GUBB_Recessed,  TRUE
	dc.l	GUBB_FrameType, BFT_BUTTON
	dc.l	GUBB_TextColor, 2
	dc.l	GUBB_Flags,     BB_TEXT_ABOVE_LEFT!BB_SUNAT_UL
	dc.l	GUBB_3DText,    TRUE
	dc.l	GU_AlignLeft,   GDG_BOX1
	dc.l	GU_TopRel,      GDG_BOX1
	dc.l	GU_AddTop,      10
	dc.l	GU_DupeWidth,   GDG_BOX1
	dc.l	GU_DupeHeight,  GDG_BOX1
	dc.l	TAG_DONE

box3text:
	dc.b	"Recessed3D FrameType = BFT_BUTTON",0
	even
	
box4:
	dc.l	GU_GadgetKind,  BEVELBOX_KIND
	dc.l	GU_GadgetText,  box4text
	dc.l	GUBB_Recessed,  TRUE
	dc.l	GUBB_FrameType, BFT_BUTTON
	dc.l	GUBB_TextColor, 2
	dc.l	GUBB_Flags,     BB_TEXT_ABOVE_LEFT
	dc.l	GU_LeftRel,     GDG_BOX3
	dc.l	GU_AlignTop,    GDG_BOX3
	dc.l	GU_DupeWidth,   GDG_BOX1
	dc.l	GU_DupeHeight,  GDG_BOX1
	dc.l	TAG_DONE

box4text:
	dc.b	"Recessed FrameType = BFT_BUTTON",0
	even
	
box5:
	dc.l	GU_GadgetKind,  BEVELBOX_KIND
	dc.l	GU_GadgetText,  box5text
	dc.l	GUBB_Recessed,  TRUE
	dc.l	GUBB_FrameType, BFT_DROPBOX
	dc.l	GUBB_TextColor, 2
	dc.l	GUBB_Flags,     BB_TEXT_ABOVE_LEFT!BB_SUNAT_UL
	dc.l	GUBB_3DText,    TRUE
	dc.l	GU_AlignLeft,   GDG_BOX1
	dc.l	GU_TopRel,      GDG_BOX4
	dc.l	GU_AddTop,      10
	dc.l	GU_DupeWidth,   GDG_BOX1
	dc.l	GU_DupeHeight,  GDG_BOX1
	dc.l	TAG_DONE

box5text:
	dc.b	"Recessed3D FrameType = BFT_DROPBOX",0
	even
	
box6:
	dc.l	GU_GadgetKind,  BEVELBOX_KIND
	dc.l	GU_GadgetText,  box6text
	dc.l	GUBB_Recessed,  TRUE
	dc.l	GUBB_FrameType, BFT_DROPBOX
	dc.l	GUBB_TextColor, 2
	dc.l	GUBB_Flags,     BB_TEXT_ABOVE_LEFT
	dc.l	GU_LeftRel,     GDG_BOX5
	dc.l	GU_AlignTop,    GDG_BOX5
	dc.l	GU_DupeWidth,   GDG_BOX1
	dc.l	GU_DupeHeight,  GDG_BOX1
	dc.l	TAG_DONE

box6text:
	dc.b	"Recessed FrameType = BFT_DROPBOX",0
	even
	
drawer:
	dc.l	GU_GadgetKind,  DRAWER_KIND
	dc.l	GU_GadgetText,  drawertext
	dc.l	GU_Flags,       NG_HIGHLABEL
	dc.l	GU_LabelHotkey, TRUE
	dc.l	GU_AlignLeft,   GDG_BOX1
	dc.l	GU_AdjustLeft,  10
	dc.l	GU_TopRel,      GDG_BOX5
	dc.l	GU_AddTop,      5
	dc.l	GU_Width,       DRAWERKIND_WIDTH
	dc.l	GU_Height,      DRAWERKIND_HEIGHT
	dc.l	TAG_DONE

drawertext:
	dc.b	"_DRAWER KIND:",0
	even

file:
	dc.l	GU_GadgetKind,  FILE_KIND
	dc.l	GU_GadgetText,  filetext
	dc.l	GU_Flags,       NG_HIGHLABEL
	dc.l	GU_LabelHotkey, TRUE
	dc.l	GU_AlignLeft,   GDG_DRAWER
	dc.l	GU_TopRel,      GDG_DRAWER
	dc.l	GU_AddTop,      5
	dc.l	GU_Width,       FILEKIND_WIDTH
	dc.l	GU_Height,      FILEKIND_HEIGHT
	dc.l	TAG_DONE

filetext:
	dc.b	"_FILE KIND:",0
	even
	
progress:
	dc.l	GU_GadgetKind,  PROGRESS_KIND
	dc.l	GU_GadgetText,  progresstext
	dc.l	GUPR_Current,   30
	dc.l	GUPR_Total,     100
	dc.l	GU_Flags,       NG_HIGHLABEL
	dc.l	GU_LeftRel,     GDG_DRAWER
	dc.l	GU_AdjustLeft,  10
	dc.l	GU_AlignTop,    GDG_DRAWER
	dc.l	GU_Width,       100
	dc.l	GU_DupeHeight,  GDG_DRAWER
	dc.l	TAG_DONE

progresstext:
	dc.b	"PROGRESS KIND:",0
	even

image:
	dc.l	GU_GadgetKind,   IMAGE_KIND
	dc.l	GU_GadgetText,   imagetext
	dc.l	GUIM_Image,      image1
	dc.l	GUIM_SelectImg,  image2
	dc.l	GU_Flags,        NG_HIGHLABEL
	dc.l	GU_LabelHotkey,  TRUE
	dc.l	GU_LeftRel,      GDG_PROGRESS
	dc.l	GU_AdjustLeft,   10
	dc.l	GU_AlignTop,     GDG_PROGRESS
	dc.l	GU_Width,        29+10
	dc.l	GU_Height,       15+5
	dc.l	TAG_DONE

imagetext:
	dc.b	"_IMAGE KIND:",0
	even

gadgets:
	GADGET	GDG_BOX1,     box1,     NULL
	GADGET	GDG_BOX2,     box2,     NULL
	GADGET	GDG_BOX3,     box3,     NULL
	GADGET	GDG_BOX4,     box4,     NULL
	GADGET	GDG_BOX5,     box5,     NULL
	GADGET	GDG_BOX6,     box6,     NULL
	GADGET	GDG_DRAWER,   drawer,   GT_tags
	GADGET	GDG_FILE,     file,     GT_tags
	GADGET	GDG_PROGRESS, progress, NULL
	GADGET	GDG_IMAGE,    image,    GT_tags
	GADGET	-1,NULL,NULL

WINGADS: equ	WFLG_DRAGBAR!WFLG_DEPTHGADGET!WFLG_CLOSEGADGET

;----------------------- Tags for the window to open -------------------------
window_tags:
	dc.l	WA_Left,	5,	WA_Top,	20,	WA_InnerWidth
InnerWidth:	EQU	*-window_tags
	dc.l	LEFT_OFFSET,		WA_InnerHeight
InnerHeight:	EQU	*-window_tags
	dc.l	TOP_OFFSET,		WA_IDCMP
winIDCMP:
	dc.l	IDCMP_CLOSEWINDOW
	dc.l	WA_Flags, WINGADS!WFLG_SMART_REFRESH!WFLG_ACTIVATE!WFLG_RMBTRAP
	dc.l	WA_Gadgets
glist:	dc.l	0
	dc.l	WA_Title,WinTitle
	dc.l	TAG_DONE

WinTitle:
	dc.b	"Yeah, it tastes well, doesn't ?!",0
	even
	
*----------------------------------------------------------------------------*
* Here  we've  some hot image data for the IMAGE_KIND gadget - unselected
* and selected images !
*----------------------------------------------------------------------------*

image1:	dc.w	0, 0, 29, 15, 2		; x, y, width, height, depth
	dc.l	image1_data		; image data
	dc.b	3, 0			; planepick, planeonoff
	dc.l	NULL

image2:	dc.w	0, 0, 29, 15, 2		; x, y, width, height, depth
	dc.l	image2_data		; image data
	dc.b	3, 0			; planepick, planeonoff
	dc.l	NULL

	SECTION gutildemo,DATA_C	; Bitplane data MUST BE IN CHIP MEM!
image1_data:
	dc.w	$007F, $F000, $03FF, $FE00, $0FFF, $FF80, $3C1F, $C1E0, $780F
	dc.w	$80F0, $780F, $80F0, $F9CF, $9CF8, $FDDD, $DDF8, $FFF8, $FFF8
	dc.w	$7FF8, $FFF0, $7FFF, $FFF0, $3FFF, $FFE0, $0FE0, $3F80, $03FF
	dc.w	$FE00, $007F, $F000
	dc.w	$007F, $F000, $03FF, $FE00, $0FFF, $FF80, $3FFF, $FFE0, $7FFF
	dc.w	$FFF0, $7FFF, $FFF0, $FE3F, $E3F8, $FE3F, $E3F8, $FFFF, $FFF8
	dc.w	$7FFF, $FFF0, $7FFF, $FFF0, $3FFF, $FFE0, $0FFF, $FF80, $03FF
	dc.w	$FE00, $007F, $F000

image2_data:
	dc.w	$007F, $F000, $03FF, $FE00, $0FFF, $FF80, $3C1F, $C1E0, $78EF
	dc.w	$8EF0, $78EF, $8EF0, $F80F, $80F8, $FC1D, $C1F8, $FFF8, $FFF8
	dc.w	$7FF8, $FFF0, $7FFF, $FFF0, $3F9F, $CFE0, $0FC0, $1F80, $03FF
	dc.w	$FE00, $007F, $F000
	dc.w	$007F, $F000, $03FF, $FE00, $0FFF, $FF80, $3FFF, $FFE0, $7F1F
	dc.w	$F1F0, $7F1F, $F1F0, $FFFF, $FFF8, $FFFF, $FFF8, $FFFF, $FFF8
	dc.w	$7FFF, $FFF0, $7FFF, $FFF0, $3FFF, $FFE0, $0FFF, $FF80, $03FF
	dc.w	$FE00, $007F, $F000

;------------------------------------- BSS -----------------------------------

	STRUCTURE	myBSS,0
		LONG	GUtilBase
		LONG	IntuiBase
		LONG	myscreen
		LONG	ginfo
		LONG	mywindow
	LABEL	MyBSS_SIZEOF

	SECTION	demo,BSS
MyBSS:	ds.b	MyBSS_SIZEOF
