/*
 * Name        : wimp.h
 * Description : SWI names and structures for accessing the SWIs provided by
 *               the WindowManager
 * Copyright   :  Pace Micro Technology, 1994-2000
 */



#ifndef __wimp_h
#define __wimp_h


/***************************************************************************
 * SWI names, reason codes and flags                                       *
 ***************************************************************************/

#ifndef Wimp_Initialise

#define Wimp_Initialise                         0x400c0
#define Wimp_CreateWindow                       0x400c1
#define Wimp_CreateIcon                         0x400c2
#define Wimp_CreateIconRelative                 0x400c2
#define Wimp_CreateIconPrioritised              0x400c2
#define Wimp_DeleteWindow                       0x400c3
#define Wimp_DeleteIcon                         0x400c4
#define Wimp_OpenWindow                         0x400c5
#define Wimp_CloseWindow                        0x400c6
#define Wimp_Poll                               0x400c7
#define Wimp_RedrawWindow                       0x400c8
#define Wimp_UpdateWindow                       0x400c9
#define Wimp_GetRectangle                       0x400ca
#define Wimp_GetWindowState                     0x400cb
#define Wimp_GetWindowInfo                      0x400cc
#define Wimp_SetIconState                       0x400cd
#define Wimp_GetIconState                       0x400ce
#define Wimp_GetPointerInfo                     0x400cf
#define Wimp_DragBox                            0x400d0
#define Wimp_ForceRedraw                        0x400d1
#define Wimp_SetCaretPosition                   0x400d2
#define Wimp_GetCaretPosition                   0x400d3
#define Wimp_CreateMenu                         0x400d4
#define Wimp_DecodeMenu                         0x400d5
#define Wimp_WhichIcon                          0x400d6
#define Wimp_SetExtent                          0x400d7
#define Wimp_OpenTemplate                       0x400d9
#define Wimp_CloseTemplate                      0x400da
#define Wimp_LoadTemplate                       0x400db
#define Wimp_ProcessKey                         0x400dc
#define Wimp_CloseDown                          0x400dd
#define Wimp_StartTask                          0x400de
#define Wimp_ReportError                        0x400df
#define Wimp_GetWindowOutline                   0x400e0
#define Wimp_PollIdle                           0x400e1
#define Wimp_PlotIcon                           0x400e2
#define Wimp_SetMode                            0x400e3
#define Wimp_SetPalette                         0x400e4
#define Wimp_ReadPalette                        0x400e5
#define Wimp_ReadTruePalette                    0x400e5
#define Wimp_SetColour                          0x400e6
#define Wimp_SendMessage                        0x400e7
#define Wimp_CreateSubMenu                      0x400e8
#define Wimp_SpriteOp                           0x400e9
#define Wimp_BaseOfSprites                      0x400ea
#define Wimp_BlockCopy                          0x400eb
#define Wimp_SlotSize                           0x400ec
#define Wimp_ReadPixTrans                       0x400ed
#define Wimp_ClaimFreeMemory                    0x400ee
#define Wimp_ReleaseFreeMemory                  0x400ee
#define Wimp_CommandWindow                      0x400ef
#define Wimp_TextColour                         0x400f0
#define Wimp_TransferBlock                      0x400f1
#define Wimp_ReadSysInfo                        0x400f2
#define Wimp_SetFontColours                     0x400f3
#define Wimp_GetMenuState                       0x400f4
#define Wimp_RegisterFilter                     0x400f5
#define Wimp_AddMessages                        0x400f6
#define Wimp_RemoveMessages                     0x400f7
#define Wimp_SetColourMapping                   0x400f8

#define Service_Memory                          0x11
#define Service_StartWimp                       0x49
#define Service_StartedWimp                     0x4a
#define Service_PremodeChange                   0x4d
#define Service_MouseTrap                       0x52
#define Service_WimpCloseDown                   0x53
#define Service_WimpReportError                 0x57
#define Service_WimpSaveDesktop                 0x5c
#define Service_WimpPalette                     0x5d
#define Service_DesktopWelcome                  0x7c
#define Service_ShutDown                        0x7e
#define Service_ShutDownComplete                0x80
#define Service_WimpSpritesMoved                0x85
#define Service_WimpRegisterFilters             0x86

#endif


/*
 * Flags passed in R0 to SWI Wimp_Poll.
 */

