//****************************************************************
//* Part 0: My data types
//****************************************************************
#define  False 0
#define  True  !(False)

typedef struct {
	int MinX, MinY, MaxX, MaxY;
} t_BoxenLuder;

typedef struct {
	int X, Y;
} t_Standpunkt;

//****************************************************************
//* RISC OS data types
//****************************************************************

// For some things I get so-called Handles
typedef int t_TaskHandle;
typedef int t_WindowHandle;
typedef int t_IconHandle;

//****************************************************************
// Global things
//****************************************************************
char WimpScrapVar[] = "Wimp$Scrap";
char WimpScrap[] = "<Wimp$Scrap>";


//****************************************************************
// Icons
//****************************************************************

typedef int t_SpriteArea;

// Icon data
typedef union {
	char IconText[12];
	struct {
		char *Text;
		char *Validation;
		int Length;
	}	IconTextIndirect;
	struct {
		char *Sprite;
		t_SpriteArea *Area;
		int Length;
	}	IconSpriteIndirect;
} t_IconData;

char IconTextBuffer[sizeof(t_IconData)+1];

// Icon
typedef struct {
	t_BoxenLuder BoundingBox;
	unsigned IconFlags;
	t_IconData IconData;
} t_Icon;

// Set Icon State
typedef struct {
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
	int EORword;
	int CLRword;
} t_IconSetState;


// Flag bits
//  0	Text
//  1	Sprite
//  2	Border
//  3	Centered horizontally
//  4	Centered vertically
//  5	Filled
//  6	Outline font
//  7	Redraw by app
//  8	Indirected
//  9	Right alined
// 10	Add to selection with adjust
// 11	Sprite half size
// 12-15	Button typ
// 16-20	Exclusive selection group
// 21	Selected
// 22	Shaded
// 23	Deleted
// 24-27	Foreground colour
// 28-31	Background colour
// 24-31	Font handle

#define IconFlags_Mask_Text (1<<0)
#define IconFlags_Mask_Sprite (1<<1)
#define IconFlags_Mask_Border (1<<2)
#define IconFlags_Mask_HCenter (1<<3)
#define IconFlags_Mask_VCenter (1<<4)
#define IconFlags_Mask_Filled (1<<5)
#define IconFlags_Mask_Indirect (1<<8)
#define IconFlags_Mask_AlignRight (1<<9)
#define IconFlags_Mask_Selected (1<<21)

#define IconFlags_Mask_TextLeft (0)
#define IconFlags_Mask_TextCenter (1<<3)
#define IconFlags_Mask_TextRight (1<<9)

#define IconFlags_Shift_Button 12
#define IconFlags_Shift_ESG 16
#define IconFlags_Shift_FGColor 24
#define IconFlags_Shift_BGColor 28

#define ColorWhite 0
#define ColorGrey 2
#define ColorBlack 7

#define IconButton_MenuOnly 0
#define IconButton_ClickOnce 3
#define IconButton_ClickLeaving 4
#define IconButton_ClickOnOff 5
#define IconButton_Caret 15

#define IconFlags_IconBar     (IconFlags_Mask_Sprite | IconFlags_Mask_Indirect | (IconButton_ClickOnce<<IconFlags_Shift_Button))
#define IconFlags_MenuItem    (IconFlags_Mask_Text | IconFlags_Mask_Filled | (ColorWhite<<IconFlags_Shift_BGColor) | (ColorBlack<<IconFlags_Shift_FGColor))
#define IconFlags_WindowTitle (IconFlags_Mask_Text | IconFlags_Mask_HCenter | IconFlags_Mask_VCenter | IconFlags_Mask_Filled | IconFlags_Mask_Indirect | (ColorGrey<<IconFlags_Shift_BGColor) | (ColorBlack<<IconFlags_Shift_FGColor))

