522 lines
16 KiB
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);
|
|
}
|