#define Wimp_Poll_NullMask                      (1u <<  0)
#define Wimp_Poll_RedrawWindowRequestMask       (1u <<  1)
#define Wimp_Poll_PointerLeavingWindowMask      (1u <<  4)
#define Wimp_Poll_PointerEnteringWindowMask     (1u <<  5)
#define Wimp_Poll_MouseClickMask                (1u <<  6)
#define Wimp_Poll_KeyPressedMask                (1u <<  8)
#define Wimp_Poll_LoseCaretMask                 (1u << 11)
#define Wimp_Poll_GainCaretMask                 (1u << 12)
#define Wimp_Poll_PollWordNonZeroMask           (1u << 13)
#define Wimp_Poll_UserMessageMask               (1u << 17)
#define Wimp_Poll_UserMessageRecordedMask       (1u << 18)
#define Wimp_Poll_UserMessageAcknowledgeMask    (1u << 19)
#define Wimp_Poll_PollWord                      (1u << 22)
#define Wimp_Poll_PollWordHighPriority          (1u << 23)
#define Wimp_Poll_SaveFPRegs                    (1u << 24)


/*
 * Flags passed in R1 to SWI Wimp_ReportError.
 */

#define Wimp_ReportError_OK                     (1u << 0)
#define Wimp_ReportError_Cancel                 (1u << 1)
#define Wimp_ReportError_HighlightCancel        (1u << 2)
#define Wimp_ReportError_NoPrompt               (1u << 3)
#define Wimp_ReportError_NoAppName              (1u << 4)
#define Wimp_ReportError_LeaveOpen              (1u << 5)
#define Wimp_ReportError_Close                  (1u << 6)
#define Wimp_ReportError_NoBeep                 (1u << 7)




/***************************************************************************
 *                    Globally useful fundamental types                    *
 ***************************************************************************/

/*
 * Bounding box
 */

typedef struct
{
  int xmin, ymin, xmax, ymax;
}
BBox;


/*
 * Caret
 */

typedef struct
{
  int window_handle;
  int icon_handle;
  int xoffset;
  int yoffset;
  int height;
  int index;
}
WimpCaret;



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


/***************************************************************************
 *                      Fundamental types for icons                        *
 ***************************************************************************/

typedef union
{
  char    t[12];
  char    s[12];
  char    st[12];

  struct
  {
    char *buffer;
    char *validation;
    int   buffer_size;
  }
  it;

  struct
  {
    void *sprite;
    void *sprite_area;
    int   sprite_name_length;
  }
  is;

  struct
  {
    char *buffer;
    char *validation;
    int   buffer_size;
  }
  ist;
}
WimpIconData;



typedef struct
{
  BBox         bbox;
  unsigned int flags;
  WimpIconData data;
}
WimpIconBlock;



/*
 * Icon description flags
 */

#define WimpIcon_Text        (1u <<  0)
#define WimpIcon_Sprite      (1u <<  1)
#define WimpIcon_Border      (1u <<  2)
#define WimpIcon_HCentred    (1u <<  3)
#define WimpIcon_VCentred    (1u <<  4)
#define WimpIcon_Filled      (1u <<  5)
#define WimpIcon_AntiAliased (1u <<  6)
#define WimpIcon_NeedsHelp   (1u <<  7)
#define WimpIcon_Indirected  (1u <<  8)
#define WimpIcon_RJustified  (1u <<  9)
#define WimpIcon_AllowAdjust (1u << 10)
#define WimpIcon_HalfSize    (1u << 11)
#define WimpIcon_ButtonType  (1u << 12)
#define WimpIcon_ESG         (1u << 16)
#define WimpIcon_Selected    (1u << 21)
#define WimpIcon_Shaded      (1u << 22)
#define WimpIcon_Deleted     (1u << 23)
#define WimpIcon_FGColour    (1u << 24)
#define WimpIcon_BGColour    (1u << 28)
#define WimpIcon_FontHandle  (1u << 24)



/*
 * The following are icon button types.  To set the button type in an
 * icon's flags you should multiply by the constant Icon_ButtonType
 * eg,
 *
 *     WimpIcon i;
 *
 *        i.flags |= WimpIcon_ButtonType * ButtonType_Never;
 */

#define ButtonType_Never            0
#define ButtonType_Always           1
#define ButtonType_Repeat           2
#define ButtonType_Click            3
#define ButtonType_Release          4
#define ButtonType_DoubleClick      5
#define ButtonType_ClickDrag        6
#define ButtonType_ReleaseDrag      7
#define ButtonType_DoubleDrag       8
#define ButtonType_MenuIcon         9
#define ButtonType_DoubleClickDrag 10
#define ButtonType_Radio           11
#define ButtonType_WriteClickDrag  14
#define ButtonType_Writable        15



