/* PowerWindows.h */

#define _ProgVersion_ 1
#define _ProgRevision_ 1
#define _ProgSubRevision_ 0

#define _ProgVersionS_ "1.1"
#define _FullProgVersionS_ "1.1"

/* Strukturen */

struct ScreenEntry
{
	struct MinNode se_Node;
	struct Screen *se_Screen ;
	WORD	 se_NormalWidth;
	WORD	 se_NormalHeight;
	struct Layer_Info *se_LayerInfo;
	struct Layer *se_RightLayer;
	struct Layer *se_BottomLayer;
	struct Layer *se_TopLayer;
	struct Layer *se_LeftLayer;
};

struct TaskEntry
{
	struct MinNode te_Node;
	WORD  te_MatchType;
	UBYTE	te_Flags;
	UBYTE te_Pattern;
};

struct MyImageData
{
	struct Window *win;
	WORD ImageTyp;
};

struct MyButtonData
{
	struct MinNode node;
	struct Gadget *ThisGadget;
	struct Window *ThisWindow;
	struct Window *ParentWindow;
	STRPTR WindowTitle;
	struct timeval Time1;
	struct timeval Time2;
	struct Task *task;
	APTR UserData;
	APTR UserDataIcon;
	WORD WindowLeft,WindowTop;
	WORD Last_WindowLeft,Last_WindowTop;
	WORD Flags;
	WORD GadgetType;
};

struct ActionMsg
{
	struct Message ExecMessage;
	struct ScreenEntry *SEntry;
	struct Window *win;
	struct Window *IconWindow;
	WORD	Code;
	WORD	x1,y1;
};

struct Ext_Header
{
	BPTR	Seg_Next;
	WORD	CODE_MOVEQ;
	WORD	CODE_RTS;
	ULONG	Recognition;
	void	(*Routine)(void);
};

struct PWSemaphore
{
	struct SignalSemaphore Sem;
	ULONG	 Match1;
	ULONG  Match2;
	struct Task *PWTask;
	BYTE	 Version;
	BYTE	 Revision;
	BYTE	 SubRevision;
};

struct gpDeIconify
{
	ULONG	 MethodID;
	struct Window *gpdi_IconWindow;
};


enum {LIB_INTUITION,LIB_LAYERS,LIB_GRAPHICS};

/* Defines */

#define DBUG(a) if (ExtDebug) {printf(a ": ");gets(s2);}

#define ImageSuperClass IMAGECLASS
#define ButtonSuperClass BUTTONGCLASS

/* Macros */

#define Pos(c,s) (strchr((s),(c)) ? (UWORD) ((ULONG)strchr((s),(c)) - (ULONG)(s)) : -1 )
#define GreaterOne(a,b) ((a) > (b) ? (a) : (b))
#define LowerOne(a,b)   ((a) < (b) ? (a) : (b))
#define MinLimit(a,b)   if ((a)<(b)) (a)=(b)
#define MaxLimit(a,b)   if ((a)>(b)) (a)=(b)

/* Icon-Position */

#define IP_UPPERLEFT 0
#define IP_UPPERRIGHT 1
#define IP_LOWERLEFT 2
#define IP_LOWERRIGHT 3
#define IP_CENTER 4
#define IP_AUTOBOTTOMLEFT 5
#define IP_AUTOBOTTOMRIGHT 6
#define IP_AUTOTOPLEFT 7
#define IP_AUTOTOPRIGHT 8
#define IP_AUTOLEFTTOP 9
#define IP_AUTOLEFTBOTTOM 10
#define IP_AUTORIGHTTOP 11
#define IP_AUTORIGHTBOTTOM 12

/* Icon-Depth */

#define ID_ALWAYSFRONT 0
#define ID_NORMAL 1
#define ID_NORMALBEHIND 2

/* Icon-Breite */

#define IW_WINWIDTH 12345678

/* Marker - Arten */

#define MARKER_NORMAL 0
#define MARKER_NONE 1
#define MARKER_GADGET 2
#define MARKER_EXTENDED 3

/* Task-Matching Arten */

#define MATCH_NORMAL 0
#define MATCH_PATTERN 1