#define IconFlags_TextL  (IconFlags_Mask_Text | (ColorBlack<<IconFlags_Shift_FGColor))
#define IconFlags_TextC  (IconFlags_Mask_Text | IconFlags_Mask_HCenter | (ColorBlack<<IconFlags_Shift_FGColor))
#define IconFlags_TextR  (IconFlags_Mask_Text | IconFlags_Mask_AlignRight | (ColorBlack<<IconFlags_Shift_FGColor))
#define IconFlags_Edit   (IconFlags_Mask_Text | IconFlags_Mask_Filled | (IconButton_Caret<<IconFlags_Shift_Button) | (ColorWhite<<IconFlags_Shift_BGColor) | (ColorBlack<<IconFlags_Shift_FGColor))
#define IconFlags_Button (IconFlags_Mask_Text | IconFlags_Mask_HCenter | IconFlags_Mask_VCenter | IconFlags_Mask_Filled | (IconButton_ClickOnce<<IconFlags_Shift_Button) | (ColorGrey<<IconFlags_Shift_BGColor) | (ColorBlack<<IconFlags_Shift_FGColor))
#define IconFlags_OnOff  (IconFlags_Mask_Text | IconFlags_Mask_Sprite | IconFlags_Mask_VCenter | (IconButton_ClickOnOff<<IconFlags_Shift_Button))
#define IconFlags_Click  (IconFlags_Mask_Text | IconFlags_Mask_Sprite | IconFlags_Mask_VCenter | (IconButton_ClickLeaving<<IconFlags_Shift_Button))



// Button Types
//  0	menu only
//  1	mouse over
//  2	click auto repeat
//  3	click once
//  4	(click selects), (deselect leaving), declick
//  5	(click selects), double click
//  6	click, drag
//  7	(click selects), declick, drag
//  8	(click selects), double click, drag
//  9	menu icon
// 10	click, drage, double click
// 11	click selects, drag
// 12	reserved
// 13	reserved
// 14	put caret, drag possible
// 15	put caret


#define IconBar_IconLeft (t_WindowHandle)(-2)
#define IconBar_IconRight (t_WindowHandle)(-1)

#define WimpSpriteArea (t_SpriteArea*)1

char NoText[] = "";
#define Icon_NoText (char*)(&NoText)

#define Window_WimpBlock (t_WindowHandle)(NULL)

char IconText[] = "R2;";
char IconButton[] = "R5,3;Pptr_drop;";
char IconButtonDefault[] = "R6,3;";
char IconWriteable[] = "KT;R2;";
char IconWriteableNumber[] = "KT;A0-9;R2;";
char IconWriteableJump[] = "KRT;R2;";
char IconRadio[] = "Sradiooff,radioon;";
char IconOption[] = "Soptoff,opton;";
char IconDown[] = "Sdown;";
char IconUp[] = "Sup;";

#define IconValidation_Flat NULL
#define IconValidation_Text (char*)(&IconText)
#define IconValidation_Button (char*)(&IconButton)
#define IconValidation_ButtonDefault (char*)(&IconButtonDefault)
#define IconValidation_Writeable (char*)(&IconWriteable)
#define IconValidation_WriteableNumber (char*)(&IconWriteableNumber)
#define IconValidation_WriteableJump (char*)(&IconWriteableJump)

#define IconValidation_Radio (char*)(&IconRadio)
#define IconValidation_Option (char*)(&IconOption)
#define IconValidation_DownUp (char*)(&IconDownUp)
#define IconValidation_DownUp (char*)(&IconDownUp)

//****************************************************************
// Keys
#define KeyShift 0
#define KeyCtrl 1
#define KeyAlt 2
#define KeyOffsetLeft 3
#define KeyoffsetRight 6

//****************************************************************
// Windows

typedef struct {
	t_BoxenLuder Visible;
	int  ScrollX, ScrollY;
	t_WindowHandle WindowStack; // -1
	unsigned WindowFlags;
	char TitleForground; //7
	char TitleBackground; // 2
	char WorkareaForground; // 7
	char WorkareaBackground; // 1
	char ScrollbarBackground; //3
	char ScrollbarForeground; // 1
	char TitleFocusBackground; // 12
	char ExtraFlags;
	t_BoxenLuder Workarea;
	unsigned TitleIconFlags;
	int WorkareaButtonType;
	t_SpriteArea *ToolSpriteArea; // -1 (WimpSpriteArea)
	int MinArea; // Width & Height in 16 Bit each!
	t_IconData TitleIconData;
	int IconCount;
} t_WindowHeader;