/***************************************************************************
 *   The following structures define data types for blocks of memory which *
 *   are passed to Wimp SWIs which manipulate or interrogate icons.        *
 *                                                                         *
 ***************************************************************************/


/*
 * Structure for creating an icon using SWI Wimp_CreateIcon
 */

typedef struct
{
  int           window_handle;
  WimpIconBlock icon;
}
WimpCreateIconBlock;



/*
 * Structure for getting an icon's state using SWI Wimp_GetIconState
 */

typedef struct
{
  int           window_handle;
  int           icon_handle;
  WimpIconBlock icon;
}
WimpGetIconStateBlock;



/*
 * Structure for setting an icon's state using SWI Wimp_SetIconState
 */

typedef struct
{
  int window_handle;
  int icon_handle;
  int EOR_word; /* dpt: grr */
  int clear_word;
}
WimpSetIconStateBlock;



/*
 * Structure for getting the pointer's state using SWI Wimp_GetPointerInfo
 */

typedef struct
{
  int x;
  int y;
  int button_state;
  int window_handle;
  int icon_handle;
}
WimpGetPointerInfoBlock;



/*
 * Structure for starting a drag using SWI Wimp_DragBox
 */

typedef struct
{
  int    wimp_window;
  int    drag_type;
  BBox   dragging_box;
  BBox   parent_box;
  int   *workspace;
  void (*draw)();
  void (*remove)();
  void (*move)();
}
WimpDragBox;

#define Wimp_DragBox_DragWindow                   1
#define Wimp_DragBox_DragSize                     2
#define Wimp_DragBox_DragHorizontal               3
#define Wimp_DragBox_DragVertical                 4
#define Wimp_DragBox_DragFixedDash                5
#define Wimp_DragBox_DragRubberDash               6
#define Wimp_DragBox_DragPoint                    7
#define Wimp_DragBox_DragFixedUserBox             8
#define Wimp_DragBox_DragRubberUserBox            9
#define Wimp_DragBox_DragFixedUserBoxDontCancel  10
#define Wimp_DragBox_DragRubberUserBoxDontCancel 11
#define Wimp_DragBox_DragBoth                    12

#define Wimp_DragBox_DontCancel                   2



/*
 * Structure for plotting an icon using SWI Wimp_PlotIcon
 */

typedef WimpIconBlock WimpPlotIconBlock;




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


/***************************************************************************
 *                     Fundamental types for windows                       *
 ***************************************************************************/

typedef struct
{
    BBox          visible_area;
    int           xscroll;
    int           yscroll;
    int           behind;
    unsigned int  flags;
    char          title_fg;
    char          title_bg;
    char          work_fg;
    char          work_bg;
    char          scroll_outer;
    char          scroll_inner;
    char          highlight_bg;
    char          reserved;
    BBox          extent;
    unsigned int  title_flags;
    unsigned int  work_flags;
    void         *sprite_area;
    short         min_width;
    short         min_height;
    WimpIconData  title_data;
    int           nicons;

    /*-- any icons follow here in memory --*/
    /* WimpIconBlock      icons[1]; */
}
WimpWindow;


/*
 * Window description flag values
 *
 * Note: only "new-style" flags are shown
 */

#define WimpWindow_Moveable          (1u <<  1)
#define WimpWindow_AutoRedraw        (1u <<  4)
#define WimpWindow_Pane              (1u <<  5)
#define WimpWindow_NoBounds          (1u <<  6)
#define WimpWindow_ScrollRepeat      (1u <<  8)
#define WimpWindow_Scroll            (1u <<  9)
#define WimpWindow_RealColours       (1u << 10)
#define WimpWindow_Back              (1u << 11)
#define WimpWindow_HotKeys           (1u << 12)
#define WimpWindow_StayOnScreen      (1u << 13)
#define WimpWindow_IgnoreXExtent     (1u << 14)
#define WimpWindow_IgnoreYExtent     (1u << 15)
#define WimpWindow_Open              (1u << 16)
#define WimpWindow_NotCovered        (1u << 17)
#define WimpWindow_FullSize          (1u << 18)
#define WimpWindow_Toggled           (1u << 19)
#define WimpWindow_HasInputFocus     (1u << 20)
#define WimpWindow_ForceOnceOnScreen (1u << 21)
#define WimpWindow_BackIcon          (1u << 24)
#define WimpWindow_CloseIcon         (1u << 25)
#define WimpWindow_TitleIcon         (1u << 26)
#define WimpWindow_ToggleIcon        (1u << 27)
#define WimpWindow_VScroll           (1u << 28)
#define WimpWindow_SizeIcon          (1u << 29)
#define WimpWindow_HScroll           (1u << 30)
#define WimpWindow_NewFormat         (1u << 31)


