#ifndef TSICON_H
#define TSICON_H

#define INTUI_V36_NAMES_ONLY

#include <exec/types.h>

#include <clib/alib_protos.h>

extern struct IntuitionBase *IntuitionBase;
#include <clib/intuition_protos.h>
#include <pragmas/intuition_pragmas.h>

#include <clib/exec_protos.h>
extern struct ExecBase *SysBase;
#include <pragmas/exec_pragmas.h>

extern struct DosLibrary *DOSBase;
#include <clib/dos_protos.h>
#include <pragmas/dos_pragmas.h>

/* Below is undefined in 2.02 header file dos/dos.h */
#ifndef DOS_RDARGS
#define DOS_RDARGS 5
#endif

extern struct Library *WorkbenchBase;
#include <clib/wb_protos.h>
#include <pragmas/wb_pragmas.h>

extern struct Library *IconBase;
#include <clib/icon_protos.h>
#include <pragmas/icon_pragmas.h>

extern struct Library *CxBase;
#include <clib/commodities_protos.h>
#include <pragmas/commodities_pragmas.h>

extern struct Library *AslBase;
#include <clib/asl_protos.h>
#include <pragmas/asl_pragmas.h>

extern struct Library *UtilityBase;
#include <clib/utility_protos.h>
#include <pragmas/utility_pragmas.h>
/* Below is not in the 2.02 version of clib/utility_protos.h
   pragmas/utility_pragmas.h */
#ifndef INCLUDES204
LONG Stricmp(UBYTE *string1,UBYTE *string2);
#pragma libcall UtilityBase Stricmp A2 9802
#endif

#include <clib/rexxsyslib_protos.h>
extern struct RxsLib *RexxSysBase;
#include <pragmas/rexxsyslib_pragmas.h>
#include <rexx/errors.h>

#include <Workbench/icon.h>
#include <Workbench/Startup.h>
#include <Workbench/Workbench.h>

#include <graphics/gfxbase.h>
extern struct GfxBase *GfxBase ;
#include <clib/graphics_protos.h>
#include <pragmas/graphics_pragmas.h>

extern struct Library *GadToolsBase;
#include <clib/gadtools_protos.h>
#include <pragmas/gadtools_pragmas.h>
/* Below are not in 2.02 version of libraries/gadtools.h */
#ifndef GT_Underscore
#define GT_Underscore GT_TagBase+64
#endif
#ifndef GTMN_FullMenu
#define GTMN_FullMenu GT_TagBase+62
#endif
#ifndef INCLUDES204                         
#ifdef ARROWIDCMP
#undef ARROWIDCMP
#endif
#define ARROWIDCMP    (IDCMP_GADGETUP | IDCMP_GADGETDOWN |\
        IDCMP_INTUITICKS | IDCMP_MOUSEBUTTONS)
#ifdef LISTVIEWIDCMP
#undef LISTVIEWIDCMP
#endif
#define LISTVIEWIDCMP (IDCMP_GADGETUP | IDCMP_GADGETDOWN |\
        IDCMP_MOUSEMOVE | ARROWIDCMP)
#ifdef BUTTONIDCMP
#undef BUTTONIDCMP
#endif
#define BUTTONIDCMP (IDCMP_GADGETUP)
#endif

#include <intuition/gadgetclass.h>

#include <exec/memory.h>

#include <devices/timer.h>

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <ios1.h>

/* Control structure for each AppIcon/Window */
struct IN {
   struct   Node        IN_Node;		/* Short name is in ln_Name */
   struct   DiskObject *IN_DiskObject;
   struct   AppIcon    *IN_AppIcon;
   struct   AppWindow  *IN_AppWindow;
	STRPTR 				  	IN_FName;
   struct   List			IN_AnimList;/* List of ANode */
   struct   Window     *IN_W;
   struct   Gadget	  *IN_G;
   struct	ANode		  *IN_CurrANode;
				ULONG			IN_LastSeconds,IN_LastMicros,IN_YPos;
};

struct ANode {
   struct   Node        AN_Node;
   struct   DiskObject *AN_DiskObject;
	ULONG    AN_CurrentTime; /* Time to wait to display in 1/10s */
	ULONG    AN_WaitTime;
			
};

#define CPORTNAME "_TSICON"     /* Used for Control when run twice */
#define RPORTNAME "TSICON"         /* The arexx port */

