/*->c.wimp */

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include <time.h>
#include <stdarg.h>

#include "h.swis"

#include "h.os"
#include "h.wimp"



#undef SetPalette
#undef SetFontColours


/*                          W I M P    S W I 's                            */
#define Initialise          0x000400C0
#define CreateWindow        0x000400C1
#define CreateIcon          0x000400C2
#define DeleteWindow        0x000400C3
#define DeleteIcon          0x000400C4
#define OpenWindow          0x000400C5
#define CloseWindow         0x000400C6
#define Poll                0x000400C7
#define RedrawWindow        0x000400C8
#define UpdateWindow        0x000400C9
#define GetRectangle        0x000400CA
#define GetWindowState      0x000400CB
#define GetWindowInfo       0x000400CC
#define SetIconState        0x000400CD
#define GetIconState        0x000400CE
#define GetPointerInfo      0x000400CF
#define DragBox             0x000400D0
#define ForceRedraw         0x000400D1
#define SetCaretPosition    0x000400D2
#define GetCaretPosition    0x000400D3
#define CreateMenu          0x000400D4
#define DecodeMenu          0x000400D5
#define WhichIcon           0x000400D6
#define SetExtent           0x000400D7
#define SetPointerShape     0x000400D8
#define OpenTemplate        0x000400D9
#define CloseTemplate       0x000400DA
#define LoadTemplate        0x000400DB
#define ProcessKey          0x000400DC
#define CloseDown           0x000400DD
#define StartTask           0x000400DE
#define ReportError         0x000400DF
#define GetWindowOutline    (0x000400c0+32)
#define PollIdle            (0x000400c0+33)
#define PlotIcon            (0x000400c0+34)
#define SetMode             (0x000400c0+35)
#define SetPalette          (0x000400c0+36)
#define ReadPalette         (0x000400c0+37)
#define SetColour           (0x000400c0+38)
#define SendMessage         (0x000400c0+39)
#define CreateSubMenu       (0x000400c0+40)
#define SpriteOp            (0x000400c0+41)
#define BaseOfSprites       (0x000400c0+42)
#define BlockCopy           (0x000400c0+43)
#define SlotSize            (0x000400c0+44)
#define ReadPixTrans        (0x000400c0+45)
#define ClaimFreeMemory     (0x000400c0+46)
#define CommandWindow       (0x000400c0+47)
#define TextColour          (0x000400c0+48)
#define TransferBlock       (0x000400c0+49)
#define ReadSysInfo         (0x000400c0+50)
#define SetFontColours      (0x000400c0+51)


os_error * wimp_taskinit(char *name,int * version,wimp_t *t)
{
os_regset r;
os_error *e;
int       list;

list=0;

r.r[0] = *version;
r.r[1] = 'T' +
        ('A' << 8) +
        ('S' << 16) +
        ('K' << 24);
r.r[2] = (int) name;
r.r[3] = (int)&list;

e = os_swix(Initialise, &r);

*t =  r.r[1];
*version=r.r[0];

return(e);
}




os_error *wimp_spriteop(int reason_code, char *name)
{
 os_regset r ;
 r.r[0] = reason_code ;
 r.r[2] = (int) name ;
 return os_swix(SpriteOp, &r) ;
}




os_error * wimp_create_wind(wimp_wind * w, wimp_w * result)
{

os_regset r;
os_error *e;

r.r[1] = (int)w;

e = os_swix(CreateWindow, &r);

*result = r.r[0];

return(e);

}



os_error * wimp_create_icon(wimp_icreate * i, wimp_i * result)
{

os_regset r;
os_error *e;

r.r[1] = (int)i;

e = os_swix(CreateIcon, &r);

*result = r.r[0];

return(e);

}



os_error * wimp_delete_wind(wimp_w w)
{

os_regset r;
os_error *e;

r.r[1] = (int)&w;

e = os_swix(DeleteWindow, &r);

return(e);

}



os_error * wimp_delete_icon(wimp_w w, wimp_i i)
{

os_regset r;
os_error *e;
int j[2];

j[0] = (int)w;
j[1] = (int)i;

r.r[1] = (int) j;

e = os_swix(DeleteIcon, &r);

return(e);

}



os_error * wimp_open_wind(wimp_openstr * o)
{

os_regset r;
os_error *e;

r.r[1] = (int)o;

e = os_swix(OpenWindow, &r);

return(e);

}