/* "special" window values */

#define WimpWindow_Background                   (-1)
#define WimpWindow_Iconbar                      (-2)    /* dpt: grr */
#define WimpWindow_Top                          (-1)
#define WimpWindow_Bottom                       (-2)



/***************************************************************************
 *   The following structures define data types for blocks of memory which *
 *   are passed to Wimp SWIs which manipulate or interrogate windows.      *
 *                                                                         *
 ***************************************************************************/


/*
 * Structure for creating a window using SWI Wimp_CreateWindow
 */

typedef WimpWindow WimpCreateWindowBlock;




/*
 * Structure for deleting a window using SWI Wimp_DeleteWindow
 */

typedef struct
{
  int window_handle;
}
WimpDeleteWindowBlock;



/*
 * Structure for deleting an icon using SWI Wimp_DeleteIcon
 */

typedef struct
{
  int window_handle;
  int icon_handle;
}
WimpDeleteIconBlock;



/*
 * Structure for opening a window using SWI Wimp_OpenWindow
 */

typedef struct
{
  int  window_handle;
  BBox visible_area;
  int  xscroll;
  int  yscroll;
  int  behind;
}
WimpOpenWindowBlock;



/*
 * Structure for closing a window using SWI Wimp_CloseWindow
 */

typedef struct
{
  int window_handle;
}
WimpCloseWindowBlock;



/*
 * Structure for redrawing a Window using SWI Wimp_RedrawWindow
 */

typedef struct
{
  int  window_handle;
  BBox visible_area;
  int  xscroll;
  int  yscroll;
  BBox redraw_area;
}
WimpRedrawWindowBlock;



/*
 * Structure for updating a window using SWI Wimp_UpdateWindow
 */

typedef struct
{
  int  window_handle;
  BBox update_area;
}
WimpUpdateWindowBlock;



/*
 * Structure for getting a rectangle using SWI Wimp_GetRectangle
 */

typedef WimpRedrawWindowBlock WimpGetRectangleBlock;



/*
 * Structure for getting a window's state using SWI Wimp_GetWindowState
 */

typedef struct
{
  int          window_handle;
  BBox         visible_area;
  int          xscroll;
  int          yscroll;
  int          behind;
  unsigned int flags;
}
WimpGetWindowStateBlock;



/*
 * Structure for geting info for a window using SWI Wimp_GetWindowInfo
 */

typedef struct
{
  int        window_handle;
  WimpWindow window_data;
}
WimpGetWindowInfoBlock;



/*
 * Structure for getting a window's outline using SWI Wimp_GetWindowOutline
 */

typedef struct
{
  int  window_handle;
  BBox outline;
}
WimpGetWindowOutlineBlock;



/*
 * Structure for forcing a redraw on a window (or screen) using SWI
 * Wimp_ForceRedraw
 */

typedef struct
{
  int  window_handle;
  BBox redraw_area;
}
WimpForceRedrawBlock;



/*
 * Structures for getting the caret position using SWI Wimp_GetCaretPosition
 */

typedef WimpCaret WimpGetCaretPositionBlock;




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


/***************************************************************************
 *                     Fundamental types for menus                         *
 ***************************************************************************/



typedef struct
{
    unsigned int  flags;
    void         *submenu_or_window;            /* dpt: ick */
    unsigned int  icon_flags;
    WimpIconData  icon_data;
}
WimpMenuItem;


/*
 * Menu item flags values
 */

#define WimpMenuItem_Ticked                     (1u << 0)
#define WimpMenuItem_DottedLine                 (1u << 1)
#define WimpMenuItem_Writable                   (1u << 2)
#define WimpMenuItem_GenerateSubWimpMenuWarning (1u << 3)
#define WimpMenuItem_AllowWhenGreyedOut         (1u << 4)
#define WimpMenuItem_Last                       (1u << 7)
#define WimpMenuItem_IndirectedTitle            (1u << 8)



