diff options
Diffstat (limited to 'trunk/src/emu/input.h')
-rw-r--r-- | trunk/src/emu/input.h | 1087 |
1 files changed, 1087 insertions, 0 deletions
diff --git a/trunk/src/emu/input.h b/trunk/src/emu/input.h new file mode 100644 index 00000000000..22fb8f6d339 --- /dev/null +++ b/trunk/src/emu/input.h @@ -0,0 +1,1087 @@ +/*************************************************************************** + + input.h + + Handle input from the user. + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#pragma once + +#ifndef __EMU_H__ +#error Dont include this file directly; include emu.h instead. +#endif + +#ifndef __INPUT_H__ +#define __INPUT_H__ + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +// relative devices return ~512 units per onscreen pixel +const INT32 INPUT_RELATIVE_PER_PIXEL = 512; + +// absolute devices return values between -65536 and +65536 +const INT32 INPUT_ABSOLUTE_MIN = -65536; +const INT32 INPUT_ABSOLUTE_MAX = 65536; + +// maximum number of axis/buttons/hats with ITEM_IDs for use by osd layer +const int INPUT_MAX_AXIS = 8; +const int INPUT_MAX_BUTTONS = 16; +const int INPUT_MAX_HATS = 4; +const int INPUT_MAX_ADD_SWITCH = 16; +const int INPUT_MAX_ADD_ABSOLUTE = 16; +const int INPUT_MAX_ADD_RELATIVE = 16; + + +// device classes +enum input_device_class +{ + DEVICE_CLASS_INVALID, + DEVICE_CLASS_FIRST_VALID, + DEVICE_CLASS_KEYBOARD = DEVICE_CLASS_FIRST_VALID, + DEVICE_CLASS_MOUSE, + DEVICE_CLASS_LIGHTGUN, + DEVICE_CLASS_JOYSTICK, + DEVICE_CLASS_LAST_VALID = DEVICE_CLASS_JOYSTICK, + DEVICE_CLASS_INTERNAL, + DEVICE_CLASS_MAXIMUM +}; +DECLARE_ENUM_OPERATORS(input_device_class) + + +// device index +const int DEVICE_INDEX_MAXIMUM = 0xff; + + +// input item classes +enum input_item_class +{ + ITEM_CLASS_INVALID, + ITEM_CLASS_SWITCH, + ITEM_CLASS_ABSOLUTE, + ITEM_CLASS_RELATIVE, + ITEM_CLASS_MAXIMUM +}; + + +// input item modifiers +enum input_item_modifier +{ + ITEM_MODIFIER_NONE, + ITEM_MODIFIER_POS, + ITEM_MODIFIER_NEG, + ITEM_MODIFIER_LEFT, + ITEM_MODIFIER_RIGHT, + ITEM_MODIFIER_UP, + ITEM_MODIFIER_DOWN, + ITEM_MODIFIER_MAXIMUM +}; + + +// standard item IDs +enum input_item_id +{ + ITEM_ID_INVALID, + ITEM_ID_FIRST_VALID, + + // standard keyboard IDs + ITEM_ID_A = ITEM_ID_FIRST_VALID, + ITEM_ID_B, + ITEM_ID_C, + ITEM_ID_D, + ITEM_ID_E, + ITEM_ID_F, + ITEM_ID_G, + ITEM_ID_H, + ITEM_ID_I, + ITEM_ID_J, + ITEM_ID_K, + ITEM_ID_L, + ITEM_ID_M, + ITEM_ID_N, + ITEM_ID_O, + ITEM_ID_P, + ITEM_ID_Q, + ITEM_ID_R, + ITEM_ID_S, + ITEM_ID_T, + ITEM_ID_U, + ITEM_ID_V, + ITEM_ID_W, + ITEM_ID_X, + ITEM_ID_Y, + ITEM_ID_Z, + ITEM_ID_0, + ITEM_ID_1, + ITEM_ID_2, + ITEM_ID_3, + ITEM_ID_4, + ITEM_ID_5, + ITEM_ID_6, + ITEM_ID_7, + ITEM_ID_8, + ITEM_ID_9, + ITEM_ID_F1, + ITEM_ID_F2, + ITEM_ID_F3, + ITEM_ID_F4, + ITEM_ID_F5, + ITEM_ID_F6, + ITEM_ID_F7, + ITEM_ID_F8, + ITEM_ID_F9, + ITEM_ID_F10, + ITEM_ID_F11, + ITEM_ID_F12, + ITEM_ID_F13, + ITEM_ID_F14, + ITEM_ID_F15, + ITEM_ID_ESC, + ITEM_ID_TILDE, + ITEM_ID_MINUS, + ITEM_ID_EQUALS, + ITEM_ID_BACKSPACE, + ITEM_ID_TAB, + ITEM_ID_OPENBRACE, + ITEM_ID_CLOSEBRACE, + ITEM_ID_ENTER, + ITEM_ID_COLON, + ITEM_ID_QUOTE, + ITEM_ID_BACKSLASH, + ITEM_ID_BACKSLASH2, + ITEM_ID_COMMA, + ITEM_ID_STOP, + ITEM_ID_SLASH, + ITEM_ID_SPACE, + ITEM_ID_INSERT, + ITEM_ID_DEL, + ITEM_ID_HOME, + ITEM_ID_END, + ITEM_ID_PGUP, + ITEM_ID_PGDN, + ITEM_ID_LEFT, + ITEM_ID_RIGHT, + ITEM_ID_UP, + ITEM_ID_DOWN, + ITEM_ID_0_PAD, + ITEM_ID_1_PAD, + ITEM_ID_2_PAD, + ITEM_ID_3_PAD, + ITEM_ID_4_PAD, + ITEM_ID_5_PAD, + ITEM_ID_6_PAD, + ITEM_ID_7_PAD, + ITEM_ID_8_PAD, + ITEM_ID_9_PAD, + ITEM_ID_SLASH_PAD, + ITEM_ID_ASTERISK, + ITEM_ID_MINUS_PAD, + ITEM_ID_PLUS_PAD, + ITEM_ID_DEL_PAD, + ITEM_ID_ENTER_PAD, + ITEM_ID_PRTSCR, + ITEM_ID_PAUSE, + ITEM_ID_LSHIFT, + ITEM_ID_RSHIFT, + ITEM_ID_LCONTROL, + ITEM_ID_RCONTROL, + ITEM_ID_LALT, + ITEM_ID_RALT, + ITEM_ID_SCRLOCK, + ITEM_ID_NUMLOCK, + ITEM_ID_CAPSLOCK, + ITEM_ID_LWIN, + ITEM_ID_RWIN, + ITEM_ID_MENU, + ITEM_ID_CANCEL, + + // standard mouse/joystick/gun IDs + ITEM_ID_XAXIS, + ITEM_ID_YAXIS, + ITEM_ID_ZAXIS, + ITEM_ID_RXAXIS, + ITEM_ID_RYAXIS, + ITEM_ID_RZAXIS, + ITEM_ID_SLIDER1, + ITEM_ID_SLIDER2, + ITEM_ID_BUTTON1, + ITEM_ID_BUTTON2, + ITEM_ID_BUTTON3, + ITEM_ID_BUTTON4, + ITEM_ID_BUTTON5, + ITEM_ID_BUTTON6, + ITEM_ID_BUTTON7, + ITEM_ID_BUTTON8, + ITEM_ID_BUTTON9, + ITEM_ID_BUTTON10, + ITEM_ID_BUTTON11, + ITEM_ID_BUTTON12, + ITEM_ID_BUTTON13, + ITEM_ID_BUTTON14, + ITEM_ID_BUTTON15, + ITEM_ID_BUTTON16, + ITEM_ID_START, + ITEM_ID_SELECT, + + // Hats + ITEM_ID_HAT1UP, + ITEM_ID_HAT1DOWN, + ITEM_ID_HAT1LEFT, + ITEM_ID_HAT1RIGHT, + ITEM_ID_HAT2UP, + ITEM_ID_HAT2DOWN, + ITEM_ID_HAT2LEFT, + ITEM_ID_HAT2RIGHT, + ITEM_ID_HAT3UP, + ITEM_ID_HAT3DOWN, + ITEM_ID_HAT3LEFT, + ITEM_ID_HAT3RIGHT, + ITEM_ID_HAT4UP, + ITEM_ID_HAT4DOWN, + ITEM_ID_HAT4LEFT, + ITEM_ID_HAT4RIGHT, + + // Additional IDs + ITEM_ID_ADD_SWITCH1, + ITEM_ID_ADD_SWITCH2, + ITEM_ID_ADD_SWITCH3, + ITEM_ID_ADD_SWITCH4, + ITEM_ID_ADD_SWITCH5, + ITEM_ID_ADD_SWITCH6, + ITEM_ID_ADD_SWITCH7, + ITEM_ID_ADD_SWITCH8, + ITEM_ID_ADD_SWITCH9, + ITEM_ID_ADD_SWITCH10, + ITEM_ID_ADD_SWITCH11, + ITEM_ID_ADD_SWITCH12, + ITEM_ID_ADD_SWITCH13, + ITEM_ID_ADD_SWITCH14, + ITEM_ID_ADD_SWITCH15, + ITEM_ID_ADD_SWITCH16, + + ITEM_ID_ADD_ABSOLUTE1, + ITEM_ID_ADD_ABSOLUTE2, + ITEM_ID_ADD_ABSOLUTE3, + ITEM_ID_ADD_ABSOLUTE4, + ITEM_ID_ADD_ABSOLUTE5, + ITEM_ID_ADD_ABSOLUTE6, + ITEM_ID_ADD_ABSOLUTE7, + ITEM_ID_ADD_ABSOLUTE8, + ITEM_ID_ADD_ABSOLUTE9, + ITEM_ID_ADD_ABSOLUTE10, + ITEM_ID_ADD_ABSOLUTE11, + ITEM_ID_ADD_ABSOLUTE12, + ITEM_ID_ADD_ABSOLUTE13, + ITEM_ID_ADD_ABSOLUTE14, + ITEM_ID_ADD_ABSOLUTE15, + ITEM_ID_ADD_ABSOLUTE16, + + ITEM_ID_ADD_RELATIVE1, + ITEM_ID_ADD_RELATIVE2, + ITEM_ID_ADD_RELATIVE3, + ITEM_ID_ADD_RELATIVE4, + ITEM_ID_ADD_RELATIVE5, + ITEM_ID_ADD_RELATIVE6, + ITEM_ID_ADD_RELATIVE7, + ITEM_ID_ADD_RELATIVE8, + ITEM_ID_ADD_RELATIVE9, + ITEM_ID_ADD_RELATIVE10, + ITEM_ID_ADD_RELATIVE11, + ITEM_ID_ADD_RELATIVE12, + ITEM_ID_ADD_RELATIVE13, + ITEM_ID_ADD_RELATIVE14, + ITEM_ID_ADD_RELATIVE15, + ITEM_ID_ADD_RELATIVE16, + + // generic other IDs + ITEM_ID_OTHER_SWITCH, + ITEM_ID_OTHER_AXIS_ABSOLUTE, + ITEM_ID_OTHER_AXIS_RELATIVE, + ITEM_ID_MAXIMUM, + + // internal codes for sequences + ITEM_ID_SEQ_END, + ITEM_ID_SEQ_DEFAULT, + ITEM_ID_SEQ_NOT, + ITEM_ID_SEQ_OR, + + // absolute maximum ID + ITEM_ID_ABSOLUTE_MAXIMUM = 0xfff +}; +DECLARE_ENUM_OPERATORS(input_item_id) + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// forward declarations +class input_device_item; +class input_device; +class input_class; +class input_manager; + + +// callback for getting the value of an item on a device +typedef INT32 (*item_get_state_func)(void *device_internal, void *item_internal); + + +// ======================> joystick_map + +// a 9x9 joystick map +class joystick_map +{ +public: + // construction/destruction + joystick_map(); + joystick_map(const joystick_map &src) { copy(src); } + + // operators + joystick_map &operator=(const joystick_map &src) { if (this != &src) copy(src); return *this; } + + // parse from a string + bool parse(const char *mapstring); + + // create a friendly string + const char *to_string(astring &string) const; + + // update the state of a live map + UINT8 update(INT32 xaxisval, INT32 yaxisval); + + // joystick mapping codes + static const UINT8 JOYSTICK_MAP_NEUTRAL = 0x00; + static const UINT8 JOYSTICK_MAP_LEFT = 0x01; + static const UINT8 JOYSTICK_MAP_RIGHT = 0x02; + static const UINT8 JOYSTICK_MAP_UP = 0x04; + static const UINT8 JOYSTICK_MAP_DOWN = 0x08; + static const UINT8 JOYSTICK_MAP_STICKY = 0x0f; + +private: + // internal helpers + void copy(const joystick_map &src) + { + memcpy(m_map, src.m_map, sizeof(m_map)); + m_lastmap = JOYSTICK_MAP_NEUTRAL; + m_origstring = src.m_origstring; + } + + // internal state + UINT8 m_map[9][9]; // 9x9 grid + UINT8 m_lastmap; // last value returned (for sticky tracking) + astring m_origstring; // originally parsed string +}; + + +// ======================> input_code + +// a combined code that describes a particular input on a particular device +class input_code +{ +public: + // construction/destruction + input_code(input_device_class devclass = DEVICE_CLASS_INVALID, int devindex = 0, input_item_class itemclass = ITEM_CLASS_INVALID, input_item_modifier modifier = ITEM_MODIFIER_NONE, input_item_id itemid = ITEM_ID_INVALID) + : m_internal(((devclass & 0xf) << 28) | ((devindex & 0xff) << 20) | ((itemclass & 0xf) << 16) | ((modifier & 0xf) << 12) | (itemid & 0xfff)) + { + assert(devclass >= 0 && devclass < DEVICE_CLASS_MAXIMUM); + assert(devindex >= 0 && devindex < DEVICE_INDEX_MAXIMUM); + assert(itemclass >= 0 && itemclass < ITEM_CLASS_MAXIMUM); + assert(modifier >= 0 && modifier < ITEM_MODIFIER_MAXIMUM); + assert(itemid >= 0 && itemid < ITEM_ID_ABSOLUTE_MAXIMUM); + } + input_code(const input_code &src) + : m_internal(src.m_internal) { } + input_code(input_device &device, input_item_id itemid); + + // operators + bool operator==(const input_code &rhs) const { return m_internal == rhs.m_internal; } + bool operator!=(const input_code &rhs) const { return m_internal != rhs.m_internal; } + + // getters + bool internal() const { return device_class() == DEVICE_CLASS_INTERNAL; } + input_device_class device_class() const { return input_device_class((m_internal >> 28) & 0xf); } + int device_index() const { return ((m_internal >> 20) & 0xff); } + input_item_class item_class() const { return input_item_class((m_internal >> 16) & 0xf); } + input_item_modifier item_modifier() const { return input_item_modifier((m_internal >> 12) & 0xf); } + input_item_id item_id() const { return input_item_id(m_internal & 0xfff); } + + // setters + void set_device_class(input_device_class devclass) { assert(devclass >= 0 && devclass <= 0xf); m_internal = (m_internal & ~(0xf << 28)) | ((devclass & 0xf) << 28); } + void set_device_index(int devindex) { assert(devindex >= 0 && devindex <= 0xff); m_internal = (m_internal & ~(0xff << 20)) | ((devindex & 0xff) << 20); } + void set_item_class(input_item_class itemclass) { assert(itemclass >= 0 && itemclass <= 0xf); m_internal = (m_internal & ~(0xf << 16)) | ((itemclass & 0xf) << 16); } + void set_item_modifier(input_item_modifier modifier) { assert(modifier >= 0 && modifier <= 0xf); m_internal = (m_internal & ~(0xf << 12)) | ((modifier & 0xf) << 12); } + void set_item_id(input_item_id itemid) { assert(itemid >= 0 && itemid <= 0xfff); m_internal = (m_internal & ~0xfff) | (itemid & 0xfff); } + +private: + // internal state + UINT32 m_internal; +}; + + +// ======================> input_seq + +// a sequence of input_codes, supporting AND/OR and inversion +class input_seq +{ +public: + // construction/destruction + input_seq(input_code code0 = input_seq::end_code, input_code code1 = input_seq::end_code, input_code code2 = input_seq::end_code, input_code code3 = input_seq::end_code, input_code code4 = input_seq::end_code, input_code code5 = input_seq::end_code, input_code code6 = input_seq::end_code) + { set(code0, code1, code2, code3, code4, code5, code6); } + input_seq(const input_seq &rhs) { memcpy(m_code, rhs.m_code, sizeof(m_code)); } + + // operators + bool operator==(const input_seq &rhs) const { return (memcmp(m_code, rhs.m_code, sizeof(m_code)) == 0); } + bool operator!=(const input_seq &rhs) const { return (memcmp(m_code, rhs.m_code, sizeof(m_code)) != 0); } + input_code operator[](int index) const { return (index >= 0 && index < ARRAY_LENGTH(m_code)) ? m_code[index] : input_seq::end_code; } + input_seq &operator+=(input_code code); + input_seq &operator|=(input_code code); + + // getters + int length() const; + bool is_valid() const; + bool is_default() const { return m_code[0] == default_code; } + + // setters + void set(input_code code0 = input_seq::end_code, input_code code1 = input_seq::end_code, input_code code2 = input_seq::end_code, input_code code3 = input_seq::end_code, input_code code4 = input_seq::end_code, input_code code5 = input_seq::end_code, input_code code6 = input_seq::end_code); + void reset() { set(); } + void set_default() { set(default_code); } + void backspace(); + void replace(input_code oldcode, input_code newcode); + + // constant codes used in sequences + static const input_code end_code; + static const input_code default_code; + static const input_code not_code; + static const input_code or_code; + + // constant sequences + static const input_seq empty_seq; + +private: + // internal state + input_code m_code[16]; +}; + + +// ======================> input_device + +// a logical device of a given class that can provide input +class input_device +{ + friend class input_class; + + // construction/destruction + input_device(input_class &_class, int _devindex, const char *_name, void *_internal); + +public: + // getters + input_class &device_class() const { return m_class; } + input_manager &manager() const; + running_machine &machine() const; + input_device_class devclass() const; + const char *name() const { return m_name; } + int devindex() const { return m_devindex; } + input_device_item *item(input_item_id index) const { return m_item[index]; } + input_item_id maxitem() const { return m_maxitem; } + void *internal() const { return m_internal; } + joystick_map &joymap() { return m_joymap; } + bool steadykey_enabled() const { return m_steadykey_enabled; } + bool lightgun_reload_button() const { return m_lightgun_reload_button; } + + // item management + input_item_id add_item(const char *name, input_item_id itemid, item_get_state_func getstate, void *internal = NULL); + void set_joystick_map(const joystick_map &map) { m_joymap = map; } + + // helpers + INT32 apply_deadzone_and_saturation(INT32 value) const; + void apply_steadykey() const; + +private: + // internal state + input_class & m_class; // reference to our class + astring m_name; // string name of device + int m_devindex; // device index of this device + input_device_item * m_item[ITEM_ID_ABSOLUTE_MAXIMUM]; // array of pointers to items + input_item_id m_maxitem; // maximum item index + void * m_internal; // internal callback pointer + + // joystick information + joystick_map m_joymap; // joystick map for this device + INT32 m_joystick_deadzone; // deadzone for joystick + INT32 m_joystick_saturation; // saturation position for joystick + bool m_steadykey_enabled; // steadykey enabled for keyboards + bool m_lightgun_reload_button; // lightgun reload hack +}; + + +// ======================> input_class + +// a class of device that provides input +class input_class +{ +public: + // construction/destruction + input_class(input_manager &manager, input_device_class devclass, bool enabled = false, bool multi = false); + + // getters + input_manager &manager() const { return m_manager; } + running_machine &machine() const; + input_device *device(int index) const { return (index <= m_maxindex) ? m_device[index] : NULL; } + input_device_class devclass() const { return m_devclass; } + int maxindex() const { return m_maxindex; } + bool enabled() const { return m_enabled; } + bool multi() const { return m_multi; } + + // setters + void enable(bool state = true) { m_enabled = state; } + void set_multi(bool multi = true) { m_multi = multi; } + + // device management + input_device *add_device(const char *name, void *internal = NULL); + input_device *add_device(int devindex, const char *name, void *internal = NULL); + + // misc helpers + input_item_class standard_item_class(input_item_id itemid); + +private: + // internal helpers + void frame_callback(); + + // internal state + input_manager & m_manager; // reference to our manager + input_device * m_device[DEVICE_INDEX_MAXIMUM]; // array of devices in this class + input_device_class m_devclass; // our device class + int m_maxindex; // maximum populated index + bool m_enabled; // is this class enabled? + bool m_multi; // are multiple instances of this class allowed? +}; + + +// ======================> input_manager + +// global machine-level information about devices +class input_manager +{ +public: + // construction/destruction + input_manager(running_machine &machine); + + // getters + running_machine &machine() const { return m_machine; } + input_class &device_class(input_device_class devclass) { assert(devclass < ARRAY_LENGTH(m_class)); assert(m_class[devclass] != NULL); return *m_class[devclass]; } + + // input code readers + INT32 code_value(input_code code); + bool code_pressed(input_code code) { return code_value(code) != 0; } + bool code_pressed_once(input_code code); + + // input code polling + void reset_polling(); + input_code poll_axes(); + input_code poll_switches(); + input_code poll_keyboard_switches(); + + // input code helpers + input_device *device_from_code(input_code code) const; + input_device_item *item_from_code(input_code code) const; + input_code code_from_itemid(input_item_id itemid) const; + const char *code_name(astring &string, input_code code) const; + const char *code_to_token(astring &string, input_code code) const; + input_code code_from_token(const char *_token); + + // input sequence readers + bool seq_pressed(const input_seq &seq); + INT32 seq_axis_value(const input_seq &seq, input_item_class &itemclass); + + // input sequence polling + void seq_poll_start(input_item_class itemclass, const input_seq *startseq = NULL); + bool seq_poll(); + const input_seq &seq_poll_final() const { return m_poll_seq; } + + // input sequence helpers + const char *seq_name(astring &string, const input_seq &seq) const; + const char *seq_to_tokens(astring &string, const input_seq &seq) const; + void seq_from_tokens(input_seq &seq, const char *_token); + + // misc + bool set_global_joystick_map(const char *mapstring); + +private: + // internal helpers + void reset_memory(); + bool code_check_axis(input_device_item &item, input_code code); + + // internal state + running_machine & m_machine; + input_code m_switch_memory[64]; + + // classes + input_class m_keyboard_class; + input_class m_mouse_class; + input_class m_joystick_class; + input_class m_lightgun_class; + input_class * m_class[DEVICE_CLASS_MAXIMUM]; + + // sequence polling state + input_seq m_poll_seq; + osd_ticks_t m_poll_seq_last_ticks; + input_item_class m_poll_seq_class; +}; + + + +//************************************************************************** +// MACROS +//************************************************************************** + +// invalid codes +#define INPUT_CODE_INVALID input_code() + +// keyboard codes +#define KEYCODE_A_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_A) +#define KEYCODE_B_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_B) +#define KEYCODE_C_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_C) +#define KEYCODE_D_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_D) +#define KEYCODE_E_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_E) +#define KEYCODE_F_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F) +#define KEYCODE_G_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_G) +#define KEYCODE_H_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_H) +#define KEYCODE_I_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_I) +#define KEYCODE_J_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_J) +#define KEYCODE_K_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_K) +#define KEYCODE_L_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_L) +#define KEYCODE_M_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_M) +#define KEYCODE_N_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_N) +#define KEYCODE_O_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_O) +#define KEYCODE_P_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_P) +#define KEYCODE_Q_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_Q) +#define KEYCODE_R_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_R) +#define KEYCODE_S_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_S) +#define KEYCODE_T_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_T) +#define KEYCODE_U_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_U) +#define KEYCODE_V_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_V) +#define KEYCODE_W_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_W) +#define KEYCODE_X_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_X) +#define KEYCODE_Y_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_Y) +#define KEYCODE_Z_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_Z) +#define KEYCODE_0_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_0) +#define KEYCODE_1_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_1) +#define KEYCODE_2_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_2) +#define KEYCODE_3_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_3) +#define KEYCODE_4_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_4) +#define KEYCODE_5_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_5) +#define KEYCODE_6_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_6) +#define KEYCODE_7_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_7) +#define KEYCODE_8_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_8) +#define KEYCODE_9_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_9) +#define KEYCODE_F1_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F1) +#define KEYCODE_F2_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F2) +#define KEYCODE_F3_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F3) +#define KEYCODE_F4_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F4) +#define KEYCODE_F5_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F5) +#define KEYCODE_F6_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F6) +#define KEYCODE_F7_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F7) +#define KEYCODE_F8_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F8) +#define KEYCODE_F9_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F9) +#define KEYCODE_F10_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F10) +#define KEYCODE_F11_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F11) +#define KEYCODE_F12_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F12) +#define KEYCODE_F13_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F13) +#define KEYCODE_F14_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F14) +#define KEYCODE_F15_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_F15) +#define KEYCODE_ESC_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_ESC) +#define KEYCODE_TILDE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_TILDE) +#define KEYCODE_MINUS_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_MINUS) +#define KEYCODE_EQUALS_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_EQUALS) +#define KEYCODE_BACKSPACE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BACKSPACE) +#define KEYCODE_TAB_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_TAB) +#define KEYCODE_OPENBRACE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_OPENBRACE) +#define KEYCODE_CLOSEBRACE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_CLOSEBRACE) +#define KEYCODE_ENTER_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_ENTER) +#define KEYCODE_COLON_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_COLON) +#define KEYCODE_QUOTE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_QUOTE) +#define KEYCODE_BACKSLASH_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BACKSLASH) +#define KEYCODE_BACKSLASH2_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BACKSLASH2) +#define KEYCODE_COMMA_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_COMMA) +#define KEYCODE_STOP_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_STOP) +#define KEYCODE_SLASH_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_SLASH) +#define KEYCODE_SPACE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_SPACE) +#define KEYCODE_INSERT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_INSERT) +#define KEYCODE_DEL_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_DEL) +#define KEYCODE_HOME_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_HOME) +#define KEYCODE_END_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_END) +#define KEYCODE_PGUP_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_PGUP) +#define KEYCODE_PGDN_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_PGDN) +#define KEYCODE_LEFT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_LEFT) +#define KEYCODE_RIGHT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_RIGHT) +#define KEYCODE_UP_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_UP) +#define KEYCODE_DOWN_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_DOWN) +#define KEYCODE_0_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_0_PAD) +#define KEYCODE_1_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_1_PAD) +#define KEYCODE_2_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_2_PAD) +#define KEYCODE_3_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_3_PAD) +#define KEYCODE_4_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_4_PAD) +#define KEYCODE_5_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_5_PAD) +#define KEYCODE_6_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_6_PAD) +#define KEYCODE_7_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_7_PAD) +#define KEYCODE_8_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_8_PAD) +#define KEYCODE_9_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_9_PAD) +#define KEYCODE_SLASH_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_SLASH_PAD) +#define KEYCODE_ASTERISK_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_ASTERISK) +#define KEYCODE_MINUS_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_MINUS_PAD) +#define KEYCODE_PLUS_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_PLUS_PAD) +#define KEYCODE_DEL_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_DEL_PAD) +#define KEYCODE_ENTER_PAD_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_ENTER_PAD) +#define KEYCODE_PRTSCR_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_PRTSCR) +#define KEYCODE_PAUSE_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_PAUSE) +#define KEYCODE_LSHIFT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_LSHIFT) +#define KEYCODE_RSHIFT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_RSHIFT) +#define KEYCODE_LCONTROL_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_LCONTROL) +#define KEYCODE_RCONTROL_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_RCONTROL) +#define KEYCODE_LALT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_LALT) +#define KEYCODE_RALT_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_RALT) +#define KEYCODE_SCRLOCK_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_SCRLOCK) +#define KEYCODE_NUMLOCK_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_NUMLOCK) +#define KEYCODE_CAPSLOCK_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_CAPSLOCK) +#define KEYCODE_LWIN_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_LWIN) +#define KEYCODE_RWIN_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_RWIN) +#define KEYCODE_MENU_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_MENU) +#define KEYCODE_CANCEL_INDEXED(n) input_code(DEVICE_CLASS_KEYBOARD, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_CANCEL) + +#define KEYCODE_A KEYCODE_A_INDEXED(0) +#define KEYCODE_B KEYCODE_B_INDEXED(0) +#define KEYCODE_C KEYCODE_C_INDEXED(0) +#define KEYCODE_D KEYCODE_D_INDEXED(0) +#define KEYCODE_E KEYCODE_E_INDEXED(0) +#define KEYCODE_F KEYCODE_F_INDEXED(0) +#define KEYCODE_G KEYCODE_G_INDEXED(0) +#define KEYCODE_H KEYCODE_H_INDEXED(0) +#define KEYCODE_I KEYCODE_I_INDEXED(0) +#define KEYCODE_J KEYCODE_J_INDEXED(0) +#define KEYCODE_K KEYCODE_K_INDEXED(0) +#define KEYCODE_L KEYCODE_L_INDEXED(0) +#define KEYCODE_M KEYCODE_M_INDEXED(0) +#define KEYCODE_N KEYCODE_N_INDEXED(0) +#define KEYCODE_O KEYCODE_O_INDEXED(0) +#define KEYCODE_P KEYCODE_P_INDEXED(0) +#define KEYCODE_Q KEYCODE_Q_INDEXED(0) +#define KEYCODE_R KEYCODE_R_INDEXED(0) +#define KEYCODE_S KEYCODE_S_INDEXED(0) +#define KEYCODE_T KEYCODE_T_INDEXED(0) +#define KEYCODE_U KEYCODE_U_INDEXED(0) +#define KEYCODE_V KEYCODE_V_INDEXED(0) +#define KEYCODE_W KEYCODE_W_INDEXED(0) +#define KEYCODE_X KEYCODE_X_INDEXED(0) +#define KEYCODE_Y KEYCODE_Y_INDEXED(0) +#define KEYCODE_Z KEYCODE_Z_INDEXED(0) +#define KEYCODE_0 KEYCODE_0_INDEXED(0) +#define KEYCODE_1 KEYCODE_1_INDEXED(0) +#define KEYCODE_2 KEYCODE_2_INDEXED(0) +#define KEYCODE_3 KEYCODE_3_INDEXED(0) +#define KEYCODE_4 KEYCODE_4_INDEXED(0) +#define KEYCODE_5 KEYCODE_5_INDEXED(0) +#define KEYCODE_6 KEYCODE_6_INDEXED(0) +#define KEYCODE_7 KEYCODE_7_INDEXED(0) +#define KEYCODE_8 KEYCODE_8_INDEXED(0) +#define KEYCODE_9 KEYCODE_9_INDEXED(0) +#define KEYCODE_F1 KEYCODE_F1_INDEXED(0) +#define KEYCODE_F2 KEYCODE_F2_INDEXED(0) +#define KEYCODE_F3 KEYCODE_F3_INDEXED(0) +#define KEYCODE_F4 KEYCODE_F4_INDEXED(0) +#define KEYCODE_F5 KEYCODE_F5_INDEXED(0) +#define KEYCODE_F6 KEYCODE_F6_INDEXED(0) +#define KEYCODE_F7 KEYCODE_F7_INDEXED(0) +#define KEYCODE_F8 KEYCODE_F8_INDEXED(0) +#define KEYCODE_F9 KEYCODE_F9_INDEXED(0) +#define KEYCODE_F10 KEYCODE_F10_INDEXED(0) +#define KEYCODE_F11 KEYCODE_F11_INDEXED(0) +#define KEYCODE_F12 KEYCODE_F12_INDEXED(0) +#define KEYCODE_F13 KEYCODE_F13_INDEXED(0) +#define KEYCODE_F14 KEYCODE_F14_INDEXED(0) +#define KEYCODE_F15 KEYCODE_F15_INDEXED(0) +#define KEYCODE_ESC KEYCODE_ESC_INDEXED(0) +#define KEYCODE_TILDE KEYCODE_TILDE_INDEXED(0) +#define KEYCODE_MINUS KEYCODE_MINUS_INDEXED(0) +#define KEYCODE_EQUALS KEYCODE_EQUALS_INDEXED(0) +#define KEYCODE_BACKSPACE KEYCODE_BACKSPACE_INDEXED(0) +#define KEYCODE_TAB KEYCODE_TAB_INDEXED(0) +#define KEYCODE_OPENBRACE KEYCODE_OPENBRACE_INDEXED(0) +#define KEYCODE_CLOSEBRACE KEYCODE_CLOSEBRACE_INDEXED(0) +#define KEYCODE_ENTER KEYCODE_ENTER_INDEXED(0) +#define KEYCODE_COLON KEYCODE_COLON_INDEXED(0) +#define KEYCODE_QUOTE KEYCODE_QUOTE_INDEXED(0) +#define KEYCODE_BACKSLASH KEYCODE_BACKSLASH_INDEXED(0) +#define KEYCODE_BACKSLASH2 KEYCODE_BACKSLASH2_INDEXED(0) +#define KEYCODE_COMMA KEYCODE_COMMA_INDEXED(0) +#define KEYCODE_STOP KEYCODE_STOP_INDEXED(0) +#define KEYCODE_SLASH KEYCODE_SLASH_INDEXED(0) +#define KEYCODE_SPACE KEYCODE_SPACE_INDEXED(0) +#define KEYCODE_INSERT KEYCODE_INSERT_INDEXED(0) +#define KEYCODE_DEL KEYCODE_DEL_INDEXED(0) +#define KEYCODE_HOME KEYCODE_HOME_INDEXED(0) +#define KEYCODE_END KEYCODE_END_INDEXED(0) +#define KEYCODE_PGUP KEYCODE_PGUP_INDEXED(0) +#define KEYCODE_PGDN KEYCODE_PGDN_INDEXED(0) +#define KEYCODE_LEFT KEYCODE_LEFT_INDEXED(0) +#define KEYCODE_RIGHT KEYCODE_RIGHT_INDEXED(0) +#define KEYCODE_UP KEYCODE_UP_INDEXED(0) +#define KEYCODE_DOWN KEYCODE_DOWN_INDEXED(0) +#define KEYCODE_0_PAD KEYCODE_0_PAD_INDEXED(0) +#define KEYCODE_1_PAD KEYCODE_1_PAD_INDEXED(0) +#define KEYCODE_2_PAD KEYCODE_2_PAD_INDEXED(0) +#define KEYCODE_3_PAD KEYCODE_3_PAD_INDEXED(0) +#define KEYCODE_4_PAD KEYCODE_4_PAD_INDEXED(0) +#define KEYCODE_5_PAD KEYCODE_5_PAD_INDEXED(0) +#define KEYCODE_6_PAD KEYCODE_6_PAD_INDEXED(0) +#define KEYCODE_7_PAD KEYCODE_7_PAD_INDEXED(0) +#define KEYCODE_8_PAD KEYCODE_8_PAD_INDEXED(0) +#define KEYCODE_9_PAD KEYCODE_9_PAD_INDEXED(0) +#define KEYCODE_SLASH_PAD KEYCODE_SLASH_PAD_INDEXED(0) +#define KEYCODE_ASTERISK KEYCODE_ASTERISK_INDEXED(0) +#define KEYCODE_MINUS_PAD KEYCODE_MINUS_PAD_INDEXED(0) +#define KEYCODE_PLUS_PAD KEYCODE_PLUS_PAD_INDEXED(0) +#define KEYCODE_DEL_PAD KEYCODE_DEL_PAD_INDEXED(0) +#define KEYCODE_ENTER_PAD KEYCODE_ENTER_PAD_INDEXED(0) +#define KEYCODE_PRTSCR KEYCODE_PRTSCR_INDEXED(0) +#define KEYCODE_PAUSE KEYCODE_PAUSE_INDEXED(0) +#define KEYCODE_LSHIFT KEYCODE_LSHIFT_INDEXED(0) +#define KEYCODE_RSHIFT KEYCODE_RSHIFT_INDEXED(0) +#define KEYCODE_LCONTROL KEYCODE_LCONTROL_INDEXED(0) +#define KEYCODE_RCONTROL KEYCODE_RCONTROL_INDEXED(0) +#define KEYCODE_LALT KEYCODE_LALT_INDEXED(0) +#define KEYCODE_RALT KEYCODE_RALT_INDEXED(0) +#define KEYCODE_SCRLOCK KEYCODE_SCRLOCK_INDEXED(0) +#define KEYCODE_NUMLOCK KEYCODE_NUMLOCK_INDEXED(0) +#define KEYCODE_CAPSLOCK KEYCODE_CAPSLOCK_INDEXED(0) +#define KEYCODE_LWIN KEYCODE_LWIN_INDEXED(0) +#define KEYCODE_RWIN KEYCODE_RWIN_INDEXED(0) +#define KEYCODE_MENU KEYCODE_MENU_INDEXED(0) +#define KEYCODE_CANCEL KEYCODE_CANCEL_INDEXED(0) + +// mouse axes as relative devices +#define MOUSECODE_X_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_RELATIVE, ITEM_MODIFIER_NONE, ITEM_ID_XAXIS) +#define MOUSECODE_Y_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_RELATIVE, ITEM_MODIFIER_NONE, ITEM_ID_YAXIS) +#define MOUSECODE_Z_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_RELATIVE, ITEM_MODIFIER_NONE, ITEM_ID_ZAXIS) + +#define MOUSECODE_X MOUSECODE_X_INDEXED(0) +#define MOUSECODE_Y MOUSECODE_Y_INDEXED(0) +#define MOUSECODE_Z MOUSECODE_Z_INDEXED(0) + +// mouse axes as switches in +/- direction +#define MOUSECODE_X_POS_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_POS, ITEM_ID_XAXIS) +#define MOUSECODE_X_NEG_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NEG, ITEM_ID_XAXIS) +#define MOUSECODE_Y_POS_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_POS, ITEM_ID_YAXIS) +#define MOUSECODE_Y_NEG_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NEG, ITEM_ID_YAXIS) +#define MOUSECODE_Z_POS_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_POS, ITEM_ID_ZAXIS) +#define MOUSECODE_Z_NEG_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NEG, ITEM_ID_ZAXIS) + +#define MOUSECODE_X_POS_SWITCH MOUSECODE_X_POS_SWITCH_INDEXED(0) +#define MOUSECODE_X_NEG_SWITCH MOUSECODE_X_NEG_SWITCH_INDEXED(0) +#define MOUSECODE_Y_POS_SWITCH MOUSECODE_Y_POS_SWITCH_INDEXED(0) +#define MOUSECODE_Y_NEG_SWITCH MOUSECODE_Y_NEG_SWITCH_INDEXED(0) +#define MOUSECODE_Z_POS_SWITCH MOUSECODE_Z_POS_SWITCH_INDEXED(0) +#define MOUSECODE_Z_NEG_SWITCH MOUSECODE_Z_NEG_SWITCH_INDEXED(0) + +// mouse buttons +#define MOUSECODE_BUTTON1_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON1) +#define MOUSECODE_BUTTON2_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON2) +#define MOUSECODE_BUTTON3_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON3) +#define MOUSECODE_BUTTON4_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON4) +#define MOUSECODE_BUTTON5_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON5) +#define MOUSECODE_BUTTON6_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON6) +#define MOUSECODE_BUTTON7_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON7) +#define MOUSECODE_BUTTON8_INDEXED(n) input_code(DEVICE_CLASS_MOUSE, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON8) + +#define MOUSECODE_BUTTON1 MOUSECODE_BUTTON1_INDEXED(0) +#define MOUSECODE_BUTTON2 MOUSECODE_BUTTON2_INDEXED(0) +#define MOUSECODE_BUTTON3 MOUSECODE_BUTTON3_INDEXED(0) +#define MOUSECODE_BUTTON4 MOUSECODE_BUTTON4_INDEXED(0) +#define MOUSECODE_BUTTON5 MOUSECODE_BUTTON5_INDEXED(0) +#define MOUSECODE_BUTTON6 MOUSECODE_BUTTON6_INDEXED(0) +#define MOUSECODE_BUTTON7 MOUSECODE_BUTTON7_INDEXED(0) +#define MOUSECODE_BUTTON8 MOUSECODE_BUTTON8_INDEXED(0) + +// gun axes as absolute devices +#define GUNCODE_X_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_XAXIS) +#define GUNCODE_Y_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_YAXIS) + +#define GUNCODE_X GUNCODE_X_INDEXED(0) +#define GUNCODE_Y GUNCODE_Y_INDEXED(0) + +// gun buttons +#define GUNCODE_BUTTON1_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON1) +#define GUNCODE_BUTTON2_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON2) +#define GUNCODE_BUTTON3_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON3) +#define GUNCODE_BUTTON4_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON4) +#define GUNCODE_BUTTON5_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON5) +#define GUNCODE_BUTTON6_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON6) +#define GUNCODE_BUTTON7_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON7) +#define GUNCODE_BUTTON8_INDEXED(n) input_code(DEVICE_CLASS_LIGHTGUN, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON8) + +#define GUNCODE_BUTTON1 GUNCODE_BUTTON1_INDEXED(0) +#define GUNCODE_BUTTON2 GUNCODE_BUTTON2_INDEXED(0) +#define GUNCODE_BUTTON3 GUNCODE_BUTTON3_INDEXED(0) +#define GUNCODE_BUTTON4 GUNCODE_BUTTON4_INDEXED(0) +#define GUNCODE_BUTTON5 GUNCODE_BUTTON5_INDEXED(0) +#define GUNCODE_BUTTON6 GUNCODE_BUTTON6_INDEXED(0) +#define GUNCODE_BUTTON7 GUNCODE_BUTTON7_INDEXED(0) +#define GUNCODE_BUTTON8 GUNCODE_BUTTON8_INDEXED(0) + +// joystick axes as absolute devices +#define JOYCODE_X_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_XAXIS) +#define JOYCODE_Y_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_YAXIS) +#define JOYCODE_Z_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_ZAXIS) +#define JOYCODE_U_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_RXAXIS) +#define JOYCODE_V_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NONE, ITEM_ID_RYAXIS) + +#define JOYCODE_X JOYCODE_X_INDEXED(0) +#define JOYCODE_Y JOYCODE_Y_INDEXED(0) +#define JOYCODE_Z JOYCODE_Z_INDEXED(0) +#define JOYCODE_U JOYCODE_U_INDEXED(0) +#define JOYCODE_V JOYCODE_V_INDEXED(0) + +// joystick axes as absolute half-axes +#define JOYCODE_X_POS_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_POS, ITEM_ID_XAXIS) +#define JOYCODE_X_NEG_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NEG, ITEM_ID_XAXIS) +#define JOYCODE_Y_POS_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_POS, ITEM_ID_YAXIS) +#define JOYCODE_Y_NEG_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NEG, ITEM_ID_YAXIS) +#define JOYCODE_Z_POS_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_POS, ITEM_ID_ZAXIS) +#define JOYCODE_Z_NEG_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NEG, ITEM_ID_ZAXIS) +#define JOYCODE_U_POS_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_POS, ITEM_ID_RXAXIS) +#define JOYCODE_U_NEG_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NEG, ITEM_ID_RXAXIS) +#define JOYCODE_V_POS_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_POS, ITEM_ID_RYAXIS) +#define JOYCODE_V_NEG_ABSOLUTE_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_ABSOLUTE, ITEM_MODIFIER_NEG, ITEM_ID_RYAXIS) + +#define JOYCODE_X_POS_ABSOLUTE JOYCODE_X_POS_ABSOLUTE_INDEXED(0) +#define JOYCODE_X_NEG_ABSOLUTE JOYCODE_X_NEG_ABSOLUTE_INDEXED(0) +#define JOYCODE_Y_POS_ABSOLUTE JOYCODE_Y_POS_ABSOLUTE_INDEXED(0) +#define JOYCODE_Y_NEG_ABSOLUTE JOYCODE_Y_NEG_ABSOLUTE_INDEXED(0) +#define JOYCODE_Z_POS_ABSOLUTE JOYCODE_Z_POS_ABSOLUTE_INDEXED(0) +#define JOYCODE_Z_NEG_ABSOLUTE JOYCODE_Z_NEG_ABSOLUTE_INDEXED(0) +#define JOYCODE_U_POS_ABSOLUTE JOYCODE_U_POS_ABSOLUTE_INDEXED(0) +#define JOYCODE_U_NEG_ABSOLUTE JOYCODE_U_NEG_ABSOLUTE_INDEXED(0) +#define JOYCODE_V_POS_ABSOLUTE JOYCODE_V_POS_ABSOLUTE_INDEXED(0) +#define JOYCODE_V_NEG_ABSOLUTE JOYCODE_V_NEG_ABSOLUTE_INDEXED(0) + +// joystick axes as switches; X/Y are specially handled for left/right/up/down mapping +#define JOYCODE_X_LEFT_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_LEFT, ITEM_ID_XAXIS) +#define JOYCODE_X_RIGHT_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_RIGHT, ITEM_ID_XAXIS) +#define JOYCODE_Y_UP_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_UP, ITEM_ID_YAXIS) +#define JOYCODE_Y_DOWN_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_DOWN, ITEM_ID_YAXIS) +#define JOYCODE_Z_POS_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_POS, ITEM_ID_ZAXIS) +#define JOYCODE_Z_NEG_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NEG, ITEM_ID_ZAXIS) +#define JOYCODE_U_POS_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_POS, ITEM_ID_RXAXIS) +#define JOYCODE_U_NEG_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NEG, ITEM_ID_RXAXIS) +#define JOYCODE_V_POS_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_POS, ITEM_ID_RYAXIS) +#define JOYCODE_V_NEG_SWITCH_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NEG, ITEM_ID_RYAXIS) + +#define JOYCODE_X_LEFT_SWITCH JOYCODE_X_LEFT_SWITCH_INDEXED(0) +#define JOYCODE_X_RIGHT_SWITCH JOYCODE_X_RIGHT_SWITCH_INDEXED(0) +#define JOYCODE_Y_UP_SWITCH JOYCODE_Y_UP_SWITCH_INDEXED(0) +#define JOYCODE_Y_DOWN_SWITCH JOYCODE_Y_DOWN_SWITCH_INDEXED(0) +#define JOYCODE_Z_POS_SWITCH JOYCODE_Z_POS_SWITCH_INDEXED(0) +#define JOYCODE_Z_NEG_SWITCH JOYCODE_Z_NEG_SWITCH_INDEXED(0) +#define JOYCODE_U_POS_SWITCH JOYCODE_U_POS_SWITCH_INDEXED(0) +#define JOYCODE_U_NEG_SWITCH JOYCODE_U_NEG_SWITCH_INDEXED(0) +#define JOYCODE_V_POS_SWITCH JOYCODE_V_POS_SWITCH_INDEXED(0) +#define JOYCODE_V_NEG_SWITCH JOYCODE_V_NEG_SWITCH_INDEXED(0) + +// joystick buttons +#define JOYCODE_BUTTON1_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON1) +#define JOYCODE_BUTTON2_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON2) +#define JOYCODE_BUTTON3_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON3) +#define JOYCODE_BUTTON4_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON4) +#define JOYCODE_BUTTON5_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON5) +#define JOYCODE_BUTTON6_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON6) +#define JOYCODE_BUTTON7_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON7) +#define JOYCODE_BUTTON8_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON8) +#define JOYCODE_BUTTON9_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON9) +#define JOYCODE_BUTTON10_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON10) +#define JOYCODE_BUTTON11_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON11) +#define JOYCODE_BUTTON12_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON12) +#define JOYCODE_BUTTON13_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON13) +#define JOYCODE_BUTTON14_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON14) +#define JOYCODE_BUTTON15_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON15) +#define JOYCODE_BUTTON16_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_BUTTON16) +#define JOYCODE_START_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_START) +#define JOYCODE_SELECT_INDEXED(n) input_code(DEVICE_CLASS_JOYSTICK, n, ITEM_CLASS_SWITCH, ITEM_MODIFIER_NONE, ITEM_ID_SELECT) + +#define JOYCODE_BUTTON1 JOYCODE_BUTTON1_INDEXED(0) +#define JOYCODE_BUTTON2 JOYCODE_BUTTON2_INDEXED(0) +#define JOYCODE_BUTTON3 JOYCODE_BUTTON3_INDEXED(0) +#define JOYCODE_BUTTON4 JOYCODE_BUTTON4_INDEXED(0) +#define JOYCODE_BUTTON5 JOYCODE_BUTTON5_INDEXED(0) +#define JOYCODE_BUTTON6 JOYCODE_BUTTON6_INDEXED(0) +#define JOYCODE_BUTTON7 JOYCODE_BUTTON7_INDEXED(0) +#define JOYCODE_BUTTON8 JOYCODE_BUTTON8_INDEXED(0) +#define JOYCODE_BUTTON9 JOYCODE_BUTTON9_INDEXED(0) +#define JOYCODE_BUTTON10 JOYCODE_BUTTON10_INDEXED(0) +#define JOYCODE_BUTTON11 JOYCODE_BUTTON11_INDEXED(0) +#define JOYCODE_BUTTON12 JOYCODE_BUTTON12_INDEXED(0) +#define JOYCODE_BUTTON13 JOYCODE_BUTTON13_INDEXED(0) +#define JOYCODE_BUTTON14 JOYCODE_BUTTON14_INDEXED(0) +#define JOYCODE_BUTTON15 JOYCODE_BUTTON15_INDEXED(0) +#define JOYCODE_BUTTON16 JOYCODE_BUTTON16_INDEXED(0) +#define JOYCODE_START JOYCODE_START_INDEXED(0) +#define JOYCODE_SELECT JOYCODE_SELECT_INDEXED(0) + + + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// joystick maps +extern const char joystick_map_8way[]; +extern const char joystick_map_4way_sticky[]; +extern const char joystick_map_4way_diagonal[]; + + +//************************************************************************** +// INLINE FUNCTIONS +//************************************************************************** + +// input_device helpers +inline input_manager &input_device::manager() const { return m_class.manager(); } +inline running_machine &input_device::machine() const { return m_class.machine(); } +inline input_device_class input_device::devclass() const { return m_class.devclass(); } + +// input_class helpers +inline running_machine &input_class::machine() const { return m_manager.machine(); } + + +#endif // __INPUT_H__ |