/**************************************************************************** * * SciTech OS Portability Manager Library * * ======================================================================== * * The contents of this file are subject to the SciTech MGL Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.scitechsoft.com/mgl-license.txt * * Software distributed under the License is distributed on an * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. * * The Initial Developer of the Original Code is SciTech Software, Inc. * All Rights Reserved. * * ======================================================================== * * Language: ANSI C * Environment: Any * * Description: Header file for the SciTech cross platform event library * ****************************************************************************/ #ifndef __EVENT_H #define __EVENT_H #include "scitech.h" /*---------------------- Macros and type definitions ----------------------*/ #pragma pack(1) /* 'C' calling conventions always */ #define EVTAPI _ASMAPI #define EVTAPIP _ASMAPIP /* Event message masks for keyDown events */ #define EVT_ASCIIMASK 0x00FF /* ASCII code of key pressed */ #define EVT_SCANMASK 0xFF00 /* Scan code of key pressed */ #define EVT_COUNTMASK 0x7FFF0000L /* Count for KEYREPEAT's */ /* Macros to extract values from the message fields */ #define EVT_asciiCode(m) ( (uchar) (m & EVT_ASCIIMASK) ) #define EVT_scanCode(m) ( (uchar) ( (m & EVT_SCANMASK) >> 8 ) ) #define EVT_repeatCount(m) ( (short) ( (m & EVT_COUNTMASK) >> 16 ) ) /**************************************************************************** REMARKS: Defines the set of ASCII codes reported by the event library functions in the message field. Use the EVT_asciiCode macro to extract the code from the event structure. HEADER: event.h ****************************************************************************/ typedef enum { ASCII_ctrlA = 0x01, ASCII_ctrlB = 0x02, ASCII_ctrlC = 0x03, ASCII_ctrlD = 0x04, ASCII_ctrlE = 0x05, ASCII_ctrlF = 0x06, ASCII_ctrlG = 0x07, ASCII_backspace = 0x08, ASCII_ctrlH = 0x08, ASCII_tab = 0x09, ASCII_ctrlI = 0x09, ASCII_ctrlJ = 0x0A, ASCII_ctrlK = 0x0B, ASCII_ctrlL = 0x0C, ASCII_enter = 0x0D, ASCII_ctrlM = 0x0D, ASCII_ctrlN = 0x0E, ASCII_ctrlO = 0x0F, ASCII_ctrlP = 0x10, ASCII_ctrlQ = 0x11, ASCII_ctrlR = 0x12, ASCII_ctrlS = 0x13, ASCII_ctrlT = 0x14, ASCII_ctrlU = 0x15, ASCII_ctrlV = 0x16, ASCII_ctrlW = 0x17, ASCII_ctrlX = 0x18, ASCII_ctrlY = 0x19, ASCII_ctrlZ = 0x1A, ASCII_esc = 0x1B, ASCII_space = 0x20, ASCII_exclamation = 0x21, /* ! */ ASCII_quote = 0x22, /* " */ ASCII_pound = 0x23, /* # */ ASCII_dollar = 0x24, /* $ */ ASCII_percent = 0x25, /* % */ ASCII_ampersand = 0x26, /* & */ ASCII_apostrophe = 0x27, /* ' */ ASCII_leftBrace = 0x28, /* ( */ ASCII_rightBrace = 0x29, /* ) */ ASCII_times = 0x2A, /* * */ ASCII_plus = 0x2B, /* + */ ASCII_comma = 0x2C, /* , */ ASCII_minus = 0x2D, /* - */ ASCII_period = 0x2E, /* . */ ASCII_divide = 0x2F, /* / */ ASCII_0 = 0x30, ASCII_1 = 0x31, ASCII_2 = 0x32, ASCII_3 = 0x33, ASCII_4 = 0x34, ASCII_5 = 0x35, ASCII_6 = 0x36, ASCII_7 = 0x37, ASCII_8 = 0x38, ASCII_9 = 0x39, ASCII_colon = 0x3A, /* : */ ASCII_semicolon = 0x3B, /* ; */ ASCII_lessThan = 0x3C, /* < */ ASCII_equals = 0x3D, /* = */ ASCII_greaterThan = 0x3E, /* > */ ASCII_question = 0x3F, /* ? */ ASCII_at = 0x40, /* @ */ ASCII_A = 0x41, ASCII_B = 0x42, ASCII_C = 0x43, ASCII_D = 0x44, ASCII_E = 0x45, ASCII_F = 0x46, ASCII_G = 0x47, ASCII_H = 0x48, ASCII_I = 0x49, ASCII_J = 0x4A, ASCII_K = 0x4B, ASCII_L = 0x4C, ASCII_M = 0x4D, ASCII_N = 0x4E, ASCII_O = 0x4F, ASCII_P = 0x50, ASCII_Q = 0x51, ASCII_R = 0x52, ASCII_S = 0x53, ASCII_T = 0x54, ASCII_U = 0x55, ASCII_V = 0x56, ASCII_W = 0x57, ASCII_X = 0x58, ASCII_Y = 0x59, ASCII_Z = 0x5A, ASCII_leftSquareBrace = 0x5B, /* [ */ ASCII_backSlash = 0x5C, /* \ */ ASCII_rightSquareBrace = 0x5D, /* ] */ ASCII_caret = 0x5E, /* ^ */ ASCII_underscore = 0x5F, /* _ */ ASCII_leftApostrophe = 0x60, /* ` */ ASCII_a = 0x61, ASCII_b = 0x62, ASCII_c = 0x63, ASCII_d = 0x64, ASCII_e = 0x65, ASCII_f = 0x66, ASCII_g = 0x67, ASCII_h = 0x68, ASCII_i = 0x69, ASCII_j = 0x6A, ASCII_k = 0x6B, ASCII_l = 0x6C, ASCII_m = 0x6D, ASCII_n = 0x6E, ASCII_o = 0x6F, ASCII_p = 0x70, ASCII_q = 0x71, ASCII_r = 0x72, ASCII_s = 0x73, ASCII_t = 0x74, ASCII_u = 0x75, ASCII_v = 0x76, ASCII_w = 0x77, ASCII_x = 0x78, ASCII_y = 0x79, ASCII_z = 0x7A, ASCII_leftCurlyBrace = 0x7B, /* { */ ASCII_verticalBar = 0x7C, /* | */ ASCII_rightCurlyBrace = 0x7D, /* } */ ASCII_tilde = 0x7E /* ~ */ } EVT_asciiCodesType; /**************************************************************************** REMARKS: Defines the set of scan codes reported by the event library functions in the message field. Use the EVT_scanCode macro to extract the code from the event structure. Note that the scan codes reported will be the same across all keyboards (assuming the placement of keys on a 101 key US keyboard), but the translated ASCII values may be different depending on the country code pages in use. NOTE: Scan codes in the event library are not really hardware scan codes, but rather virtual scan codes as generated by a low level keyboard interface driver. All virtual codes begin with scan code 0x60 and range up from there. HEADER: event.h ****************************************************************************/ typedef enum { KB_padEnter = 0x60, /* Keypad keys */ KB_padMinus = 0x4A, KB_padPlus = 0x4E, KB_padTimes = 0x37, KB_padDivide = 0x61, KB_padLeft = 0x62, KB_padRight = 0x63, KB_padUp = 0x64, KB_padDown = 0x65, KB_padInsert = 0x66, KB_padDelete = 0x67, KB_padHome = 0x68, KB_padEnd = 0x69, KB_padPageUp = 0x6A, KB_padPageDown = 0x6B, KB_padCenter = 0x4C, KB_F1 = 0x3B, /* Function keys */ KB_F2 = 0x3C, KB_F3 = 0x3D, KB_F4 = 0x3E, KB_F5 = 0x3F, KB_F6 = 0x40, KB_F7 = 0x41, KB_F8 = 0x42, KB_F9 = 0x43, KB_F10 = 0x44, KB_F11 = 0x57, KB_F12 = 0x58, KB_left = 0x4B, /* Cursor control keys */ KB_right = 0x4D, KB_up = 0x48, KB_down = 0x50, KB_insert = 0x52, KB_delete = 0x53, KB_home = 0x47, KB_end = 0x4F, KB_pageUp = 0x49, KB_pageDown = 0x51, KB_capsLock = 0x3A, KB_numLock = 0x45, KB_scrollLock = 0x46, KB_leftShift = 0x2A, KB_rightShift = 0x36, KB_leftCtrl = 0x1D, KB_rightCtrl = 0x6C, KB_leftAlt = 0x38, KB_rightAlt = 0x6D, KB_leftWindows = 0x5B, KB_rightWindows = 0x5C, KB_menu = 0x5D, KB_sysReq = 0x54, KB_esc = 0x01, /* Normal keyboard keys */ KB_1 = 0x02, KB_2 = 0x03, KB_3 = 0x04, KB_4 = 0x05, KB_5 = 0x06, KB_6 = 0x07, KB_7 = 0x08, KB_8 = 0x09, KB_9 = 0x0A, KB_0 = 0x0B, KB_minus = 0x0C, KB_equals = 0x0D, KB_backSlash = 0x2B, KB_backspace = 0x0E, KB_tab = 0x0F, KB_Q = 0x10, KB_W = 0x11, KB_E = 0x12, KB_R = 0x13, KB_T = 0x14, KB_Y = 0x15, KB_U = 0x16, KB_I = 0x17, KB_O = 0x18, KB_P = 0x19, KB_leftSquareBrace = 0x1A, KB_rightSquareBrace = 0x1B, KB_enter = 0x1C, KB_A = 0x1E, KB_S = 0x1F, KB_D = 0x20, KB_F = 0x21, KB_G = 0x22, KB_H = 0x23, KB_J = 0x24, KB_K = 0x25, KB_L = 0x26, KB_semicolon = 0x27, KB_apostrophe = 0x28, KB_Z = 0x2C, KB_X = 0x2D, KB_C = 0x2E, KB_V = 0x2F, KB_B = 0x30, KB_N = 0x31, KB_M = 0x32, KB_comma = 0x33, KB_period = 0x34, KB_divide = 0x35, KB_space = 0x39, KB_tilde = 0x29 } EVT_scanCodesType; /**************************************************************************** REMARKS: Defines the mask for the joystick axes that are present HEADER: event.h MEMBERS: EVT_JOY_AXIS_X1 - Joystick 1, X axis is present EVT_JOY_AXIS_Y1 - Joystick 1, Y axis is present EVT_JOY_AXIS_X2 - Joystick 2, X axis is present EVT_JOY_AXIS_Y2 - Joystick 2, Y axis is present EVT_JOY_AXIS_ALL - Mask for all axes ****************************************************************************/ typedef enum { EVT_JOY_AXIS_X1 = 0x00000001, EVT_JOY_AXIS_Y1 = 0x00000002, EVT_JOY_AXIS_X2 = 0x00000004, EVT_JOY_AXIS_Y2 = 0x00000008, EVT_JOY_AXIS_ALL = 0x0000000F } EVT_eventJoyAxisType; /**************************************************************************** REMARKS: Defines the event message masks for joystick events HEADER: event.h MEMBERS: EVT_JOY1_BUTTONA - Joystick 1, button A is down EVT_JOY1_BUTTONB - Joystick 1, button B is down EVT_JOY2_BUTTONA - Joystick 2, button A is down EVT_JOY2_BUTTONB - Joystick 2, button B is down ****************************************************************************/ typedef enum { EVT_JOY1_BUTTONA = 0x00000001, EVT_JOY1_BUTTONB = 0x00000002, EVT_JOY2_BUTTONA = 0x00000004, EVT_JOY2_BUTTONB = 0x00000008 } EVT_eventJoyMaskType; /**************************************************************************** REMARKS: Defines the event message masks for mouse events HEADER: event.h MEMBERS: EVT_LEFTBMASK - Left button is held down EVT_RIGHTBMASK - Right button is held down EVT_MIDDLEBMASK - Middle button is held down EVT_BOTHBMASK - Both left and right held down together EVT_ALLBMASK - All buttons pressed EVT_DBLCLICK - Set if mouse down event was a double click ****************************************************************************/ typedef enum { EVT_LEFTBMASK = 0x00000001, EVT_RIGHTBMASK = 0x00000002, EVT_MIDDLEBMASK = 0x00000004, EVT_BOTHBMASK = 0x00000007, EVT_ALLBMASK = 0x00000007, EVT_DBLCLICK = 0x00010000 } EVT_eventMouseMaskType; /**************************************************************************** REMARKS: Defines the event modifier masks. These are the masks used to extract the modifier information from the modifiers field of the event_t structure. Note that the values in the modifiers field represent the values of these modifier keys at the time the event occurred, not the time you decided to process the event. HEADER: event.h MEMBERS: EVT_LEFTBUT - Set if left mouse button was down EVT_RIGHTBUT - Set if right mouse button was down EVT_MIDDLEBUT - Set if the middle button was down EVT_RIGHTSHIFT - Set if right shift was down EVT_LEFTSHIFT - Set if left shift was down EVT_RIGHTCTRL - Set if right ctrl key was down EVT_RIGHTALT - Set if right alt key was down EVT_LEFTCTRL - Set if left ctrl key was down EVT_LEFTALT - Set if left alt key was down EVT_SHIFTKEY - Mask for any shift key down EVT_CTRLSTATE - Set if ctrl key was down EVT_ALTSTATE - Set if alt key was down EVT_CAPSLOCK - Caps lock is active EVT_NUMLOCK - Num lock is active EVT_SCROLLLOCK - Scroll lock is active ****************************************************************************/ typedef enum { EVT_LEFTBUT = 0x00000001, EVT_RIGHTBUT = 0x00000002, EVT_MIDDLEBUT = 0x00000004, EVT_RIGHTSHIFT = 0x00000008, EVT_LEFTSHIFT = 0x00000010, EVT_RIGHTCTRL = 0x00000020, EVT_RIGHTALT = 0x00000040, EVT_LEFTCTRL = 0x00000080, EVT_LEFTALT = 0x00000100, EVT_SHIFTKEY = 0x00000018, EVT_CTRLSTATE = 0x000000A0, EVT_ALTSTATE = 0x00000140, EVT_SCROLLLOCK = 0x00000200, EVT_NUMLOCK = 0x00000400, EVT_CAPSLOCK = 0x00000800 } EVT_eventModMaskType; /**************************************************************************** REMARKS: Defines the event codes returned in the event_t structures what field. Note that these are defined as a set of mutually exlusive bit fields, so you can test for multiple event types using the combined event masks defined in the EVT_eventMaskType enumeration. HEADER: event.h MEMBERS: EVT_NULLEVT - A null event EVT_KEYDOWN - Key down event EVT_KEYREPEAT - Key repeat event EVT_KEYUP - Key up event EVT_MOUSEDOWN - Mouse down event EVT_MOUSEAUTO - Mouse down autorepeat event EVT_MOUSEUP - Mouse up event EVT_MOUSEMOVE - Mouse movement event EVT_JOYCLICK - Joystick button state change event EVT_JOYMOVE - Joystick movement event EVT_USEREVT - First user event ****************************************************************************/ typedef enum { EVT_NULLEVT = 0x00000000, EVT_KEYDOWN = 0x00000001, EVT_KEYREPEAT = 0x00000002, EVT_KEYUP = 0x00000004, EVT_MOUSEDOWN = 0x00000008, EVT_MOUSEAUTO = 0x00000010, EVT_MOUSEUP = 0x00000020, EVT_MOUSEMOVE = 0x00000040, EVT_JOYCLICK = 0x00000080, EVT_JOYMOVE = 0x00000100, EVT_USEREVT = 0x00000200 } EVT_eventType; /**************************************************************************** REMARKS: Defines the event code masks you can use to test for multiple types of events, since the event codes are mutually exlusive bit fields. HEADER: event.h MEMBERS: EVT_KEYEVT - Mask for any key event EVT_MOUSEEVT - Mask for any mouse event EVT_MOUSECLICK - Mask for any mouse click event EVT_JOYEVT - Mask for any joystick event EVT_EVERYEVT - Mask for any event ****************************************************************************/ typedef enum { EVT_KEYEVT = (EVT_KEYDOWN | EVT_KEYREPEAT | EVT_KEYUP), EVT_MOUSEEVT = (EVT_MOUSEDOWN | EVT_MOUSEAUTO | EVT_MOUSEUP | EVT_MOUSEMOVE), EVT_MOUSECLICK = (EVT_MOUSEDOWN | EVT_MOUSEUP), EVT_JOYEVT = (EVT_JOYCLICK | EVT_JOYMOVE), EVT_EVERYEVT = 0x7FFFFFFF } EVT_eventMaskType; /**************************************************************************** REMARKS: Structure describing the information contained in an event extracted from the event queue. HEADER: event.h MEMBERS: which - Window identifier for message for use by high level window manager code (i.e. MegaVision GUI or Windows API). what - Type of event that occurred. Will be one of the values defined by the EVT_eventType enumeration. when - Time that the event occurred in milliseconds since startup where_x - X coordinate of the mouse cursor location at the time of the event (in screen coordinates). For joystick events this represents the position of the first joystick X axis. where_y - Y coordinate of the mouse cursor location at the time of the event (in screen coordinates). For joystick events this represents the position of the first joystick Y axis. relative_x - Relative movement of the mouse cursor in the X direction (in units of mickeys, or 1/200th of an inch). For joystick events this represents the position of the second joystick X axis. relative_y - Relative movement of the mouse cursor in the Y direction (in units of mickeys, or 1/200th of an inch). For joystick events this represents the position of the second joystick Y axis. message - Event specific message for the event. For use events this can be any user specific information. For keyboard events this contains the ASCII code in bits 0-7, the keyboard scan code in bits 8-15 and the character repeat count in bits 16-30. You can use the EVT_asciiCode, EVT_scanCode and EVT_repeatCount macros to extract this information from the message field. For mouse events this contains information about which button was pressed, and will be a combination of the flags defined by the EVT_eventMouseMaskType enumeration. For joystick events, this conatins information about which buttons were pressed, and will be a combination of the flags defined by the EVT_eventJoyMaskType enumeration. modifiers - Contains additional information about the state of the keyboard shift modifiers (Ctrl, Alt and Shift keys) when the event occurred. For mouse events it will also contain the state of the mouse buttons. Will be a combination of the values defined by the EVT_eventModMaskType enumeration. next - Internal use; do not use. prev - Internal use; do not use. ****************************************************************************/ typedef struct { ulong which; ulong what; ulong when; int where_x; int where_y; int relative_x; int relative_y; ulong message; ulong modifiers; int next; int prev; } event_t; /**************************************************************************** REMARKS: Structure describing an entry in the code page table. A table of translation codes for scan codes to ASCII codes is provided in this table to be used by the keyboard event libraries. On some OS'es the keyboard translation is handled by the OS, but for DOS and embedded systems you must register a different code page translation table if you want to support keyboards other than the US English keyboard (the default). NOTE: Entries in code page tables *must* be in ascending order for the scan codes as we do a binary search on the tables for the ASCII code equivalents. HEADER: event.h MEMBERS: scanCode - Scan code to translate (really the virtual scan code). asciiCode - ASCII code for this scan code. ****************************************************************************/ typedef struct { uchar scanCode; uchar asciiCode; } codepage_entry_t; /**************************************************************************** REMARKS: Structure describing a complete code page translation table. The table contains translation tables for normal keys, shifted keys and ctrl keys. The Ctrl key always has precedence over the shift table, and the shift table is used when the shift key is down or the CAPSLOCK key is down. HEADER: event.h MEMBERS: name - Name of the code page table (ie: "US English") normal - Code page for translating normal keys normalLen - Length of normal translation table caps - Code page for translating keys when CAPSLOCK is down capsLen - Length of CAPSLOCK translation table shift - Code page for shifted keys (ie: shift key is held down) shiftLen - Length of shifted translation table shiftCaps - Code page for shifted keys when CAPSLOCK is down shiftCapsLen - Length of shifted CAPSLOCK translation table ctrl - Code page for ctrl'ed keys (ie: ctrl key is held down) ctrlLen - Length of ctrl'ed translation table numPad - Code page for NUMLOCK'ed keypad keys numPadLen - Length of NUMLOCK'ed translation table ****************************************************************************/ typedef struct { char name[20]; codepage_entry_t *normal; int normalLen; codepage_entry_t *caps; int capsLen; codepage_entry_t *shift; int shiftLen; codepage_entry_t *shiftCaps; int shiftCapsLen; codepage_entry_t *ctrl; int ctrlLen; codepage_entry_t *numPad; int numPadLen; } codepage_t; /* {secret} */ typedef ibool (EVTAPIP _EVT_userEventFilter)(event_t *evt); /* {secret} */ typedef void (EVTAPIP _EVT_mouseMoveHandler)(int x,int y); /* {secret} */ typedef void (EVTAPIP _EVT_heartBeatCallback)(void *params); /* Macro to find the size of a static array */ #define EVT_ARR_SIZE(a) (sizeof(a)/sizeof((a)[0])) #pragma pack() /*--------------------------- Global variables ----------------------------*/ #ifdef __cplusplus extern "C" { /* Use "C" linkage when in C++ mode */ #endif /* Standard code page tables */ extern codepage_t _CP_US_English; /*------------------------- Function Prototypes ---------------------------*/ /* Public API functions for user applications */ ibool EVTAPI EVT_getNext(event_t *evt,ulong mask); ibool EVTAPI EVT_peekNext(event_t *evt,ulong mask); ibool EVTAPI EVT_post(ulong which,ulong what,ulong message,ulong modifiers); void EVTAPI EVT_flush(ulong mask); void EVTAPI EVT_halt(event_t *evt,ulong mask); ibool EVTAPI EVT_isKeyDown(uchar scanCode); void EVTAPI EVT_setMousePos(int x,int y); void EVTAPI EVT_getMousePos(int *x,int *y); /* Function to enable/disable updating of keyboard LED status indicators */ void EVTAPI EVT_allowLEDS(ibool enable); /* Function to install a custom keyboard code page. Default is US English */ codepage_t *EVTAPI EVT_getCodePage(void); void EVTAPI EVT_setCodePage(codepage_t *page); /* Functions for fine grained joystick calibration */ void EVTAPI EVT_pollJoystick(void); int EVTAPI EVT_joyIsPresent(void); void EVTAPI EVT_joySetUpperLeft(void); void EVTAPI EVT_joySetLowerRight(void); void EVTAPI EVT_joySetCenter(void); /* Install user supplied event filter callback */ void EVTAPI EVT_setUserEventFilter(_EVT_userEventFilter filter); /* Install user supplied event heartbeat callback function */ void EVTAPI EVT_setHeartBeatCallback(_EVT_heartBeatCallback callback,void *params); void EVTAPI EVT_getHeartBeatCallback(_EVT_heartBeatCallback *callback,void **params); /* Internal functions to initialise and kill the event manager. MGL * applications should never call these functions directly as the MGL * libraries do it for you. */ /* {secret} */ void EVTAPI EVT_init(_EVT_mouseMoveHandler mouseMove); /* {secret} */ void EVTAPI EVT_setMouseRange(int xRes,int yRes); /* {secret} */ void EVTAPI EVT_suspend(void); /* {secret} */ void EVTAPI EVT_resume(void); /* {secret} */ void EVTAPI EVT_exit(void); #ifdef __cplusplus } /* End of "C" linkage for C++ */ #endif /* __cplusplus */ #endif /* __EVENT_H */