typedef struct
{
  char title[12];
  char title_fg;
  char title_bg;
  char work_fg;
  char work_bg;
  int  item_width;
  int  item_height;
  int  gap;

  WimpMenuItem items[1]; /* menu items follow here in memory */
}
WimpMenu;



typedef int WimpMenuSelections[9]; /* the wimp only allows 8-deep menu tree */



/***************************************************************************
 *   The following structures define data types for blocks of memory which *
 *   are passed to Wimp SWIs which manipulate or interrogate menus.        *
 *                                                                         *
 ***************************************************************************/


/*
 * Structure for creating a menu using SWI Wimp_CreateMenu
 */

typedef WimpMenu WimpCreateMenuBlock;



/*
 * Structure for creating a submenu using SWI Wimp_CreateSubMenu
 */

typedef WimpMenu WimpCreateSubMenuBlock;



/*
 * Structure for getting the current state of the menu tree using SWI
 * Wimp_GetMenuState
 */

typedef WimpMenuSelections WimpGetMenuStateBlock;




/***************************************************************************
 *                            Messages                                     *
 ***************************************************************************/

/*
 * Wimp message numbers
 */

#define Wimp_MQuit                    0
#define Wimp_MDataSave                1
#define Wimp_MDataSaveAck             2
#define Wimp_MDataLoad                3
#define Wimp_MDataLoadAck             4
#define Wimp_MDataOpen                5
#define Wimp_MRAMFetch                6
#define Wimp_MRAMTransmit             7
#define Wimp_MPreQuit                 8
#define Wimp_MPaletteChange           9
#define Wimp_MSaveDesktop             0xa
#define Wimp_MDeviceClaim             0xb
#define Wimp_MDeviceInUse             0xc
#define Wimp_MDataSaved               0xd
#define Wimp_MShutDown                0xe
#define Wimp_MClaimEntity             0xf
#define Wimp_MDataRequest             0x10
#define Wimp_MDragging                0x11
#define Wimp_MDragClaim               0x12
#define Wimp_MReleaseEntity           0x13
#define Wimp_MAppControl              0x15

#define Wimp_MFilerOpenDir            0x400
#define Wimp_MFilerCloseDir           0x401
#define Wimp_MFilerOpenDirAt          0x402
#define Wimp_MFilerSelectionDirectory 0x403
#define Wimp_MFilerAddSelection       0x404
#define Wimp_MFilerAction             0x405
#define Wimp_MFilerControlAction      0x406
#define Wimp_MFilerSelection          0x407
#define Wimp_MFilerDevicePath         0x408
#define Wimp_MFilerShareDir           0x409

#define Wimp_MAlarmSet                0x500
#define Wimp_MAlarmGoneOff            0x501

#define Wimp_MHelpRequest             0x502
#define Wimp_MHelpReply               0x503
#define Wimp_MHelpEnable              0x504

#define Wimp_MMenuWarning             0x400c0
#define Wimp_MModeChange              0x400c1
#define Wimp_MTaskInitialise          0x400c2
#define Wimp_MTaskCloseDown           0x400c3
#define Wimp_MSlotSize                0x400c4
#define Wimp_MSetSlot                 0x400c5
#define Wimp_MTaskNameRq              0x400c6
#define Wimp_MTaskNameIs              0x400c7
#define Wimp_MTaskStarted             0x400c8
#define Wimp_MMenusDeleted            0x400c9
#define Wimp_MIconize                 0x400ca
#define Wimp_MWindowClosed            0x400cb
#define Wimp_MWindowInfo              0x400cc
#define Wimp_MSwap                    0x400cd /* ### this should go */
#define Wimp_MToolsChanged            0x400ce
#define Wimp_MFontChanged             0x400cf
#define Wimp_MIconizeAt               0x400d0

#define Wimp_MPrintFile               0x80140
#define Wimp_MWillPrint               0x80141
#define Wimp_MPrintSave               0x80142
#define Wimp_MPrintInit               0x80143
#define Wimp_MPrintError              0x80144
#define Wimp_MPrintTypeOdd            0x80145
#define Wimp_MPrintTypeKnown          0x80146
#define Wimp_MSetPrinter              0x80147



/***************************************************************************
 *   The following are definitions of structures used to send and          *
 *   receive Wimp Messages                                                 *
 ***************************************************************************/



