/* This file is part of Warzone 2100. Copyright (C) 1999-2004 Eidos Interactive Copyright (C) 2005-2007 Warzone Resurrection Project Warzone 2100 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. Warzone 2100 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 Warzone 2100; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /*! \file input.h * \brief Prototypes for the keyboard and mouse input funcitons. */ #ifndef _input_h #define _input_h /* Check the header files have been included from frame.h if they * are used outside of the framework library. */ #if !defined(_frame_h) && !defined(FRAME_LIB_INCLUDE) #error Framework header files MUST be included from Frame.h ONLY. #endif #include #include "types.h" /** Defines for all the key codes used. */ typedef enum _key_code { KEY_ESC =SDLK_ESCAPE, KEY_1 =SDLK_1, KEY_2 =SDLK_2, KEY_3 =SDLK_3, KEY_4 =SDLK_4, KEY_5 =SDLK_5, KEY_6 =SDLK_6, KEY_7 =SDLK_7, KEY_8 =SDLK_8, KEY_9 =SDLK_9, KEY_0 =SDLK_0, KEY_MINUS =SDLK_MINUS, KEY_EQUALS =SDLK_EQUALS, KEY_BACKSPACE =SDLK_BACKSPACE, KEY_TAB =SDLK_TAB, KEY_Q =SDLK_q, KEY_W =SDLK_w, KEY_E =SDLK_e, KEY_R =SDLK_r, KEY_T =SDLK_t, KEY_Y =SDLK_y, KEY_U =SDLK_u, KEY_I =SDLK_i, KEY_O =SDLK_o, KEY_P =SDLK_p, KEY_LBRACE =SDLK_LEFTBRACKET, KEY_RBRACE =SDLK_RIGHTBRACKET, KEY_RETURN =SDLK_RETURN, KEY_LCTRL =SDLK_LCTRL, KEY_A =SDLK_a, KEY_S =SDLK_s, KEY_D =SDLK_d, KEY_F =SDLK_f, KEY_G =SDLK_g, KEY_H =SDLK_h, KEY_J =SDLK_j, KEY_K =SDLK_k, KEY_L =SDLK_l, KEY_SEMICOLON =SDLK_SEMICOLON, KEY_QUOTE =SDLK_QUOTE, KEY_BACKQUOTE =SDLK_BACKQUOTE, KEY_LSHIFT =SDLK_LSHIFT, KEY_BACKSLASH =SDLK_BACKSLASH, KEY_Z =SDLK_z, KEY_X =SDLK_x, KEY_C =SDLK_c, KEY_V =SDLK_v, KEY_B =SDLK_b, KEY_N =SDLK_n, KEY_M =SDLK_m, KEY_COMMA =SDLK_COMMA, KEY_FULLSTOP =SDLK_PERIOD, KEY_FORWARDSLASH =SDLK_SLASH, KEY_RSHIFT =SDLK_RSHIFT, KEY_KP_STAR =SDLK_KP_MULTIPLY, KEY_LALT =SDLK_LALT, KEY_SPACE =SDLK_SPACE, KEY_CAPSLOCK =SDLK_CAPSLOCK, KEY_F1 =SDLK_F1, KEY_F2 =SDLK_F2, KEY_F3 =SDLK_F3, KEY_F4 =SDLK_F4, KEY_F5 =SDLK_F5, KEY_F6 =SDLK_F6, KEY_F7 =SDLK_F7, KEY_F8 =SDLK_F8, KEY_F9 =SDLK_F9, KEY_F10 =SDLK_F10, KEY_NUMLOCK =SDLK_NUMLOCK, KEY_SCROLLLOCK =SDLK_SCROLLOCK, KEY_KP_7 =SDLK_KP7, KEY_KP_8 =SDLK_KP8, KEY_KP_9 =SDLK_KP9, KEY_KP_MINUS =SDLK_KP_MINUS, KEY_KP_4 =SDLK_KP4, KEY_KP_5 =SDLK_KP5, KEY_KP_6 =SDLK_KP6, KEY_KP_PLUS =SDLK_KP_PLUS, KEY_KP_1 =SDLK_KP1, KEY_KP_2 =SDLK_KP2, KEY_KP_3 =SDLK_KP3, KEY_KP_0 =SDLK_KP0, KEY_KP_FULLSTOP =SDLK_KP_PERIOD, KEY_F11 =SDLK_F11, KEY_F12 =SDLK_F12, KEY_RCTRL =SDLK_RCTRL, KEY_KP_BACKSLASH =SDLK_KP_DIVIDE, KEY_RALT =SDLK_RALT, KEY_HOME =SDLK_HOME, KEY_UPARROW =SDLK_UP, KEY_PAGEUP =SDLK_PAGEUP, KEY_LEFTARROW =SDLK_LEFT, KEY_RIGHTARROW =SDLK_RIGHT, KEY_END =SDLK_END, KEY_DOWNARROW =SDLK_DOWN, KEY_PAGEDOWN =SDLK_PAGEDOWN, KEY_INSERT =SDLK_INSERT, KEY_DELETE =SDLK_DELETE, KEY_KPENTER =SDLK_KP_ENTER, KEY_IGNORE =5190 } KEY_CODE; /** The largest possible scan code. */ #define KEY_MAXSCAN SDLK_LAST /** Tell the input system that we have lost the focus. */ extern void inputLooseFocus(void); extern void inputHandleKeyEvent(SDL_KeyboardEvent*); extern void inputHandleMouseMotionEvent(SDL_MouseMotionEvent*); extern void inputHandleMouseButtonEvent(SDL_MouseButtonEvent*); /** Converts the key code into an ascii string. */ extern void keyScanToString(KEY_CODE code, char *ascii, UDWORD maxStringSize); /** Initialise the input module. */ extern void inputInitialise(void); /** Add a key press to the key buffer. */ extern void inputAddBuffer(UDWORD code, char char_code, UDWORD count); /** This returns true if the key is currently depressed. */ extern BOOL keyDown(KEY_CODE code); /** This returns true if the key went from being up to being down this frame. */ extern BOOL keyPressed(KEY_CODE code); /** This returns true if the key went from being down to being up this frame. */ extern BOOL keyReleased(KEY_CODE code); typedef enum _mouse_key_code { MOUSE_LMB = SDL_BUTTON_LEFT, MOUSE_MMB = SDL_BUTTON_MIDDLE, MOUSE_RMB = SDL_BUTTON_RIGHT, MOUSE_WUP = SDL_BUTTON_WHEELUP, MOUSE_WDN = SDL_BUTTON_WHEELDOWN } MOUSE_KEY_CODE; /** Return the current X position of the mouse. */ extern Uint16 mouseX(void) WZ_DECL_PURE; /** Return the current Y position of the mouse. */ extern Uint16 mouseY(void) WZ_DECL_PURE; /** This returns true if the mouse key is currently depressed. */ extern BOOL mouseDown(MOUSE_KEY_CODE code); /** This returns true if the mouse key was double clicked. */ extern BOOL mouseDClicked(MOUSE_KEY_CODE code); /** This returns true if the mouse key went from being up to being down this frame. */ extern BOOL mousePressed(MOUSE_KEY_CODE code); /** This returns true if the mouse key went from being down to being up this frame. */ extern BOOL mouseReleased(MOUSE_KEY_CODE code); /** Check for a mouse drag, return the drag start coords if dragging. */ extern BOOL mouseDrag(MOUSE_KEY_CODE code, UDWORD *px, UDWORD *py); /** Warps the mouse to the given position. */ extern void SetMousePos(Uint16 x, Uint16 y); /** Sets the state of the mouse key to down. */ extern void setMouseDown(MOUSE_KEY_CODE code); /** Sets the state of the mouse key to up. */ extern void setMouseUp(MOUSE_KEY_CODE code); /* The input buffer can contain normal character codes and these control codes */ #define INPBUF_LEFT 0x010000 #define INPBUF_RIGHT 0x020000 #define INPBUF_UP 0x030000 #define INPBUF_DOWN 0x040000 #define INPBUF_HOME 0x050000 #define INPBUF_END 0x060000 #define INPBUF_INS 0x070000 #define INPBUF_DEL 0x080000 #define INPBUF_PGUP 0x090000 #define INPBUF_PGDN 0x0a0000 /* Some defines for keys that map into the normal character space */ #define INPBUF_BKSPACE 0x000008 #define INPBUF_TAB 0x000009 #define INPBUF_CR 0x00000D #define INPBUF_ESC 0x00001b /** Return the next key press or 0 if no key in the buffer. * The key returned will have been remaped to the correct ascii code for the * windows key map. * All key presses are buffered up (including windows auto repeat). */ extern UDWORD inputGetKey(void); extern char inputGetCharKey(void); /** Clear the input buffer. */ extern void inputClearBuffer(void); #endif