/*
* 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 .
*
*/
//Filename : OMOUSE.H
//Description : Header file for Mouse Handling Object (OMOUSE.CPP)
#ifndef __OMOUSE_H
#define __OMOUSE_H
#ifndef __ALL_H
#include
#endif
#define DIRECTINPUT_VERSION 0x300
#include
//-------- Define macro constant --------//
//
// Button id, for Mouse internal use only,
// not appeal to mouse driver parameters
//
//---------------------------------------//
// event_type
enum MouseEventType
{
LEFT_BUTTON = 0,
RIGHT_BUTTON = LEFT_BUTTON+1,
KEY_PRESS = 2,
LEFT_BUTTON_RELEASE = 4,
RIGHT_BUTTON_RELEASE = LEFT_BUTTON_RELEASE+1,
KEY_RELEASE = 6,
};
#define LEFT_BUTTON_MASK 1
#define RIGHT_BUTTON_MASK 2
// bit flag of any skey_state, event_skey_state
#define LEFT_SHIFT_KEY_MASK 0x001
#define RIGHT_SHIFT_KEY_MASK 0x002
#define SHIFT_KEY_MASK 0x003
#define LEFT_CONTROL_KEY_MASK 0x004
#define RIGHT_CONTROL_KEY_MASK 0x008
#define CONTROL_KEY_MASK 0x00c
#define LEFT_ALT_KEY_MASK 0x010
#define RIGHT_ALT_KEY_MASK 0x020
#define ALT_KEY_MASK 0x030
#define NUM_LOCK_STATE_MASK 0x040
#define CAP_LOCK_STATE_MASK 0x080
#define SCROLL_LOCK_STATE_MASK 0x100
#define INSERT_STATE_MASK 0x200
#define GRAPH_KEY_MASK 0x400
//----- Define the upper limit for mouse coordination ------//
#define MOUSE_X_UPPER_LIMIT (VGA_WIDTH-5)
#define MOUSE_Y_UPPER_LIMIT (VGA_HEIGHT-5)
//------ Default settting ---------//
#define DEFAULT_DOUBLE_SPEED_THRESHOLD 8
#define DEFAULT_TRIPLE_SPEED_THRESHOLD 16
//-------- Define struct MouseClick -------//
struct MouseClick // MultiClick buffer structure
{
int x, y;
int release_x, release_y; // where mouse is release
int count; // number of clicks
DWORD time; // time of last click
DWORD release_time; // time of last release
};
//------- Define struct MouseEvent --------//
/*
struct MouseEvent // event buffer structure
{
int state; // mouse state
int x, y; // cursor coordinates
DWORD time; // time event occurred
unsigned scan_code; // if scan_code>0 then it's a key press event
unsigned short skey_state; // speical key state, such as LEFT_SHIFT_KEY_MASK ...
};
*/
struct MouseEvent // event buffer structure
{
MouseEventType event_type; // mouse state
DWORD time; // time event occurred
unsigned short skey_state; // speical key state, such as LEFT_SHIFT_KEY_MASK ...
// int state; // state mask of mouse button
int x, y; // mousecursor coordinates
unsigned scan_code; // if scan_code>0 then it's a key press event
};
//--------- Define class Mouse ------------//
class Mouse
{
public:
char init_flag;
char handle_flicking;
char* vga_update_buf;
HHOOK key_hook_handle;
// HANDLE direct_mouse_handle;
LPDIRECTINPUT direct_input;
LPDIRECTINPUTDEVICE di_mouse_device, di_keyb_device;
//------- real-time mouse state -------//
int cur_x, cur_y;
int left_press, right_press;
//------- real-time keyboard state ---------//
unsigned short skey_state; // such as LEFT_SHIFT_KEY_MASK
//------- boundary of mouse cursor hot spot --------//
int bound_x1;
int bound_y1;
int bound_x2;
int bound_y2;
// ------ mouse setting ---------- //
int double_speed_threshold; // default DEFAULT_DOUBLE_SPEED_THRESHOLD
int triple_speed_threshold; // default DEFAULT_TRIPLE_SPEED_THRESHOLD
//-------- click & key buffer ---------//
unsigned short event_skey_state;
char has_mouse_event; // if has_mouse_event, mouse_event_type is valid
MouseEventType mouse_event_type;
MouseClick click_buffer[2]; // left button & right button only
// use : LEFT_BUTTON=0, RIGHT_BUTTON=1
unsigned scan_code; // key pressed, keyboard event
unsigned key_code; // converted from scan_code and event_skey_state
//-------- event buffer ---------//
enum { EVENT_BUFFER_SIZE = 20 }; // No. of events can be stored in buffer
MouseEvent event_buffer[EVENT_BUFFER_SIZE];
int head_ptr; // head pointer to the event buffer
int tail_ptr; // tail pointer to the event buffer
public:
Mouse();
~Mouse();
void init(HINSTANCE, HWND, LPDIRECTINPUT createdDirectInput=0);
void deinit();
void add_event(MouseEvent *);
void add_key_event(unsigned, DWORD);
int get_event();
void poll_event();
// #### begin Gilbert 31/10 #########//
void update_skey_state();
// #### end Gilbert 31/10 #########//
void show();
void hide();
void hide_area(int,int,int,int);
void show_area();
//--- functions for real-time mouse state accessing ---//
int in_area(int,int,int,int);
int press_area(int,int,int,int,int=0);
int wait_press(int timeOutSecond=0);
//---- functions of mouse cursor boundary ------//
void set_boundary(int, int, int, int);
void reset_boundary();
//----- functions for queue event accessing ----//
int single_click(int,int,int,int,int=0);
int double_click(int,int,int,int,int=0);
int any_click (int,int,int,int,int=0);
int any_click(int=0);
int release_click(int,int,int,int,int=0);
int click_x(int buttonId=0) { return click_buffer[buttonId].x; }
int click_y(int buttonId=0) { return click_buffer[buttonId].y; }
int release_x(int buttonId=0) { return click_buffer[buttonId].release_x; }
int release_y(int buttonId=0) { return click_buffer[buttonId].release_y; }
int click_count(int buttonId=0) { return click_buffer[buttonId].count; }
int is_mouse_event() { return has_mouse_event; }
int is_key_event() { return scan_code; }
int is_any_event() { return has_mouse_event || scan_code; }
int is_press_button_event() { return has_mouse_event && (mouse_event_type == LEFT_BUTTON || mouse_event_type == RIGHT_BUTTON); }
int is_release_button_event() { return has_mouse_event && (mouse_event_type == LEFT_BUTTON_RELEASE || mouse_event_type == RIGHT_BUTTON_RELEASE); }
void reset_click();
static int is_key(unsigned keyCode, unsigned short skeyState, unsigned short charValue, unsigned flags = 0 );
static int is_key(unsigned keyCode, unsigned short skeyState, char *keyStr, unsigned flags = 0 );
// see omouse2.h for flags
private:
long micky_to_displacement(DWORD);
};
//---------- End of define class ---------------//
extern Mouse mouse;
#endif