typedef struct {
	t_WindowHeader WindowHeader;
	t_Icon WindowIcon[];
} t_Window;

#define Window_OpenInFront (t_WindowHandle)(-1)

// Flag bits
//  0	Old format flags I do not use
//  1	Moveable
//  2 	Old format flags I do not use
//  3 	Old format flags I do not use
//  4	Wimp can manage redraw alone
//  5	It is a pane
//  6	Window may be moved off-screen
//  7 	Old format flags I do not use
//  8	I want scroll request events with auto repeat
//  9	As above but not auto repeat
// 10	Window colors are in GCOL format
// 11	No window may be behind this one
// 12	I want hot keys events usind Wimp_ProcessKey
// 13	Windows must remain on-screen
// 14	Ignore horizontal resize
// 15	Ignore vertical resize
// The next 5 bits are filled by Wimp_GetWindowState
// 16	Window is open
// 17	Window is completely visible
// 18	Window has its max size
// 19	The Open_Window_Request has been triggered by resize click
// 20	Window has input focus
// 21 	Next Open_Window will force window on-screen (set by Wimp as needed)
// 22	reserved, must be 0
// 23	reserved, must be 0
// The next 8 bits replace the "old format flags" if bit 31 is set
// 24 	Window has put-to-back icon
// 25 	Window has close icon
// 26 	Window has title bar
// 27 	Window has toggle size icon
// 28 	Window has vertical scroll bar
// 29 	Window has resize icon
// 30 	Window has horizontal scroll bar
// 31 	If set the bits 24-30 are used instead of the old bits 0, 2, 3, and 7

#define WindowFlags_Mask_Moveable (1<<1)
#define WindowFlags_Mask_WimpRedraw (1<<4)
#define WindowFlags_Mask_Pane (1<<5)
#define WindowFlags_Mask_OffScreen (1<<6)
#define WindowFlags_Mask_Open (1<<16)
#define WindowFlags_Mask_BackIcon (1<<24)
#define WindowFlags_Mask_CloseIcon (1<<25)
#define WindowFlags_Mask_TitleBar (1<<26)
#define WindowFlags_Mask_SizeToggle (1<<27)
#define WindowFlags_Mask_VScroll (1<<28)
#define WindowFlags_Mask_Resize (1<<29)
#define WindowFlags_Mask_HScroll (1<<30)
#define WindowFlags_Mask_NewFlags ((unsigned)1<<31)

#define WindowFlags_Info (WindowFlags_Mask_WimpRedraw | WindowFlags_Mask_NewFlags | WindowFlags_Mask_TitleBar)
#define WindowFlags_Simple (WindowFlags_Mask_Moveable | WindowFlags_Mask_WimpRedraw | WindowFlags_Mask_OffScreen | WindowFlags_Mask_NewFlags | WindowFlags_Mask_CloseIcon | WindowFlags_Mask_TitleBar)
#define WindowFlags_Pane (WindowFlags_Mask_Moveable | WindowFlags_Mask_WimpRedraw | WindowFlags_Mask_OffScreen | WindowFlags_Mask_NewFlags | WindowFlags_Mask_Pane)
#define WindowFlags_PaneScroll (WindowFlags_Mask_Moveable | WindowFlags_Mask_WimpRedraw | WindowFlags_Mask_OffScreen | WindowFlags_Mask_NewFlags | WindowFlags_Mask_Pane | WindowFlags_Mask_VScroll | WindowFlags_Mask_HScroll)
#define WindowFlags_AllTools (WindowFlags_Mask_Moveable | WindowFlags_Mask_WimpRedraw | WindowFlags_Mask_OffScreen | WindowFlags_Mask_NewFlags | WindowFlags_Mask_BackIcon | WindowFlags_Mask_CloseIcon | WindowFlags_Mask_TitleBar | WindowFlags_Mask_SizeToggle | WindowFlags_Mask_VScroll | WindowFlags_Mask_Resize | WindowFlags_Mask_HScroll)
#define WindowFlags_AllToolsRedraw (WindowFlags_Mask_Moveable | WindowFlags_Mask_OffScreen | WindowFlags_Mask_NewFlags | WindowFlags_Mask_BackIcon | WindowFlags_Mask_CloseIcon | WindowFlags_Mask_TitleBar | WindowFlags_Mask_SizeToggle | WindowFlags_Mask_VScroll | WindowFlags_Mask_Resize | WindowFlags_Mask_HScroll)