/* TaskEntry Flags */

#define TEF_DONTPATCHANYTHING 1

/* Action-Codes */

#define AM_MOVEWINDOW 0
#define AM_ICONIFY 1
#define AM_ACTIVATEWINDOW 2
#define AM_ICONCLOSEGADGET 3

/* Look of Iconify-Gadget */

#define ICONIMAGE_NORMAL 0
#define ICONIMAGE_NICE 1
#define ICONIMAGE_SYSI 2
#define ICONIMAGE_SYSINICE 3
#define ICONIMAGE_SYSIMUI 4
#define ICONIMAGE_VISUALPREFS 5

/* Image-Typen */

#define IMAGE_ICONIFYGADGET 0
#define IMAGE_ICONNODRAG 1

/* IDs for Custom-Gadgets */

#define GADGET_ICONIFY 2330
#define GADGET_ICONDRAG 2331
#define GADGET_ICONDEPTH 2332
#define GADGET_ICONCLOSE 2333
#define GADGET_SCREENDEPTH2 2334
#define GADGET_WINDOWDEPTH 2335
#define GADGET_ICONNODRAG 2336

/* Fehler von DeadLock-Task */

#define DT_ERR_NOTIMERPORT 1
#define DT_ERR_NOTIMERREQUEST 2
#define DT_ERR_NOTIMERDEVICE 3

/* Tags fuer MyButtonClass */

#define CGA_Dummy TAG_USER + 0x30000 + 100
#define CGA_WindowTitle CGA_Dummy + 1
#define CGA_ParentWindow CGA_Dummy + 2
#define CGA_WindowLeft CGA_Dummy + 3
#define CGA_WindowTop CGA_Dummy + 4
#define CGA_UserDataIcon CGA_Dummy + 5
#define CGA_Task CGA_Dummy + 6

/* Methode fuer MyButtonClass */

#define CGM_DeIconify 76
#define CGM_Iconify 77

/* Dummy Task zur Erkennung des gepatchten Depth-Gadgets */

#define PATCHEDDEPTHGADGETTASKDUMMY 0x74CAFE19

/* LVO Layers */

#define LVO_UpfrontLayer -0x30
#define LVO_MoveLayerInFrontOf -0xA8
#define LVO_CreateUpfrontLayer -0x24
#define LVO_CreateUpfrontHookLayer -0xBA
#define LVO_CreateBehindHookLayer -0xC0
#define LVO_DeleteLayer -90
#define LVO_LockLayers -108
#define LVO_LockLayerInfo -120
#define LVO_UnLockLayers -114
	
/* LVO Graphics */

#define LVO_Move -0xF0
#define LVO_Draw -0xF6
	
/* LVO Exec */

#define LVO_AllocVec -684
#define LVO_FreeVec -690
#define LVO_AddHead -240
#define LVO_Remove -252
#define LVO_Forbid -132
#define LVO_Permit -138
#define LVO_FindTask -294
#define LVO_ObtainSemaphore -564
#define LVO_ObtainSemaphoreShared -678
#define LVO_ReleaseSemaphore -570
	
/* LVO Dos */

#define LVO_MatchPatternNoCase -972
#define LVO_MatchPattern -846

/* LVO Intuition */

#define LVO_OpenScreen -198
#define LVO_OpenScreenTagList -612
#define LVO_CloseScreen -66
#define LVO_OpenWorkBench -210
#define LVO_CloseWorkBench -78

#define LVO_OpenWindow -204
#define LVO_OpenWindowTagList -606
#define LVO_CloseWindow -72
#define LVO_ActivateWindow -450
#define LVO_ActivateGadget -462
#define LVO_LockPubScreen -510
#define LVO_UnlockPubScreen -516
#define LVO_WBenchToFront -342
#define LVO_WindowToFront -312
#define LVO_WindowToBack -306
#define LVO_FreeSysRequest -372
#define LVO_EasyRequestArgs -588
#define LVO_AutoRequest -348
#define LVO_SetWindowTitles -276
#define LVO_NewObjectA -636

#define IECODE_LBUTTON_UP 0xE8
#define IECODE_RBUTTON_UP 0xE9
	