/*
 * The following structures are for common Wimp messages.  This list is not
 * exhaustive, but the client application can add to these any other messages
 * which it needs.
 */


typedef struct
{
  int  destination_window;
  int  destination_icon;
  int  destination_x;
  int  destination_y;
  int  estimated_size;
  int  file_type;
  char leaf_name[212];
}
WimpDataSaveMessage,
WimpDataSaveAckMessage,
WimpDataLoadMessage,
WimpDataLoadAckMessage;



typedef struct
{
  int  window_handle;
  int  padding1;
  int  x;
  int  y;
  int  padding2;
  int  file_type;
  char path_name[212];
}
WimpDataOpen;



typedef struct
{
  void *buffer;
  int   buffer_size;
}
WimpRAMFetchMessage;



typedef struct
{
  void *buffer;
  int   nbytes;
}
WimpRAMTransmitMessage;



typedef struct
{
  int file_handle;
}
WimpSaveDesktopMessage;



typedef struct
{
  int  major_device;
  int  minor_device;
  char information[228];
}
WimpDeviceClaimMessage,
WimpDeviceInUseMessage;



typedef struct
{
  unsigned int flags;
}
WimpShutdownMessage;



typedef struct
{
  unsigned int flags;
}
WimpClaimEntityMessage;

/* Flags for the above */

#define Wimp_MClaimEntity_CaretSelectionClaimed (3u << 0)
#define Wimp_MClaimEntity_ClipboardClaimed      (1u << 2)



typedef struct
{
  int          window_handle;
  int          internal_handle;
  int          x;
  int          y;
  unsigned int flags;
  int          file_types[54];
}
WimpDataRequestMessage;

/* Flags for the above */

#define Wimp_MDataRequest_ClipboardRequested    (1u << 2)



typedef struct
{
  int          window_handle;
  int          icon_handle;
  int          x;
  int          y;
  unsigned int flags;
  BBox         bbox;
  int          file_types[50];
}
WimpDraggingMessage;

/* Flags for the above */

#define Wimp_MDragging_SendingFromSelection     (1u << 0)
#define Wimp_MDragging_SendingFromClipboard     (1u << 1)
#define Wimp_MDragging_SouceWillBeDeleted       (1u << 2)
#define Wimp_MDragging_DontClaim                (1u << 3)



typedef struct
{
  unsigned int flags;
  int          file_types[58];
}
WimpDragClaimMessage;

/* Flags for the above */

#define Wimp_MDragClaim_ChangedPointer          (1u << 0)
#define Wimp_MDragClaim_RemoveDragBox           (1u << 1)
#define Wimp_MDragClaim_DeleteSource            (1u << 2)




typedef struct
{
  unsigned int flags;
}
WimpReleaseEntityMessage;

/* Flags for the above */

#define Wimp_MReleaseEntity_ClipboardReleased   (1u << 2)



typedef struct
{
  unsigned int version; /* ### unsigned? */
  unsigned int flags;
  unsigned int reason; /* ### unsigned? */
}
WimpAppControlMessage;

/* Reason codes for the above */

#define Wimp_MAppControl_Stop                   0
#define Wimp_MAppControl_WakeUp                 1
#define Wimp_MAppControl_Freeze                 2
#define Wimp_MAppControl_MinimiseMemory         3
#define Wimp_MAppControl_Configure              4
#define Wimp_MAppControl_Open			5

/* Flags for the above */

#define Wimp_MAppControl_ImmediateAction        (1u << 0)



typedef struct
{
  int mouse_x;
  int mouse_y;
  int buttons;
  int window_handle;
  int icon_handle;
}
WimpHelpRequestMessage;



typedef struct
{
  char text[236];
}
WimpHelpReplyMessage;



typedef struct
{
  unsigned int flags;
}
WimpHelpEnableMessage;

/* Flags for the above */

#define Wimp_MHelpEnable_Suspend           	(1u << 0)
#define Wimp_MHelpEnable_ReadConfiguration 	(1u << 1)



typedef struct
{
  int          fs_number;
  unsigned int flags;
  char         directory_name[228];
}
WimpFilerOpenDirMessage,
WimpFilerCloseDirMessage;



typedef struct
{
  int          fs_number;
  unsigned int flags;
  int          x;
  int          y;
  int          width;
  int          height;
  char         view_mode;
  char         directory_name[211];
}
WimpFilerOpenDirAtMessage;



typedef struct
{
  char directory_name[236];
}
WimpFilerSelectionDirectoryMessage;