//****************************************************************
// Menus

typedef struct {
	t_IconData Title;
	char TitleForeground; // 7
	char TitleBackground; // 2
	char BodyForeground; // 7
	char BodyBackground; // 0
	int Width; // Automatic
	int Height; // 44
	int Gap; //0
} t_MenuHeader;

// Since MenuItem needs Menu and vice versa this is the trick
typedef struct t_Menu t_Menu;

typedef struct {
	unsigned MenuFlags;
	union {
		t_Menu *SubMenu;
		t_WindowHandle Window;
		int Warning;
	} MenuLink;
	unsigned IconFlags;
	t_IconData IconData;
} t_MenuItem;

struct t_Menu {
	t_MenuHeader MenuHeader;
	t_MenuItem MenuItem[];
};

#define MenuFlags_Standard 0
#define MenuFlags_Mask_Last (1<<7)
#define MenuFlags_Mask_Dashes (1<<1)
#define MenuFlags_Mask_Tick (1<<0)
#define MenuFlags_Title_Indirect (1<<8)


//****************************************************************
//* Part 2: SWI Paramters
//****************************************************************

//****************************************************************
// Polling

#define TASK 0x4B534154
// I mask out these by default
//  0 Null
//  4 Pointer leaving
//  5 Pointer entering
// 11 Lose caret
// 12 Gain caret
// 14 reserved
// 15 reserved
// 16 reserved
#define PollMask_Standard 0x1b831
#define PollMask_Null 0x1b830

#define ReasonCode_Null 0
#define ReasonCode_RedrawWindow 1
#define ReasonCode_OpenWindow 2
#define ReasonCode_CloseWindow 3
#define ReasonCode_MouseClick 6
#define ReasonCode_UserDragBox 7
#define ReasonCode_KeyPress 8
#define ReasonCode_MenuSelection 9
#define ReasonCode_UserMessage 17
#define ReasonCode_UserMessageRecorded 18
#define ReasonCode_UserMessageAcknowledge 19

#define WindowBackground (t_WindowHandle)(-1)
#define WindowIconbar (t_WindowHandle)(-2)

#define MessageCode_Quit 0

#define MouseButtonRight  0x1
#define MouseButtonMiddle 0x2
#define MouseButtonLeft   0x4
#define MouseDragRight    16
#define MouseDragLeft     64

// Wimp Poll Block as a buffer
typedef struct {
	char Data[256];
} t_Buffer256;

typedef struct {
	char Data[236];
} t_Buffer236;

#define FileType_Directory 0x1000
#define FileType_Application 0x2000
#define FileType_Untyped 0xffffffff

// Wimp Message Data for DataSave(Ack)
#define MessageCode_DataSave 1
#define MessageCode_DataSaveAck 2
#define HeaderSize_DataSave 48
typedef struct {
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
	t_Standpunkt Coordinate;
	int DataSize;
	int FileType;
	char FileName[212];
} t_WimpMessageDataSave;

// Wimp Message Data for DataLoad(Ack)
#define MessageCode_DataLoad 3
#define MessageCode_DataLoadAck 4
#define HeaderSize_DataLoad 48
typedef struct {
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
	t_Standpunkt Coordinate;
	int DataSize;
	int FileType;
	char FileName[212];
} t_WimpMessageDataLoad;