os_error * wimp_close_wind(wimp_w w)
{

os_regset r;
os_error *e;

r.r[1] = (int)&w;

e = os_swix(CloseWindow, &r);

return(e);

}


os_error * wimp_redraw_wind(wimp_redrawstr * wr, int * result)
{

os_regset r;
os_error *e;

r.r[1] = (int)wr;

e = os_swix(RedrawWindow, &r);

*result = r.r[0];

return(e);

}



os_error * wimp_update_wind(wimp_redrawstr * wr, int * result)
{

os_regset r;
os_error *e;

r.r[1] = (int)wr;

e = os_swix(UpdateWindow, &r);

*result = r.r[0];

return(e);

}



os_error * wimp_get_rectangle(wimp_redrawstr * wr, int * result)
{

os_regset r;
os_error *e;

r.r[1] = (int)wr;

e = os_swix(GetRectangle, &r);

*result = r.r[0];

return(e);

}


os_error * wimp_get_wind_state(wimp_w w, wimp_wstate * result)
{

os_regset r;
os_error *e;

result->o.w = w;

r.r[1] = (int)result;

e = os_swix(GetWindowState, &r);

return(e);

}




os_error * wimp_get_wind_info(wimp_winfo * result)

{

os_regset r;
os_error *e;

r.r[1] = (int)result;
e = os_swix(GetWindowInfo, &r);

return(e);

}




typedef struct {
  wimp_w    wind_h;
  wimp_i    icon_h;
  wimp_iconflags flags_v;
  wimp_iconflags flags_m;
} wimp_handles_and_flags;


os_error * wimp_set_icon_state(wimp_w w, wimp_i i,
     wimp_iconflags value, wimp_iconflags mask)
{

os_regset r;
os_error *e;
wimp_handles_and_flags b;

b.wind_h = w;
b.icon_h = i;
b.flags_v = value;
b.flags_m = mask;

r.r[1] = (int)&b;

e = os_swix(SetIconState, &r);

return(e);

}




typedef struct {
  wimp_w    wind_h;
  wimp_i    icon_h;
  wimp_icon icon_s;
} wimp_icon_and_handles;

os_error * wimp_get_icon_info(wimp_w w, wimp_i i, wimp_icon * result)

{

os_regset r;
os_error *e;
wimp_icon_and_handles b;


b.wind_h = w;
b.icon_h = i;

r.r[1] = (int)&b;

e = os_swix(GetIconState, &r);

*result = b.icon_s;

return(e);

}



typedef struct {
  wimp_mousestr m;
  int dud;
} mstr;


os_error * wimp_get_point_info(wimp_mousestr * result)

{

os_regset r;
os_error *e;
mstr m;

r.r[1] = (int)&m;

e = os_swix(GetPointerInfo, &r);

*result = m.m;
return(e);

}



os_error * wimp_drag_box(wimp_dragstr * d)
{

os_regset r;
os_error *e;

r.r[1] = (int)d;

e = os_swix(DragBox, &r);

return(e);

}




os_error * wimp_force_redraw(wimp_redrawstr * r)

{

os_error *e;

e = os_swix(ForceRedraw, (os_regset *)r);

return(e);

}



os_error * wimp_set_caret_pos(wimp_caretstr * c)
{

os_error *e;

e = os_swix(SetCaretPosition, (os_regset *)c);

return(e);

}



os_error * wimp_get_caret_pos(wimp_caretstr * c)

{

os_regset r;
os_error *e;

r.r[1] = (int)c;

e = os_swix(GetCaretPosition, &r);

return(e);

}



os_error * wimp_create_menu(wimp_menustr * m, int x, int y)

{

os_regset r;
os_error *e;

r.r[1] = (int)m;
r.r[2] = x;
r.r[3] = y;

e = os_swix(CreateMenu, &r);

return(e);

}



os_error * wimp_decode_menu(wimp_menustr * m, void * p1, void * p2)

{

os_regset r;
os_error *e;

r.r[1] = (int)m;
r.r[2] = (int)p1;
r.r[3] = (int)p2;

e = os_swix(DecodeMenu, &r);

return(e);

}





os_error * wimp_which_icon(wimp_which_block * w, wimp_i * results)