enum IconMessageType {  /* Internal control messages */
	IMT_Quit,
	IMT_Add,
	IMT_Show,
	IMT_Enable,
	IMT_Disable,
	IMT_Hide,
	IMT_Add_Add,
	IMT_Remove
};

struct IconMessage {
	struct	Message		   	IM_Message;
	enum		IconMessageType	IM_Type;
  	STRPTR	          			IM_Name;
};

#define CX_MESSAGE_POPUP 1    /* Hotkey Msg IDs */
#define CX_MESSAGE_WPOPUP 2

struct CommandEntry {   /* Used for Arexx commands */
   STRPTR CommandName;
};

/* dos rdargs stuff - template depends on if already running */
#define RD_Quit 0L
#define RD_Add 1L
#define RD_Remove 2L
#define RD_Show 3L
#define RD_Hide 4L
#define RD_Enable 5L
#define RD_Disable 6L
#define RD_Files 7L
#define Template "QUIT/S,ADD/S,REMOVE/S,SHOW/S,HIDE/S,ENABLE/S,DISABLE/S,FILES/M"
#define Template1 "SHOW/S,DISABLE/S,FILES/M"
#define RD_Show1 0L
#define RD_Disable1 1L
#define RD_Files1 2L

#define len 256

void mymain(char *line);
void DoMessage(struct AppMessage *AppMessage);
void SError(STRPTR ErrorMessage);
BOOL DoIt(struct IN *IN,char *DirName,char *FileName);
BOOL AddObject(STRPTR ObjectName,BOOL JustAdd);
BOOL AddIcons(struct IN *IN);
void RemoveIcons(struct IN *IN);
BOOL DeleteObject(STRPTR filepart);
BOOL SafePutToPort(struct IconMessage *message, STRPTR portname,struct MsgPort *ReplyPort);
void About(void);
void DeleteNum(ULONG Num);
void Show(BOOL defaultscreen);
void Hide(void);
void Up(void);
void Down(void);
void Add(void);
void Delete(void);
void IEnable(void);
void IDisable(void);
BOOL SafeAddObject(STRPTR ObjectName,BOOL JustAdd);
void StripIntuiMessages(struct MsgPort *mp,struct Window *win);
void CloseWindowSafely(struct Window *win);
void WinDisable(void);
void WinEnable(void);
int FindCommand(char *command);
BOOL ListObjects(char *FileName);

/* Various defines originally set up by TplEdit */

#define WLEF	  0
#define WTOP	204
#define WWID	290
#define WHEI	171

#define GLEF_0	 14
#define GTOP_0	105
#define GWID_0	 70
#define GHEI_0	 13

#define GLEF_1	 14
#define GTOP_1	 29
#define GWID_1	 70
#define GHEI_1	 13

#define GLEF_2	108
#define GTOP_2	 28
#define GWID_2	173
#define GHEI_2	109

#define GLEF_3	 14
#define GTOP_3	 49
#define GWID_3	 70
#define GHEI_3	 13

#define GLEF_4	 14
#define GTOP_4	 85
#define GWID_4	 70
#define GHEI_4	 13

#define GLEF_5	212
#define GTOP_5	140
#define GWID_5	 69
#define GHEI_5	 21

#define GLEF_6	108
#define GTOP_6	140
#define GWID_6	 69
#define GHEI_6	 21

#define GLEF_7	  8
#define GTOP_7	132
#define GWID_7	 85
#define GHEI_7	 29

#define BLEF_0	  8
#define BTOP_0	 24
#define BWID_0	 85
#define BHEI_0	101

#define GAD_R_Disable	0
#define GAD_R_Hide	1
#define GAD_R_List	2
#define GAD_R_Quit	3
#define GAD_R_Enable	4
#define GAD_R_Delete	5
#define GAD_R_Add		6
#define GAD_R_About	7

#define ALLGADS		8

#define NG_R_Disable	(NGAry + GAD_R_Disable)
#define NG_R_Hide		(NGAry + GAD_R_Hide)
#define NG_R_List		(NGAry + GAD_R_List)
#define NG_R_Quit		(NGAry + GAD_R_Quit)
#define NG_R_Enable	(NGAry + GAD_R_Enable)
#define NG_R_Delete	(NGAry + GAD_R_Delete)
#define NG_R_Add		(NGAry + GAD_R_Add)
#define NG_R_About	(NGAry + GAD_R_About)

void
FreeGads(void);
struct Gadget *
InitGads(struct Screen *Scr);
void
drawborders(void);

#endif
