reman3/Rayman_X/cpa/tempgrp/INO/Specif/MouseWin.c

522 lines
16 KiB
C

/***************************************************************************/
/* Description: Mouse.c Part of CPA INO */
/* */
/* Author: F. Jentey */
/* Last Update: 09/08/97 */
/* */
/***************************************************************************/
#include "INOInit.h"
#include "Mouse.h"
#define M_Mouse() INO_g_p_stMouseInterface->lpVtbl
/*
tdstMouseStatus : mouse status informations
*/
typedef struct _stMouseStatus
{
DIDEVCAPS m_stCaps;
DIMOUSESTATE m_stStates[2];
short m_wAcquired;
short m_wCurrentBuffer;
/* Link with a GLD device */
short m_wLinkedWithGLD;
GLD_tdhDevice m_tdGLDDeviceHandle;
GLD_tdstDeviceAttributes m_stGLDDeviceAttributes;
float m_fPixelsPerMickeys;
float m_fScreenPosX;
float m_fScreenPosY;
int m_iMousePosX;
int m_iMousePosY;
int m_iOldMousePosX;
int m_iOldMousePosY;
} tdstMouseStatus;
/* Mouse init OK */
short INO_g_wMouseInitOk = 0;
/* The mouse state structure */
tdstMouseStatus INO_g_stMouseState;
/* Mouse device interface */
LPDIRECTINPUTDEVICE INO_g_p_stMouseInterface;
/* Mouse last error code */
u_long INO_g_ulMouseErrorCode;
/* Number of INO_fn_wReadMouse() Call */
u_long INO_g_ulMouseCounter = 0;
/*********************************************************************
INITIALISATION
*********************************************************************/
short INO_fn_wInitMouse(HINSTANCE hInstance, HWND hWindow)
{
GUID guid = GUID_SysMouse;
HRESULT DInputErr;
if (INO_g_wMouseInitOk) return (0);
/* Init direct input */
if (!INO_fn_wInitDirectInput(hInstance,hWindow)) return(C_wMouseError);
DInputErr = INO_g_p_stDInputInterface->lpVtbl->CreateDevice(
INO_g_p_stDInputInterface,
&guid,
&INO_g_p_stMouseInterface,
NULL
);
switch (DInputErr)
{
case DI_OK:
break;
case DIERR_INVALIDPARAM:
case DIERR_OUTOFMEMORY:
case DIERR_NOINTERFACE:
case DIERR_DEVICENOTREG:
INO_fn_vReleaseDirectInput();
return(C_wMouseError);
}
/* Get Mouse Capabilities (number of axis and button) */
INO_g_stMouseState.m_stCaps.dwSize = sizeof(DIDEVCAPS);
DInputErr = M_Mouse()->GetCapabilities(INO_g_p_stMouseInterface,&INO_g_stMouseState.m_stCaps);
if (DInputErr != DI_OK)
{
/* TO DO, warning, message */
}
/* TO DO, check if the device is physicaly attached */
/* Make sure the mouse isn't acquire before calling setDataFormat and */
/* SetCooperativeLevel. Return always OK */
DInputErr = M_Mouse()->Unacquire(INO_g_p_stMouseInterface);
INO_g_stMouseState.m_wAcquired = 0;
/* Tell DirectInput that we want to receive data in mouse format */
DInputErr = M_Mouse()->SetDataFormat(
INO_g_p_stMouseInterface,
&c_dfDIMouse
);
switch (DInputErr)
{
case DI_OK:
break;
case DIERR_INVALIDPARAM:
case DIERR_ACQUIRED:
M_Mouse()->Release(INO_g_p_stMouseInterface);
INO_fn_vReleaseDirectInput();
return(C_wMouseError);
break;
}
/* Set mouse cooperative level */
DInputErr = M_Mouse()->SetCooperativeLevel(
INO_g_p_stMouseInterface,
hWindow,
DISCL_EXCLUSIVE | DISCL_FOREGROUND
);
switch (DInputErr)
{
case DI_OK:
break;
case DIERR_INVALIDPARAM:
M_Mouse()->Release(INO_g_p_stMouseInterface);
INO_fn_vReleaseDirectInput();
return(C_wMouseError);
}
/* Try to acquire the mouse */
DInputErr = M_Mouse()->Acquire(INO_g_p_stMouseInterface);
switch (DInputErr)
{
case DI_OK:
case S_FALSE: /* Already acquired, OK */
INO_g_stMouseState.m_wAcquired = 1;
break;
case DIERR_INPUTLOST:
INO_g_stMouseState.m_wAcquired = 0;
break;
case DIERR_INVALIDPARAM:
INO_g_stMouseState.m_wAcquired = 0;
M_Mouse()->Release(INO_g_p_stMouseInterface);
INO_fn_vReleaseDirectInput();
return(C_wMouseError);
}
/* Init mouse state */
INO_g_stMouseState.m_wCurrentBuffer = 0;
INO_g_stMouseState.m_wLinkedWithGLD = 0;
INO_g_ulMouseCounter = 0;
INO_g_wMouseInitOk++;
return (0);
}
short INO_fn_wInitMouseWithGLD(HINSTANCE hInstance, GLD_tdhDevice tdGLDDeviceHandle)
{
HWND WndHandle;
POINT Point;
if (INO_g_wMouseInitOk) return (0);
if (!GLD_bIsDeviceHandleValid(tdGLDDeviceHandle))
{
INO_g_ulMouseErrorCode = C_ErrMouseInvalidGLDDeviceHandle;
return (C_wMouseError);
}
if (GLD_bGetDeviceAttributes(tdGLDDeviceHandle, &INO_g_stMouseState.m_stGLDDeviceAttributes))
{
/* Check the window handle of the device */
if (INO_g_stMouseState.m_stGLDDeviceAttributes.bFullScreen)
WndHandle = INO_g_stMouseState.m_stGLDDeviceAttributes.hFullScreenModeWnd;
else
WndHandle = INO_g_stMouseState.m_stGLDDeviceAttributes.hNormalModeWnd;
if (INO_fn_wInitMouse(hInstance,WndHandle) != C_wMouseError)
{
INO_g_stMouseState.m_wLinkedWithGLD = 1;
INO_g_stMouseState.m_tdGLDDeviceHandle = tdGLDDeviceHandle;
INO_g_stMouseState.m_fPixelsPerMickeys = 1.0;
INO_g_stMouseState.m_fScreenPosX = 0.5;
INO_g_stMouseState.m_fScreenPosY = 0.5;
return (0);
}
else
return (C_wMouseError);
}
else
{
if (Erm_M_uwCheckError(GLD,C_ucErmDefaultChannel))
Erm_M_ClearLastError(C_ucErmDefaultChannel);
INO_g_ulMouseErrorCode = C_ErrMouseFailedGettingDeviceAttributes;
return (C_wMouseError);
}
}
short INO_fn_vFreeMouse(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if (INO_g_stMouseState.m_wAcquired)
{
M_Mouse()->Unacquire(INO_g_p_stMouseInterface);
INO_g_stMouseState.m_wAcquired = 0;
}
M_Mouse()->Release(INO_g_p_stMouseInterface);
INO_fn_vReleaseDirectInput();
INO_g_wMouseInitOk = 0;
return (0);
}
short INO_fn_wGetMouseNumberOfButtons(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
return ((short)INO_g_stMouseState.m_stCaps.dwButtons);
}
short INO_fn_wGetMouseNumberOfAxes(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
return ((short)INO_g_stMouseState.m_stCaps.dwAxes);
}
/*********************************************************************
POLLING FUNCTION, GETTING MOUSE STATE
*********************************************************************/
short INO_fn_wReadMouse(void)
{
HRESULT DInputErr;
POINT Point;
HWND WndHandle;
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
/* Increase the internal frame counter */
INO_g_ulMouseCounter++;
/* Try to acquire the mouse if not done */
if (!INO_g_stMouseState.m_wAcquired)
{
DInputErr = M_Mouse()->Acquire(INO_g_p_stMouseInterface);
switch (DInputErr)
{
case DI_OK:
case S_FALSE:
INO_g_stMouseState.m_wAcquired = 1;
break;
case DIERR_INPUTLOST:
INO_g_ulMouseErrorCode = C_ErrMouseFocusLost;
return (C_wMouseError);
case DIERR_INVALIDPARAM:
INO_g_stMouseState.m_wAcquired = 0;
INO_g_ulMouseErrorCode = C_ErrMouseDirectInputError;
return (C_wMouseError);
default:
break;
}
}
/* Flip the mouse state buffer */
INO_g_stMouseState.m_wCurrentBuffer = 1 - INO_g_stMouseState.m_wCurrentBuffer;
/* Get mouse current state */
DInputErr = M_Mouse()->GetDeviceState(
INO_g_p_stMouseInterface,
sizeof(DIMOUSESTATE),
&INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer]
);
switch (DInputErr)
{
case DI_OK:
INO_g_stMouseState.m_wAcquired = 1;
break;
case E_PENDING:
break;
case DIERR_INPUTLOST:
/*case DIERR_NOTACQUIRED:*/
INO_g_stMouseState.m_wAcquired = 0;
INO_g_ulMouseErrorCode = C_ErrMouseFocusLost;
return (C_wMouseError);
case DIERR_INVALIDPARAM:
INO_g_stMouseState.m_wAcquired = 0;
INO_g_ulMouseErrorCode = C_ErrMouseDirectInputError;
return(C_wMouseError);
default:
break;
}
//read Cursor Position
if (INO_g_stMouseState.m_stGLDDeviceAttributes.bFullScreen)
WndHandle = INO_g_stMouseState.m_stGLDDeviceAttributes.hFullScreenModeWnd;
else
WndHandle = INO_g_stMouseState.m_stGLDDeviceAttributes.hNormalModeWnd;
//swap Postion;
INO_g_stMouseState.m_iOldMousePosX = INO_g_stMouseState.m_iMousePosX;
INO_g_stMouseState.m_iOldMousePosY = INO_g_stMouseState.m_iMousePosY;
GetCursorPos( &Point );
ScreenToClient( WndHandle, &Point );
INO_g_stMouseState.m_iMousePosX = Point.x;
INO_g_stMouseState.m_iMousePosY = Point.y;
/* If linked with a GLD device, get the device attributes */
if (INO_g_stMouseState.m_wLinkedWithGLD)
{
if (GLD_bGetDeviceAttributes(INO_g_stMouseState.m_tdGLDDeviceHandle,
&INO_g_stMouseState.m_stGLDDeviceAttributes))
{
INO_g_stMouseState.m_fScreenPosX +=
((float)INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].lX * INO_g_stMouseState.m_fPixelsPerMickeys)
/ (float)(INO_g_stMouseState.m_stGLDDeviceAttributes.dwWidth-1);
if (INO_g_stMouseState.m_fScreenPosX<0.0) INO_g_stMouseState.m_fScreenPosX = 0.0;
if (INO_g_stMouseState.m_fScreenPosX>1.0) INO_g_stMouseState.m_fScreenPosX = 1.0;
INO_g_stMouseState.m_fScreenPosY +=
((float)INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].lY * INO_g_stMouseState.m_fPixelsPerMickeys)
/ (float)(INO_g_stMouseState.m_stGLDDeviceAttributes.dwHeight-1);
if (INO_g_stMouseState.m_fScreenPosY<0.0) INO_g_stMouseState.m_fScreenPosY = 0.0;
if (INO_g_stMouseState.m_fScreenPosY>1.0) INO_g_stMouseState.m_fScreenPosY = 1.0;
}
else
{
if (Erm_M_uwCheckError(GLD,C_ucErmDefaultChannel))
Erm_M_ClearLastError(C_ucErmDefaultChannel);
INO_g_ulMouseErrorCode = C_ErrMouseFailedGettingDeviceAttributes;
return (C_wMouseError);
}
}
return(0);
}
short INO_fn_wGetMousePosition(int *p_iX, int *p_iY)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if (!INO_g_stMouseState.m_wLinkedWithGLD)
{
INO_g_ulMouseErrorCode = C_ErrNoGLDDeviceLinkedWithMouse;
return (C_wMouseError);
}
*p_iX = INO_g_stMouseState.m_iMousePosX;
*p_iY = INO_g_stMouseState.m_iMousePosY;
if( (INO_g_stMouseState.m_iMousePosX >=0) &&
(INO_g_stMouseState.m_iMousePosY >=0) &&
(INO_g_stMouseState.m_iMousePosX <= INO_g_stMouseState.m_stGLDDeviceAttributes.dwWidth) &&
(INO_g_stMouseState.m_iMousePosY <= INO_g_stMouseState.m_stGLDDeviceAttributes.dwHeight)
)
return C_wMouseTrue;
else
return C_wMouseFalse;
}
short INO_fn_wGetMousePositionInGldDevice(float *p_fX, float *p_fY)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if (!INO_g_stMouseState.m_wLinkedWithGLD)
{
INO_g_ulMouseErrorCode = C_ErrNoGLDDeviceLinkedWithMouse;
return (C_wMouseError);
}
*p_fX = INO_g_stMouseState.m_fScreenPosX;
*p_fY = INO_g_stMouseState.m_fScreenPosY;
return (0);
}
short INO_fn_wLeftMouseButtonDown(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if (INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[0])
return (C_wMouseTrue);
else
return (C_wMouseFalse);
}
short INO_fn_wRightMouseButtonDown(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if (INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[1])
return (C_wMouseTrue);
else
return (C_wMouseFalse);
}
short INO_fn_wLeftMouseButtonJustDown(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if ( (INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[0]) &&
(!INO_g_stMouseState.m_stStates[1-INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[0]) )
return (C_wMouseTrue);
else
return (C_wMouseFalse);
}
short INO_fn_wRightMouseButtonJustDown(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if ( (INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[1]) &&
(!INO_g_stMouseState.m_stStates[1-INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[1]) )
return (C_wMouseTrue);
else
return (C_wMouseFalse);
}
short INO_fn_wLeftMouseButtonJustUp(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if ( (!INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[0]) &&
(INO_g_stMouseState.m_stStates[1-INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[0]) )
return (C_wMouseTrue);
else
return (C_wMouseFalse);
}
short INO_fn_wRightMouseButtonJustUp(void)
{
if (!INO_g_wMouseInitOk)
{
INO_g_ulMouseErrorCode = C_ErrMouseNotInitialized;
return (C_wMouseError);
}
if ( (!INO_g_stMouseState.m_stStates[INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[1]) &&
(INO_g_stMouseState.m_stStates[1-INO_g_stMouseState.m_wCurrentBuffer].rgbButtons[1]) )
return (C_wMouseTrue);
else
return (C_wMouseFalse);
}
u_long INO_fn_ulGetMouseErrorCode(void)
{
return(INO_g_ulMouseErrorCode);
}