{

os_regset r;
os_error *e;

r.r[0] = w->window;
r.r[2] = w->bit_mask;
r.r[3] = w->bit_set;

r.r[1] = (int)results;

e = os_swix(WhichIcon, &r);

return(e);

}




os_error * wimp_set_extent(wimp_redrawstr * wr)
{

os_regset r;
os_error *e;

r.r[0] = wr->w;
r.r[1] = (int)wr + 4;

e = os_swix(SetExtent, &r);

return(e);

}




os_error * wimp_open_template(char * name)

{

os_regset r;
os_error *e;

r.r[1] = (int)name;

e = os_swix(OpenTemplate, &r);

return(e);

}



os_error * wimp_close_template(void)
{

os_regset r;
os_error *e;

e = os_swix(CloseTemplate, &r);

return(e);

}



os_error * wimp_load_template(wimp_template * t)

{

os_error *e;

e = os_swix(LoadTemplate, (os_regset *)t);

return(e);

}




os_error *wimp_processkey(int chcode) {
  return os_swi1(ProcessKey, chcode);
}




os_error * wimp_taskclose(wimp_t t)

{
os_regset r;
os_error *e;

r.r[0] = t;
r.r[1] = 'T' +
        ('A' << 8) +
        ('S' << 16) +
        ('K' << 24);
  e = os_swix(CloseDown, &r);
  return e;
}




os_error *wimp_getwindowoutline(wimp_redrawstr *re)
{
  os_regset r;
  os_error *e;

  r.r[1] = (int) re;
  e = os_swix(GetWindowOutline, &r);
  return e;
}


os_error *wimp_readpalette(wimp_palettestr* p)
{
  os_regset r;
  os_error *e;
  int i ;

  r.r[1] = (int) p;
  e = os_swix(ReadPalette, &r);

  for (i=0 ; i<20; i++)
  {
   int t = ((int *)p)[i] & 0xF0F0F0FF ;
   ((int *)p)[i] = t | ((t>>4) & 0xF0F0F00) ;
                   /* copy all the colour nibbles down, to scale by 17/16 */
  }
  return e;
}




os_error *wimp_setcolour(int colour)
{
  os_regset r;
  os_error *e;

  r.r[0] = colour;
  e = os_swix(SetColour, &r);
  return e;
}


os_error *wimp_sendmessage(wimp_etype code, wimp_msgstr* m, wimp_t dest)
{
  return os_swi3(os_X | SendMessage, code, (int) m, dest);
}

os_error *wimp_sendwmessage(
  wimp_etype code, wimp_msgstr* m, wimp_w w, wimp_i i)
{
  return os_swi4(os_X | SendMessage, code, (int) m, w, i);
}

os_error *wimp_create_submenu(wimp_menustr *sub, int x, int y)
{
  os_regset r;
  os_error *e;

  r.r[1] = (int) sub;
  r.r[2] = x;
  r.r[3] = y;
  e = os_swix(CreateSubMenu, &r);
  return e;
}

os_error *wimp_slotsize(int *currentslot /*inout*/,
                        int *nextslot /*inout*/,
                        int *freepool /*out*/) {
  return os_swi3r(SlotSize, *currentslot, *nextslot, 0,
                            currentslot, nextslot, freepool);
}



os_error *wimp_blockcopy(wimp_w w, wimp_box *source, int x, int y)
{
  os_regset r;

  r.r[0] = w;
  r.r[1] = source->x0;
  r.r[2] = source->y0;
  r.r[3] = source->x1;
  r.r[4] = source->y1;
  r.r[5] = x;
  r.r[6] = y;
  return os_swix(BlockCopy, &r);
}



os_error *wimp_transferblock(wimp_t sourcetask,char *sourcebuf,
                             wimp_t desttask,  char *destbuf,int buflen)
{
 os_error * err;
 os_regset  rx;

 rx.r[0]=sourcetask;        /* source taskhandle         */
 rx.r[1]=(int)sourcebuf;    /* source buffer             */
 rx.r[2]=desttask;          /* destination taskhandle    */
 rx.r[3]=(int)destbuf;      /* destination buffer        */
 rx.r[4]=buflen;

 err=os_swix(Wimp_TransferBlock,&rx);

 return(err);
}



/* Added by cafj */

os_error *wimp_starttask (char *clicmd)
{
  os_regset reg;

  reg.r[0] = (int)clicmd;

  return(os_swix(Wimp_StartTask, &reg));
}




