/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
/***********************************************************************
*
* DMOUSE.VXD - DirectMouse
*
* this VxD lets a Win32 app get direct mouse input, without the windows
* user interface filtering/mapping them.
*
* multiple apps can open DMOUSE.VXD, but it is assumes only
* one app will be talking to DMOUSE at a time.
*
* example:
* #include "dmouse.h"
* h = DMouseOpen();
* ....
*
* DMOUSE_STATE dm;
* DMouseGetState(h, &dm);
*
* if (dm.mouse_dx || dm.mouse_dy)
* mouse has moved
*
* if (dm.mouse_state & MOUSE_BUTTON_DOWN_MASK)
* mouse has gone down (from last call)
*
* if (dm.mouse_state & MOUSE_BUTTON_UP_MASK)
* mouse has gone up (from last call)
*
* if (dm.mouse_state & MOUSE_BUTTON_ASYNC_MASK)
* a mouse button is down now!
*
* ....
* DMouseClose(h);
*
* ToddLa
*
***********************************************************************/
#ifndef __WINDOWS_
#include
#endif
#define DMOUSE_VXD "\\\\.\\DMOUSE.VXD"
#define DMOUSE_GET_STATE 1
#define DMOUSE_GET_STATE_PTR 2
/***********************************************************************
* DMOUSE_STATE
*
* mouse_dx - delta (in mickeys) that the mouse has moved in x
* mouse_dy - delta (in mickeys) that the mouse has moved in y
* mouse_state - contains the current state of the mouse buttons
* contains the buttons that have gone up (from last query)
* contains the buttons that have gone down (from last query)
*
***********************************************************************/
struct DMOUSE_STATE
{
DWORD mouse_delta_x;
DWORD mouse_delta_y;
DWORD mouse_state;
};
#define MOUSE_STATE_CHANGE 0x80000000
#define MOUSE_BUTTON_ASYNC_MASK 0x0000000F
#define MOUSE_BUTTON1_ASYNC 0x00000008
#define MOUSE_BUTTON2_ASYNC 0x00000004
#define MOUSE_BUTTON3_ASYNC 0x00000002
#define MOUSE_BUTTON4_ASYNC 0x00000001
#define MOUSE_BUTTON_DOWN_MASK 0x00000F00
#define MOUSE_BUTTON1_DOWN 0x00000800
#define MOUSE_BUTTON2_DOWN 0x00000400
#define MOUSE_BUTTON3_DOWN 0x00000200
#define MOUSE_BUTTON4_DOWN 0x00000100
#define MOUSE_BUTTON_UP_MASK 0x0000F000
#define MOUSE_BUTTON1_UP 0x00008000
#define MOUSE_BUTTON2_UP 0x00004000
#define MOUSE_BUTTON3_UP 0x00002000
#define MOUSE_BUTTON4_UP 0x00001000
/***********************************************************************
*
* DMouseOpen
*
* open a instance of the DMOUSE VxD and return you a handle
*
***********************************************************************/
__inline HANDLE DMouseOpen()
{
HANDLE h;
h = CreateFile(DMOUSE_VXD, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL);
if (h == INVALID_HANDLE_VALUE)
return NULL;
return h;
}
/***********************************************************************
*
* DMouseClose
*
* close a instance of the DMOUSE VxD
*
***********************************************************************/
__inline void DMouseClose(HANDLE h)
{
if (h != NULL && h != INVALID_HANDLE_VALUE)
CloseHandle(h);
}
/***********************************************************************
*
* DMouseGetState
*
* read the current mouse state.
*
* this will return the amount the mouse has moved from the last time
* you called this service. (mouse_delta_x, mouse_delta_y)
*
* if a button has gone down from the last time you called this
* service the associated bit (MOUSE_BUTTONx_DOWN) will be set in
* mouse_state
*
* if a button has gone up from the last time you called this
* service the associated bit (MOUSE_BUTTONx_UP) will be set in
* mouse_state
*
* if a button is down right now the associated bit (MOUSE_BUTTONx_ASYNC)
* will be set in mouse_state
*
***********************************************************************/
__inline BOOL DMouseGetState(HANDLE h, DMOUSE_STATE *p)
{
DWORD cb;
if (h == NULL || h == INVALID_HANDLE_VALUE)
return FALSE;
return DeviceIoControl(h, DMOUSE_GET_STATE,
NULL, 0, p, sizeof(DMOUSE_STATE), &cb, 0);
}
/***********************************************************************
*
* DMouseGetStatePointer
*
* returns a pointer to the internal "live" MOUSE_STATE
*
* in general it is better to use DMouseGetState, but this
* service is useful for "peeking" at the button state quickly
*
* to determine if the mouse state has changed, you need to look
* at the MOUSE_STATE_CHANGE bit in mouse_state.
*
***********************************************************************/
__inline DMOUSE_STATE * DMouseGetStatePointer(HANDLE h)
{
DWORD cb;
DMOUSE_STATE *p = NULL;
if (h == NULL || h == INVALID_HANDLE_VALUE)
return NULL;
DeviceIoControl(h, DMOUSE_GET_STATE_PTR,
NULL, 0, &p, sizeof(p), &cb, 0);
return p;
}