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

#include "gtlayout_global.h"

VOID LIBENT
LT_LockWindow(REG(a0) struct Window *window)
{
	if(window)
	{
		LockNode	*lockNode;
		BOOLEAN 	 found;

		found = FALSE;

		ObtainSemaphore(&LTP_LockSemaphore);

		SCANLIST(&LTP_LockList,lockNode)
		{
			if(lockNode -> Window == window)
			{
				lockNode -> Count++;

				found = TRUE;

				break;
			}
		}

		if(!found)
		{
			if(lockNode = AllocMem(sizeof(LockNode),MEMF_PUBLIC | MEMF_ANY | MEMF_CLEAR))
			{
				AddTail((struct List *)&LTP_LockList,(struct Node *)lockNode);

				lockNode -> Window		= window;
				lockNode -> OldIDCMPFlags	= window -> IDCMPFlags;
				lockNode -> Count		= 1;
				lockNode -> MinWidth		= window -> MinWidth;
				lockNode -> MaxWidth		= window -> MaxWidth;
				lockNode -> MinHeight		= window -> MinHeight;
				lockNode -> MaxHeight		= window -> MaxHeight;

				WindowLimits(window,window -> Width,window -> Height,window -> Width,window -> Height);

				ModifyIDCMP(window,(window -> IDCMPFlags & IDCMP_REFRESHWINDOW) | IDCMP_SIZEVERIFY);

				if(V39)
				{
					STATIC struct TagItem tags[3] =
					{
						WA_BusyPointer,		TRUE,
						WA_PointerDelay,	TRUE,

						TAG_DONE
					};

					SetWindowPointerA(window,tags);
				}
				else
				{
					STATIC UWORD __chip Stopwatch[(2 + 16) * 2] =
					{
						0x0000,0x0000,

						0x0400,0x07C0,
						0x0000,0x07C0,
						0x0100,0x0380,
						0x0000,0x07E0,
						0x07C0,0x1FF8,
						0x1FF0,0x3FEC,
						0x3FF8,0x7FDE,
						0x3FF8,0x7FBE,
						0x7FFC,0xFF7F,
						0x7EFC,0xFFFF,
						0x7FFC,0xFFFF,
						0x3FF8,0x7FFE,
						0x3FF8,0x7FFE,
						0x1FF0,0x3FFC,
						0x07C0,0x1FF8,
						0x0000,0x07E0,

						0x0000,0x0000
					};

					SetPointer(window,Stopwatch,16,16,-6,0);
				}

				Request(&lockNode -> Requester,window);
			}
		}

		ReleaseSemaphore(&LTP_LockSemaphore);
	}
}


/****************************************************************************/


VOID LIBENT
LT_UnlockWindow(REG(a0) struct Window *window)
{
	if(window)
	{
		LockNode *lockNode;

		ObtainSemaphore(&LTP_LockSemaphore);

		SCANLIST(&LTP_LockList,lockNode)
		{
			if(lockNode -> Window == window)
			{
				if(--lockNode -> Count < 1)
				{
					Remove((struct Node *)lockNode);

					WindowLimits(window,lockNode -> MinWidth,lockNode -> MinHeight,lockNode -> MaxWidth,lockNode -> MaxHeight);

					EndRequest(&lockNode -> Requester,window);

					if(V39)
						SetWindowPointerA(window,NULL);
					else
						ClearPointer(window);

					ModifyIDCMP(window,lockNode -> OldIDCMPFlags);

					FreeMem(lockNode,sizeof(LockNode));
				}

				break;
			}
		}

		ReleaseSemaphore(&LTP_LockSemaphore);
	}
}


/*****************************************************************************/


VOID LIBENT
LT_DeleteWindowLock(REG(a0) struct Window *window)
{
	if(window)
	{
		LockNode *lockNode;

		ObtainSemaphore(&LTP_LockSemaphore);

		SCANLIST(&LTP_LockList,lockNode)
		{
			if(lockNode -> Window == window)
			{
				Remove((struct Node *)lockNode);

				EndRequest(&lockNode -> Requester,window);

				if(V39)
					SetWindowPointerA(window,NULL);
				else
					ClearPointer(window);

				ModifyIDCMP(window,lockNode -> OldIDCMPFlags);

				FreeMem(lockNode,sizeof(LockNode));

				break;
			}
		}

		ReleaseSemaphore(&LTP_LockSemaphore);
	}
}
