/*     
      TEXT SERVER . Magma 1.0 . 1996 . Sylvain HUET

         textpkg.c : routines de gestion de terminal texte
*/

#include "x/Version.h"
#include "x/scolplugin.h"


#include <stdio.h>
#include <string.h>


/*
#include <winuser.h>
#include <mmsystem.h>

#include "../kernel/include/kernel.h"
#include "../kernel/listlab.h"
#include "winscol.h"
*/

int SCOLGetUpdateRect(HWND h)
{
  return GetUpdateRect(h,NULL,TRUE);
}
int SCOLValidateRect(HWND h)
{
  ValidateRect(h,NULL);
  return 0;
}


int TMkeybdstate(mmachine m)
{
  int k;

  k=0;
  if (GetKeyState(VK_SHIFT)<0) k+=1;
  if (GetKeyState(VK_CONTROL)<0) k+=2;
  if (GetKeyState(VK_MENU)<0) k+=4;
  return MMpush(m,k*2);
}
int TMgetCursorPos(mmachine m)
{
  POINT p ;

  GetCursorPos(&p);
  if (MMpush(m,p.x*2)) return MERRMEM;
  if (MMpush(m,p.y*2)) return MERRMEM;
  if (MMpush(m,2*2)) return MERRMEM;
  return MBdeftab(m);
}

//$BB
int TMsetCursorPos(mmachine m)
{
  int x;
  int y;

  y 	= MMpull(m)>>1;
  x 	= MMpull(m)>>1;

  
  SetCursorPos(x, y);
  
  return MMpush(m,0) ;
}

int MMjoystick(mmachine m)
{
	JOYINFO joy;
	int i;

	i=MMpull(m)>>1;
	if ((i<0)||(i>1)) return MMpush(m,NIL);
	if (i) i=JOYSTICKID2;
	else i=JOYSTICKID1;
	
	if (joyGetPos(i,&joy)!=JOYERR_NOERROR) return MMpush(m,NIL);
	if (MMpush(m,joy.wXpos<<1)) return MERRMEM;
	if (MMpush(m,joy.wYpos<<1)) return MERRMEM;
	if (MMpush(m,joy.wZpos<<1)) return MERRMEM;
	if (MMpush(m,joy.wButtons<<1)) return MERRMEM;
	if (MMpush(m,4*2)) return MERRMEM;
	return MBdeftab(m);
}

// $BLG: New function: Retrieves modern joysticks 4th axis
// Compatible with old joysticks (same as _joystick)
int MMjoystickExt(mmachine m)
{
	JOYCAPS caps;
	JOYINFO joy;
	JOYINFOEX joyex;
	int i;

	i=MMpull(m)>>1;
	if ((i<0)||(i>1)) return MMpush(m,NIL);
	if (i) i=JOYSTICKID2;
	else i=JOYSTICKID1;
	
	if (joyGetDevCaps(i,&caps,sizeof(JOYCAPS))!=JOYERR_NOERROR) return MMpush(m,NIL);
	
	if (caps.wNumAxes<=3)
	{
	  if (joyGetPos(i,&joy)!=JOYERR_NOERROR) return MMpush(m,NIL);
	  if (MMpush(m,joy.wXpos<<1)) return MERRMEM;
	  if (MMpush(m,joy.wYpos<<1)) return MERRMEM;
	  if (MMpush(m,joy.wZpos<<1)) return MERRMEM;
	  if (MMpush(m,NIL)) return MERRMEM;
  	if (MMpush(m,joy.wButtons<<1)) return MERRMEM;
  	if (MMpush(m,5*2)) return MERRMEM;
	  return MBdeftab(m);
	}
	else
	{
	  //$BLG - v5.3.03: Add
	  joyex.dwSize = sizeof(JOYINFOEX);
		memset(&(joyex.dwFlags), 0, sizeof(JOYINFOEX) - sizeof(DWORD));
	  joyex.dwFlags = JOY_RETURNALL;
	  
	  if (joyGetPosEx(i,&joyex) != JOYERR_NOERROR) return MMpush(m, NIL);
	  //$BLG - v5.3.03: Modif (Moved line above)
	  //joyex.dwFlags = JOY_RETURNALL;
	  if (MMpush(m,joyex.dwXpos<<1)) return MERRMEM;
	  if (MMpush(m,joyex.dwYpos<<1)) return MERRMEM;
	  if (MMpush(m,joyex.dwZpos<<1)) return MERRMEM;
	  if (MMpush(m,joyex.dwRpos<<1)) return MERRMEM;
  	if (MMpush(m,joyex.dwButtons<<1)) return MERRMEM;
  	if (MMpush(m,5*2)) return MERRMEM;
	  return MBdeftab(m);	  
	}
}

#define NDIVPKG 5
char* divname[NDIVPKG]=
{"_keybdstate","_GETscreenPos","_joystick","_joystickExt",
  //$BB
  "_SETscreenPos"
};

int (*divfun[NDIVPKG])(mmachine m)=
{
 TMkeybdstate,TMgetCursorPos,MMjoystick,MMjoystickExt,
  //$BB
  TMsetCursorPos
};

int divnarg[NDIVPKG]=
{0,0,1,1,2};

char* divtype[NDIVPKG]=
{"fun [] I","fun [] [I I]","fun [I] [I I I I]","fun [I] [I I I I I]",
  //$BB
  "fun [I I] I"
};



int SCOLloadDiv(mmachine m)
{
	return PKhardpak(m,"txtsys.pkg",NDIVPKG,divname,divfun,divnarg,divtype);
}