typedef struct
{
  char leaf_names[236];
}
WimpFilerAddSelectionMessage;



typedef struct
{
  int operation;
  int options;
  union
  {
    int  words[57];
    char bytes[228];
  }
  data;
}
WimpFilerActionMessage;



typedef struct
{
  int control;
}
WimpFilerControlActionMessage;



typedef struct
{
  BBox selection;
  int  item_width;
  int  item_height;
  int  view_mode;
  int  start_column;
  int  start_row;
  int  end_column;
  int  end_row;
}
WimpFilerSelectionMessage;



typedef struct
{
  char path_name[236];
}
WimpFilerDevicePathMessage;



typedef struct
{
  unsigned int flags;
  int          x;
  int          y;
  char         directory_name[224];
}
WimpFilerShareDirMessage;



typedef struct
{
  void               *submenu_or_window; /* ### ick */
  int                 x;
  int                 y;
  WimpMenuSelections  selection;
}
WimpMenuWarningMessage;



typedef struct
{
  void *cao;
  int   slot_size;
  char  task_name[228];
}
WimpTaskInitialiseMessage;



typedef struct
{
  int slot_size;
  int next_slot_size;
}
WimpSlotSizeMessage;



typedef struct
{
  int slot_size;
  int task_handle;
}
WimpSetSlotMessage;



typedef struct
{
  int task_handle;
}
WimpTaskNameRequestMessage;



typedef struct
{
  int  task_handle;
  int  slot_size;
  char task_name[228];
}
WimpTaskNameIsMessage;



typedef struct
{
  WimpMenu *menu;
}
WimpMenusDeletedMessage;



typedef struct
{
  int  window_handle;
  int  task_handle;
  char title[20];
}
WimpIconizeMessage;



typedef struct
{
  int window_handle;
}
WimpWindowClosedMessage;



typedef struct
{
  int  window_handle;
  int  reserved;
  char sprite_name[8];
  char title[220];
}
WimpWindowInfoMessage;



typedef struct
{
  int          window_handle;
  int          task_handle;
  int          x;
  int          y;
  unsigned int flags;
}
WimpIconizeAtMessage;

/* Flags for the above */

#define Wimp_MIconizeAt_ShiftHeld 		(1u << 0)



typedef struct
{
  struct
  {
    int size;
    int sender;
    int my_ref;
    int your_ref;
    int action_code;
  }
  hdr;

  union
  {
    int                                words[59];
    char                               bytes[236];

    WimpDataSaveMessage                data_save;
    WimpDataSaveAckMessage             data_save_ack;
    WimpDataLoadMessage                data_load;
    WimpDataLoadAckMessage             data_load_ack;
    WimpDataOpen                       data_open;
    WimpRAMFetchMessage                ram_fetch;
    WimpRAMTransmitMessage             ram_transmit;

    WimpSaveDesktopMessage             save_desktop;

    WimpDeviceClaimMessage             device_claim;
    WimpDeviceInUseMessage             device_in_use;

    WimpShutdownMessage                shutdown;

    WimpClaimEntityMessage             claim_entity;
    WimpDataRequestMessage             data_request;

    WimpDraggingMessage                dragging;
    WimpDragClaimMessage               drag_claim;

    WimpAppControlMessage              app_control;

    WimpHelpRequestMessage             help_request;
    WimpHelpReplyMessage               help_reply;
    WimpHelpEnableMessage              help_enable;

    WimpFilerOpenDirMessage            filer_open_dir;
    WimpFilerCloseDirMessage           filer_close_dir;
    WimpFilerOpenDirAtMessage          filer_open_dir_at;
    WimpFilerSelectionDirectoryMessage filer_selection_directory;
    WimpFilerAddSelectionMessage       filer_add_selection;
    WimpFilerActionMessage             filer_action;
    WimpFilerControlActionMessage      filer_control_action;
    WimpFilerSelectionMessage          filer_selection;
    WimpFilerShareDirMessage           filer_share_dir;
    WimpFilerDevicePathMessage         filer_device_path;

    WimpMenuWarningMessage             menu_warning;

    WimpTaskInitialiseMessage          task_initialise;

    WimpSlotSizeMessage                slot_size;

    WimpSetSlotMessage                 set_slot;

    WimpTaskNameRequestMessage         task_name_request;
    WimpTaskNameIsMessage              task_name_is;

    WimpMenusDeletedMessage            menus_deleted;

    WimpIconizeMessage                 iconize;
    WimpWindowClosedMessage            window_closed;
    WimpWindowInfoMessage              window_info;
    WimpIconizeAtMessage               iconize_at;
  }
  data;
}
WimpMessage;



