/* ->c.point  */
/* Ovation!   (c) D. J. Pilling,  December 1988                     */
/*                         Tool kit code                              */

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



#include "h.os"
#include "h.wimp"
#include "h.sprite"
#include "h.wimpt"
#include "h.bbc"
#include "h.akbd"
#include "h.werr"
#include "h.flex"

#include "h.DrawLevel0"


#include "h.wos"
#include "h.ram"
#include "h.file"
#include "h.main"
#include "h.DrawLib"
#include "h.pic"
#include "h.mym"

#include "h.key"

#include "h.pan"
#include "h.data"




#define OS_SpriteOp 0x2E

/****************************************************************************/


int ourpointer;
int curpointer;
int pointtime;

/*

 0 = system pointer
 1 = pointer
 2 = text insert pointer
 3 = hand
 4 = re-size
 5 = adjust
 6 = crosshair
 7 = orthline
 8 = vert guide line
 9 = horiz guide line

 */

/*
static int tpixtrn[4]={0x01010100,0x01010202,0x03020102,0x01010200};
*/

/* don't use mouse colour 2 */

static int tpixtrn[4]={0x03020100,0x01010101,0x01010101,0x01010101};



#define NOPOINTER -1
#define SYSTEM    0


void setpointer(int pointer)  /* set the pointer to whatever */
{
 os_regset rx;
 char name[32];


 if(pointer>0)
 {
  sprintf(name,"%d",pointer-1);

  rx.r[0]=0x100+36;
  rx.r[1]=(int)sprites;
  rx.r[2]=(int)name;
  rx.r[3]=2;
  rx.r[4]=0; /* pointdata[pointer].x; */ /* offset of active point */
  rx.r[5]=0; /* pointdata[pointer].y; */
  rx.r[6]=0;                     /* (int)magblk;   pointer to mag factors */
  rx.r[7]=(int)tpixtrn;          /*  pixel trans table                    */

  os_swix(OS_SpriteOp,&rx);
  bbc_vduq(19,1,25,140,189,0);
  bbc_vduq(19,2,25,19,108,213);
  bbc_vduq(19,3,25,0,43,112);
 }
 else
 if(pointer==NOPOINTER)
 {
  oscli("pointer 0");
 }
 else
 {
  oscli("pointer 0");
  oscli("pointer 1");
 }

 curpointer=pointer;
}



void zpoint(void)  /* called if ourpointer is true */
{
 int newpointer;

 newpointer=curpointer;

 if(curpointer<1) newpointer=1;
 else
 if((zerotime-pointtime)>10)
 {
  newpointer=curpointer-1;
  if(newpointer<1) newpointer=40;
  pointtime=zerotime;
 }

 if(curpointer!=newpointer) setpointer(newpointer);
}



void cpoint(int gain)  /* called on lose/gain pointer */
{
 if(showcoords && (projection!=SAT))
 {
  if(gain) addzeroevent(COORDZERO);
  else     remzeroevent(COORDZERO);
 }

 if(!gain && ourpointer)
 {
  if(curpointer!=SYSTEM) setpointer(SYSTEM);
  ourpointer=0;
  remzeroevent(POINTZERO);
 }
 else
 if(busy)
 {
  addzeroevent(POINTZERO);
  ourpointer=1;
  zpoint();
 }
}



void abspoint(void)   /* set pointer to whatever is should be */
                      /* use this on completion of drag       */
                      /* use also on mode change !            */
{
 getpointer();
 if(mhandle==DRAWW && busy)
 {
  addzeroevent(POINTZERO);
  ourpointer=1;
  zpoint();
 }
 else
 {
  remzeroevent(POINTZERO);
  setpointer(0);
  ourpointer=0;
 }
}



void resetpointer(void)
{
 if(ourpointer) setpointer(0);
}