#define ACTION_NONE 0
#define ACTION_DRAGWINDOW 1
#define ACTION_AFTERMOVE 2
#define ACTION_AFTERMOVE2 3
#define ACTION_FREEZE 4
#define ACTION_AFTERFREEZE 5
#define ACTION_MULTI 6

#define IO_LayerMagic_Cookie 0x20051975

/* Multi Modes */

#define MULTI_ICONIFY 1
#define MULTI_DEICONIFY 2

/* LayerInfoFlags */

#define LIF_PATCHED 0x80

/* Signale zur Kommunikation mit Sub-Task */

#define SIG_TASK_READY SIGBREAKF_CTRL_F
#define SIG_TASK_START SIGBREAKF_CTRL_E
#define SIG_TASK_DIE   SIGBREAKF_CTRL_D

/* PowerWindows: Externe Routinen */

#ifndef MAKE_ID
#define MAKE_ID(a,b,c,d)	((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
#endif

#define EXT_CHECKSCREEN MAKE_ID('P','W','C','S')
#define EXT_CHECKWINDOW MAKE_ID('P','W','C','W')
#define EXT_RENDERICON    MAKE_ID('P','W','R','I')
#define EXT_PREFSSCANNER MAKE_ID('P','W','S','P')


#ifndef NOPROTOS
/* Prototypen */

void Ende(char *mes);
void Init(void);
void ParseArguments(void);
void SetCD(void);
void OpenLibs(void);
void OpenInput(void);
void InitCx(void);
void HandleCx(void);
void EndCx(void);
void ScanPreferences(WORD numpatches);
int IntNachricht(char *body,char *auswahl);
void Hinweis(char *body);

extern "ASM" void Dummy_HookFunc(void);
extern "ASM" LONG Dummy_ScreenChecker(Msg msg);
extern "ASM" LONG Dummy_WindowChecker(Msg msg);

//extern "ASM" struct Layer *OldCreateUpfrontHookLayer(register __a0 struct Layer_Info *li,register __a1 struct BitMap *bm,
//	register __d0 long x0, register __d1 long y0, register __d2 const long x1, register __d3 const long y1, register __d4 const long flags,
//	register __a3 const struct Hook *hook,register __a2 const struct BitMap *bm2 );


extern "ASM" struct ScreenEntry *FindScreen(register __a0 struct Layer_Info *li);
extern "ASM" BOOL CompareTask(register __d0 STRPTR name);

extern "ASM" void New_UpfrontLayer(void);
extern "ASM" LONG JumpOld_UpfrontLayer(register __a0 LONG dummy,register __a1 struct Layer *lay);
extern "ASM" LONG Jump_BehindLayer(register __a0 LONG dummy,register __a1 struct Layer *lay);

LONG NEW_UpfrontLayer(LONG dummy,struct Layer *lay);

extern "ASM" void New_MoveLayerInFrontOf(void);

extern "ASM" LONG Jump_MoveLayerInFrontOf(register __a0 struct Layer *layertomove, register __a1 struct Layer *targetlayer);

extern "ASN" void New_CreateUpfrontLayer(void);
extern "ASM" void New_CreateUpfrontHookLayer(void);

extern "ASM" void New_OpenScreen(void);
extern "ASM" void New_OpenScreenTagList(void);
extern "ASM" void New_CloseScreen(void);
extern "ASM" void New_OpenWorkBench(void);
extern "ASM" void New_CloseWorkBench(void);

extern "ASM" void New_OpenWindow(void);
extern "ASM" void New_OpenWindowTagList(void);
extern "ASM" void New_CloseWindow(void);
extern "ASM" void New_ActivateWindow(void);
extern "ASM" void New_ActivateGadget(void);
extern "ASM" void New_WindowToFront(void);
extern "ASM" void New_WindowToBack(void);
extern "ASM" void New_FreeSysRequest(void);
extern "ASM" void New_EasyRequestArgs(void);
extern "ASM" void New_AutoRequest(void);