/* structure used to send a wimp message using SWI Wimp_SendMessage */

typedef WimpMessage WimpSendMessageBlock;






/***************************************************************************
 *                               Events                                    *
 ***************************************************************************/


/*
 * Event codes returned in r0 from SWI Wimp_Poll.
 */

#define Wimp_ENull                   0
#define Wimp_ERedrawWindow           1
#define Wimp_EOpenWindow             2
#define Wimp_ECloseWindow            3
#define Wimp_EPointerLeavingWindow   4
#define Wimp_EPointerEnteringWindow  5
#define Wimp_EMouseClick             6
#define Wimp_EUserDrag               7
#define Wimp_EKeyPressed             8
#define Wimp_EMenuSelection          9
#define Wimp_EScrollRequest          10
#define Wimp_ELoseCaret              11
#define Wimp_EGainCaret              12
#define Wimp_EPollWordNonZero        13
#define Wimp_EUserMessage            17
#define Wimp_EUserMessageRecorded    18
#define Wimp_EUserMessageAcknowledge 19
#define Wimp_EToolboxEvent           0x200


/*
 * Structures defining the event block returned by the Wimp from SWI
 * Wimp_Poll. ie. the block whose address was passed in R1.
 */


typedef struct
{
  int window_handle;
}
WimpRedrawWindowRequestEvent;



typedef WimpOpenWindowBlock WimpOpenWindowRequestEvent;



typedef struct
{
  int window_handle;
}
WimpCloseWindowRequestEvent;



typedef struct
{
  int window_handle;
}
WimpPointerLeavingWindowEvent,
WimpPointerEnteringWindowEvent;



typedef struct
{
  int mouse_x;
  int mouse_y;
  int buttons;
  int window_handle;
  int icon_handle;
}
WimpMouseClickEvent;

/* Button types for the above */

#define Wimp_MouseButtonAdjust     1
#define Wimp_MouseButtonMenu       2
#define Wimp_MouseButtonSelect     4

#define Wimp_MouseButtonDragAdjust 0x10
#define Wimp_MouseButtonDragSelect 0x40



typedef struct
{
  BBox bbox;
}
WimpUserDragBoxEvent;



typedef struct
{
  WimpCaret caret;
  int       key_code;
}
WimpKeyPressedEvent;



typedef WimpMenuSelections WimpMenuSelectionEvent;



typedef struct
{
  WimpOpenWindowBlock open;
  int                 xscroll;
  int                 yscroll;
  int                 icon_handle; /* Provided for extended scroll requests */
}
WimpScrollRequestEvent;



typedef WimpCaret WimpLoseCaretEvent;



typedef WimpCaret WimpGainCaretEvent;



typedef struct
{
  void *poll_word;
  int   poll_word_contents;
}
WimpPollWordNonZeroEvent;



typedef WimpMessage WimpUserMessageEvent,
                    WimpUserMessageRecordedEvent,
                    WimpUserMessageAcknowledgeEvent;



/*
 * Generic block passed to SWI Wimp_Poll in R1.  The Wimp will fill in this
 * block with event-specific data.
 */

typedef union
{
  int                             words[64];
  char                            bytes[256];

  WimpRedrawWindowRequestEvent    redraw_window_request;
  WimpOpenWindowRequestEvent      open_window_request;
  WimpCloseWindowRequestEvent     close_window_request;
  WimpPointerLeavingWindowEvent   pointer_leaving_window;
  WimpPointerEnteringWindowEvent  pointer_entering_window;
  WimpMouseClickEvent             mouse_click;
  WimpUserDragBoxEvent            user_drag_box;
  WimpKeyPressedEvent             key_pressed;
  WimpMenuSelectionEvent          menu_selection;
  WimpScrollRequestEvent          scroll_request;
  WimpLoseCaretEvent              lose_caret;
  WimpGainCaretEvent              gain_caret;
  WimpPollWordNonZeroEvent        poll_word_non_zero;

  WimpUserMessageEvent            user_message;
  WimpUserMessageRecordedEvent    user_message_recorded;
  WimpUserMessageAcknowledgeEvent user_message_acknowledge;
}
WimpPollBlock;


#endif
