/*  GadTools layout toolkit
**
**  Copyright © 1993-1994 by Olaf `Olsen' Barthel
**  Freely distributable.
*/

#include "gtlayout_global.h"

#define MESSAGE_COOKIE 0x19138AFB

struct IntuiMessage * LIBENT
LT_GetIMsg(REG(a0) struct LayoutHandle *Handle)
{
	if(Handle)
	{
		struct IntuiMessage *Msg = GT_GetIMsg(Handle -> Window -> UserPort);

		if(Msg)
		{
			struct IntuiMessage *Clone;

			if(Msg -> Class == IDCMP_SIZEVERIFY && Handle -> ResizeView)
			{
					// They're coming to take me away, HAHA!

				Handle -> SizeVerified	= TRUE;
				Handle -> SizeWidth	= Handle -> Window -> Width;
				Handle -> SizeHeight	= Handle -> Window -> Height;

				RemoveGList(Handle -> Window,Handle -> List,(UWORD)-1);

					// Fake a null event, otherwise the following
					// IDCMP_NEWSIZE would probably not get through

				if(Clone = (struct IntuiMessage *)AllocMem(sizeof(struct IntuiMessage),MEMF_ANY))
				{
					CopyMem(Msg,Clone,sizeof(struct IntuiMessage));

					Clone -> Class					= NULL;
					Clone -> ExecMessage . mn_Node . ln_Name	= (char *)MESSAGE_COOKIE;
					Clone -> ExecMessage . mn_Node . ln_Pri 	= -114;
					Clone -> ExecMessage . mn_ReplyPort		= (struct MsgPort *)Clone;
					Clone -> SpecialLink				= (struct IntuiMessage *)Clone;

					GT_ReplyIMsg(Msg);
				}
			}
			else
			{
				if(Clone = (struct IntuiMessage *)AllocMem(sizeof(struct IntuiMessage),MEMF_ANY))
				{
					CopyMem(Msg,Clone,sizeof(struct IntuiMessage));

					Clone -> ExecMessage . mn_Node . ln_Name	= (char *)MESSAGE_COOKIE;
					Clone -> ExecMessage . mn_Node . ln_Pri 	= -114;
					Clone -> ExecMessage . mn_ReplyPort		= (struct MsgPort *)Clone;
					Clone -> SpecialLink				= (struct IntuiMessage *)Clone;

					GT_ReplyIMsg(Msg);

					LT_HandleInput(Handle,Clone -> Qualifier,&Clone -> Class,&Clone -> Code,(struct Gadget **)&Clone -> IAddress);
				}
			}

			if(Clone)
				return(Clone);
			else
				GT_ReplyIMsg(Msg);
		}
	}

	return(NULL);
}

VOID LIBENT
LT_ReplyIMsg(REG(a0) struct IntuiMessage *Msg)
{
	if(Msg)
	{
		if(Msg -> SpecialLink == (struct IntuiMessage *)Msg && Msg -> ExecMessage . mn_Node . ln_Name == (char *)MESSAGE_COOKIE && Msg -> ExecMessage . mn_Node . ln_Pri == -114 && Msg -> ExecMessage . mn_ReplyPort == (struct MsgPort *)Msg)
			FreeMem(Msg,sizeof(struct IntuiMessage));
		else
			GT_ReplyIMsg(Msg);
	}
}