extern "ASM" LONG JumpOld_EasyRequestArgs(register __a0 struct Window *window,register __a1 struct EasyStruct *easystruct,register __a2 ULONG *idcmpflags,register __a3 APTR args);
extern "ASM" LONG JumpOld_AutoRequest(register __a0 struct Window *window,register __a1 struct IntuiText *bodytext, register __a2 struct IntuiText *positivetext, register __a3 struct IntuiText *negativetext,register __d0 ULONG positiveflags,register __d1 ULONG negativeflags,register __d2 ULONG width, register __d3 ULONG height);
extern "ASM" void New_SetWindowTitles(void);
extern "ASM" void New_NewObjectA(void);
extern "ASM" Object *JumpOld_NewObjectA(register __a0 struct IClass *cl,register __a1 char *clid,register __a2 struct TagItem *taglist);

extern "ASM" void KillLayer(register __a1 struct Layer *lay);

extern "ASM" void InputEntry(void);
// extern "ASM" void DrawRect(void);
extern "ASM" void RollWORD(register __a0 WORD &i);
extern "ASM" void Blinker(void);
extern "ASM" void Blinker2(void);
extern "ASM" void BlinkerFehler(void);

BOOL MyLockLayer(struct Layer *lay);
BOOL MyLockLayers(struct Layer_Info *li);
void ScanScreens(void);
void DoPatches(void);
void AddInputHandler(void);
void RemoveWindows(struct ScreenEntry *se);
void SelfDestruction(void);
BOOL RemovePatches(void);
void MakePrivateClasses(void);
ULONG MyImageDispatcher(struct IClass *Klasse,struct Image *im,Msg msg);
ULONG MyButtonDispatcher(struct IClass *Klasse,struct Gadget *gad,Msg msg);

void HandleBreak(void);
void MakeDeadLockTask(void);
void StartDeadLockTask(void);
void HandleActionPort(void);
void DeadLockHunter(void);

/* Icon.c */

void MakeIcon(struct ActionMsg *MyMsg,WORD x,WORD y);
void KillIconWindow(struct Window *win,BOOL CloseIt);
struct Window *FindIconWindow(struct Window *win);
struct Gadget *GetIconUserData(struct Window *win,APTR *v);
void RefreshIconFrame(struct Window *win);
void RefreshIconTitle(struct Window *win,STRPTR title);
void RefreshIconTitleExt(struct Window *win,STRPTR title);
void RenderIconFrame(ULONG method,struct Window *win, struct RastPort *rp);
void RenderIconFrameExt(ULONG method,struct Window *win,struct RastPort *rp);

/* Misc.c */

void SendActionMsg(struct ActionMsg* &MyMsg,struct Window *ParentWindow,WORD WinLeft,WORD WinTop,struct Window *IconWindow,struct ScreenEntry *se,WORD Code);
void ReAlloc(APTR &Old,ULONG size,ULONG size2,ULONG flags);
BOOL ValidTagList(struct TagItem *tl);
struct TaskEntry *CheckTask(struct Window *win,struct List *list,BOOL sensitive);
struct Gadget *FindIconifyGadget(struct Window *win);
struct Gadget *FindIconGadget(struct Window *win);
void KillExt(BPTR &seg,LONG (*&routine)(Msg));
void KillLibrary(struct Library *&lib);
BOOL IsMyImage(struct Image *im);
BOOL IsMyButton(struct Gadget *gad);
BOOL KillMyGadget(struct Gadget *gad,struct Window *win);
void KillMyGadgets(struct Window *win);
void DrawHClipLine(WORD x1,WORD y1,WORD x2);
void DrawVClipLine(WORD x1,WORD y1,WORD y2);
void DrawRect(void);
void ScanWindows(struct Screen *scr);
struct Screen *WorkbenchOpened(void);

/* InputHandler.c */

void RefreshMultiWindows(void);
struct InputEvent *MyInputHandler(struct InputEvent *ie,APTR hd);

/* Patch.c */

void After_OpenScreen(struct Screen *scr);
void NEW_CloseScreen(struct Screen *scr);
void After_OpenWindowTagList(struct Window *win);
void PatchROM(void);
void ResetROM(void);


#endif

#ifndef NOVARS
/* Variablen */

extern "C"
{

#include "vars.h"

}

#endif

