Removed multi-mouse / multi-keyboard support in anticipation of a real multi-mouse and multi-touch API.

Plus, this lets me start implementing cursor support.
This commit is contained in:
Sam Lantinga 2010-05-09 20:47:22 -07:00
parent d12afdaedb
commit 338f95eb06
36 changed files with 514 additions and 2986 deletions

View file

@ -75,9 +75,13 @@ typedef enum
SDL_MOUSEBUTTONUP, /**< Mouse button released */
SDL_MOUSEWHEEL, /**< Mouse wheel motion */
/* Tablet events */
SDL_PROXIMITYIN = 0x500, /**< Proximity In event */
SDL_PROXIMITYOUT, /**< Proximity Out event */
/* Tablet or multiple mice input device events */
SDL_INPUTMOTION = 0x500, /**< Input moved */
SDL_INPUTBUTTONDOWN, /**< Input button pressed */
SDL_INPUTBUTTONUP, /**< Input button released */
SDL_INPUTWHEEL, /**< Input wheel motion */
SDL_INPUTPROXIMITYIN, /**< Input pen entered proximity */
SDL_INPUTPROXIMITYOUT, /**< Input pen left proximity */
/* Joystick events */
SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */
@ -124,10 +128,10 @@ typedef struct SDL_KeyboardEvent
{
Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */
Uint32 windowID; /**< The window with keyboard focus, if any */
Uint8 which; /**< The keyboard device index */
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 padding1;
Uint8 padding2;
Uint8 padding3;
SDL_keysym keysym; /**< The key that was pressed or released */
} SDL_KeyboardEvent;
@ -139,7 +143,6 @@ typedef struct SDL_TextEditingEvent
{
Uint32 type; /**< ::SDL_TEXTEDITING */
Uint32 windowID; /**< The window with keyboard focus, if any */
Uint8 which; /**< The keyboard device index */
char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */
int start; /**< The start cursor of selected editing text */
int length; /**< The length of selected editing text */
@ -154,10 +157,6 @@ typedef struct SDL_TextInputEvent
{
Uint32 type; /**< ::SDL_TEXTINPUT */
Uint32 windowID; /**< The window with keyboard focus, if any */
Uint8 which; /**< The keyboard device index */
Uint8 padding1;
Uint8 padding2;
Uint8 padding3;
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */
} SDL_TextInputEvent;
@ -168,20 +167,12 @@ typedef struct SDL_MouseMotionEvent
{
Uint32 type; /**< ::SDL_MOUSEMOTION */
Uint32 windowID; /**< The window with mouse focus, if any */
Uint8 which; /**< The mouse device index */
Uint8 state; /**< The current button state */
Uint8 padding1;
Uint8 padding2;
Uint8 padding3;
int x; /**< X coordinate, relative to window */
int y; /**< Y coordinate, relative to window */
int z; /**< Z coordinate, for future use */
int pressure; /**< Pressure reported by tablets */
int pressure_max; /**< Maximum value of the pressure reported by the device */
int pressure_min; /**< Minimum value of the pressure reported by the device */
int rotation; /**< For future use */
int tilt_x; /**< For future use */
int tilt_y; /**< For future use */
int cursor; /**< The cursor being used in the event */
int xrel; /**< The relative motion in the X direction */
int yrel; /**< The relative motion in the Y direction */
} SDL_MouseMotionEvent;
@ -193,10 +184,10 @@ typedef struct SDL_MouseButtonEvent
{
Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */
Uint32 windowID; /**< The window with mouse focus, if any */
Uint8 which; /**< The mouse device index */
Uint8 button; /**< The mouse button index */
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 padding1;
Uint8 padding2;
int x; /**< X coordinate, relative to window */
int y; /**< Y coordinate, relative to window */
} SDL_MouseButtonEvent;
@ -208,30 +199,10 @@ typedef struct SDL_MouseWheelEvent
{
Uint32 type; /**< ::SDL_MOUSEWHEEL */
Uint32 windowID; /**< The window with mouse focus, if any */
Uint8 which; /**< The mouse device index */
Uint8 padding1;
Uint8 padding2;
Uint8 padding3;
int x; /**< The amount scrolled horizontally */
int y; /**< The amount scrolled vertically */
} SDL_MouseWheelEvent;
/**
* \brief Tablet pen proximity event
*/
typedef struct SDL_ProximityEvent
{
Uint32 type; /**< ::SDL_PROXIMITYIN or ::SDL_PROXIMITYOUT */
Uint32 windowID; /**< The associated window */
Uint8 which;
Uint8 padding1;
Uint8 padding2;
Uint8 padding3;
int cursor;
int x;
int y;
} SDL_ProximityEvent;
/**
* \brief Joystick axis motion event structure (event.jaxis.*)
*/
@ -371,7 +342,6 @@ typedef union SDL_Event
SDL_QuitEvent quit; /**< Quit request event data */
SDL_UserEvent user; /**< Custom event data */
SDL_SysWMEvent syswm; /**< System dependent window event data */
SDL_ProximityEvent proximity; /**< Proximity In or Out event */
/** Temporarily here for backwards compatibility */
/*@{*/

88
include/SDL_input.h Normal file
View file

@ -0,0 +1,88 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2010 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
/**
* \file SDL_input.h
*
* Include file for lowlevel SDL input device handling.
*
* This talks about individual devices, and not the system cursor. If you
* just want to know when the user moves the pointer somewhere in your
* window, this is NOT the API you want. This one handles things like
* multi-touch, drawing tablets, and multiple, separate mice.
*
* The other API is in SDL_mouse.h
*/
#ifndef _SDL_input_h
#define _SDL_input_h
#include "SDL_stdinc.h"
#include "SDL_error.h"
#include "SDL_video.h"
#include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
extern "C" {
/* *INDENT-ON* */
#endif
/* Function prototypes */
/* !!! FIXME: real documentation
* - Redetect devices
* - This invalidates all existing device information from previous queries!
* - There is an implicit (re)detect upon SDL_Init().
*/
extern DECLSPEC int SDLCALL SDL_RedetectInputDevices(void);
/**
* \brief Get the number of mouse input devices available.
*/
extern DECLSPEC int SDLCALL SDL_GetNumInputDevices(void);
/**
* \brief Gets the name of a device with the given index.
*
* \param index is the index of the device, whose name is to be returned.
*
* \return the name of the device with the specified index
*/
extern DECLSPEC const char *SDLCALL SDL_GetInputDeviceName(int index);
extern DECLSPEC int SDLCALL SDL_IsDeviceDisconnected(int index);
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
}
/* *INDENT-ON* */
#endif
#include "close_code.h"
#endif /* _SDL_mouse_h */
/* vi: set ts=4 sw=4 expandtab: */

View file

@ -32,6 +32,7 @@
#include "SDL_stdinc.h"
#include "SDL_error.h"
#include "SDL_keysym.h"
#include "SDL_video.h"
#include "begin_code.h"
/* Set up for C function definitions, even when using C++ */
@ -55,25 +56,12 @@ typedef struct SDL_keysym
/* Function prototypes */
/**
* \brief Get the number of keyboard input devices available.
*
* \sa SDL_SelectKeyboard()
* \brief Get the window which currently has keyboard focus.
*/
extern DECLSPEC int SDLCALL SDL_GetNumKeyboards(void);
extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void);
/**
* \brief Set the index of the currently selected keyboard.
*
* \return The index of the previously selected keyboard.
*
* \note You can query the currently selected keyboard by passing an index of -1.
*
* \sa SDL_GetNumKeyboards()
*/
extern DECLSPEC int SDLCALL SDL_SelectKeyboard(int index);
/**
* \brief Get a snapshot of the current state of the selected keyboard.
* \brief Get a snapshot of the current state of the keyboard.
*
* \param numkeys if non-NULL, receives the length of the returned array.
*
@ -90,20 +78,20 @@ extern DECLSPEC int SDLCALL SDL_SelectKeyboard(int index);
extern DECLSPEC Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys);
/**
* \brief Get the current key modifier state for the selected keyboard.
* \brief Get the current key modifier state for the keyboard.
*/
extern DECLSPEC SDLMod SDLCALL SDL_GetModState(void);
/**
* \brief Set the current key modifier state for the selected keyboard.
* \brief Set the current key modifier state for the keyboard.
*
* \note This does not change the keyboard state, only the key modifier flags.
*/
extern DECLSPEC void SDLCALL SDL_SetModState(SDLMod modstate);
/**
* \brief Get the key code corresponding to the given scancode according to the
* current keyboard layout.
* \brief Get the key code corresponding to the given scancode according
* to the current keyboard layout.
*
* See ::SDLKey for details.
*

View file

@ -24,6 +24,22 @@
* \file SDL_mouse.h
*
* Include file for SDL mouse event handling.
*
* Please note that this ONLY discusses "mice" with the notion of the
* desktop GUI. You (usually) have one system cursor, and the OS hides
* the hardware details from you. If you plug in 10 mice, all ten move that
* one cursor. For many applications and games, this is perfect, and this
* API has served hundreds of SDL programs well since its birth.
*
* It's not the whole picture, though. If you want more lowlevel control,
* SDL offers a different API, that gives you visibility into each input
* device, multi-touch interfaces, etc.
*
* Those two APIs are incompatible, and you usually should not use both
* at the same time. But for legacy purposes, this API refers to a "mouse"
* when it actually means the system pointer and not a physical mouse.
*
* The other API is in SDL_input.h
*/
#ifndef _SDL_mouse_h
@ -43,68 +59,16 @@ extern "C" {
typedef struct SDL_Cursor SDL_Cursor; /* Implementation dependent */
/* Function prototypes */
/**
* \brief Get the number of mouse input devices available.
*
* \sa SDL_SelectMouse()
* \brief Get the window which currently has mouse focus.
*/
extern DECLSPEC int SDLCALL SDL_GetNumMice(void);
extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void);
/**
* \brief Gets the name of a mouse with the given index.
*
* \param index is the index of the mouse, which name is to be returned.
*
* \return the name of the mouse with the specified index
*/
extern DECLSPEC char *SDLCALL SDL_GetMouseName(int index);
/**
* \brief Set the index of the currently selected mouse.
*
* \return The index of the previously selected mouse.
*
* \note You can query the currently selected mouse by passing an index of -1.
*
* \sa SDL_GetNumMice()
*/
extern DECLSPEC int SDLCALL SDL_SelectMouse(int index);
/**
* \brief Get the window which currently has focus for the specified mouse.
*/
extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocusWindow(int index);
/**
* \brief Set relative mouse mode for the specified mouse.
*
* \param enabled Whether or not to enable relative mode
*
* \return 0 on success, or -1 if relative mode is not supported.
*
* While the mouse is in relative mode, the cursor is hidden, and the
* driver will try to report continuous motion in the current window.
* Only relative motion events will be delivered, the mouse position
* will not change.
*
* \note This function will flush any pending mouse motion.
*
* \sa SDL_GetRelativeMouseMode()
*/
extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(int index,
SDL_bool enabled);
/**
* \brief Query whether relative mouse mode is enabled for the specified mouse.
*
* \sa SDL_SetRelativeMouseMode()
*/
extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(int index);
/**
* \brief Retrieve the current state of the specified mouse.
* \brief Retrieve the current state of the mouse.
*
* The current button state is returned as a button bitmask, which can
* be tested using the SDL_BUTTON(X) macros, and x and y are set to the
@ -114,17 +78,16 @@ extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(int index);
extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y);
/**
* \brief Retrieve the state of the specified mouse.
* \brief Retrieve the relative state of the mouse.
*
* The current button state is returned as a button bitmask, which can
* be tested using the SDL_BUTTON(X) macros, and x and y are set to the
* mouse deltas since the last call to SDL_GetRelativeMouseState().
*/
extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int index, int *x,
int *y);
extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y);
/**
* \brief Moves the currently selected mouse to the given position within the window.
* \brief Moves the mouse to the given position within the window.
*
* \param window The window to move the mouse into, or NULL for the current mouse focus
* \param x The x coordinate within the window
@ -136,8 +99,33 @@ extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window,
int x, int y);
/**
* \brief Create a cursor for the currently selected mouse, using the
* specified bitmap data and mask (in MSB format).
* \brief Set relative mouse mode.
*
* \param enabled Whether or not to enable relative mode
*
* \return 0 on success, or -1 if relative mode is not supported.
*
* While the mouse is in relative mode, the cursor is hidden, and the
* driver will try to report continuous motion in the current window.
* Only relative motion events will be delivered, the mouse position
* will not change.
*
* \note This function will flush any pending mouse motion.
*
* \sa SDL_GetRelativeMouseMode()
*/
extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled);
/**
* \brief Query whether relative mouse mode is enabled.
*
* \sa SDL_SetRelativeMouseMode()
*/
extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(void);
/**
* \brief Create a cursor, using the specified bitmap data and
* mask (in MSB format).
*
* The cursor width must be a multiple of 8 bits.
*
@ -148,7 +136,7 @@ extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window,
* <tr><td> 1 </td><td> 1 </td><td> Black </td></tr>
* <tr><td> 0 </td><td> 0 </td><td> Transparent </td></tr>
* <tr><td> 1 </td><td> 0 </td><td> Inverted color if possible, black
if not. </td></tr>
* if not. </td></tr>
* </table>
*
* \sa SDL_FreeCursor()
@ -159,14 +147,12 @@ extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data,
int hot_y);
/**
* \brief Set the active cursor for the currently selected mouse.
*
* \note The cursor must have been created for the selected mouse.
* \brief Set the active cursor.
*/
extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor);
/**
* \brief Return the active cursor for the currently selected mouse.
* \brief Return the active cursor.
*/
extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void);
@ -178,8 +164,7 @@ extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void);
extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor);
/**
* \brief Toggle whether or not the cursor is shown for the currently selected
* mouse.
* \brief Toggle whether or not the cursor is shown.
*
* \param toggle 1 to show the cursor, 0 to hide it, -1 to query the current
* state.
@ -188,38 +173,6 @@ extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor);
*/
extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle);
/**
* \brief Gets the number of cursors a pointing device supports.
*
* Useful for tablet users. Useful only under Windows.
*
* \param index is the index of the pointing device, which number of cursors we
* want to receive.
*
* \return the number of cursors supported by the pointing device. On Windows
* if a device is a tablet it returns a number >=1. Normal mice always
* return 1.
*
* On Linux every device reports one cursor.
*/
extern DECLSPEC int SDLCALL SDL_GetCursorsNumber(int index);
/**
* \brief Returns the index of the current cursor used by a specific pointing
* device.
*
* Useful only under Windows.
*
* \param index is the index of the pointing device, which cursor index we want
* to receive.
*
* \return the index of the cursor currently used by a specific pointing
* device. Always 0 under Linux. On Windows if the device isn't a
* tablet it returns 0. If the device is the tablet it returns the
* cursor index. 0 - stylus, 1 - eraser, 2 - cursor.
*/
extern DECLSPEC int SDLCALL SDL_GetCurrentCursor(int index);
/**
* Used as a mask when testing buttons in buttonstate.
* - Button 1: Left mouse button

View file

@ -88,7 +88,6 @@ typedef struct
* \sa SDL_SetWindowTitle()
* \sa SDL_ShowWindow()
*/
struct SDL_Window;
typedef struct SDL_Window SDL_Window;
/**