// Wimp Poll block for a user message
typedef struct {
	int MessageLength;
	int SenderHandle;
	int MyRef;
	int YourRef;
	int MessageCode;
	union MessageData {
		t_Buffer236 Block;
		t_WimpMessageDataLoad DataLoad;
		t_WimpMessageDataSave DataSave;
	} MessageData;
} t_WimpUserMessage;


// Wimp Poll block for a mouse click
typedef struct {
	t_Standpunkt Mouse;
	int Buttons;
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
	char Filler[236];
} t_WimpMouseClick;

// Wimp Poll block for menu selection
typedef struct {
	int MenuItem[63];  // = 256 Bytes
} t_WimpMenuSelection;

// Wimp Poll block for open window
typedef struct {
	t_WindowHandle WindowHandle;
	t_BoxenLuder Visible;
	int  ScrollX, ScrollY;
	t_WindowHandle WindowStack; // -1
	char Filler[224];
} t_WimpOpenWindow;

// Block for redraw window's GetRectangle
typedef struct {
	t_WindowHandle WindowHandle;
	t_BoxenLuder Visible;
	int  ScrollX, ScrollY;
	t_BoxenLuder Rectangle;
	char Filler[212];
} t_WimpGetRectangle;

// Wimp Poll block for close window
typedef struct {
	t_WindowHandle WindowHandle;
	char Filler[252];
} t_WimpCloseWindow;

// Wimp Poll block for keypress
typedef struct {
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
	t_Standpunkt Offset;
	int CaretFormat;
	int CaretIndex;
	int CharacterCode;
	char Filler[228];
} t_WimpKeyPress;

// Wimp Poll block for drag box
typedef struct {
	t_BoxenLuder DragBox;
	char Filler[240];
} t_WimpDragBox;

// Block for SWI Wimp_GetWindowState
typedef struct {
	t_WindowHandle WindowHandle;
	t_BoxenLuder Visible;
	int ScrollX, ScrollY;
	int OpenBehind;
	unsigned WindowFlags;
	char Filler[212];
} t_WimpGetWindowState;

// Wimp Poll Block with multiple formats
typedef union {
	t_Buffer256 Block;
	t_WimpUserMessage UserMessage;
	t_WimpMouseClick MouseClick;
	t_WimpMenuSelection MenuSelection;
	t_WimpOpenWindow OpenWindow;
	t_WimpCloseWindow CloseWindow;
	t_WimpGetWindowState GetWindowState;
	t_WimpGetRectangle RedrawWindow;
	t_WimpKeyPress KeyPress;
	t_WimpDragBox DragBox;
} t_WimpPollBlock;



//****************************************************************
// SWIs

// Block for SWI Wimp_CreateIcon
typedef struct {
	t_WindowHandle WindowHandle;
	t_Icon Icon;
} t_WimpCreateIconBlock;

// Block for SWI Wimp_DeleteIcon
typedef struct {
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
} t_WimpDeleteIconBlock;

// Block for SWI Wimp_GetIconState
typedef struct {
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
	t_Icon Icon;
} t_WimpGetIconStateBlock;

// Block for SWI Wimp_GetWindowState
typedef struct {
	t_WindowHandle WindowHandle;
	t_BoxenLuder Visible;
	int ScrollX, ScrollY;
	int OpenBehind;
	unsigned WindowFlags;
} t_WimpGetWindowStateBlock;

typedef struct {
	int MessageCode;
	int Delimiter;
} t_WimpAddRemoveMessages;

// Drag Icon
#define DragSimpleBox 5
typedef struct {
	t_WindowHandle WindowHandle;
	int DragType;
	t_BoxenLuder DragBox;
	t_BoxenLuder ParentBox;
} t_WimpDragBoxBlock;

// GetPointer Info
typedef struct {
	t_Standpunkt Mouse;
	int Buttons;
	t_WindowHandle WindowHandle;
	t_IconHandle IconHandle;
} t_WimpGetPointerInfo;

// MessageTrans FileDescriptor
typedef struct {
	int FourWords[4];
} t_MessageTrans_FileDescriptor;
	

//****************************************************************
// OS stuff

typedef struct {
	unsigned Type, Load, Exec, Length, Attributes;
} t_OSFileInfoBlock;

