From 54753025c9e23b920021e97f1c22d3e1f087a4fc Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 9 May 2010 20:47:22 -0700 Subject: [PATCH 001/272] 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. --- Makefile.in | 2 +- include/SDL_events.h | 50 +- include/SDL_input.h | 88 +++ include/SDL_keyboard.h | 28 +- include/SDL_mouse.h | 149 ++--- include/SDL_video.h | 1 - src/SDL_compat.c | 4 - src/events/SDL_keyboard.c | 203 ++----- src/events/SDL_keyboard_c.h | 47 +- src/events/SDL_mouse.c | 549 ++++-------------- src/events/SDL_mouse_c.h | 93 +-- src/video/cocoa/SDL_cocoakeyboard.m | 96 ++- src/video/cocoa/SDL_cocoamouse.m | 36 +- src/video/cocoa/SDL_cocoavideo.h | 2 - src/video/cocoa/SDL_cocoawindow.m | 54 +- src/video/uikit/SDL_uikitview.h | 4 +- src/video/uikit/SDL_uikitview.m | 10 +- src/video/win32/SDL_win32events.c | 177 +----- src/video/win32/SDL_win32keyboard.c | 12 +- src/video/win32/SDL_win32keyboard.h | 2 +- src/video/win32/SDL_win32modes.c | 1 - src/video/win32/SDL_win32mouse.c | 168 ------ src/video/win32/SDL_win32video.c | 40 +- src/video/win32/SDL_win32video.h | 15 - src/video/win32/SDL_win32window.c | 56 +- src/video/win32/wactab/pktdef.h | 237 -------- src/video/win32/wactab/wintab.h | 866 ---------------------------- src/video/win32/wactab/wintabx.h | 136 ----- src/video/x11/SDL_x11events.c | 118 +--- src/video/x11/SDL_x11keyboard.c | 8 +- src/video/x11/SDL_x11mouse.c | 125 ---- src/video/x11/SDL_x11video.h | 1 - src/video/x11/SDL_x11window.c | 42 +- test/common.c | 33 +- test/testime.c | 7 +- test/testintersections.c | 20 +- 36 files changed, 504 insertions(+), 2976 deletions(-) create mode 100644 include/SDL_input.h delete mode 100644 src/video/win32/wactab/pktdef.h delete mode 100644 src/video/win32/wactab/wintab.h delete mode 100644 src/video/win32/wactab/wintabx.h diff --git a/Makefile.in b/Makefile.in index bbcae1177..87df4de3d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -44,7 +44,7 @@ EMBEDSPU = @EMBEDSPU@ DIST = acinclude autogen.sh Borland.html Borland.zip BUGS build-scripts configure configure.in COPYING CREDITS include INSTALL Makefile.minimal Makefile.in README* sdl-config.in sdl.m4 sdl.pc.in SDL.spec SDL.spec.in src test TODO VisualC.html VisualC VisualCE Watcom-Win32.zip WhatsNew Xcode Xcode-iPhoneOS -HDRS = SDL.h SDL_assert.h SDL_atomic.h SDL_audio.h SDL_compat.h SDL_cpuinfo.h SDL_endian.h SDL_error.h SDL_events.h SDL_haptic.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_opengles.h SDL_pixels.h SDL_platform.h SDL_power.h SDL_quit.h SDL_rect.h SDL_revision.h SDL_rwops.h SDL_scancode.h SDL_stdinc.h SDL_surface.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h +HDRS = SDL.h SDL_assert.h SDL_atomic.h SDL_audio.h SDL_compat.h SDL_cpuinfo.h SDL_endian.h SDL_error.h SDL_events.h SDL_haptic.h SDL_input.h SDL_joystick.h SDL_keyboard.h SDL_keysym.h SDL_loadso.h SDL_main.h SDL_mouse.h SDL_mutex.h SDL_name.h SDL_opengl.h SDL_opengles.h SDL_pixels.h SDL_platform.h SDL_power.h SDL_quit.h SDL_rect.h SDL_revision.h SDL_rwops.h SDL_scancode.h SDL_stdinc.h SDL_surface.h SDL_syswm.h SDL_thread.h SDL_timer.h SDL_types.h SDL_version.h SDL_video.h begin_code.h close_code.h LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ diff --git a/include/SDL_events.h b/include/SDL_events.h index fbdc46c94..91bdd8624 100644 --- a/include/SDL_events.h +++ b/include/SDL_events.h @@ -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 */ /*@{*/ diff --git a/include/SDL_input.h b/include/SDL_input.h new file mode 100644 index 000000000..455138f1b --- /dev/null +++ b/include/SDL_input.h @@ -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: */ diff --git a/include/SDL_keyboard.h b/include/SDL_keyboard.h index 4c013ba2c..4482ac028 100644 --- a/include/SDL_keyboard.h +++ b/include/SDL_keyboard.h @@ -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() - */ -extern DECLSPEC int SDLCALL SDL_GetNumKeyboards(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() + * \brief Get the window which currently has keyboard focus. */ -extern DECLSPEC int SDLCALL SDL_SelectKeyboard(int index); +extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); /** - * \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. * diff --git a/include/SDL_mouse.h b/include/SDL_mouse.h index a52ad8836..cb3cd9ccf 100644 --- a/include/SDL_mouse.h +++ b/include/SDL_mouse.h @@ -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,45 +59,50 @@ 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. + * \brief Retrieve the current state of the mouse. * - * \return the name of the mouse with the specified index + * 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 cursor position relative to the focus window for the currently + * selected mouse. You can pass NULL for either x or y. */ -extern DECLSPEC char *SDLCALL SDL_GetMouseName(int index); +extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); /** - * \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() + * \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 int SDLCALL SDL_SelectMouse(int index); +extern DECLSPEC Uint8 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); /** - * \brief Get the window which currently has focus for the specified mouse. + * \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 + * \param y The y coordinate within the window + * + * \note This function generates a mouse motion event */ -extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocusWindow(int index); +extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, + int x, int y); /** - * \brief Set relative mouse mode for the specified mouse. + * \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 @@ -93,51 +114,18 @@ extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocusWindow(int index); * * \sa SDL_GetRelativeMouseMode() */ -extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(int index, - SDL_bool enabled); +extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled); /** - * \brief Query whether relative mouse mode is enabled for the specified mouse. + * \brief Query whether relative mouse mode is enabled. * * \sa SDL_SetRelativeMouseMode() */ -extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(int index); - -/** - * \brief Retrieve the current state of the specified 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 cursor position relative to the focus window for the currently - * selected mouse. You can pass NULL for either x or y. - */ -extern DECLSPEC Uint8 SDLCALL SDL_GetMouseState(int *x, int *y); - -/** - * \brief Retrieve the state of the specified 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 SDL_bool SDLCALL SDL_GetRelativeMouseMode(void); /** - * \brief Moves the currently selected 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 - * \param y The y coordinate within the window - * - * \note This function generates a mouse motion event - */ -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 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, * 1 1 Black * 0 0 Transparent * 1 0 Inverted color if possible, black - if not. + * if not. * * * \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 diff --git a/include/SDL_video.h b/include/SDL_video.h index a0db406cd..804869f69 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -88,7 +88,6 @@ typedef struct * \sa SDL_SetWindowTitle() * \sa SDL_ShowWindow() */ -struct SDL_Window; typedef struct SDL_Window SDL_Window; /** diff --git a/src/SDL_compat.c b/src/SDL_compat.c index a985dc35f..0c094e8a7 100644 --- a/src/SDL_compat.c +++ b/src/SDL_compat.c @@ -277,16 +277,13 @@ SDL_CompatEventFilter(void *userdata, SDL_Event * event) case SDL_MOUSEWHEEL: { Uint8 button; - int selected; int x, y; if (event->wheel.y == 0) { break; } - selected = SDL_SelectMouse(event->wheel.which); SDL_GetMouseState(&x, &y); - SDL_SelectMouse(selected); if (event->wheel.y > 0) { button = SDL_BUTTON_WHEELUP; @@ -294,7 +291,6 @@ SDL_CompatEventFilter(void *userdata, SDL_Event * event) button = SDL_BUTTON_WHEELDOWN; } - fake.button.which = event->wheel.which; fake.button.button = button; fake.button.x = x; fake.button.y = y; diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index e6a9ca0ef..f25bc6af8 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -30,9 +30,19 @@ /* Global keyboard information */ -static int SDL_num_keyboards; -static int SDL_current_keyboard; -static SDL_Keyboard **SDL_keyboards; + +typedef struct SDL_Keyboard SDL_Keyboard; + +struct SDL_Keyboard +{ + /* Data common to all keyboards */ + SDL_Window *focus; + Uint16 modstate; + Uint8 keystate[SDL_NUM_SCANCODES]; + SDLKey keymap[SDL_NUM_SCANCODES]; +}; + +static SDL_Keyboard SDL_keyboard; static const SDLKey SDL_default_keymap[SDL_NUM_SCANCODES] = { 0, 0, 0, 0, @@ -544,75 +554,15 @@ SDL_KeyboardInit(void) return (0); } -SDL_Keyboard * -SDL_GetKeyboard(int index) -{ - if (index < 0 || index >= SDL_num_keyboards) { - return NULL; - } - return SDL_keyboards[index]; -} - -int -SDL_AddKeyboard(const SDL_Keyboard * keyboard, int index) -{ - SDL_Keyboard **keyboards; - - /* Add the keyboard to the list of keyboards */ - if (index < 0 || index >= SDL_num_keyboards || SDL_keyboards[index]) { - keyboards = - (SDL_Keyboard **) SDL_realloc(SDL_keyboards, - (SDL_num_keyboards + - 1) * sizeof(*keyboards)); - if (!keyboards) { - SDL_OutOfMemory(); - return -1; - } - - SDL_keyboards = keyboards; - index = SDL_num_keyboards++; - } - SDL_keyboards[index] = - (SDL_Keyboard *) SDL_malloc(sizeof(*SDL_keyboards[index])); - if (!SDL_keyboards[index]) { - SDL_OutOfMemory(); - return -1; - } - *SDL_keyboards[index] = *keyboard; - - return index; -} - -void -SDL_DelKeyboard(int index) -{ - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); - - if (!keyboard) { - return; - } - - if (keyboard->FreeKeyboard) { - keyboard->FreeKeyboard(keyboard); - } - SDL_free(keyboard); - - SDL_keyboards[index] = NULL; -} - void -SDL_ResetKeyboard(int index) +SDL_ResetKeyboard(void) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); + SDL_Keyboard *keyboard = &SDL_keyboard; SDL_scancode scancode; - if (!keyboard) { - return; - } - for (scancode = 0; scancode < SDL_NUM_SCANCODES; ++scancode) { if (keyboard->keystate[scancode] == SDL_PRESSED) { - SDL_SendKeyboardKey(index, SDL_RELEASED, scancode); + SDL_SendKeyboardKey(SDL_RELEASED, scancode); } } } @@ -624,13 +574,9 @@ SDL_GetDefaultKeymap(SDLKey * keymap) } void -SDL_SetKeymap(int index, int start, SDLKey * keys, int length) +SDL_SetKeymap(int start, SDLKey * keys, int length) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); - - if (!keyboard) { - return; - } + SDL_Keyboard *keyboard = &SDL_keyboard; if (start < 0 || start + length > SDL_NUM_SCANCODES) { return; @@ -645,33 +591,23 @@ SDL_SetScancodeName(SDL_scancode scancode, const char *name) SDL_scancode_names[scancode] = name; } -void -SDL_SetKeyboardFocus(int index, SDL_Window * window) +SDL_Window * +SDL_GetKeyboardFocus(void) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); - int i; - SDL_bool focus; + SDL_Keyboard *keyboard = &SDL_keyboard; - if (!keyboard) { - return; - } + return keyboard->focus; +} + +void +SDL_SetKeyboardFocus(SDL_Window * window) +{ + SDL_Keyboard *keyboard = &SDL_keyboard; /* See if the current window has lost focus */ if (keyboard->focus && keyboard->focus != window) { - focus = SDL_FALSE; - for (i = 0; i < SDL_num_keyboards; ++i) { - if (i != index) { - SDL_Keyboard *check = SDL_GetKeyboard(i); - if (check && check->focus == keyboard->focus) { - focus = SDL_TRUE; - break; - } - } - } - if (!focus) { - SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_LOST, - 0, 0); - } + SDL_SendWindowEvent(keyboard->focus, SDL_WINDOWEVENT_FOCUS_LOST, + 0, 0); } keyboard->focus = window; @@ -687,14 +623,14 @@ SDL_SetKeyboardFocus(int index, SDL_Window * window) } int -SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode) +SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); + SDL_Keyboard *keyboard = &SDL_keyboard; int posted; Uint16 modstate; Uint32 type; - if (!keyboard || !scancode) { + if (!scancode) { return 0; } #if 0 @@ -807,7 +743,6 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode) if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.key.type = type; - event.key.which = (Uint8) index; event.key.state = state; event.key.keysym.scancode = scancode; event.key.keysym.sym = keyboard->keymap[scancode]; @@ -820,22 +755,17 @@ SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode) } int -SDL_SendKeyboardText(int index, const char *text) +SDL_SendKeyboardText(const char *text) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); + SDL_Keyboard *keyboard = &SDL_keyboard; int posted; - if (!keyboard) { - return 0; - } - /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE) { SDL_Event event; event.text.type = SDL_TEXTINPUT; event.text.windowID = keyboard->focus ? keyboard->focus->id : 0; - event.text.which = (Uint8) index; SDL_strlcpy(event.text.text, text, SDL_arraysize(event.text.text)); event.text.windowID = keyboard->focus ? keyboard->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); @@ -844,22 +774,17 @@ SDL_SendKeyboardText(int index, const char *text) } int -SDL_SendEditingText(int index, const char *text, int start, int length) +SDL_SendEditingText(const char *text, int start, int length) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(index); + SDL_Keyboard *keyboard = &SDL_keyboard; int posted; - if (!keyboard) { - return 0; - } - /* Post the event, if desired */ posted = 0; if (SDL_GetEventState(SDL_TEXTEDITING) == SDL_ENABLE) { SDL_Event event; event.edit.type = SDL_TEXTEDITING; event.edit.windowID = keyboard->focus ? keyboard->focus->id : 0; - event.text.which = (Uint8) index; event.edit.start = start; event.edit.length = length; SDL_strlcpy(event.edit.text, text, SDL_arraysize(event.edit.text)); @@ -871,93 +796,49 @@ SDL_SendEditingText(int index, const char *text, int start, int length) void SDL_KeyboardQuit(void) { - int i; - - for (i = 0; i < SDL_num_keyboards; ++i) { - SDL_DelKeyboard(i); - } - SDL_num_keyboards = 0; - SDL_current_keyboard = 0; - - if (SDL_keyboards) { - SDL_free(SDL_keyboards); - SDL_keyboards = NULL; - } -} - -int -SDL_GetNumKeyboards(void) -{ - return SDL_num_keyboards; -} - -int -SDL_SelectKeyboard(int index) -{ - if (index >= 0 && index < SDL_num_keyboards) { - SDL_current_keyboard = index; - } - return SDL_current_keyboard; } Uint8 * SDL_GetKeyboardState(int *numkeys) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard); + SDL_Keyboard *keyboard = &SDL_keyboard; if (numkeys != (int *) 0) { *numkeys = SDL_NUM_SCANCODES; } - - if (!keyboard) { - return NULL; - } return keyboard->keystate; } SDLMod SDL_GetModState(void) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard); + SDL_Keyboard *keyboard = &SDL_keyboard; - if (!keyboard) { - return KMOD_NONE; - } return keyboard->modstate; } void SDL_SetModState(SDLMod modstate) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard); + SDL_Keyboard *keyboard = &SDL_keyboard; - if (!keyboard) { - return; - } keyboard->modstate = modstate; } SDLKey SDL_GetKeyFromScancode(SDL_scancode scancode) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard); + SDL_Keyboard *keyboard = &SDL_keyboard; - if (!keyboard) { - return SDLK_UNKNOWN; - } return keyboard->keymap[scancode]; } SDL_scancode SDL_GetScancodeFromKey(SDLKey key) { - SDL_Keyboard *keyboard = SDL_GetKeyboard(SDL_current_keyboard); + SDL_Keyboard *keyboard = &SDL_keyboard; SDL_scancode scancode; - if (!keyboard) { - return SDL_SCANCODE_UNKNOWN; - } - for (scancode = SDL_SCANCODE_UNKNOWN; scancode < SDL_NUM_SCANCODES; ++scancode) { if (keyboard->keymap[scancode] == key) { diff --git a/src/events/SDL_keyboard_c.h b/src/events/SDL_keyboard_c.h index d4021ff35..1eeb9718c 100644 --- a/src/events/SDL_keyboard_c.h +++ b/src/events/SDL_keyboard_c.h @@ -27,44 +27,17 @@ #include "SDL_keysym.h" #include "SDL_events.h" -typedef struct SDL_Keyboard SDL_Keyboard; - -struct SDL_Keyboard -{ - /* Free the keyboard when it's time */ - void (*FreeKeyboard) (SDL_Keyboard * keyboard); - - /* Data common to all keyboards */ - SDL_Window *focus; - Uint16 modstate; - Uint8 keystate[SDL_NUM_SCANCODES]; - SDLKey keymap[SDL_NUM_SCANCODES]; - - void *driverdata; -}; - /* Initialize the keyboard subsystem */ extern int SDL_KeyboardInit(void); -/* Get the keyboard at an index */ -extern SDL_Keyboard *SDL_GetKeyboard(int index); - -/* Add a keyboard, possibly reattaching at a particular index (or -1), - returning the index of the keyboard, or -1 if there was an error. - */ -extern int SDL_AddKeyboard(const SDL_Keyboard * keyboard, int index); - -/* Remove a keyboard at an index, clearing the slot for later */ -extern void SDL_DelKeyboard(int index); - -/* Clear the state of a keyboard at an index */ -extern void SDL_ResetKeyboard(int index); +/* Clear the state of the keyboard */ +extern void SDL_ResetKeyboard(void); /* Get the default keymap */ extern void SDL_GetDefaultKeymap(SDLKey * keymap); -/* Set the mapping of scancode to key codes for this keyboard */ -extern void SDL_SetKeymap(int index, int start, SDLKey * keys, int length); +/* Set the mapping of scancode to key codes */ +extern void SDL_SetKeymap(int start, SDLKey * keys, int length); /* Set a platform-dependent key name, overriding the default platform-agnostic name. Encoded as UTF-8. The string is not copied, thus the pointer given to @@ -73,16 +46,16 @@ extern void SDL_SetKeymap(int index, int start, SDLKey * keys, int length); extern void SDL_SetScancodeName(SDL_scancode scancode, const char *name); /* Set the keyboard focus window */ -extern void SDL_SetKeyboardFocus(int index, SDL_Window * window); +extern void SDL_SetKeyboardFocus(SDL_Window * window); -/* Send a keyboard event for a keyboard at an index */ -extern int SDL_SendKeyboardKey(int index, Uint8 state, SDL_scancode scancode); +/* Send a keyboard key event */ +extern int SDL_SendKeyboardKey(Uint8 state, SDL_scancode scancode); -/* Send keyboard text input for a keyboard at an index */ -extern int SDL_SendKeyboardText(int index, const char *text); +/* Send keyboard text input */ +extern int SDL_SendKeyboardText(const char *text); /* Send editing text for selected range from start to end */ -extern int SDL_SendEditingText(int index, const char *text, int start, int end); +extern int SDL_SendEditingText(const char *text, int start, int end); /* Shutdown the keyboard subsystem */ extern void SDL_KeyboardQuit(void); diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index c9e229654..e8a9ccd75 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -29,382 +29,97 @@ #include "../video/SDL_sysvideo.h" -static int SDL_num_mice = 0; -static int SDL_current_mouse = -1; -static SDL_Mouse **SDL_mice = NULL; +/* Global mouse information */ +typedef struct SDL_Mouse SDL_Mouse; -/* Public functions */ -int -SDL_MouseInit(void) +struct SDL_Mouse { - return (0); -} + /* Create a cursor from a surface */ + SDL_Cursor *(*CreateCursor) (SDL_Surface * surface, int hot_x, int hot_y); -SDL_Mouse * -SDL_GetMouse(int index) -{ - if (index < 0 || index >= SDL_num_mice) { - return NULL; - } - return SDL_mice[index]; -} + /* Show the specified cursor, or hide if cursor is NULL */ + int (*ShowCursor) (SDL_Cursor * cursor); -static int -SDL_GetMouseIndexId(int id) -{ - int index; - SDL_Mouse *mouse; + /* This is called when a mouse motion event occurs */ + void (*MoveCursor) (SDL_Cursor * cursor); - for (index = 0; index < SDL_num_mice; ++index) { - mouse = SDL_GetMouse(index); - if (mouse->id == id) { - return index; - } - } - return -1; -} + /* Free a window manager cursor */ + void (*FreeCursor) (SDL_Cursor * cursor); -int -SDL_AddMouse(const SDL_Mouse * mouse, char *name, int pressure_max, - int pressure_min, int ends) -{ - SDL_Mouse **mice; - int selected_mouse; - int index; - size_t length; - - if (SDL_GetMouseIndexId(mouse->id) != -1) { - SDL_SetError("Mouse ID already in use"); - } - - /* Add the mouse to the list of mice */ - mice = (SDL_Mouse **) SDL_realloc(SDL_mice, - (SDL_num_mice + 1) * sizeof(*mice)); - if (!mice) { - SDL_OutOfMemory(); - return -1; - } - - SDL_mice = mice; - index = SDL_num_mice++; - - SDL_mice[index] = (SDL_Mouse *) SDL_malloc(sizeof(*SDL_mice[index])); - if (!SDL_mice[index]) { - SDL_OutOfMemory(); - return -1; - } - *SDL_mice[index] = *mouse; - - /* we're setting the mouse properties */ - length = 0; - length = SDL_strlen(name); - SDL_mice[index]->focus = 0; - SDL_mice[index]->name = SDL_malloc((length + 2) * sizeof(char)); - SDL_strlcpy(SDL_mice[index]->name, name, length + 1); - SDL_mice[index]->pressure_max = pressure_max; - SDL_mice[index]->pressure_min = pressure_min; - SDL_mice[index]->cursor_shown = SDL_TRUE; - selected_mouse = SDL_SelectMouse(index); - SDL_mice[index]->cur_cursor = NULL; - SDL_mice[index]->def_cursor = - SDL_CreateCursor(default_cdata, default_cmask, DEFAULT_CWIDTH, - DEFAULT_CHEIGHT, DEFAULT_CHOTX, DEFAULT_CHOTY); - SDL_SetCursor(SDL_mice[index]->def_cursor); - /* we're assuming that all mice are in the computer sensing zone */ - SDL_mice[index]->proximity = SDL_TRUE; - /* we're assuming that all mice are working in the absolute position mode - thanx to that, the users that don't want to use many mice don't have to - worry about anything */ - SDL_mice[index]->relative_mode = SDL_FALSE; - SDL_mice[index]->current_end = 0; - SDL_mice[index]->total_ends = ends; - SDL_SelectMouse(selected_mouse); - - return index; -} + /* Warp the mouse to (x,y) */ + void (*WarpMouse) (SDL_Mouse * mouse, SDL_Window * window, int x, int y); -void -SDL_DelMouse(int index) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (!mouse) { - return; - } - - mouse->def_cursor = NULL; - SDL_free(mouse->name); - while (mouse->cursors) { - SDL_FreeCursor(mouse->cursors); - } - - if (mouse->FreeMouse) { - mouse->FreeMouse(mouse); - } - SDL_free(mouse); + /* Data common to all mice */ + SDL_Window *focus; + int x; + int y; + int xdelta; + int ydelta; + int last_x, last_y; /* the last reported x and y coordinates */ + Uint8 buttonstate; + SDL_bool relative_mode; - SDL_mice[index] = NULL; -} + SDL_Cursor *cursors; + SDL_Cursor *def_cursor; + SDL_Cursor *cur_cursor; + SDL_bool cursor_shown; +}; -void -SDL_ResetMouse(int index) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); +static SDL_Mouse SDL_mouse; - if (!mouse) { - return; - } - - /* FIXME */ -} - -void -SDL_MouseQuit(void) -{ - int i; - - for (i = 0; i < SDL_num_mice; ++i) { - SDL_DelMouse(i); - } - SDL_num_mice = 0; - SDL_current_mouse = -1; - - if (SDL_mice) { - SDL_free(SDL_mice); - SDL_mice = NULL; - } -} +/* Public functions */ int -SDL_GetNumMice(void) +SDL_MouseInit(void) { - return SDL_num_mice; + return (0); } -int -SDL_SelectMouse(int index) +void +SDL_ResetMouse(void) { - if (index >= 0 && index < SDL_num_mice) { - SDL_current_mouse = index; - } - return SDL_current_mouse; + /* FIXME */ } SDL_Window * -SDL_GetMouseFocusWindow(int index) +SDL_GetMouseFocus(void) { - SDL_Mouse *mouse = SDL_GetMouse(index); + SDL_Mouse *mouse = &SDL_mouse; - if (!mouse) { - return 0; - } return mouse->focus; } -static int SDLCALL -FlushMouseMotion(void *param, SDL_Event * event) -{ - if (event->type == SDL_MOUSEMOTION - && event->motion.which == (Uint8) SDL_current_mouse) { - return 0; - } else { - return 1; - } -} - -int -SDL_SetRelativeMouseMode(int index, SDL_bool enabled) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (!mouse) { - return -1; - } - - /* Flush pending mouse motion */ - mouse->flush_motion = SDL_TRUE; - SDL_PumpEvents(); - mouse->flush_motion = SDL_FALSE; - SDL_FilterEvents(FlushMouseMotion, mouse); - - /* Set the relative mode */ - mouse->relative_mode = enabled; - - /* Update cursor visibility */ - SDL_SetCursor(NULL); - - if (!enabled) { - /* Restore the expected mouse position */ - SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y); - } - return 0; -} - -SDL_bool -SDL_GetRelativeMouseMode(int index) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (!mouse) { - return SDL_FALSE; - } - return mouse->relative_mode; -} - -Uint8 -SDL_GetMouseState(int *x, int *y) -{ - SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse); - - if (!mouse) { - if (x) { - *x = 0; - } - if (y) { - *y = 0; - } - return 0; - } - - if (x) { - *x = mouse->x; - } - if (y) { - *y = mouse->y; - } - return mouse->buttonstate; -} - -Uint8 -SDL_GetRelativeMouseState(int index, int *x, int *y) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (!mouse) { - if (x) { - *x = 0; - } - if (y) { - *y = 0; - } - return 0; - } - - if (x) { - *x = mouse->xdelta; - } - if (y) { - *y = mouse->ydelta; - } - mouse->xdelta = 0; - mouse->ydelta = 0; - return mouse->buttonstate; -} - void -SDL_SetMouseFocus(int id, SDL_Window * window) +SDL_SetMouseFocus(SDL_Window * window) { - int index = SDL_GetMouseIndexId(id); - SDL_Mouse *mouse = SDL_GetMouse(index); - int i; - SDL_bool focus; + SDL_Mouse *mouse = &SDL_mouse; - if (!mouse || (mouse->focus == window)) { + if (mouse->focus == window) { return; } /* See if the current window has lost focus */ if (mouse->focus) { - focus = SDL_FALSE; - for (i = 0; i < SDL_num_mice; ++i) { - SDL_Mouse *check; - if (i != index) { - check = SDL_GetMouse(i); - if (check && check->focus == mouse->focus) { - focus = SDL_TRUE; - break; - } - } - } - if (!focus) { - SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_LEAVE, 0, 0); - } + SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_LEAVE, 0, 0); } mouse->focus = window; if (mouse->focus) { - focus = SDL_FALSE; - for (i = 0; i < SDL_num_mice; ++i) { - SDL_Mouse *check; - if (i != index) { - check = SDL_GetMouse(i); - if (check && check->focus == mouse->focus) { - focus = SDL_TRUE; - break; - } - } - } - if (!focus) { - SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_ENTER, 0, 0); - } + SDL_SendWindowEvent(mouse->focus, SDL_WINDOWEVENT_ENTER, 0, 0); } } int -SDL_SendProximity(int id, int x, int y, int type) +SDL_SendMouseMotion(int relative, int x, int y) { - int index = SDL_GetMouseIndexId(id); - SDL_Mouse *mouse = SDL_GetMouse(index); - int posted = 0; - - if (!mouse) { - return 0; - } - - mouse->last_x = x; - mouse->last_y = y; - if (SDL_GetEventState(type) == SDL_ENABLE) { - SDL_Event event; - event.proximity.which = (Uint8) index; - event.proximity.x = x; - event.proximity.y = y; - event.proximity.cursor = mouse->current_end; - event.proximity.type = type; - /* FIXME: is this right? */ - event.proximity.windowID = mouse->focus ? mouse->focus->id : 0; - posted = (SDL_PushEvent(&event) > 0); - if (type == SDL_PROXIMITYIN) { - mouse->proximity = SDL_TRUE; - } else { - mouse->proximity = SDL_FALSE; - } - } - return posted; -} - -int -SDL_SendMouseMotion(int id, int relative, int x, int y, int pressure) -{ - int index = SDL_GetMouseIndexId(id); - SDL_Mouse *mouse = SDL_GetMouse(index); + SDL_Mouse *mouse = &SDL_mouse; int posted; int xrel; int yrel; int x_max = 0, y_max = 0; - if (!mouse || mouse->flush_motion) { - return 0; - } - - /* if the mouse is out of proximity we don't to want to have any motion from it */ - if (mouse->proximity == SDL_FALSE) { - mouse->last_x = x; - mouse->last_y = y; - return 0; - } - /* the relative motion is calculated regarding the system cursor last position */ if (relative) { xrel = x; @@ -451,35 +166,26 @@ SDL_SendMouseMotion(int id, int relative, int x, int y, int pressure) mouse->xdelta += xrel; mouse->ydelta += yrel; - mouse->pressure = pressure; +#if 0 /* FIXME */ /* Move the mouse cursor, if needed */ if (mouse->cursor_shown && !mouse->relative_mode && mouse->MoveCursor && mouse->cur_cursor) { mouse->MoveCursor(mouse->cur_cursor); } +#endif /* Post the event, if desired */ posted = 0; - if (SDL_GetEventState(SDL_MOUSEMOTION) == SDL_ENABLE && - mouse->proximity == SDL_TRUE) { + if (SDL_GetEventState(SDL_MOUSEMOTION) == SDL_ENABLE) { SDL_Event event; event.motion.type = SDL_MOUSEMOTION; - event.motion.which = (Uint8) index; + event.motion.windowID = mouse->focus ? mouse->focus->id : 0; event.motion.state = mouse->buttonstate; event.motion.x = mouse->x; event.motion.y = mouse->y; - event.motion.z = mouse->z; - event.motion.pressure = mouse->pressure; - event.motion.pressure_max = mouse->pressure_max; - event.motion.pressure_min = mouse->pressure_min; - event.motion.rotation = 0; - event.motion.tilt_x = 0; - event.motion.tilt_y = 0; - event.motion.cursor = mouse->current_end; event.motion.xrel = xrel; event.motion.yrel = yrel; - event.motion.windowID = mouse->focus ? mouse->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); } mouse->last_x = mouse->x; @@ -488,17 +194,12 @@ SDL_SendMouseMotion(int id, int relative, int x, int y, int pressure) } int -SDL_SendMouseButton(int id, Uint8 state, Uint8 button) +SDL_SendMouseButton(Uint8 state, Uint8 button) { - int index = SDL_GetMouseIndexId(id); - SDL_Mouse *mouse = SDL_GetMouse(index); + SDL_Mouse *mouse = &SDL_mouse; int posted; Uint32 type; - if (!mouse) { - return 0; - } - /* Figure out which event to perform */ switch (state) { case SDL_PRESSED: @@ -527,7 +228,6 @@ SDL_SendMouseButton(int id, Uint8 state, Uint8 button) if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; - event.button.which = (Uint8) index; event.button.state = state; event.button.button = button; event.button.x = mouse->x; @@ -539,12 +239,12 @@ SDL_SendMouseButton(int id, Uint8 state, Uint8 button) } int -SDL_SendMouseWheel(int index, int x, int y) +SDL_SendMouseWheel(int x, int y) { - SDL_Mouse *mouse = SDL_GetMouse(index); + SDL_Mouse *mouse = &SDL_mouse; int posted; - if (!mouse || (!x && !y)) { + if (!x && !y) { return 0; } @@ -553,53 +253,108 @@ SDL_SendMouseWheel(int index, int x, int y) if (SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE) { SDL_Event event; event.type = SDL_MOUSEWHEEL; - event.wheel.which = (Uint8) index; + event.wheel.windowID = mouse->focus ? mouse->focus->id : 0; event.wheel.x = x; event.wheel.y = y; - event.wheel.windowID = mouse->focus ? mouse->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); } return posted; } void -SDL_WarpMouseInWindow(SDL_Window * window, int x, int y) +SDL_MouseQuit(void) { - SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse); +} - if (!mouse) { - return; +Uint8 +SDL_GetMouseState(int *x, int *y) +{ + SDL_Mouse *mouse = &SDL_mouse; + + if (x) { + *x = mouse->x; + } + if (y) { + *y = mouse->y; } + return mouse->buttonstate; +} + +Uint8 +SDL_GetRelativeMouseState(int *x, int *y) +{ + SDL_Mouse *mouse = &SDL_mouse; + + if (x) { + *x = mouse->xdelta; + } + if (y) { + *y = mouse->ydelta; + } + mouse->xdelta = 0; + mouse->ydelta = 0; + return mouse->buttonstate; +} + +void +SDL_WarpMouseInWindow(SDL_Window * window, int x, int y) +{ + SDL_Mouse *mouse = &SDL_mouse; if (mouse->WarpMouse) { mouse->WarpMouse(mouse, window, x, y); } else { - SDL_SetMouseFocus(SDL_current_mouse, window); - SDL_SendMouseMotion(SDL_current_mouse, 0, x, y, 0); + SDL_SetMouseFocus(window); + SDL_SendMouseMotion(0, x, y); + } +} + +int +SDL_SetRelativeMouseMode(SDL_bool enabled) +{ + SDL_Mouse *mouse = &SDL_mouse; + + /* Flush pending mouse motion */ + SDL_FlushEvent(SDL_MOUSEMOTION); + + /* Set the relative mode */ + mouse->relative_mode = enabled; + + if (!enabled) { + /* Restore the expected mouse position */ + SDL_WarpMouseInWindow(mouse->focus, mouse->x, mouse->y); } + + /* Update cursor visibility */ + SDL_SetCursor(NULL); + + return 0; +} + +SDL_bool +SDL_GetRelativeMouseMode() +{ + SDL_Mouse *mouse = &SDL_mouse; + + return mouse->relative_mode; } SDL_Cursor * SDL_CreateCursor(const Uint8 * data, const Uint8 * mask, int w, int h, int hot_x, int hot_y) { - SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse); + SDL_Mouse *mouse = &SDL_mouse; SDL_Surface *surface; SDL_Cursor *cursor; int x, y; Uint32 *pixel; - Uint8 datab, maskb; + Uint8 datab = 0, maskb = 0; const Uint32 black = 0xFF000000; const Uint32 white = 0xFFFFFFFF; const Uint32 transparent = 0x00000000; - if (!mouse) { - SDL_SetError("No mice are initialized"); - return NULL; - } - if (!mouse->CreateCursor) { - SDL_SetError("Current mouse doesn't have cursor support"); + SDL_SetError("Cursors are not currently supported"); return NULL; } @@ -638,7 +393,6 @@ SDL_CreateCursor(const Uint8 * data, const Uint8 * mask, cursor = mouse->CreateCursor(surface, hot_x, hot_y); if (cursor) { - cursor->mouse = mouse; cursor->next = mouse->cursors; mouse->cursors = cursor; } @@ -655,12 +409,7 @@ SDL_CreateCursor(const Uint8 * data, const Uint8 * mask, void SDL_SetCursor(SDL_Cursor * cursor) { - SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse); - - if (!mouse) { - SDL_SetError("No mice are initialized"); - return; - } + SDL_Mouse *mouse = &SDL_mouse; /* Set the new cursor */ if (cursor) { @@ -694,7 +443,7 @@ SDL_SetCursor(SDL_Cursor * cursor) SDL_Cursor * SDL_GetCursor(void) { - SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse); + SDL_Mouse *mouse = &SDL_mouse; if (!mouse) { return NULL; @@ -705,13 +454,12 @@ SDL_GetCursor(void) void SDL_FreeCursor(SDL_Cursor * cursor) { - SDL_Mouse *mouse; + SDL_Mouse *mouse = &SDL_mouse; SDL_Cursor *curr, *prev; if (!cursor) { return; } - mouse = cursor->mouse; if (cursor == mouse->def_cursor) { return; @@ -740,7 +488,7 @@ SDL_FreeCursor(SDL_Cursor * cursor) int SDL_ShowCursor(int toggle) { - SDL_Mouse *mouse = SDL_GetMouse(SDL_current_mouse); + SDL_Mouse *mouse = &SDL_mouse; SDL_bool shown; if (!mouse) { @@ -761,47 +509,4 @@ SDL_ShowCursor(int toggle) return shown; } -char * -SDL_GetMouseName(int index) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - if (!mouse) { - return NULL; - } - return mouse->name; -} - -void -SDL_ChangeEnd(int id, int end) -{ - int index = SDL_GetMouseIndexId(id); - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (mouse) { - mouse->current_end = end; - } -} - -int -SDL_GetCursorsNumber(int index) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (!mouse) { - return -1; - } - return mouse->total_ends; -} - -int -SDL_GetCurrentCursor(int index) -{ - SDL_Mouse *mouse = SDL_GetMouse(index); - - if (!mouse) { - return -1; - } - return mouse->current_end; -} - /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/SDL_mouse_c.h b/src/events/SDL_mouse_c.h index 7ed0cf7b6..284468fa9 100644 --- a/src/events/SDL_mouse_c.h +++ b/src/events/SDL_mouse_c.h @@ -24,108 +24,33 @@ #ifndef _SDL_mouse_c_h #define _SDL_mouse_c_h -typedef struct SDL_Mouse SDL_Mouse; - struct SDL_Cursor { - SDL_Mouse *mouse; SDL_Cursor *next; void *driverdata; }; -struct SDL_Mouse -{ - /* Create a cursor from a surface */ - SDL_Cursor *(*CreateCursor) (SDL_Surface * surface, int hot_x, int hot_y); - - /* Show the specified cursor, or hide if cursor is NULL */ - int (*ShowCursor) (SDL_Cursor * cursor); - - /* This is called when a mouse motion event occurs */ - void (*MoveCursor) (SDL_Cursor * cursor); - - /* Free a window manager cursor */ - void (*FreeCursor) (SDL_Cursor * cursor); - - /* Warp the mouse to (x,y) */ - void (*WarpMouse) (SDL_Mouse * mouse, SDL_Window * window, int x, - int y); - - /* Free the mouse when it's time */ - void (*FreeMouse) (SDL_Mouse * mouse); - - /* data common for tablets */ - int pressure; - int pressure_max; - int pressure_min; - int tilt; /* for future use */ - int rotation; /* for future use */ - int total_ends; - int current_end; - - /* Data common to all mice */ - int id; - SDL_Window *focus; - int which; - int x; - int y; - int z; /* for future use */ - int xdelta; - int ydelta; - int last_x, last_y; /* the last reported x and y coordinates */ - char *name; - Uint8 buttonstate; - SDL_bool relative_mode; - SDL_bool proximity; - SDL_bool flush_motion; - - SDL_Cursor *cursors; - SDL_Cursor *def_cursor; - SDL_Cursor *cur_cursor; - SDL_bool cursor_shown; - - void *driverdata; -}; - /* Initialize the mouse subsystem */ extern int SDL_MouseInit(void); -/* Get the mouse at an index */ -extern SDL_Mouse *SDL_GetMouse(int index); - -/* Add a mouse, possibly reattaching at a particular index (or -1), - returning the index of the mouse, or -1 if there was an error. - */ -extern int SDL_AddMouse(const SDL_Mouse * mouse, char *name, - int pressure_max, int pressure_min, int ends); - -/* Remove a mouse at an index, clearing the slot for later */ -extern void SDL_DelMouse(int index); - -/* Clear the button state of a mouse at an index */ -extern void SDL_ResetMouse(int index); +/* Clear the mouse state */ +extern void SDL_ResetMouse(void); /* Set the mouse focus window */ -extern void SDL_SetMouseFocus(int id, SDL_Window * window); +extern void SDL_SetMouseFocus(SDL_Window * window); -/* Send a mouse motion event for a mouse */ -extern int SDL_SendMouseMotion(int id, int relative, int x, int y, int z); +/* Send a mouse motion event */ +extern int SDL_SendMouseMotion(int relative, int x, int y); -/* Send a mouse button event for a mouse */ -extern int SDL_SendMouseButton(int id, Uint8 state, Uint8 button); +/* Send a mouse button event */ +extern int SDL_SendMouseButton(Uint8 state, Uint8 button); -/* Send a mouse wheel event for a mouse */ -extern int SDL_SendMouseWheel(int id, int x, int y); - -/* Send a proximity event for a mouse */ -extern int SDL_SendProximity(int id, int x, int y, int type); +/* Send a mouse wheel event */ +extern int SDL_SendMouseWheel(int x, int y); /* Shutdown the mouse subsystem */ extern void SDL_MouseQuit(void); -/* FIXME: Where do these functions go in this header? */ -extern void SDL_ChangeEnd(int id, int end); - #endif /* _SDL_mouse_c_h */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoakeyboard.m b/src/video/cocoa/SDL_cocoakeyboard.m index e6266c9e4..9fd89d15d 100644 --- a/src/video/cocoa/SDL_cocoakeyboard.m +++ b/src/video/cocoa/SDL_cocoakeyboard.m @@ -62,20 +62,13 @@ @interface SDLTranslatorResponder : NSView NSRange _markedRange; NSRange _selectedRange; SDL_Rect _inputRect; - int _keyboard; } - (void) doCommandBySelector:(SEL)myselector; - (void) setInputRect:(SDL_Rect *) rect; -- (void) setKeyboard:(int) keyboard; @end @implementation SDLTranslatorResponder -- (void) setKeyboard:(int) keyboard -{ - _keyboard = keyboard; -} - - (void) setInputRect:(SDL_Rect *) rect { _inputRect = *rect; @@ -94,7 +87,7 @@ - (void) insertText:(id) aString else str = [aString UTF8String]; - SDL_SendKeyboardText(_keyboard, str); + SDL_SendKeyboardText(str); } - (void) doCommandBySelector:(SEL) myselector @@ -140,7 +133,7 @@ - (void) setMarkedText:(id) aString _selectedRange = selRange; _markedRange = NSMakeRange(0, [aString length]); - SDL_SendEditingText(_keyboard, [aString UTF8String], + SDL_SendEditingText([aString UTF8String], selRange.location, selRange.length); DEBUG_IME(@"setMarkedText: %@, (%d, %d)", _markedText, @@ -204,7 +197,7 @@ - (NSArray *) validAttributesForMarkedText * differentiating between left and right versions of the keys. */ static void -DoUnsidedModifiers(int keyboard, unsigned short scancode, +DoUnsidedModifiers(unsigned short scancode, unsigned int oldMods, unsigned int newMods) { const int mapping[] = { @@ -226,14 +219,14 @@ - (NSArray *) validAttributesForMarkedText if (oldMask && oldMask != newMask) { /* modifier up event */ /* If this was Caps Lock, we need some additional voodoo to make SDL happy */ if (bit == NSAlphaShiftKeyMask) { - SDL_SendKeyboardKey(keyboard, SDL_PRESSED, mapping[i]); + SDL_SendKeyboardKey(SDL_PRESSED, mapping[i]); } - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, mapping[i]); + SDL_SendKeyboardKey(SDL_RELEASED, mapping[i]); } else if (newMask && oldMask != newMask) { /* modifier down event */ - SDL_SendKeyboardKey(keyboard, SDL_PRESSED, mapping[i]); + SDL_SendKeyboardKey(SDL_PRESSED, mapping[i]); /* If this was Caps Lock, we need some additional voodoo to make SDL happy */ if (bit == NSAlphaShiftKeyMask) { - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, mapping[i]); + SDL_SendKeyboardKey(SDL_RELEASED, mapping[i]); } } } @@ -244,8 +237,7 @@ - (NSArray *) validAttributesForMarkedText * sides was made. */ static void -HandleNonDeviceModifier(int keyboard, - unsigned int device_independent_mask, +HandleNonDeviceModifier(unsigned int device_independent_mask, unsigned int oldMods, unsigned int newMods, SDL_scancode scancode) @@ -259,9 +251,9 @@ - (NSArray *) validAttributesForMarkedText newMask = newMods & device_independent_mask; if (oldMask && oldMask != newMask) { - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, scancode); + SDL_SendKeyboardKey(SDL_RELEASED, scancode); } else if (newMask && oldMask != newMask) { - SDL_SendKeyboardKey(keyboard, SDL_PRESSED, scancode); + SDL_SendKeyboardKey(SDL_PRESSED, scancode); } } @@ -269,8 +261,7 @@ - (NSArray *) validAttributesForMarkedText * This function sets the actual SDL_PrivateKeyboard event. */ static void -HandleModifierOneSide(int keyboard, - unsigned int oldMods, unsigned int newMods, +HandleModifierOneSide(unsigned int oldMods, unsigned int newMods, SDL_scancode scancode, unsigned int sided_device_dependent_mask) { @@ -287,9 +278,9 @@ - (NSArray *) validAttributesForMarkedText * find out which it is. */ if (new_dep_mask && old_dep_mask != new_dep_mask) { - SDL_SendKeyboardKey(keyboard, SDL_PRESSED, scancode); + SDL_SendKeyboardKey(SDL_PRESSED, scancode); } else { - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, scancode); + SDL_SendKeyboardKey(SDL_RELEASED, scancode); } } @@ -298,8 +289,7 @@ - (NSArray *) validAttributesForMarkedText * e.g. left-shift vs right-shift. */ static void -HandleModifierSide(int keyboard, - int device_independent_mask, +HandleModifierSide(int device_independent_mask, unsigned int oldMods, unsigned int newMods, SDL_scancode left_scancode, SDL_scancode right_scancode, @@ -316,7 +306,7 @@ - (NSArray *) validAttributesForMarkedText */ if ((device_dependent_mask & newMods) == 0) { /* Revert to the old behavior */ - HandleNonDeviceModifier(keyboard, device_independent_mask, oldMods, newMods, left_scancode); + HandleNonDeviceModifier(device_independent_mask, oldMods, newMods, left_scancode); return; } @@ -329,10 +319,10 @@ - (NSArray *) validAttributesForMarkedText * change or if the bits don't both exist. */ if (left_device_dependent_mask & diff_mod) { - HandleModifierOneSide(keyboard, oldMods, newMods, left_scancode, left_device_dependent_mask); + HandleModifierOneSide(oldMods, newMods, left_scancode, left_device_dependent_mask); } if (right_device_dependent_mask & diff_mod) { - HandleModifierOneSide(keyboard, oldMods, newMods, right_scancode, right_device_dependent_mask); + HandleModifierOneSide(oldMods, newMods, right_scancode, right_device_dependent_mask); } } } @@ -343,8 +333,7 @@ - (NSArray *) validAttributesForMarkedText * can't still be down). */ static void -ReleaseModifierSide(int keyboard, - unsigned int device_independent_mask, +ReleaseModifierSide(unsigned int device_independent_mask, unsigned int oldMods, unsigned int newMods, SDL_scancode left_scancode, SDL_scancode right_scancode, @@ -362,7 +351,7 @@ - (NSArray *) validAttributesForMarkedText /* In this case, we can't detect the keyboard, so use the left side * to represent both, and release it. */ - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, left_scancode); + SDL_SendKeyboardKey(SDL_RELEASED, left_scancode); return; } @@ -373,10 +362,10 @@ - (NSArray *) validAttributesForMarkedText * so I hope this doesn't cause other problems. */ if ( left_device_dependent_mask & oldMods ) { - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, left_scancode); + SDL_SendKeyboardKey(SDL_RELEASED, left_scancode); } if ( right_device_dependent_mask & oldMods ) { - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, right_scancode); + SDL_SendKeyboardKey(SDL_RELEASED, right_scancode); } } @@ -384,7 +373,7 @@ - (NSArray *) validAttributesForMarkedText * This function handles the CapsLock case. */ static void -HandleCapsLock(int keyboard, unsigned short scancode, +HandleCapsLock(unsigned short scancode, unsigned int oldMods, unsigned int newMods) { unsigned int oldMask, newMask; @@ -393,16 +382,16 @@ - (NSArray *) validAttributesForMarkedText newMask = newMods & NSAlphaShiftKeyMask; if (oldMask != newMask) { - SDL_SendKeyboardKey(keyboard, SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); + SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_CAPSLOCK); + SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_CAPSLOCK); } oldMask = oldMods & NSNumericPadKeyMask; newMask = newMods & NSNumericPadKeyMask; if (oldMask != newMask) { - SDL_SendKeyboardKey(keyboard, SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); - SDL_SendKeyboardKey(keyboard, SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); + SDL_SendKeyboardKey(SDL_PRESSED, SDL_SCANCODE_NUMLOCKCLEAR); + SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_NUMLOCKCLEAR); } } @@ -410,7 +399,7 @@ - (NSArray *) validAttributesForMarkedText * correct side of the key. */ static void -DoSidedModifiers(int keyboard, unsigned short scancode, +DoSidedModifiers(unsigned short scancode, unsigned int oldMods, unsigned int newMods) { /* Set up arrays for the key syms for the left and right side. */ @@ -435,7 +424,7 @@ - (NSArray *) validAttributesForMarkedText unsigned int i, bit; /* Handle CAPSLOCK separately because it doesn't have a left/right side */ - HandleCapsLock(keyboard, scancode, oldMods, newMods); + HandleCapsLock(scancode, oldMods, newMods); /* Iterate through the bits, testing each against the old modifiers */ for (i = 0, bit = NSShiftKeyMask; bit <= NSCommandKeyMask; bit <<= 1, ++i) { @@ -448,7 +437,7 @@ - (NSArray *) validAttributesForMarkedText * and right side keys may alternate or both may be pressed. */ if (newMask) { - HandleModifierSide(keyboard, bit, oldMods, newMods, + HandleModifierSide(bit, oldMods, newMods, left_mapping[i], right_mapping[i], left_device_mapping[i], right_device_mapping[i]); } @@ -456,7 +445,7 @@ - (NSArray *) validAttributesForMarkedText * the device dependent bits to release the correct keys. */ else if (oldMask && oldMask != newMask) { - ReleaseModifierSide(keyboard, bit, oldMods, newMods, + ReleaseModifierSide(bit, oldMods, newMods, left_mapping[i], right_mapping[i], left_device_mapping[i], right_device_mapping[i]); } @@ -477,9 +466,9 @@ - (NSArray *) validAttributesForMarkedText * left side and right side modifiers is available. */ if (data->osversion >= 0x1030) { - DoSidedModifiers(data->keyboard, scancode, data->modifierFlags, modifierFlags); + DoSidedModifiers(scancode, data->modifierFlags, modifierFlags); } else { - DoUnsidedModifiers(data->keyboard, scancode, data->modifierFlags, modifierFlags); + DoUnsidedModifiers(scancode, data->modifierFlags, modifierFlags); } data->modifierFlags = modifierFlags; } @@ -549,7 +538,7 @@ - (NSArray *) validAttributesForMarkedText keymap[scancode] = s[0]; } } - SDL_SetKeymap(data->keyboard, 0, keymap, SDL_NUM_SCANCODES); + SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); return; } @@ -603,7 +592,7 @@ - (NSArray *) validAttributesForMarkedText keymap[scancode] = c; } } - SDL_SetKeymap(data->keyboard, 0, keymap, SDL_NUM_SCANCODES); + SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); return; } #endif @@ -613,10 +602,7 @@ - (NSArray *) validAttributesForMarkedText Cocoa_InitKeyboard(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_Keyboard keyboard; - SDL_zero(keyboard); - data->keyboard = SDL_AddKeyboard(&keyboard, -1); UpdateKeymap(data); /* Set our own names for the platform-dependent but layout-independent keys */ @@ -645,8 +631,6 @@ - (NSArray *) validAttributesForMarkedText [[SDLTranslatorResponder alloc] initWithFrame: NSMakeRect(0.0, 0.0, 0.0, 0.0)]; } - [data->fieldEdit setKeyboard: data->keyboard]; - if (![[data->fieldEdit superview] isEqual: parentView]) { // DEBUG_IME(@"add fieldEdit to window contentView"); @@ -686,7 +670,9 @@ - (NSArray *) validAttributesForMarkedText SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; unsigned short scancode = [event keyCode]; SDL_scancode code; +#if 0 const char *text; +#endif if ((scancode == 10 || scancode == 50) && KBGetLayoutType(LMGetKbdType()) == kKeyboardISO) { /* see comments in SDL_cocoakeys.h */ @@ -706,7 +692,7 @@ - (NSArray *) validAttributesForMarkedText /* See if we need to rebuild the keyboard layout */ UpdateKeymap(data); - SDL_SendKeyboardKey(data->keyboard, SDL_PRESSED, code); + SDL_SendKeyboardKey(SDL_PRESSED, code); #if 1 if (code == SDL_SCANCODE_UNKNOWN) { fprintf(stderr, "The key you just pressed is not recognized by SDL. To help get this fixed, report this to the SDL mailing list or to Christian Walther . Mac virtual key code is %d.\n", scancode); @@ -719,14 +705,14 @@ - (NSArray *) validAttributesForMarkedText #if 0 text = [[event characters] UTF8String]; if(text && *text) { - SDL_SendKeyboardText(data->keyboard, text); + SDL_SendKeyboardText(text); [data->fieldEdit setString:@""]; } #endif } break; case NSKeyUp: - SDL_SendKeyboardKey(data->keyboard, SDL_RELEASED, code); + SDL_SendKeyboardKey(SDL_RELEASED, code); break; case NSFlagsChanged: /* FIXME CW 2007-08-14: check if this whole mess that takes up half of this file is really necessary */ @@ -740,10 +726,6 @@ - (NSArray *) validAttributesForMarkedText void Cocoa_QuitKeyboard(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - NSAutoreleasePool *pool; - - SDL_DelKeyboard(data->keyboard); } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoamouse.m b/src/video/cocoa/SDL_cocoamouse.m index 1a71840c7..02ad198b4 100644 --- a/src/video/cocoa/SDL_cocoamouse.m +++ b/src/video/cocoa/SDL_cocoamouse.m @@ -29,11 +29,6 @@ void Cocoa_InitMouse(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_Mouse mouse; - - SDL_zero(mouse); - data->mouse = SDL_AddMouse(&mouse, "Mouse", 0, 0, 1); } static int @@ -54,10 +49,8 @@ void Cocoa_HandleMouseEvent(_THIS, NSEvent *event) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_Mouse *mouse = SDL_GetMouse(data->mouse); int i; - NSPoint point; + NSPoint point = { 0, 0 }; SDL_Window *window; /* See if there are any fullscreen windows that might handle this event */ @@ -73,44 +66,38 @@ point = [NSEvent mouseLocation]; point.x = point.x - bounds.x; point.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - point.y - bounds.y; - if (point.x < 0 || point.x >= candidate->w || - point.y < 0 || point.y >= candidate->h) { - /* The mouse is out of this fullscreen display */ - if (mouse->focus == candidate) { - SDL_SetMouseFocus(data->mouse, 0); - } - } else { + if ((point.x >= 0 && point.x < candidate->w) || + (point.y >= 0 && point.y < candidate->h)) { /* This is it! */ window = candidate; break; } } } - if (!window) { - return; - } /* Set the focus appropriately */ - if (mouse->focus != window) { - SDL_SetMouseFocus(data->mouse, window); + SDL_SetMouseFocus(window); + + if (window) { + return; } switch ([event type]) { case NSLeftMouseDown: case NSOtherMouseDown: case NSRightMouseDown: - SDL_SendMouseButton(data->mouse, SDL_PRESSED, ConvertMouseButtonToSDL([event buttonNumber])); + SDL_SendMouseButton(SDL_PRESSED, ConvertMouseButtonToSDL([event buttonNumber])); break; case NSLeftMouseUp: case NSOtherMouseUp: case NSRightMouseUp: - SDL_SendMouseButton(data->mouse, SDL_RELEASED, ConvertMouseButtonToSDL([event buttonNumber])); + SDL_SendMouseButton(SDL_RELEASED, ConvertMouseButtonToSDL([event buttonNumber])); break; case NSLeftMouseDragged: case NSRightMouseDragged: case NSOtherMouseDragged: /* usually middle mouse dragged */ case NSMouseMoved: - SDL_SendMouseMotion(data->mouse, 0, (int)point.x, (int)point.y, 0); + SDL_SendMouseMotion(0, (int)point.x, (int)point.y); break; default: /* just to avoid compiler warnings */ break; @@ -120,9 +107,6 @@ void Cocoa_QuitMouse(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - SDL_DelMouse(data->mouse); } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/cocoa/SDL_cocoavideo.h b/src/video/cocoa/SDL_cocoavideo.h index 0ddb91a7c..8f12dc056 100644 --- a/src/video/cocoa/SDL_cocoavideo.h +++ b/src/video/cocoa/SDL_cocoavideo.h @@ -57,8 +57,6 @@ typedef struct SDL_VideoData { SInt32 osversion; unsigned int modifierFlags; - int mouse; - int keyboard; void *key_layout; SDLTranslatorResponder *fieldEdit; Uint32 screensaver_activity; diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index 110b839a1..1f3fc515e 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -126,28 +126,21 @@ - (void)windowDidDeminiaturize:(NSNotification *)aNotification - (void)windowDidBecomeKey:(NSNotification *)aNotification { - int index; - /* We're going to get keyboard events, since we're key. */ - index = _data->videodata->keyboard; - SDL_SetKeyboardFocus(index, _data->window); + SDL_SetKeyboardFocus(_data->window); } - (void)windowDidResignKey:(NSNotification *)aNotification { - int index; - SDL_Mouse *mouse; - /* Some other window will get mouse events, since we're not key. */ - index = _data->videodata->mouse; - mouse = SDL_GetMouse(index); - if (mouse->focus == _data->window) { - SDL_SetMouseFocus(index, 0); + if (SDL_GetMouseFocus() == _data->window) { + SDL_SetMouseFocus(NULL); } /* Some other window will get keyboard events, since we're not key. */ - index = _data->videodata->keyboard; - SDL_SetKeyboardFocus(index, 0); + if (SDL_GetKeyboardFocus() == _data->window) { + SDL_SetKeyboardFocus(NULL); + } } - (void)windowDidHide:(NSNotification *)aNotification @@ -162,10 +155,8 @@ - (void)windowDidUnhide:(NSNotification *)aNotification - (void)mouseDown:(NSEvent *)theEvent { - int index; int button; - index = _data->videodata->mouse; switch ([theEvent buttonNumber]) { case 0: button = SDL_BUTTON_LEFT; @@ -180,7 +171,7 @@ - (void)mouseDown:(NSEvent *)theEvent button = [theEvent buttonNumber]; break; } - SDL_SendMouseButton(index, SDL_PRESSED, button); + SDL_SendMouseButton(SDL_PRESSED, button); } - (void)rightMouseDown:(NSEvent *)theEvent @@ -195,10 +186,8 @@ - (void)otherMouseDown:(NSEvent *)theEvent - (void)mouseUp:(NSEvent *)theEvent { - int index; int button; - index = _data->videodata->mouse; switch ([theEvent buttonNumber]) { case 0: button = SDL_BUTTON_LEFT; @@ -213,7 +202,7 @@ - (void)mouseUp:(NSEvent *)theEvent button = [theEvent buttonNumber]; break; } - SDL_SendMouseButton(index, SDL_RELEASED, button); + SDL_SendMouseButton(SDL_RELEASED, button); } - (void)rightMouseUp:(NSEvent *)theEvent @@ -229,24 +218,18 @@ - (void)otherMouseUp:(NSEvent *)theEvent - (void)mouseMoved:(NSEvent *)theEvent { SDL_Window *window = _data->window; - int index; - SDL_Mouse *mouse; NSPoint point; - index = _data->videodata->mouse; - mouse = SDL_GetMouse(index); point = [theEvent locationInWindow]; point.y = window->h - point.y; if ( point.x < 0 || point.x >= window->w || point.y < 0 || point.y >= window->h ) { - if (mouse->focus != 0) { - SDL_SetMouseFocus(index, 0); + if (SDL_GetMouseFocus() == window) { + SDL_SetMouseFocus(NULL); } } else { - if (mouse->focus != _data->window) { - SDL_SetMouseFocus(index, _data->window); - } - SDL_SendMouseMotion(index, 0, (int)point.x, (int)point.y, 0); + SDL_SetMouseFocus(_data->window); + SDL_SendMouseMotion(0, (int)point.x, (int)point.y); } } @@ -267,10 +250,7 @@ - (void)otherMouseDragged:(NSEvent *)theEvent - (void)scrollWheel:(NSEvent *)theEvent { - int index; - - index = _data->videodata->mouse; - SDL_SendMouseWheel(index, (int)([theEvent deltaX]+0.9f), (int)([theEvent deltaY]+0.9f)); + SDL_SendMouseWheel((int)([theEvent deltaX]+0.9f), (int)([theEvent deltaY]+0.9f)); } @end @@ -361,9 +341,8 @@ - (BOOL)canBecomeMainWindow window->flags &= ~SDL_WINDOW_MINIMIZED; } if ([nswindow isKeyWindow]) { - int index = data->videodata->keyboard; window->flags |= SDL_WINDOW_INPUT_FOCUS; - SDL_SetKeyboardFocus(index, data->window); + SDL_SetKeyboardFocus(data->window); if (window->flags & SDL_WINDOW_INPUT_GRABBED) { /* FIXME */ @@ -385,8 +364,6 @@ - (BOOL)canBecomeMainWindow NSRect rect; SDL_Rect bounds; unsigned int style; - NSString *title; - int status; Cocoa_GetDisplayBounds(_this, display, &bounds); if ((window->flags & SDL_WINDOW_FULLSCREEN) @@ -452,7 +429,6 @@ - (BOOL)canBecomeMainWindow NSAutoreleasePool *pool; NSWindow *nswindow = (NSWindow *) data; NSString *title; - int status; pool = [[NSAutoreleasePool alloc] init]; @@ -625,7 +601,7 @@ - (BOOL)canBecomeMainWindow SDL_bool Cocoa_GetWindowWMInfo(_THIS, SDL_Window * window, SDL_SysWMinfo * info) { - NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; + //NSWindow *nswindow = ((SDL_WindowData *) window->driverdata)->nswindow; if (info->version.major <= SDL_MAJOR_VERSION) { //info->window = nswindow; diff --git a/src/video/uikit/SDL_uikitview.h b/src/video/uikit/SDL_uikitview.h index a2f182b32..3e0315704 100644 --- a/src/video/uikit/SDL_uikitview.h +++ b/src/video/uikit/SDL_uikitview.h @@ -38,8 +38,10 @@ #else @interface SDL_uikitview : UIView { #endif - + +#if FIXME_MULTITOUCH SDL_Mouse mice[MAX_SIMULTANEOUS_TOUCHES]; +#endif #if SDL_IPHONE_KEYBOARD UITextField *textField; diff --git a/src/video/uikit/SDL_uikitview.m b/src/video/uikit/SDL_uikitview.m index e3dc19ec7..da03d0c2e 100644 --- a/src/video/uikit/SDL_uikitview.m +++ b/src/video/uikit/SDL_uikitview.m @@ -47,6 +47,7 @@ - (id)initWithFrame:(CGRect)frame { [self initializeKeyboard]; #endif +#if FIXME_MULTITOUCH int i; for (i=0; ivideodata; - if (videodata->wintabDLL - && videodata->WTPacket((HCTX) lParam, (UINT) wParam, &packet)) { - SDL_ChangeEnd(tablet, (int) packet.pkCursor); - pressure = (int) packet.pkNormalPressure; - } - } - break; - - case WT_PROXIMITY: - { - /* checking where the proximity message showed up */ - int h_context = LOWORD(lParam); - POINT point; - GetCursorPos(&point); - ScreenToClient(hwnd, &point); - - /* are we in proximity or out of proximity */ - if (h_context == 0) { - SDL_SendProximity(tablet, point.x, point.y, SDL_PROXIMITYOUT); - } else { - SDL_SendProximity(tablet, point.x, point.y, SDL_PROXIMITYIN); - } - } - break; - case WM_SHOWWINDOW: { if (wParam) { @@ -183,13 +146,9 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_ACTIVATE: { - int index; - SDL_Keyboard *keyboard; BOOL minimized; minimized = HIWORD(wParam); - index = data->videodata->keyboard; - keyboard = SDL_GetKeyboard(index); if (!minimized && (LOWORD(wParam) != WA_INACTIVE)) { SDL_SendWindowEvent(data->window, SDL_WINDOWEVENT_SHOWN, 0, 0); SDL_SendWindowEvent(data->window, @@ -200,13 +159,13 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) SDL_WINDOWEVENT_MAXIMIZED, 0, 0); } #endif - if (keyboard && keyboard->focus != data->window) { - SDL_SetKeyboardFocus(index, data->window); + if (SDL_GetKeyboardFocus() != data->window) { + SDL_SetKeyboardFocus(data->window); } /* FIXME: Update keyboard state */ } else { - if (keyboard && keyboard->focus == data->window) { - SDL_SetKeyboardFocus(index, 0); + if (SDL_GetKeyboardFocus() == data->window) { + SDL_SetKeyboardFocus(NULL); } if (minimized) { SDL_SendWindowEvent(data->window, @@ -217,124 +176,22 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) returnCode = 0; break; -/* WinCE has no RawInput, so we use the classic mouse events. - In classic Win32 this is done by WM_INPUT - */ -#ifdef _WIN32_WCE case WM_MOUSEMOVE: - SDL_SendMouseMotion(0, 0, LOWORD(lParam), HIWORD(lParam), 0); + SDL_SendMouseMotion(0, LOWORD(lParam), HIWORD(lParam)); break; case WM_LBUTTONDOWN: - SDL_SendMouseMotion(0, 0, LOWORD(lParam), HIWORD(lParam), 0); - SDL_SendMouseButton(0, SDL_PRESSED, SDL_BUTTON_LEFT); + SDL_SendMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT); break; case WM_LBUTTONUP: - SDL_SendMouseMotion(0, 0, LOWORD(lParam), HIWORD(lParam), 0); - SDL_SendMouseButton(0, SDL_RELEASED, SDL_BUTTON_LEFT); - break; -#else /* _WIN32_WCE */ - - case WM_INPUT: /* mouse events */ - { - LPBYTE lpb; - const RAWINPUTHEADER *header; - int index = -1; - int i; - int size = 0; - const RAWMOUSE *raw_mouse = NULL; - POINT point; - USHORT flags; - int w, h; - - /* we're collecting raw data to be able to identify the mouse (if there are several) */ - GetRawInputData((HRAWINPUT) lParam, RID_INPUT, NULL, &size, - sizeof(RAWINPUTHEADER)); - lpb = SDL_stack_alloc(BYTE, size); - GetRawInputData((HRAWINPUT) lParam, RID_INPUT, lpb, &size, - sizeof(RAWINPUTHEADER)); - raw = (RAWINPUT *) lpb; - header = &raw->header; - flags = raw->data.mouse.usButtonFlags; - - /* we're checking which mouse generated the event */ - for (i = 0; i < total_mice; ++i) { - if (mice[i] == header->hDevice) { - index = i; - break; - } - } - if (index < 0) { - /* New mouse? Should we dynamically update mouse list? */ - returnCode = 0; - break; - } - - GetCursorPos(&point); - ScreenToClient(hwnd, &point); - - SDL_GetWindowSize(data->window, &w, &h); - if (point.x >= 0 && point.y >= 0 && point.x < w && point.y < h) { - SDL_SetMouseFocus(index, data->window); - } else { - SDL_SetMouseFocus(index, 0); - /* FIXME: Should we be doing anything else here? */ - break; - } - - /* if the message was sent by a tablet we have to send also pressure */ - if (index == tablet) { - SDL_SendMouseMotion(index, 0, point.x, point.y, pressure); - } else { - SDL_SendMouseMotion(index, 0, point.x, point.y, 0); - } - /* we're sending mouse buttons messages to check up if sth changed */ - if (flags & RI_MOUSE_LEFT_BUTTON_DOWN) { - SDL_SendMouseButton(index, SDL_PRESSED, SDL_BUTTON_LEFT); - } else if (flags & RI_MOUSE_LEFT_BUTTON_UP) { - SDL_SendMouseButton(index, SDL_RELEASED, SDL_BUTTON_LEFT); - } - if (flags & RI_MOUSE_MIDDLE_BUTTON_DOWN) { - SDL_SendMouseButton(index, SDL_PRESSED, SDL_BUTTON_MIDDLE); - } else if (flags & RI_MOUSE_MIDDLE_BUTTON_UP) { - SDL_SendMouseButton(index, SDL_RELEASED, SDL_BUTTON_MIDDLE); - } - if (flags & RI_MOUSE_RIGHT_BUTTON_DOWN) { - SDL_SendMouseButton(index, SDL_PRESSED, SDL_BUTTON_RIGHT); - } else if (flags & RI_MOUSE_RIGHT_BUTTON_UP) { - SDL_SendMouseButton(index, SDL_RELEASED, SDL_BUTTON_RIGHT); - } - if (flags & RI_MOUSE_BUTTON_4_DOWN) { - SDL_SendMouseButton(index, SDL_PRESSED, SDL_BUTTON_X1); - } else if (flags & RI_MOUSE_BUTTON_4_UP) { - SDL_SendMouseButton(index, SDL_RELEASED, SDL_BUTTON_X1); - } - if (flags & RI_MOUSE_BUTTON_5_DOWN) { - SDL_SendMouseButton(index, SDL_PRESSED, SDL_BUTTON_X2); - } else if (flags & RI_MOUSE_BUTTON_5_UP) { - SDL_SendMouseButton(index, SDL_RELEASED, SDL_BUTTON_X2); - } - if (flags & RI_MOUSE_WHEEL) { - SDL_SendMouseWheel(index, 0, - (short) raw->data.mouse.usButtonData); - } - SDL_stack_free(lpb); - } - returnCode = 0; + SDL_SendMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT); break; -#endif /* _WIN32_WCE */ case WM_MOUSELEAVE: { - int i; - - for (i = 0; i < SDL_GetNumMice(); ++i) { - SDL_Mouse *mouse = SDL_GetMouse(i); - - if (mouse->focus == data->window) { - SDL_SetMouseFocus(i, 0); - } + if (SDL_GetMouseFocus() == data->window) { + SDL_SetMouseFocus(NULL); } } returnCode = 0; @@ -343,15 +200,12 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_SYSKEYDOWN: case WM_KEYDOWN: { - int index; - /* Ignore repeated keys */ if (lParam & REPEATED_KEYMASK) { returnCode = 0; break; } - index = data->videodata->keyboard; wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: @@ -388,7 +242,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) break; } if (wParam < 256) { - SDL_SendKeyboardKey(index, SDL_PRESSED, + SDL_SendKeyboardKey(SDL_PRESSED, data->videodata->key_layout[wParam]); } } @@ -398,9 +252,6 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_SYSKEYUP: case WM_KEYUP: { - int index; - - index = data->videodata->keyboard; wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: @@ -441,11 +292,11 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) if (wParam == VK_SNAPSHOT && SDL_GetKeyboardState(NULL)[SDL_SCANCODE_PRINTSCREEN] == SDL_RELEASED) { - SDL_SendKeyboardKey(index, SDL_PRESSED, + SDL_SendKeyboardKey(SDL_PRESSED, data->videodata->key_layout[wParam]); } if (wParam < 256) { - SDL_SendKeyboardKey(index, SDL_RELEASED, + SDL_SendKeyboardKey(SDL_RELEASED, data->videodata->key_layout[wParam]); } } @@ -470,14 +321,14 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) text[2] = 0x80 | (char) (wParam & 0x3F); text[3] = '\0'; } - SDL_SendKeyboardText(data->videodata->keyboard, text); + SDL_SendKeyboardText(text); } returnCode = 0; break; case WM_INPUTLANGCHANGE: { - WIN_UpdateKeymap(data->videodata->keyboard); + WIN_UpdateKeymap(); } returnCode = 1; break; diff --git a/src/video/win32/SDL_win32keyboard.c b/src/video/win32/SDL_win32keyboard.c index d975be28e..fb4e0ff41 100644 --- a/src/video/win32/SDL_win32keyboard.c +++ b/src/video/win32/SDL_win32keyboard.c @@ -50,7 +50,6 @@ void WIN_InitKeyboard(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_Keyboard keyboard; int i; /* Make sure the alpha scancodes are correct. T isn't usually remapped */ @@ -82,9 +81,7 @@ WIN_InitKeyboard(_THIS) data->key_layout = win32_scancode_table; - SDL_zero(keyboard); - data->keyboard = SDL_AddKeyboard(&keyboard, -1); - WIN_UpdateKeymap(data->keyboard); + WIN_UpdateKeymap(); SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); SDL_SetScancodeName(SDL_SCANCODE_LGUI, "Left Windows"); @@ -92,7 +89,7 @@ WIN_InitKeyboard(_THIS) } void -WIN_UpdateKeymap(int keyboard) +WIN_UpdateKeymap() { int i; SDL_scancode scancode; @@ -117,15 +114,12 @@ WIN_UpdateKeymap(int keyboard) keymap[scancode] = (MapVirtualKey(i, MAPVK_VK_TO_CHAR) & 0x7FFF); } } - SDL_SetKeymap(keyboard, 0, keymap, SDL_NUM_SCANCODES); + SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); } void WIN_QuitKeyboard(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - SDL_DelKeyboard(data->keyboard); } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/win32/SDL_win32keyboard.h b/src/video/win32/SDL_win32keyboard.h index dd5b28de6..c67410a63 100644 --- a/src/video/win32/SDL_win32keyboard.h +++ b/src/video/win32/SDL_win32keyboard.h @@ -28,7 +28,7 @@ extern BYTE alpha_scancodes[26]; extern BYTE keypad_scancodes[10]; extern void WIN_InitKeyboard(_THIS); -extern void WIN_UpdateKeymap(int keyboard); +extern void WIN_UpdateKeymap(void); extern void WIN_QuitKeyboard(_THIS); #endif /* _SDL_win32keyboard_h */ diff --git a/src/video/win32/SDL_win32modes.c b/src/video/win32/SDL_win32modes.c index f8cfde9a5..847e08343 100644 --- a/src/video/win32/SDL_win32modes.c +++ b/src/video/win32/SDL_win32modes.c @@ -160,7 +160,6 @@ WIN_AddDisplay(LPTSTR DeviceName) int WIN_InitModes(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; DWORD i, j, count; DISPLAY_DEVICE device; diff --git a/src/video/win32/SDL_win32mouse.c b/src/video/win32/SDL_win32mouse.c index ca9847f05..093720bcb 100644 --- a/src/video/win32/SDL_win32mouse.c +++ b/src/video/win32/SDL_win32mouse.c @@ -31,182 +31,14 @@ #include "SDL_win32video.h" -#include "../../events/SDL_mouse_c.h" - -extern HANDLE *mice; -extern int total_mice; -extern int tablet; - void WIN_InitMouse(_THIS) { - int index = 0; - RAWINPUTDEVICELIST *deviceList = NULL; - int devCount = 0; - int i; - UINT tmp = 0; - char *buffer = NULL; - char *tab = "wacom"; /* since windows does't give us handles to tablets, we have to detect a tablet by it's name */ - const char *rdp = "rdp_mou"; - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - -/* WinCE has no RawInputDeviceList */ -#ifdef _WIN32_WCE - SDL_Mouse mouse; - SDL_zero(mouse); - mouse.id = 0; - SDL_AddMouse(&mouse, "Stylus", 0, 0, 1); -#else - /* we're checking for the number of rawinput devices */ - if (GetRawInputDeviceList(NULL, &devCount, sizeof(RAWINPUTDEVICELIST))) { - return; - } - - deviceList = SDL_malloc(sizeof(RAWINPUTDEVICELIST) * devCount); - - /* we're getting the raw input device list */ - GetRawInputDeviceList(deviceList, &devCount, sizeof(RAWINPUTDEVICELIST)); - mice = SDL_malloc(devCount * sizeof(HANDLE)); - - /* we're getting the details of the devices */ - for (i = 0; i < devCount; ++i) { - int is_rdp = 0; - UINT j; - UINT k; - char *default_device_name = "Pointing device xx"; - const char *reg_key_root = "System\\CurrentControlSet\\Enum\\"; - char *device_name = SDL_malloc(256 * sizeof(char)); - char *key_name = NULL; - char *tmp_name = NULL; - LONG rc = 0; - HKEY hkey; - DWORD regtype = REG_SZ; - DWORD out = 256 * sizeof(char); - SDL_Mouse mouse; - size_t l; - if (deviceList[i].dwType != RIM_TYPEMOUSE) { /* if a device isn't a mouse type we don't want it */ - continue; - } - if (GetRawInputDeviceInfoA - (deviceList[i].hDevice, RIDI_DEVICENAME, NULL, &tmp) < 0) { - continue; - } - buffer = SDL_malloc((tmp + 1) * sizeof(char)); - key_name = - SDL_malloc((tmp + SDL_strlen(reg_key_root) + 1) * sizeof(char)); - - /* we're getting the device registry path and polishing it to get it's name, - surely there must be an easier way, but we haven't found it yet */ - if (GetRawInputDeviceInfoA - (deviceList[i].hDevice, RIDI_DEVICENAME, buffer, &tmp) < 0) { - continue; - } - buffer += 4; - tmp -= 4; - tmp_name = buffer; - for (j = 0; j < tmp; ++j) { - if (*tmp_name == '#') { - *tmp_name = '\\'; - } - - else if (*tmp_name == '{') { - break; - } - ++tmp_name; - } - *tmp_name = '\0'; - SDL_memcpy(key_name, reg_key_root, SDL_strlen(reg_key_root)); - SDL_memcpy(key_name + (SDL_strlen(reg_key_root)), buffer, j + 1); - l = SDL_strlen(key_name); - is_rdp = 0; - if (l >= 7) { - for (j = 0; j < l - 7; ++j) { - for (k = 0; k < 7; ++k) { - if (rdp[k] != - SDL_tolower((unsigned char) key_name[j + k])) { - break; - } - } - if (k == 7) { - is_rdp = 1; - break; - } - } - } - - buffer -= 4; - - if (is_rdp == 1) { - SDL_free(buffer); - SDL_free(key_name); - SDL_free(device_name); - is_rdp = 0; - continue; - } - - /* we're opening the registry key to get the mouse name */ - rc = RegOpenKeyExA(HKEY_LOCAL_MACHINE, key_name, 0, KEY_READ, &hkey); - if (rc != ERROR_SUCCESS) { - SDL_memcpy(device_name, default_device_name, - SDL_strlen(default_device_name)); - } - rc = RegQueryValueExA(hkey, "DeviceDesc", NULL, ®type, device_name, - &out); - RegCloseKey(hkey); - if (rc != ERROR_SUCCESS) { - SDL_memcpy(device_name, default_device_name, - SDL_strlen(default_device_name)); - } - - /* we're saving the handle to the device */ - mice[index] = deviceList[i].hDevice; - SDL_zero(mouse); - mouse.id = index; - l = SDL_strlen(device_name); - - /* we're checking if the device isn't by any chance a tablet */ - if (data->wintabDLL && tablet == -1) { - for (j = 0; j < l - 5; ++j) { - for (k = 0; k < 5; ++k) { - if (tab[k] != - SDL_tolower((unsigned char) device_name[j + k])) { - break; - } - } - if (k == 5) { - tablet = index; - break; - } - } - } - - /* if it's a tablet, let's read it's maximum and minimum pressure */ - if (tablet == index) { - AXIS pressure; - int cursors; - data->WTInfoA(WTI_DEVICES, DVC_NPRESSURE, &pressure); - data->WTInfoA(WTI_DEVICES, DVC_NCSRTYPES, &cursors); - SDL_AddMouse(&mouse, device_name, pressure.axMax, pressure.axMin, - cursors); - } else { - SDL_AddMouse(&mouse, device_name, 0, 0, 1); - } - ++index; - SDL_free(buffer); - SDL_free(key_name); - } - total_mice = index; - SDL_free(deviceList); -#endif /*_WIN32_WCE*/ } void WIN_QuitMouse(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - /* let's delete all of the mice */ - SDL_MouseQuit(); } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/win32/SDL_win32video.c b/src/video/win32/SDL_win32video.c index 1ee4f64b2..c93d4f72e 100644 --- a/src/video/win32/SDL_win32video.c +++ b/src/video/win32/SDL_win32video.c @@ -35,11 +35,6 @@ static int WIN_VideoInit(_THIS); static void WIN_VideoQuit(_THIS); -int total_mice = 0; /* total mouse count */ -HANDLE *mice = NULL; /* the handles to the detected mice */ -HCTX *g_hCtx = NULL; /* handles to tablet contexts */ -int tablet = -1; /* we're assuming that there is no tablet */ - /* WIN32 driver bootstrap functions */ static int @@ -66,9 +61,6 @@ WIN_DeleteDevice(SDL_VideoDevice * device) FreeLibrary(data->ddrawDLL); } #endif - if (data->wintabDLL) { - FreeLibrary(data->wintabDLL); - } SDL_free(device->driverdata); SDL_free(device); } @@ -85,8 +77,10 @@ WIN_CreateDevice(int devindex) device = (SDL_VideoDevice *) SDL_calloc(1, sizeof(SDL_VideoDevice)); if (device) { data = (struct SDL_VideoData *) SDL_calloc(1, sizeof(SDL_VideoData)); + } else { + data = NULL; } - if (!device || !data) { + if (!data) { SDL_OutOfMemory(); if (device) { SDL_free(device); @@ -131,32 +125,6 @@ WIN_CreateDevice(int devindex) } #endif /* SDL_VIDEO_RENDER_DDRAW */ - data->wintabDLL = LoadLibrary(TEXT("WINTAB32.DLL")); - if (data->wintabDLL) { -#define PROCNAME(X) #X - data->WTInfoA = - (UINT(*)(UINT, UINT, LPVOID)) GetProcAddress(data->wintabDLL, - PROCNAME(WTInfoA)); - data->WTOpenA = - (HCTX(*)(HWND, LPLOGCONTEXTA, BOOL)) GetProcAddress(data-> - wintabDLL, - PROCNAME - (WTOpenA)); - data->WTPacket = - (int (*)(HCTX, UINT, LPVOID)) GetProcAddress(data->wintabDLL, - PROCNAME(WTPacket)); - data->WTClose = - (BOOL(*)(HCTX)) GetProcAddress(data->wintabDLL, - PROCNAME(WTClose)); -#undef PROCNAME - - if (!data->WTInfoA || !data->WTOpenA || !data->WTPacket - || !data->WTClose) { - FreeLibrary(data->wintabDLL); - data->wintabDLL = NULL; - } - } - /* Set the function pointers */ device->VideoInit = WIN_VideoInit; device->VideoQuit = WIN_VideoQuit; @@ -225,7 +193,6 @@ WIN_VideoInit(_THIS) GAPI_AddRenderDriver(_this); #endif - g_hCtx = SDL_malloc(sizeof(HCTX)); WIN_InitKeyboard(_this); WIN_InitMouse(_this); @@ -238,7 +205,6 @@ WIN_VideoQuit(_THIS) WIN_QuitModes(_this); WIN_QuitKeyboard(_this); WIN_QuitMouse(_this); - SDL_free(g_hCtx); } /* vim: set ts=4 sw=4 expandtab: */ diff --git a/src/video/win32/SDL_win32video.h b/src/video/win32/SDL_win32video.h index fb1e96f96..3cfb63219 100644 --- a/src/video/win32/SDL_win32video.h +++ b/src/video/win32/SDL_win32video.h @@ -45,11 +45,6 @@ #include "ddraw.h" #endif -#include "wactab/wintab.h" -#define PACKETDATA ( PK_X | PK_Y | PK_BUTTONS | PK_NORMAL_PRESSURE | PK_CURSOR) -#define PACKETMODE 0 -#include "wactab/pktdef.h" - #include "SDL_win32events.h" #include "SDL_win32gamma.h" #include "SDL_win32keyboard.h" @@ -79,16 +74,6 @@ typedef struct SDL_VideoData IDirectDraw *ddraw; #endif -/* *INDENT-OFF* */ - /* Function pointers for the Wacom API */ - HANDLE wintabDLL; - UINT (*WTInfoA) (UINT, UINT, LPVOID); - HCTX (*WTOpenA) (HWND, LPLOGCONTEXTA, BOOL); - int (*WTPacket) (HCTX, UINT, LPVOID); - BOOL (*WTClose) (HCTX); -/* *INDENT-ON* */ - - int keyboard; const SDL_scancode *key_layout; } SDL_VideoData; diff --git a/src/video/win32/SDL_win32window.c b/src/video/win32/SDL_win32window.c index f69d38573..fc1cd154f 100644 --- a/src/video/win32/SDL_win32window.c +++ b/src/video/win32/SDL_win32window.c @@ -73,9 +73,6 @@ CE_SHFullScreen(HWND hwndRequester, DWORD dwState) #endif -extern HCTX *g_hCtx; /* the table of tablet event contexts, each windows has to have it's own tablet context */ -static Uint32 highestId = 0; /* the highest id of the tablet context */ - /* Fake window to help with DirectInput events. */ HWND SDL_HelperWindow = NULL; static WCHAR *SDL_HelperWindowClassName = TEXT("SDLHelperWindowInputCatcher"); @@ -165,9 +162,8 @@ SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created) } } if (GetFocus() == hwnd) { - int index = data->videodata->keyboard; window->flags |= SDL_WINDOW_INPUT_FOCUS; - SDL_SetKeyboardFocus(index, data->window); + SDL_SetKeyboardFocus(data->window); if (window->flags & SDL_WINDOW_INPUT_GRABBED) { RECT rect; @@ -186,11 +182,7 @@ SetupWindowData(_THIS, SDL_Window * window, HWND hwnd, SDL_bool created) int WIN_CreateWindow(_THIS, SDL_Window * window) { - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; SDL_VideoDisplay *display = window->display; - RAWINPUTDEVICE Rid; - AXIS TabX, TabY; - LOGCONTEXTA lc; HWND hwnd; HWND top; RECT rect; @@ -257,48 +249,6 @@ WIN_CreateWindow(_THIS, SDL_Window * window) return -1; } - /* we're configuring the tablet data. See Wintab reference for more info */ - if (videodata->wintabDLL - && videodata->WTInfoA(WTI_DEFSYSCTX, 0, &lc) != 0) { - lc.lcPktData = PACKETDATA; - lc.lcPktMode = PACKETMODE; - lc.lcOptions |= CXO_MESSAGES; - lc.lcOptions |= CXO_SYSTEM; - lc.lcMoveMask = PACKETDATA; - lc.lcBtnDnMask = lc.lcBtnUpMask = PACKETDATA; - videodata->WTInfoA(WTI_DEVICES, DVC_X, &TabX); - videodata->WTInfoA(WTI_DEVICES, DVC_Y, &TabY); - lc.lcInOrgX = 0; - lc.lcInOrgY = 0; - lc.lcInExtX = TabX.axMax; - lc.lcInExtY = TabY.axMax; - lc.lcOutOrgX = 0; - lc.lcOutOrgY = 0; - lc.lcOutExtX = GetSystemMetrics(SM_CXSCREEN); - lc.lcOutExtY = -GetSystemMetrics(SM_CYSCREEN); - if (window->id > highestId) { - HCTX *tmp_hctx; - highestId = window->id; - tmp_hctx = - (HCTX *) SDL_realloc(g_hCtx, (highestId + 1) * sizeof(HCTX)); - if (!tmp_hctx) { - SDL_OutOfMemory(); - DestroyWindow(hwnd); - return -1; - } - g_hCtx = tmp_hctx; - } - g_hCtx[window->id] = videodata->WTOpenA(hwnd, &lc, TRUE); - } -#ifndef _WIN32_WCE /* has no RawInput */ - /* we're telling the window, we want it to report raw input events from mice */ - Rid.usUsagePage = 0x01; - Rid.usUsage = 0x02; - Rid.dwFlags = RIDEV_INPUTSINK; - Rid.hwndTarget = hwnd; - RegisterRawInputDevices(&Rid, 1, sizeof(Rid)); -#endif - WIN_PumpEvents(_this); if (SetupWindowData(_this, window, hwnd, SDL_TRUE) < 0) { @@ -620,15 +570,11 @@ WIN_SetWindowGrab(_THIS, SDL_Window * window) void WIN_DestroyWindow(_THIS, SDL_Window * window) { - SDL_VideoData *videodata = (SDL_VideoData *) _this->driverdata; SDL_WindowData *data = (SDL_WindowData *) window->driverdata; if (data) { ReleaseDC(data->hwnd, data->hdc); if (data->created) { - if (videodata->wintabDLL) { - videodata->WTClose(g_hCtx[window->id]); - } DestroyWindow(data->hwnd); } SDL_free(data); diff --git a/src/video/win32/wactab/pktdef.h b/src/video/win32/wactab/pktdef.h deleted file mode 100644 index 4c8f573d8..000000000 --- a/src/video/win32/wactab/pktdef.h +++ /dev/null @@ -1,237 +0,0 @@ -/* *INDENT-OFF* */ -/* -------------------------------- pktdef.h -------------------------------- */ -/* Combined 16 & 32-bit version. */ - -/*------------------------------------------------------------------------------ -The text and information contained in this file may be freely used, -copied, or distributed without compensation or licensing restrictions. - -This file is copyright 1991-1998 by LCS/Telegraphics. -------------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------------ - -How to use pktdef.h: - -1. Include wintab.h -2. if using just one packet format: - a. Define PACKETDATA and PACKETMODE as or'ed combinations of WTPKT bits - (use the PK_* identifiers). - b. Include pktdef.h. - c. The generated structure typedef will be called PACKET. Use PACKETDATA - and PACKETMODE to fill in the LOGCONTEXT structure. -3. If using multiple packet formats, for each one: - a. Define PACKETNAME. Its text value will be a prefix for this packet's - parameters and names. - b. Define PACKETDATA and PACKETMODE similar to - 2.a. above. - c. Include pktdef.h. - d. The generated structure typedef will be called - PACKET. Compare with 2.c. above and example #2 below. -4. If using extension packet data, do the following additional steps - for each extension: - a. Before including pktdef.h, define PACKET - as either PKEXT_ABSOLUTE or PKEXT_RELATIVE. - b. The generated structure typedef will contain a field for the - extension data. - c. Scan the WTI_EXTENSION categories to find the extension's - packet mask bit. - d. OR the packet mask bit with PACKETDATA and use the - result in the lcPktData field of the LOGCONTEXT structure. - e. If PACKET was PKEXT_RELATIVE, OR the - packet mask bit with PACKETMODE and use the result - in the lcPktMode field of the LOGCONTEXT structure. - - -Example #1. -- single packet format - -#include -#define PACKETDATA PK_X | PK_Y | PK_BUTTONS /@ x, y, buttons @/ -#define PACKETMODE PK_BUTTONS /@ buttons relative mode @/ -#include -... - lc.lcPktData = PACKETDATA; - lc.lcPktMode = PACKETMODE; - -Example #2. -- multiple formats - -#include -#define PACKETNAME MOE -#define MOEPACKETDATA PK_X | PK_Y | PK_BUTTONS /@ x, y, buttons @/ -#define MOEPACKETMODE PK_BUTTONS /@ buttons relative mode @/ -#include -#define PACKETNAME LARRY -#define LARRYPACKETDATA PK_Y | PK_Z | PK_BUTTONS /@ y, z, buttons @/ -#define LARRYPACKETMODE PK_BUTTONS /@ buttons relative mode @/ -#include -#define PACKETNAME CURLY -#define CURLYPACKETDATA PK_X | PK_Z | PK_BUTTONS /@ x, z, buttons @/ -#define CURLYPACKETMODE PK_BUTTONS /@ buttons relative mode @/ -#include -... - lcMOE.lcPktData = MOEPACKETDATA; - lcMOE.lcPktMode = MOEPACKETMODE; -... - lcLARRY.lcPktData = LARRYPACKETDATA; - lcLARRY.lcPktMode = LARRYPACKETMODE; -... - lcCURLY.lcPktData = CURLYPACKETDATA; - lcCURLY.lcPktMode = CURLYPACKETMODE; - -Example #3. -- extension packet data "XFOO". - -#include -#define PACKETDATA PK_X | PK_Y | PK_BUTTONS /@ x, y, buttons @/ -#define PACKETMODE PK_BUTTONS /@ buttons relative mode @/ -#define PACKETXFOO PKEXT_ABSOLUTE /@ XFOO absolute mode @/ -#include -... -UINT ScanExts(UINT wTag) -{ - UINT i; - UINT wScanTag; - - /@ scan for wTag's info category. @/ - for (i = 0; WTInfo(WTI_EXTENSIONS + i, EXT_TAG, &wScanTag); i++) { - if (wTag == wScanTag) { - /@ return category offset from WTI_EXTENSIONS. @/ - return i; - } - } - /@ return error code. @/ - return 0xFFFF; -} -... - lc.lcPktData = PACKETDATA; - lc.lcPktMode = PACKETMODE; -#ifdef PACKETXFOO - categoryXFOO = ScanExts(WTX_XFOO); - WTInfo(WTI_EXTENSIONS + categoryXFOO, EXT_MASK, &maskXFOO); - lc.lcPktData |= maskXFOO; -#if PACKETXFOO == PKEXT_RELATIVE - lc.lcPktMode |= maskXFOO; -#endif -#endif - WTOpen(hWnd, &lc, TRUE); - - -------------------------------------------------------------------------------*/ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef PACKETNAME - /* if no packet name prefix */ - #define __PFX(x) x - #define __IFX(x,y) x ## y -#else - /* add prefixes and infixes to packet format names */ - #define __PFX(x) __PFX2(PACKETNAME,x) - #define __PFX2(p,x) __PFX3(p,x) - #define __PFX3(p,x) p ## x - #define __IFX(x,y) __IFX2(x,PACKETNAME,y) - #define __IFX2(x,i,y) __IFX3(x,i,y) - #define __IFX3(x,i,y) x ## i ## y -#endif - -#define __SFX2(x,s) __SFX3(x,s) -#define __SFX3(x,s) x ## s - -#define __TAG __IFX(tag,PACKET) -#define __TYPES __PFX(PACKET), * __IFX(P,PACKET), NEAR * __IFX(NP,PACKET), \ - FAR * __IFX(LP,PACKET) - -#define __DATA (__PFX(PACKETDATA)) -#define __MODE (__PFX(PACKETMODE)) -#define __EXT(x) __SFX2(__PFX(PACKET),x) - - -typedef struct __TAG { - #if (__DATA & PK_CONTEXT) - HCTX pkContext; - #endif - #if (__DATA & PK_STATUS) - UINT pkStatus; - #endif - #if (__DATA & PK_TIME) - DWORD pkTime; - #endif - #if (__DATA & PK_CHANGED) - WTPKT pkChanged; - #endif - #if (__DATA & PK_SERIAL_NUMBER) - UINT pkSerialNumber; - #endif - #if (__DATA & PK_CURSOR) - UINT pkCursor; - #endif - #if (__DATA & PK_BUTTONS) - DWORD pkButtons; - #endif - #if (__DATA & PK_X) - LONG pkX; - #endif - #if (__DATA & PK_Y) - LONG pkY; - #endif - #if (__DATA & PK_Z) - LONG pkZ; - #endif - #if (__DATA & PK_NORMAL_PRESSURE) - #if (__MODE & PK_NORMAL_PRESSURE) - /* relative */ - int pkNormalPressure; - #else - /* absolute */ - UINT pkNormalPressure; - #endif - #endif - #if (__DATA & PK_TANGENT_PRESSURE) - #if (__MODE & PK_TANGENT_PRESSURE) - /* relative */ - int pkTangentPressure; - #else - /* absolute */ - UINT pkTangentPressure; - #endif - #endif - #if (__DATA & PK_ORIENTATION) - ORIENTATION pkOrientation; - #endif - #if (__DATA & PK_ROTATION) - ROTATION pkRotation; /* 1.1 */ - #endif - -#ifndef NOWTEXTENSIONS - /* extensions begin here. */ - #if (__EXT(FKEYS) == PKEXT_RELATIVE) || (__EXT(FKEYS) == PKEXT_ABSOLUTE) - UINT pkFKeys; - #endif - #if (__EXT(TILT) == PKEXT_RELATIVE) || (__EXT(TILT) == PKEXT_ABSOLUTE) - TILT pkTilt; - #endif - #if (__EXT(EXPKEYS) == PKEXT_RELATIVE) || (__EXT(EXPKEYS) == PKEXT_ABSOLUTE) - WORD pkExpKeys[4]; /* 1.3 */ - #endif -#endif - -} __TYPES ; - -#undef PACKETNAME -#undef __TAG -#undef __TAG2 -#undef __TYPES -#undef __TYPES2 -#undef __DATA -#undef __MODE -#undef __PFX -#undef __PFX2 -#undef __PFX3 -#undef __IFX -#undef __IFX2 -#undef __IFX3 -#undef __SFX2 -#undef __SFX3 - -#ifdef __cplusplus -} -#endif /* __cplusplus */ diff --git a/src/video/win32/wactab/wintab.h b/src/video/win32/wactab/wintab.h deleted file mode 100644 index d1f495e8e..000000000 --- a/src/video/win32/wactab/wintab.h +++ /dev/null @@ -1,866 +0,0 @@ -/* *INDENT-OFF* */ -/* -------------------------------- wintab.h -------------------------------- */ -/* Combined 16 & 32-bit version. */ - -/*------------------------------------------------------------------------------ -The text and information contained in this file may be freely used, -copied, or distributed without compensation or licensing restrictions. - -This file is copyright 1991-1998 by LCS/Telegraphics. -------------------------------------------------------------------------------*/ - -#ifndef _INC_WINTAB /* prevent multiple includes */ -#define _INC_WINTAB - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* -------------------------------------------------------------------------- */ -/* Messages */ -#ifndef NOWTMESSAGES - - #define WT_DEFBASE 0x7FF0 - #define WT_MAXOFFSET 0xF - - #define _WT_PACKET(b) ((b)+0) - #define _WT_CTXOPEN(b) ((b)+1) - #define _WT_CTXCLOSE(b) ((b)+2) - #define _WT_CTXUPDATE(b) ((b)+3) - #define _WT_CTXOVERLAP(b) ((b)+4) - #define _WT_PROXIMITY(b) ((b)+5) - #define _WT_INFOCHANGE(b) ((b)+6) - #define _WT_CSRCHANGE(b) ((b)+7) /* 1.1 */ - #define _WT_MAX(b) ((b)+WT_MAXOFFSET) - - #define WT_PACKET _WT_PACKET(WT_DEFBASE) - #define WT_CTXOPEN _WT_CTXOPEN(WT_DEFBASE) - #define WT_CTXCLOSE _WT_CTXCLOSE(WT_DEFBASE) - #define WT_CTXUPDATE _WT_CTXUPDATE(WT_DEFBASE) - #define WT_CTXOVERLAP _WT_CTXOVERLAP(WT_DEFBASE) - #define WT_PROXIMITY _WT_PROXIMITY(WT_DEFBASE) - #define WT_INFOCHANGE _WT_INFOCHANGE(WT_DEFBASE) - #define WT_CSRCHANGE _WT_CSRCHANGE(WT_DEFBASE) /* 1.1 */ - #define WT_MAX _WT_MAX(WT_DEFBASE) - -#endif - -/* -------------------------------------------------------------------------- */ -/* -------------------------------------------------------------------------- */ -/* Data Types */ - -/* -------------------------------------------------------------------------- */ -/* COMMON DATA DEFS */ - -DECLARE_HANDLE(HMGR); /* manager handle */ -DECLARE_HANDLE(HCTX); /* context handle */ -DECLARE_HANDLE(HWTHOOK); /* hook handle */ - -typedef DWORD WTPKT; /* packet mask */ - - -#ifndef NOWTPKT - - /* WTPKT bits */ - #define PK_CONTEXT 0x0001 /* reporting context */ - #define PK_STATUS 0x0002 /* status bits */ - #define PK_TIME 0x0004 /* time stamp */ - #define PK_CHANGED 0x0008 /* change bit vector */ - #define PK_SERIAL_NUMBER 0x0010 /* packet serial number */ - #define PK_CURSOR 0x0020 /* reporting cursor */ - #define PK_BUTTONS 0x0040 /* button information */ - #define PK_X 0x0080 /* x axis */ - #define PK_Y 0x0100 /* y axis */ - #define PK_Z 0x0200 /* z axis */ - #define PK_NORMAL_PRESSURE 0x0400 /* normal or tip pressure */ - #define PK_TANGENT_PRESSURE 0x0800 /* tangential or barrel pressure */ - #define PK_ORIENTATION 0x1000 /* orientation info: tilts */ - #define PK_ROTATION 0x2000 /* rotation info; 1.1 */ - -#endif - -typedef DWORD FIX32; /* fixed-point arithmetic type */ - -#ifndef NOFIX32 - #define INT(x) HIWORD(x) - #define FRAC(x) LOWORD(x) - - #define CASTFIX32(x) ((FIX32)((x)*65536L)) - - #define ROUND(x) (INT(x) + (FRAC(x) > (WORD)0x8000)) - - #define FIX_MUL(c, a, b) \ - (c = (((DWORD)FRAC(a) * FRAC(b)) >> 16) + \ - (DWORD)INT(a) * FRAC(b) + \ - (DWORD)INT(b) * FRAC(a) + \ - ((DWORD)INT(a) * INT(b) << 16)) - - #ifdef _WINDLL - #define FIX_DIV_SC static - #else - #define FIX_DIV_SC - #endif - - #define FIX_DIV(c, a, b) \ - { \ - FIX_DIV_SC DWORD temp, rem, btemp; \ - \ - /* fraction done bytewise */ \ - temp = ((a / b) << 16); \ - rem = a % b; \ - btemp = b; \ - if (INT(btemp) < 256) { \ - rem <<= 8; \ - } \ - else { \ - btemp >>= 8; \ - } \ - temp += ((rem / btemp) << 8); \ - rem %= btemp; \ - rem <<= 8; \ - temp += rem / btemp; \ - c = temp; \ - } -#endif - -/* -------------------------------------------------------------------------- */ -/* INFO DATA DEFS */ - -#ifndef NOWTINFO - -#ifndef NOWTAXIS - -typedef struct tagAXIS { - LONG axMin; - LONG axMax; - UINT axUnits; - FIX32 axResolution; -} AXIS, *PAXIS, NEAR *NPAXIS, FAR *LPAXIS; - - /* unit specifiers */ - #define TU_NONE 0 - #define TU_INCHES 1 - #define TU_CENTIMETERS 2 - #define TU_CIRCLE 3 - -#endif - -#ifndef NOWTSYSBUTTONS - -/* system button assignment values */ -#define SBN_NONE 0x00 -#define SBN_LCLICK 0x01 -#define SBN_LDBLCLICK 0x02 -#define SBN_LDRAG 0x03 -#define SBN_RCLICK 0x04 -#define SBN_RDBLCLICK 0x05 -#define SBN_RDRAG 0x06 -#define SBN_MCLICK 0x07 -#define SBN_MDBLCLICK 0x08 -#define SBN_MDRAG 0x09 -/* for Pen Windows */ -#define SBN_PTCLICK 0x10 -#define SBN_PTDBLCLICK 0x20 -#define SBN_PTDRAG 0x30 -#define SBN_PNCLICK 0x40 -#define SBN_PNDBLCLICK 0x50 -#define SBN_PNDRAG 0x60 -#define SBN_P1CLICK 0x70 -#define SBN_P1DBLCLICK 0x80 -#define SBN_P1DRAG 0x90 -#define SBN_P2CLICK 0xA0 -#define SBN_P2DBLCLICK 0xB0 -#define SBN_P2DRAG 0xC0 -#define SBN_P3CLICK 0xD0 -#define SBN_P3DBLCLICK 0xE0 -#define SBN_P3DRAG 0xF0 - -#endif - -#ifndef NOWTCAPABILITIES - -/* hardware capabilities */ -#define HWC_INTEGRATED 0x0001 -#define HWC_TOUCH 0x0002 -#define HWC_HARDPROX 0x0004 -#define HWC_PHYSID_CURSORS 0x0008 /* 1.1 */ -#endif - -#ifndef NOWTIFC - -#ifndef NOWTCURSORS - -/* cursor capabilities */ -#define CRC_MULTIMODE 0x0001 /* 1.1 */ -#define CRC_AGGREGATE 0x0002 /* 1.1 */ -#define CRC_INVERT 0x0004 /* 1.1 */ - -#endif - -/* info categories */ -#define WTI_INTERFACE 1 - #define IFC_WINTABID 1 - #define IFC_SPECVERSION 2 - #define IFC_IMPLVERSION 3 - #define IFC_NDEVICES 4 - #define IFC_NCURSORS 5 - #define IFC_NCONTEXTS 6 - #define IFC_CTXOPTIONS 7 - #define IFC_CTXSAVESIZE 8 - #define IFC_NEXTENSIONS 9 - #define IFC_NMANAGERS 10 - #define IFC_MAX 10 - - -#endif - -#ifndef NOWTSTATUS - -#define WTI_STATUS 2 - #define STA_CONTEXTS 1 - #define STA_SYSCTXS 2 - #define STA_PKTRATE 3 - #define STA_PKTDATA 4 - #define STA_MANAGERS 5 - #define STA_SYSTEM 6 - #define STA_BUTTONUSE 7 - #define STA_SYSBTNUSE 8 - #define STA_MAX 8 - -#endif - -#ifndef NOWTDEFCONTEXT - -#define WTI_DEFCONTEXT 3 -#define WTI_DEFSYSCTX 4 -#define WTI_DDCTXS 400 /* 1.1 */ -#define WTI_DSCTXS 500 /* 1.1 */ - #define CTX_NAME 1 - #define CTX_OPTIONS 2 - #define CTX_STATUS 3 - #define CTX_LOCKS 4 - #define CTX_MSGBASE 5 - #define CTX_DEVICE 6 - #define CTX_PKTRATE 7 - #define CTX_PKTDATA 8 - #define CTX_PKTMODE 9 - #define CTX_MOVEMASK 10 - #define CTX_BTNDNMASK 11 - #define CTX_BTNUPMASK 12 - #define CTX_INORGX 13 - #define CTX_INORGY 14 - #define CTX_INORGZ 15 - #define CTX_INEXTX 16 - #define CTX_INEXTY 17 - #define CTX_INEXTZ 18 - #define CTX_OUTORGX 19 - #define CTX_OUTORGY 20 - #define CTX_OUTORGZ 21 - #define CTX_OUTEXTX 22 - #define CTX_OUTEXTY 23 - #define CTX_OUTEXTZ 24 - #define CTX_SENSX 25 - #define CTX_SENSY 26 - #define CTX_SENSZ 27 - #define CTX_SYSMODE 28 - #define CTX_SYSORGX 29 - #define CTX_SYSORGY 30 - #define CTX_SYSEXTX 31 - #define CTX_SYSEXTY 32 - #define CTX_SYSSENSX 33 - #define CTX_SYSSENSY 34 - #define CTX_MAX 34 - -#endif - -#ifndef NOWTDEVICES - -#define WTI_DEVICES 100 - #define DVC_NAME 1 - #define DVC_HARDWARE 2 - #define DVC_NCSRTYPES 3 - #define DVC_FIRSTCSR 4 - #define DVC_PKTRATE 5 - #define DVC_PKTDATA 6 - #define DVC_PKTMODE 7 - #define DVC_CSRDATA 8 - #define DVC_XMARGIN 9 - #define DVC_YMARGIN 10 - #define DVC_ZMARGIN 11 - #define DVC_X 12 - #define DVC_Y 13 - #define DVC_Z 14 - #define DVC_NPRESSURE 15 - #define DVC_TPRESSURE 16 - #define DVC_ORIENTATION 17 - #define DVC_ROTATION 18 /* 1.1 */ - #define DVC_PNPID 19 /* 1.1 */ - #define DVC_MAX 19 - -#endif - -#ifndef NOWTCURSORS - -#define WTI_CURSORS 200 - #define CSR_NAME 1 - #define CSR_ACTIVE 2 - #define CSR_PKTDATA 3 - #define CSR_BUTTONS 4 - #define CSR_BUTTONBITS 5 - #define CSR_BTNNAMES 6 - #define CSR_BUTTONMAP 7 - #define CSR_SYSBTNMAP 8 - #define CSR_NPBUTTON 9 - #define CSR_NPBTNMARKS 10 - #define CSR_NPRESPONSE 11 - #define CSR_TPBUTTON 12 - #define CSR_TPBTNMARKS 13 - #define CSR_TPRESPONSE 14 - #define CSR_PHYSID 15 /* 1.1 */ - #define CSR_MODE 16 /* 1.1 */ - #define CSR_MINPKTDATA 17 /* 1.1 */ - #define CSR_MINBUTTONS 18 /* 1.1 */ - #define CSR_CAPABILITIES 19 /* 1.1 */ - #define CSR_TYPE 20 /* 1.2 */ - #define CSR_MAX 20 - -#endif - -#ifndef NOWTEXTENSIONS - -#define WTI_EXTENSIONS 300 - #define EXT_NAME 1 - #define EXT_TAG 2 - #define EXT_MASK 3 - #define EXT_SIZE 4 - #define EXT_AXES 5 - #define EXT_DEFAULT 6 - #define EXT_DEFCONTEXT 7 - #define EXT_DEFSYSCTX 8 - #define EXT_CURSORS 9 - #define EXT_MAX 109 /* Allow 100 cursors */ - -#endif - -#endif - -/* -------------------------------------------------------------------------- */ -/* CONTEXT DATA DEFS */ - -#define LCNAMELEN 40 -#define LC_NAMELEN 40 -#ifdef WIN32 -typedef struct tagLOGCONTEXTA { - char lcName[LCNAMELEN]; - UINT lcOptions; - UINT lcStatus; - UINT lcLocks; - UINT lcMsgBase; - UINT lcDevice; - UINT lcPktRate; - WTPKT lcPktData; - WTPKT lcPktMode; - WTPKT lcMoveMask; - DWORD lcBtnDnMask; - DWORD lcBtnUpMask; - LONG lcInOrgX; - LONG lcInOrgY; - LONG lcInOrgZ; - LONG lcInExtX; - LONG lcInExtY; - LONG lcInExtZ; - LONG lcOutOrgX; - LONG lcOutOrgY; - LONG lcOutOrgZ; - LONG lcOutExtX; - LONG lcOutExtY; - LONG lcOutExtZ; - FIX32 lcSensX; - FIX32 lcSensY; - FIX32 lcSensZ; - BOOL lcSysMode; - int lcSysOrgX; - int lcSysOrgY; - int lcSysExtX; - int lcSysExtY; - FIX32 lcSysSensX; - FIX32 lcSysSensY; -} LOGCONTEXTA, *PLOGCONTEXTA, NEAR *NPLOGCONTEXTA, FAR *LPLOGCONTEXTA; -typedef struct tagLOGCONTEXTW { - WCHAR lcName[LCNAMELEN]; - UINT lcOptions; - UINT lcStatus; - UINT lcLocks; - UINT lcMsgBase; - UINT lcDevice; - UINT lcPktRate; - WTPKT lcPktData; - WTPKT lcPktMode; - WTPKT lcMoveMask; - DWORD lcBtnDnMask; - DWORD lcBtnUpMask; - LONG lcInOrgX; - LONG lcInOrgY; - LONG lcInOrgZ; - LONG lcInExtX; - LONG lcInExtY; - LONG lcInExtZ; - LONG lcOutOrgX; - LONG lcOutOrgY; - LONG lcOutOrgZ; - LONG lcOutExtX; - LONG lcOutExtY; - LONG lcOutExtZ; - FIX32 lcSensX; - FIX32 lcSensY; - FIX32 lcSensZ; - BOOL lcSysMode; - int lcSysOrgX; - int lcSysOrgY; - int lcSysExtX; - int lcSysExtY; - FIX32 lcSysSensX; - FIX32 lcSysSensY; -} LOGCONTEXTW, *PLOGCONTEXTW, NEAR *NPLOGCONTEXTW, FAR *LPLOGCONTEXTW; -#ifdef UNICODE -typedef LOGCONTEXTW LOGCONTEXT; -typedef PLOGCONTEXTW PLOGCONTEXT; -typedef NPLOGCONTEXTW NPLOGCONTEXT; -typedef LPLOGCONTEXTW LPLOGCONTEXT; -#else -typedef LOGCONTEXTA LOGCONTEXT; -typedef PLOGCONTEXTA PLOGCONTEXT; -typedef NPLOGCONTEXTA NPLOGCONTEXT; -typedef LPLOGCONTEXTA LPLOGCONTEXT; -#endif /* UNICODE */ -#else /* WIN32 */ -typedef struct tagLOGCONTEXT { - char lcName[LCNAMELEN]; - UINT lcOptions; - UINT lcStatus; - UINT lcLocks; - UINT lcMsgBase; - UINT lcDevice; - UINT lcPktRate; - WTPKT lcPktData; - WTPKT lcPktMode; - WTPKT lcMoveMask; - DWORD lcBtnDnMask; - DWORD lcBtnUpMask; - LONG lcInOrgX; - LONG lcInOrgY; - LONG lcInOrgZ; - LONG lcInExtX; - LONG lcInExtY; - LONG lcInExtZ; - LONG lcOutOrgX; - LONG lcOutOrgY; - LONG lcOutOrgZ; - LONG lcOutExtX; - LONG lcOutExtY; - LONG lcOutExtZ; - FIX32 lcSensX; - FIX32 lcSensY; - FIX32 lcSensZ; - BOOL lcSysMode; - int lcSysOrgX; - int lcSysOrgY; - int lcSysExtX; - int lcSysExtY; - FIX32 lcSysSensX; - FIX32 lcSysSensY; -} LOGCONTEXT, *PLOGCONTEXT, NEAR *NPLOGCONTEXT, FAR *LPLOGCONTEXT; -#endif /* WIN32 */ - - /* context option values */ - #define CXO_SYSTEM 0x0001 - #define CXO_PEN 0x0002 - #define CXO_MESSAGES 0x0004 - #define CXO_MARGIN 0x8000 - #define CXO_MGNINSIDE 0x4000 - #define CXO_CSRMESSAGES 0x0008 /* 1.1 */ - - /* context status values */ - #define CXS_DISABLED 0x0001 - #define CXS_OBSCURED 0x0002 - #define CXS_ONTOP 0x0004 - - /* context lock values */ - #define CXL_INSIZE 0x0001 - #define CXL_INASPECT 0x0002 - #define CXL_SENSITIVITY 0x0004 - #define CXL_MARGIN 0x0008 - #define CXL_SYSOUT 0x0010 - -/* -------------------------------------------------------------------------- */ -/* EVENT DATA DEFS */ - -/* For packet structure definition, see pktdef.h */ - -/* packet status values */ -#define TPS_PROXIMITY 0x0001 -#define TPS_QUEUE_ERR 0x0002 -#define TPS_MARGIN 0x0004 -#define TPS_GRAB 0x0008 -#define TPS_INVERT 0x0010 /* 1.1 */ - -typedef struct tagORIENTATION { - int orAzimuth; - int orAltitude; - int orTwist; -} ORIENTATION, *PORIENTATION, NEAR *NPORIENTATION, FAR *LPORIENTATION; - -typedef struct tagROTATION { /* 1.1 */ - int roPitch; - int roRoll; - int roYaw; -} ROTATION, *PROTATION, NEAR *NPROTATION, FAR *LPROTATION; -// grandfather in obsolete member names. -#define rotPitch roPitch -#define rotRoll roRoll -#define rotYaw roYaw - -/* relative buttons */ -#define TBN_NONE 0 -#define TBN_UP 1 -#define TBN_DOWN 2 - -/* -------------------------------------------------------------------------- */ -/* DEVICE CONFIG CONSTANTS */ - -#ifndef NOWTDEVCFG - -#define WTDC_NONE 0 -#define WTDC_CANCEL 1 -#define WTDC_OK 2 -#define WTDC_RESTART 3 - -#endif - -/* -------------------------------------------------------------------------- */ -/* HOOK CONSTANTS */ - -#ifndef NOWTHOOKS - -#define WTH_PLAYBACK 1 -#define WTH_RECORD 2 - -#define WTHC_GETLPLPFN (-3) -#define WTHC_LPLPFNNEXT (-2) -#define WTHC_LPFNNEXT (-1) -#define WTHC_ACTION 0 -#define WTHC_GETNEXT 1 -#define WTHC_SKIP 2 - -#endif - -/* -------------------------------------------------------------------------- */ -/* PREFERENCE FUNCTION CONSTANTS */ - -#ifndef NOWTPREF - -#define WTP_LPDEFAULT ((LPVOID)-1L) -#define WTP_DWDEFAULT ((DWORD)-1L) - -#endif - -/* -------------------------------------------------------------------------- */ -/* EXTENSION TAGS AND CONSTANTS */ - -#ifndef NOWTEXTENSIONS - -/* constants for use with pktdef.h */ -#define PKEXT_ABSOLUTE 1 -#define PKEXT_RELATIVE 2 - -/* Extension tags. */ -#define WTX_OBT 0 /* Out of bounds tracking */ -#define WTX_FKEYS 1 /* Function keys */ -#define WTX_TILT 2 /* Raw Cartesian tilt; 1.1 */ -#define WTX_CSRMASK 3 /* select input by cursor type; 1.1 */ -#define WTX_XBTNMASK 4 /* Extended button mask; 1.1 */ -#define WTX_EXPKEYS 5 /* ExpressKeys; 1.3 */ - -typedef struct tagXBTNMASK { - BYTE xBtnDnMask[32]; - BYTE xBtnUpMask[32]; -} XBTNMASK; - -typedef struct tagTILT { /* 1.1 */ - int tiltX; - int tiltY; -} TILT; - -#endif - -/* -------------------------------------------------------------------------- */ -/* -------------------------------------------------------------------------- */ -/* Functions */ - - #ifndef API - #ifndef WINAPI - #define API FAR PASCAL - #else - #define API WINAPI - #endif - #endif - -#ifndef NOWTCALLBACKS - - #ifndef CALLBACK - #define CALLBACK FAR PASCAL - #endif - - #ifndef NOWTMANAGERFXNS - /* callback function types */ - typedef BOOL (WINAPI * WTENUMPROC)(HCTX, LPARAM); /* changed CALLBACK->WINAPI, 1.1 */ - typedef BOOL (WINAPI * WTCONFIGPROC)(HCTX, HWND); - typedef LRESULT (WINAPI * WTHOOKPROC)(int, WPARAM, LPARAM); - typedef WTHOOKPROC FAR *LPWTHOOKPROC; - #endif - -#endif - - -#ifndef NOWTFUNCTIONS - - #ifndef NOWTBASICFXNS - /* BASIC FUNCTIONS */ -#ifdef WIN32 - UINT API WTInfoA(UINT, UINT, LPVOID); - #define ORD_WTInfoA 20 - UINT API WTInfoW(UINT, UINT, LPVOID); - #define ORD_WTInfoW 1020 - #ifdef UNICODE - #define WTInfo WTInfoW - #define ORD_WTInfo ORD_WTInfoW - #else - #define WTInfo WTInfoA - #define ORD_WTInfo ORD_WTInfoA - #endif /* !UNICODE */ -#else - UINT API WTInfo(UINT, UINT, LPVOID); - #define ORD_WTInfo 20 -#endif -#ifdef WIN32 - HCTX API WTOpenA(HWND, LPLOGCONTEXTA, BOOL); - #define ORD_WTOpenA 21 - HCTX API WTOpenW(HWND, LPLOGCONTEXTW, BOOL); - #define ORD_WTOpenW 1021 - #ifdef UNICODE - #define WTOpen WTOpenW - #define ORD_WTOpen ORD_WTOpenW - #else - #define WTOpen WTOpenA - #define ORD_WTOpen ORD_WTOpenA - #endif /* !UNICODE */ -#else - HCTX API WTOpen(HWND, LPLOGCONTEXT, BOOL); - #define ORD_WTOpen 21 -#endif - BOOL API WTClose(HCTX); - #define ORD_WTClose 22 - int API WTPacketsGet(HCTX, int, LPVOID); - #define ORD_WTPacketsGet 23 - BOOL API WTPacket(HCTX, UINT, LPVOID); - #define ORD_WTPacket 24 - #endif - - #ifndef NOWTVISIBILITYFXNS - /* VISIBILITY FUNCTIONS */ - BOOL API WTEnable(HCTX, BOOL); - #define ORD_WTEnable 40 - BOOL API WTOverlap(HCTX, BOOL); - #define ORD_WTOverlap 41 - #endif - - #ifndef NOWTCTXEDITFXNS - /* CONTEXT EDITING FUNCTIONS */ - BOOL API WTConfig(HCTX, HWND); - #define ORD_WTConfig 60 -#ifdef WIN32 - BOOL API WTGetA(HCTX, LPLOGCONTEXTA); - #define ORD_WTGetA 61 - BOOL API WTGetW(HCTX, LPLOGCONTEXTW); - #define ORD_WTGetW 1061 - #ifdef UNICODE - #define WTGet WTGetW - #define ORD_WTGet ORD_WTGetW - #else - #define WTGet WTGetA - #define ORD_WTGet ORD_WTGetA - #endif /* !UNICODE */ -#else - BOOL API WTGet(HCTX, LPLOGCONTEXT); - #define ORD_WTGet 61 -#endif -#ifdef WIN32 - BOOL API WTSetA(HCTX, LPLOGCONTEXTA); - #define ORD_WTSetA 62 - BOOL API WTSetW(HCTX, LPLOGCONTEXTW); - #define ORD_WTSetW 1062 - #ifdef UNICODE - #define WTSet WTSetW - #define ORD_WTSet ORD_WTSetW - #else - #define WTSet WTSetA - #define ORD_WTSet ORD_WTSetA - #endif /* !UNICODE */ -#else - BOOL API WTSet(HCTX, LPLOGCONTEXT); - #define ORD_WTSet 62 -#endif - BOOL API WTExtGet(HCTX, UINT, LPVOID); - #define ORD_WTExtGet 63 - BOOL API WTExtSet(HCTX, UINT, LPVOID); - #define ORD_WTExtSet 64 - BOOL API WTSave(HCTX, LPVOID); - #define ORD_WTSave 65 - HCTX API WTRestore(HWND, LPVOID, BOOL); - #define ORD_WTRestore 66 - #endif - - #ifndef NOWTQUEUEFXNS - /* ADVANCED PACKET AND QUEUE FUNCTIONS */ - int API WTPacketsPeek(HCTX, int, LPVOID); - #define ORD_WTPacketsPeek 80 - int API WTDataGet(HCTX, UINT, UINT, int, LPVOID, LPINT); - #define ORD_WTDataGet 81 - int API WTDataPeek(HCTX, UINT, UINT, int, LPVOID, LPINT); - #define ORD_WTDataPeek 82 -#ifndef WIN32 -/* OBSOLETE IN WIN32! */ - DWORD API WTQueuePackets(HCTX); - #define ORD_WTQueuePackets 83 -#endif - int API WTQueueSizeGet(HCTX); - #define ORD_WTQueueSizeGet 84 - BOOL API WTQueueSizeSet(HCTX, int); - #define ORD_WTQueueSizeSet 85 - #endif - - #ifndef NOWTHMGRFXNS - /* MANAGER HANDLE FUNCTIONS */ - HMGR API WTMgrOpen(HWND, UINT); - #define ORD_WTMgrOpen 100 - BOOL API WTMgrClose(HMGR); - #define ORD_WTMgrClose 101 - #endif - - #ifndef NOWTMGRCTXFXNS - /* MANAGER CONTEXT FUNCTIONS */ - BOOL API WTMgrContextEnum(HMGR, WTENUMPROC, LPARAM); - #define ORD_WTMgrContextEnum 120 - HWND API WTMgrContextOwner(HMGR, HCTX); - #define ORD_WTMgrContextOwner 121 - HCTX API WTMgrDefContext(HMGR, BOOL); - #define ORD_WTMgrDefContext 122 - HCTX API WTMgrDefContextEx(HMGR, UINT, BOOL); /* 1.1 */ - #define ORD_WTMgrDefContextEx 206 - #endif - - #ifndef NOWTMGRCONFIGFXNS - /* MANAGER CONFIG BOX FUNCTIONS */ - UINT API WTMgrDeviceConfig(HMGR, UINT, HWND); - #define ORD_WTMgrDeviceConfig 140 -#ifndef WIN32 -/* OBSOLETE IN WIN32! */ - BOOL API WTMgrConfigReplace(HMGR, BOOL, WTCONFIGPROC); - #define ORD_WTMgrConfigReplace 141 -#endif - #endif - - #ifndef NOWTMGRHOOKFXNS - /* MANAGER PACKET HOOK FUNCTIONS */ -#ifndef WIN32 -/* OBSOLETE IN WIN32! */ - WTHOOKPROC API WTMgrPacketHook(HMGR, BOOL, int, WTHOOKPROC); - #define ORD_WTMgrPacketHook 160 - LRESULT API WTMgrPacketHookDefProc(int, WPARAM, LPARAM, LPWTHOOKPROC); - #define ORD_WTMgrPacketHookDefProc 161 -#endif - #endif - - #ifndef NOWTMGRPREFFXNS - /* MANAGER PREFERENCE DATA FUNCTIONS */ - BOOL API WTMgrExt(HMGR, UINT, LPVOID); - #define ORD_WTMgrExt 180 - BOOL API WTMgrCsrEnable(HMGR, UINT, BOOL); - #define ORD_WTMgrCsrEnable 181 - BOOL API WTMgrCsrButtonMap(HMGR, UINT, LPBYTE, LPBYTE); - #define ORD_WTMgrCsrButtonMap 182 - BOOL API WTMgrCsrPressureBtnMarks(HMGR, UINT, DWORD, DWORD); - #define ORD_WTMgrCsrPressureBtnMarks 183 - BOOL API WTMgrCsrPressureResponse(HMGR, UINT, UINT FAR *, UINT FAR *); - #define ORD_WTMgrCsrPressureResponse 184 - BOOL API WTMgrCsrExt(HMGR, UINT, UINT, LPVOID); - #define ORD_WTMgrCsrExt 185 - #endif - -/* Win32 replacements for non-portable functions. */ - #ifndef NOWTQUEUEFXNS - /* ADVANCED PACKET AND QUEUE FUNCTIONS */ - BOOL API WTQueuePacketsEx(HCTX, UINT FAR *, UINT FAR *); - #define ORD_WTQueuePacketsEx 200 - #endif - - #ifndef NOWTMGRCONFIGFXNS - /* MANAGER CONFIG BOX FUNCTIONS */ -#ifdef WIN32 - BOOL API WTMgrConfigReplaceExA(HMGR, BOOL, LPSTR, LPSTR); - #define ORD_WTMgrConfigReplaceExA 202 - BOOL API WTMgrConfigReplaceExW(HMGR, BOOL, LPWSTR, LPSTR); - #define ORD_WTMgrConfigReplaceExW 1202 - #ifdef UNICODE - #define WTMgrConfigReplaceEx WTMgrConfigReplaceExW - #define ORD_WTMgrConfigReplaceEx ORD_WTMgrConfigReplaceExW - #else - #define WTMgrConfigReplaceEx WTMgrConfigReplaceExA - #define ORD_WTMgrConfigReplaceEx ORD_WTMgrConfigReplaceExA - #endif /* !UNICODE */ -#else - BOOL API WTMgrConfigReplaceEx(HMGR, BOOL, LPSTR, LPSTR); - #define ORD_WTMgrConfigReplaceEx 202 -#endif - #endif - - #ifndef NOWTMGRHOOKFXNS - /* MANAGER PACKET HOOK FUNCTIONS */ -#ifdef WIN32 - HWTHOOK API WTMgrPacketHookExA(HMGR, int, LPSTR, LPSTR); - #define ORD_WTMgrPacketHookExA 203 - HWTHOOK API WTMgrPacketHookExW(HMGR, int, LPWSTR, LPSTR); - #define ORD_WTMgrPacketHookExW 1203 - #ifdef UNICODE - #define WTMgrPacketHookEx WTMgrPacketHookExW - #define ORD_WTMgrPacketHookEx ORD_WTMgrPacketHookExW - #else - #define WTMgrPacketHookEx WTMgrPacketHookExA - #define ORD_WTMgrPacketHookEx ORD_WTMgrPacketHookExA - #endif /* !UNICODE */ -#else - HWTHOOK API WTMgrPacketHookEx(HMGR, int, LPSTR, LPSTR); - #define ORD_WTMgrPacketHookEx 203 -#endif - BOOL API WTMgrPacketUnhook(HWTHOOK); - #define ORD_WTMgrPacketUnhook 204 - LRESULT API WTMgrPacketHookNext(HWTHOOK, int, WPARAM, LPARAM); - #define ORD_WTMgrPacketHookNext 205 - #endif - - #ifndef NOWTMGRPREFFXNS - /* MANAGER PREFERENCE DATA FUNCTIONS */ - BOOL API WTMgrCsrPressureBtnMarksEx(HMGR, UINT, UINT FAR *, UINT FAR *); - #define ORD_WTMgrCsrPressureBtnMarksEx 201 - #endif - - - -#endif - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* #define _INC_WINTAB */ - diff --git a/src/video/win32/wactab/wintabx.h b/src/video/win32/wactab/wintabx.h deleted file mode 100644 index 7bd4ef18e..000000000 --- a/src/video/win32/wactab/wintabx.h +++ /dev/null @@ -1,136 +0,0 @@ -/* *INDENT-OFF* */ -/* ------------------------------- wintabx.h -------------------------------- */ -/* Combined 16 & 32-bit version. */ - - -/*------------------------------------------------------------------------------ -The text and information contained in this file may be freely used, -copied, or distributed without compensation or licensing restrictions. - -This file is copyright 1991-1998 by LCS/Telegraphics. -------------------------------------------------------------------------------*/ - -#ifndef _INC_WINTABX /* prevent multiple includes */ -#define _INC_WINTABX - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* prototype for wintabx.lib. */ -#define _UnlinkWinTab _UnlinkWintab -#ifdef WIN32 - extern WINAPI _UnlinkWintab(void); -#else - extern FAR _UnlinkWintab(void); -#endif - -/****** Wintab message crackers ***********************************************/ - -#ifndef HANDLE_MSG -#define HANDLE_MSG(hwnd, message, fn) \ - case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn)) -#endif - -/* void Cls_OnWintabPacket(HWND hwnd, HCTX hCtx, UINT sn) */ -#define HANDLE_WT_PACKET(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HCTX)(lParam), (UINT)(wParam)), 0L) -#define FORWARD__WT_PACKET(hwnd, bs, hCtx, sn, fn) \ - (void)(fn)((hwnd), _WT_PACKET(bs), (WPARAM)(UINT)(sn), (LPARAM)(HCTX)(hCtx)) -#define FORWARD_WT_PACKET(hwnd, hCtx, sn, fn) \ - FORWARD__WT_PACKET(hwnd, WT_DEFBASE, hCtx, sn, fn) - -/* void Cls_OnWintabCtxOpen(HWND hwnd, HCTX hCtx, UINT sf) */ -#define HANDLE_WT_CTXOPEN(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HCTX)(wParam), (UINT)(lParam)), 0L) -#define FORWARD__WT_CTXOPEN(hwnd, bs, hCtx, sf, fn) \ - (void)(fn)((hwnd), _WT_CTXOPEN(bs), (WPARAM)(HCTX)(hCtx), (LPARAM)(UINT)(sf)) -#define FORWARD_WT_CTXOPEN(hwnd, hCtx, sf, fn) \ - FORWARD__WT_CTXOPEN(hwnd, WT_DEFBASE, hCtx, sf, fn) - -/* void Cls_OnWintabCtxClose(HWND hwnd, HCTX hCtx, UINT sf) */ -#define HANDLE_WT_CTXCLOSE(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HCTX)(wParam), (UINT)(lParam)), 0L) -#define FORWARD__WT_CTXCLOSE(hwnd, bs, hCtx, sf, fn) \ - (void)(fn)((hwnd), _WT_CTXCLOSE(bs), (WPARAM)(HCTX)(hCtx), (LPARAM)(UINT)(sf)) -#define FORWARD_WT_CTXCLOSE(hwnd, hCtx, sf, fn) \ - FORWARD__WT_CTXCLOSE(hwnd, WT_DEFBASE, hCtx, sf, fn) - -/* void Cls_OnWintabCtxUpdate(HWND hwnd, HCTX hCtx, UINT sf) */ -#define HANDLE_WT_CTXUPDATE(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HCTX)(wParam), (UINT)(lParam)), 0L) -#define FORWARD__WT_CTXUPDATE(hwnd, bs, hCtx, sf, fn) \ - (void)(fn)((hwnd), _WT_CTXUPDATE(bs), (WPARAM)(HCTX)(hCtx), (LPARAM)(UINT)(sf)) -#define FORWARD_WT_CTXUPDATE(hwnd, hCtx, sf, fn) \ - FORWARD__WT_CTXUPDATE(hwnd, WT_DEFBASE, hCtx, sf, fn) - -/* void Cls_OnWintabCtxOverlap(HWND hwnd, HCTX hCtx, UINT sf) */ -#define HANDLE_WT_CTXOVERLAP(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HCTX)(wParam), (UINT)(lParam)), 0L) -#define FORWARD__WT_CTXOVERLAP(hwnd, bs, hCtx, sf, fn) \ - (void)(fn)((hwnd), _WT_CTXOVERLAP(bs), (WPARAM)(HCTX)(hCtx), (LPARAM)(UINT)(sf)) -#define FORWARD_WT_CTXOVERLAP(hwnd, hCtx, sf, fn) \ - FORWARD__WT_CTXOVERLAP(hwnd, WT_DEFBASE, hCtx, sf, fn) - -/* void Cls_OnWintabProximity(HWND hwnd, HCTX hCtx, BOOL cp, BOOL hp) */ -#define HANDLE_WT_PROXIMITY(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HCTX)(wParam), (BOOL)LOWORD(lParam), (BOOL)HIWORD(lParam)), 0L) -#define FORWARD__WT_PROXIMITY(hwnd, bs, hCtx, cp, hp, fn) \ - (void)(fn)((hwnd), _WT_PROXIMITY(bs), (WPARAM)(HCTX)(hCtx), MAKELPARAM((cp), (hp)) -#define FORWARD_WT_PROXIMITY(hwnd, hCtx, sf, fn) \ - FORWARD__WT_PROXIMITY(hwnd, WT_DEFBASE, hCtx, cp, hp, fn) - -/* void Cls_OnWintabInfoChange(HWND hwnd, HMGR hMgr, UINT c, UINT i) */ -#define HANDLE_WT_INFOCHANGE(hwnd, wParam, lParam, fn) \ - ((fn)((hwnd), (HMGR)(wParam), (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)), 0L) -#define FORWARD__WT_INFOCHANGE(hwnd, bs, hMgr, cp, hp, fn) \ - (void)(fn)((hwnd), _WT_INFOCHANGE(bs), (WPARAM)(HMGR)(hMgr), MAKELPARAM((c), (i)) -#define FORWARD_WT_INFOCHANGE(hwnd, hMgr, sf, fn) \ - FORWARD__WT_INFOCHANGE(hwnd, WT_DEFBASE, hMgr, cp, hp, fn) - -/****** Alternate porting layer macros ****************************************/ - -#define GET_WT_PACKET_HCTX(wp, lp) ((HCTX)lp) -#define GET_WT_PACKET_SERIAL(wp, lp) (wp) -#define GET_WT_PACKET_MPS(h, s) \ - (s), (LPARAM)(h) - -#define GET_WT_CTXOPEN_HCTX(wp, lp) ((HCTX)wp) -#define GET_WT_CTXOPEN_STATUS(wp, lp) ((UINT)lp) -#define GET_WT_CTXOPEN_MPS(h, s) \ - (WPARAM)(h), (LPARAM)(s) - -#define GET_WT_CTXCLOSE_HCTX(wp, lp) ((HCTX)wp) -#define GET_WT_CTXCLOSE_STATUS(wp, lp) ((UINT)lp) -#define GET_WT_CTXCLOSE_MPS(h, s) \ - (WPARAM)(h), (LPARAM)(s) - -#define GET_WT_CTXUPDATE_HCTX(wp, lp) ((HCTX)wp) -#define GET_WT_CTXUPDATE_STATUS(wp, lp) ((UINT)lp) -#define GET_WT_CTXUPDATE_MPS(h, s) \ - (WPARAM)(h), (LPARAM)(s) - -#define GET_WT_CTXOVERLAP_HCTX(wp, lp) ((HCTX)wp) -#define GET_WT_CTXOVERLAP_STATUS(wp, lp) ((UINT)lp) -#define GET_WT_CTXOVERLAP_MPS(h, s) \ - (WPARAM)(h), (LPARAM)(s) - -#define GET_WT_PROXIMITY_HCTX(wp, lp) ((HCTX)wp) -#define GET_WT_PROXIMITY_CTXPROX(wp, lp) LOWORD(lp) -#define GET_WT_PROXIMITY_HARDPROX(wp, lp) HIWORD(lp) -#define GET_WT_PROXIMITY_MPS(h, fc, fh) \ - (WPARAM)(h), MAKELONG(fc, fh) - -#define GET_WT_INFOCHANGE_HMGR(wp, lp) ((HMGR)wp) -#define GET_WT_INFOCHANGE_CATEGORY(wp, lp) LOWORD(lp) -#define GET_WT_INFOCHANGE_INDEX(wp, lp) HIWORD(lp) -#define GET_WT_INFOCHANGE_MPS(h, c, i) \ - (WPARAM)(h), MAKELONG(c, i) - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* #define _INC_WINTABX */ - diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 598093fed..6b7003994 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -23,12 +23,14 @@ #include #include +#include #include #include "SDL_x11video.h" #include "../../events/SDL_events_c.h" #include "../../events/SDL_mouse_c.h" +#include "SDL_timer.h" #include "SDL_syswm.h" static void @@ -93,13 +95,7 @@ X11_DispatchEvent(_THIS) if (xevent.xcrossing.mode == NotifyUngrab) printf("Mode: NotifyUngrab\n"); #endif -#if 1 - /* FIXME: Should we reset data for all mice? */ - for (i = 0; i < SDL_GetNumMice(); ++i) { - SDL_Mouse *mouse = SDL_GetMouse(i); - SDL_SetMouseFocus(mouse->id, data->window); - } -#endif + SDL_SetMouseFocus(data->window); } break; @@ -116,13 +112,7 @@ X11_DispatchEvent(_THIS) printf("Mode: NotifyUngrab\n"); #endif if (xevent.xcrossing.detail != NotifyInferior) { -#if 1 - /* FIXME: Should we reset data for all mice? */ - for (i = 0; i < SDL_GetNumMice(); ++i) { - SDL_Mouse *mouse = SDL_GetMouse(i); - SDL_SetMouseFocus(mouse->id, 0); - } -#endif + SDL_SetMouseFocus(NULL); } } break; @@ -132,7 +122,7 @@ X11_DispatchEvent(_THIS) #ifdef DEBUG_XEVENTS printf("FocusIn!\n"); #endif - SDL_SetKeyboardFocus(videodata->keyboard, data->window); + SDL_SetKeyboardFocus(data->window); #ifdef X_HAVE_UTF8_STRING if (data->ic) { XSetICFocus(data->ic); @@ -146,7 +136,7 @@ X11_DispatchEvent(_THIS) #ifdef DEBUG_XEVENTS printf("FocusOut!\n"); #endif - SDL_SetKeyboardFocus(videodata->keyboard, 0); + SDL_SetKeyboardFocus(NULL); #ifdef X_HAVE_UTF8_STRING if (data->ic) { XUnsetICFocus(data->ic); @@ -185,8 +175,7 @@ X11_DispatchEvent(_THIS) #ifdef DEBUG_XEVENTS printf("KeyPress (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif - SDL_SendKeyboardKey(videodata->keyboard, SDL_PRESSED, - videodata->key_layout[keycode]); + SDL_SendKeyboardKey(SDL_PRESSED, videodata->key_layout[keycode]); #if 0 if (videodata->key_layout[keycode] == SDLK_UNKNOWN) { int min_keycode, max_keycode; @@ -210,7 +199,7 @@ X11_DispatchEvent(_THIS) XLookupString(&xevent.xkey, text, sizeof(text), &keysym, NULL); #endif if (*text) { - SDL_SendKeyboardText(videodata->keyboard, text); + SDL_SendKeyboardText(text); } } break; @@ -222,8 +211,7 @@ X11_DispatchEvent(_THIS) #ifdef DEBUG_XEVENTS printf("KeyRelease (X11 keycode = 0x%X)\n", xevent.xkey.keycode); #endif - SDL_SendKeyboardKey(videodata->keyboard, SDL_RELEASED, - videodata->key_layout[keycode]); + SDL_SendKeyboardKey(SDL_RELEASED, videodata->key_layout[keycode]); } break; @@ -280,79 +268,25 @@ X11_DispatchEvent(_THIS) } break; - default:{ - for (i = 0; i < SDL_GetNumMice(); ++i) { - SDL_Mouse *mouse; -#if SDL_VIDEO_DRIVER_X11_XINPUT - X11_MouseData *data; -#endif - - mouse = SDL_GetMouse(i); - if (!mouse->driverdata) { - switch (xevent.type) { - case MotionNotify: -#ifdef DEBUG_MOTION - printf("X11 motion: %d,%d\n", xevent.xmotion.x, - xevent.xmotion.y); -#endif - SDL_SendMouseMotion(mouse->id, 0, xevent.xmotion.x, - xevent.xmotion.y, 0); - break; - - case ButtonPress: - SDL_SendMouseButton(mouse->id, SDL_PRESSED, - xevent.xbutton.button); - break; - - case ButtonRelease: - SDL_SendMouseButton(mouse->id, SDL_RELEASED, - xevent.xbutton.button); - break; - } - continue; - } -#if SDL_VIDEO_DRIVER_X11_XINPUT - data = (X11_MouseData *) mouse->driverdata; - if (xevent.type == data->motion) { - XDeviceMotionEvent *move = - (XDeviceMotionEvent *) & xevent; + case MotionNotify:{ #ifdef DEBUG_MOTION - printf("X11 motion: %d,%d\n", move->x, move->y); + printf("X11 motion: %d,%d\n", xevent.xmotion.x, xevent.xmotion.y); #endif - SDL_SendMouseMotion(move->deviceid, 0, move->x, move->y, - move->axis_data[2]); - return; - } - if (xevent.type == data->button_pressed) { - XDeviceButtonPressedEvent *pressed = - (XDeviceButtonPressedEvent *) & xevent; - SDL_SendMouseButton(pressed->deviceid, SDL_PRESSED, - pressed->button); - return; - } - if (xevent.type == data->button_released) { - XDeviceButtonReleasedEvent *released = - (XDeviceButtonReleasedEvent *) & xevent; - SDL_SendMouseButton(released->deviceid, SDL_RELEASED, - released->button); - return; - } - if (xevent.type == data->proximity_in) { - XProximityNotifyEvent *proximity = - (XProximityNotifyEvent *) & xevent; - SDL_SendProximity(proximity->deviceid, proximity->x, - proximity->y, SDL_PROXIMITYIN); - return; - } - if (xevent.type == data->proximity_out) { - XProximityNotifyEvent *proximity = - (XProximityNotifyEvent *) & xevent; - SDL_SendProximity(proximity->deviceid, proximity->x, - proximity->y, SDL_PROXIMITYOUT); - return; - } -#endif - } + SDL_SendMouseMotion(0, xevent.xmotion.x, xevent.xmotion.y); + } + break; + + case ButtonPress:{ + SDL_SendMouseButton(SDL_PRESSED, xevent.xbutton.button); + } + break; + + case ButtonRelease:{ + SDL_SendMouseButton(SDL_RELEASED, xevent.xbutton.button); + } + break; + + default:{ #ifdef DEBUG_XEVENTS printf("Unhandled event %d\n", xevent.type); #endif diff --git a/src/video/x11/SDL_x11keyboard.c b/src/video/x11/SDL_x11keyboard.c index 0726d99e6..dc80195a1 100644 --- a/src/video/x11/SDL_x11keyboard.c +++ b/src/video/x11/SDL_x11keyboard.c @@ -172,7 +172,6 @@ int X11_InitKeyboard(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - SDL_Keyboard keyboard; int i, j; int min_keycode, max_keycode; struct { @@ -251,8 +250,6 @@ X11_InitKeyboard(_THIS) } } - SDL_zero(keyboard); - data->keyboard = SDL_AddKeyboard(&keyboard, -1); X11_UpdateKeymap(_this); SDL_SetScancodeName(SDL_SCANCODE_APPLICATION, "Menu"); @@ -280,15 +277,12 @@ X11_UpdateKeymap(_THIS) keymap[scancode] = X11_KeyCodeToSDLKey(data->display, (KeyCode)i); } - SDL_SetKeymap(data->keyboard, 0, keymap, SDL_NUM_SCANCODES); + SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); } void X11_QuitKeyboard(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - SDL_DelKeyboard(data->keyboard); } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_x11mouse.c b/src/video/x11/SDL_x11mouse.c index 8b999f8d5..dbf5b6189 100644 --- a/src/video/x11/SDL_x11mouse.c +++ b/src/video/x11/SDL_x11mouse.c @@ -24,139 +24,14 @@ #include "SDL_x11mouse.h" #include "../../events/SDL_mouse_c.h" -#if SDL_VIDEO_DRIVER_X11_XINPUT -static void -X11_FreeMouse(SDL_Mouse * mouse) -{ - X11_MouseData *data = (X11_MouseData *) mouse->driverdata; - - if (data) { - XCloseDevice(data->display, data->device); - SDL_free(data); - } -} -#endif - void X11_InitMouse(_THIS) { - SDL_Mouse mouse; -#if SDL_VIDEO_DRIVER_X11_XINPUT - Display *display = ((SDL_VideoData *) _this->driverdata)->display; - X11_MouseData *data; - int i, j, n; - XDeviceInfo *DevList; - XAnyClassPtr deviceClass; - int event_code; - XEventClass xEvent; -#endif - int num_mice = 0; - - SDL_zero(mouse); - -#if SDL_VIDEO_DRIVER_X11_XINPUT - /* we're getting the list of input devices */ - n = 0; - if (SDL_X11_HAVE_XINPUT) { - DevList = XListInputDevices(display, &n); - } - - /* we're aquiring valuators: mice, tablets, etc. */ - for (i = 0; i < n; ++i) { - /* if it's the core pointer or core keyborard we don't want it */ - if ((DevList[i].use != IsXPointer && DevList[i].use != IsXKeyboard)) { - /* we have to check all of the device classes */ - deviceClass = DevList[i].inputclassinfo; - for (j = 0; j < DevList[i].num_classes; ++j) { - if (deviceClass->class == ValuatorClass) { /* bingo ;) */ - XValuatorInfo *valInfo; - - data = (X11_MouseData *) SDL_calloc(1, sizeof(*data)); - if (!data) { - continue; - } - data->display = display; - data->device = XOpenDevice(display, DevList[i].id); - - /* motion events */ - DeviceMotionNotify(data->device, event_code, xEvent); - if (xEvent) { - data->xevents[data->num_xevents++] = xEvent; - data->motion = event_code; - } - - /* button events */ - DeviceButtonPress(data->device, event_code, xEvent); - if (xEvent) { - data->xevents[data->num_xevents++] = xEvent; - data->button_pressed = event_code; - } - DeviceButtonRelease(data->device, event_code, xEvent); - if (xEvent) { - data->xevents[data->num_xevents++] = xEvent; - data->button_released = event_code; - } - - /* proximity events */ - ProximityIn(data->device, event_code, xEvent); - if (xEvent) { - data->xevents[data->num_xevents++] = xEvent; - data->proximity_in = event_code; - } - ProximityOut(data->device, event_code, xEvent); - if (xEvent) { - data->xevents[data->num_xevents++] = xEvent; - data->proximity_out = event_code; - } - - SDL_zero(mouse); - mouse.id = DevList[i].id; - mouse.FreeMouse = X11_FreeMouse; - mouse.driverdata = data; - - /* lets get the device parameters */ - valInfo = (XValuatorInfo *) deviceClass; - /* if the device reports pressure, lets check it parameteres */ - if (valInfo->num_axes > 2) { - SDL_AddMouse(&mouse, DevList[i].name, - valInfo->axes[2].max_value, - valInfo->axes[2].min_value, 1); - } else { - SDL_AddMouse(&mouse, DevList[i].name, 0, 0, 1); - } -#ifndef IsXExtensionPointer -#define IsXExtensionPointer 4 -#endif - if (DevList[i].use == IsXExtensionPointer) { - ++num_mice; - } - break; - } - /* if it's not class we're interested in, lets go further */ - deviceClass = - (XAnyClassPtr) ((char *) deviceClass + - deviceClass->length); - } - } - } - XFreeDeviceList(DevList); -#endif - - if (num_mice == 0) { - SDL_zero(mouse); - SDL_AddMouse(&mouse, "CorePointer", 0, 0, 1); - } } void X11_QuitMouse(_THIS) { - SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; - - /* !!! FIXME: use XCloseDevice()? Or maybe handle under SDL_MouseQuit()? */ - - /* let's delete all of the mice */ - SDL_MouseQuit(); } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_x11video.h b/src/video/x11/SDL_x11video.h index 1ba0ba392..9989911c9 100644 --- a/src/video/x11/SDL_x11video.h +++ b/src/video/x11/SDL_x11video.h @@ -67,7 +67,6 @@ typedef struct SDL_VideoData int numwindows; SDL_WindowData **windowlist; int windowlistlength; - int keyboard; Atom WM_DELETE_WINDOW; SDL_scancode key_layout[256]; } SDL_VideoData; diff --git a/src/video/x11/SDL_x11window.c b/src/video/x11/SDL_x11window.c index 18c0e478e..699740418 100644 --- a/src/video/x11/SDL_x11window.c +++ b/src/video/x11/SDL_x11window.c @@ -22,6 +22,7 @@ #include "SDL_config.h" #include "../SDL_sysvideo.h" +#include "../SDL_pixels_c.h" #include "../../events/SDL_keyboard_c.h" #include "../../events/SDL_mouse_c.h" @@ -34,6 +35,7 @@ #include "SDL_x11opengles.h" #endif +#include "SDL_timer.h" #include "SDL_syswm.h" #define _NET_WM_STATE_REMOVE 0l @@ -67,7 +69,6 @@ SetupWindowData(_THIS, SDL_Window * window, Window w, BOOL created) int numwindows = videodata->numwindows; int windowlistlength = videodata->windowlistlength; SDL_WindowData **windowlist = videodata->windowlist; - int index; /* Allocate the window data */ data = (SDL_WindowData *) SDL_calloc(1, sizeof(*data)); @@ -275,8 +276,7 @@ X11_CreateWindow(_THIS, SDL_Window * window) if (visual->class == PseudoColor) { printf("asking for PseudoColor\n"); - Status status; - XStandardColormap cmap; +/* Status status; */ XColor *colorcells; Colormap colormap; Sint32 pix; @@ -387,7 +387,6 @@ X11_CreateWindow(_THIS, SDL_Window * window) } } else if (visual->class == DirectColor) { Status status; - XStandardColormap cmap; XColor *colorcells; Colormap colormap; int i; @@ -397,9 +396,9 @@ X11_CreateWindow(_THIS, SDL_Window * window) int rshift, gshift, bshift; /* Is the colormap we need already registered in SDL? */ - if (colormap = - X11_LookupColormap(data->display, - displaydata->screen, visual->visualid)) { + if ((colormap = + X11_LookupColormap(data->display, + displaydata->screen, visual->visualid))) { xattr.colormap = colormap; /* printf("found existing colormap\n"); */ } else { @@ -647,7 +646,6 @@ X11_CreateWindow(_THIS, SDL_Window * window) /* Tell KDE to keep fullscreen windows on top */ if (window->flags & SDL_WINDOW_FULLSCREEN) { XEvent ev; - long mask; SDL_zero(ev); ev.xclient.type = ClientMessage; @@ -710,32 +708,6 @@ X11_CreateWindow(_THIS, SDL_Window * window) } #endif -#if SDL_VIDEO_DRIVER_X11_XINPUT - /* we're informing the display what extension events we want to receive from it */ - { - int i, j, n = 0; - XEventClass xevents[256]; - - for (i = 0; i < SDL_GetNumMice(); ++i) { - SDL_Mouse *mouse; - X11_MouseData *data; - - mouse = SDL_GetMouse(i); - data = (X11_MouseData *) mouse->driverdata; - if (!data) { - continue; - } - - for (j = 0; j < data->num_xevents; ++j) { - xevents[n++] = data->xevents[j]; - } - } - if (n > 0) { - XSelectExtensionEvent(data->display, w, xevents, n); - } - } -#endif - return 0; } @@ -869,8 +841,6 @@ void X11_SetWindowPosition(_THIS, SDL_Window * window) { SDL_WindowData *data = (SDL_WindowData *) window->driverdata; - SDL_DisplayData *displaydata = - (SDL_DisplayData *) window->display->driverdata; Display *display = data->videodata->display; int x, y; diff --git a/test/common.c b/test/common.c index 694fa196c..a3e19c909 100644 --- a/test/common.c +++ b/test/common.c @@ -929,45 +929,44 @@ PrintEvent(SDL_Event * event) break; case SDL_KEYDOWN: fprintf(stderr, - "Keyboard %d: key pressed in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s", - event->key.which, event->key.windowID, + "Keyboard: key pressed in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s", + event->key.windowID, event->key.keysym.scancode, SDL_GetScancodeName(event->key.keysym.scancode), event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym)); break; case SDL_KEYUP: fprintf(stderr, - "Keyboard %d: key released in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s", - event->key.which, event->key.windowID, + "Keyboard: key released in window %d: scancode 0x%08X = %s, keycode 0x%08X = %s", + event->key.windowID, event->key.keysym.scancode, SDL_GetScancodeName(event->key.keysym.scancode), event->key.keysym.sym, SDL_GetKeyName(event->key.keysym.sym)); break; case SDL_TEXTINPUT: - fprintf(stderr, "Keyboard %d: text input \"%s\" in window %d", - event->text.which, event->text.text, event->text.windowID); + fprintf(stderr, "Keyboard: text input \"%s\" in window %d", + event->text.text, event->text.windowID); break; case SDL_MOUSEMOTION: - fprintf(stderr, "Mouse %d: moved to %d,%d (%d,%d) in window %d", - event->motion.which, event->motion.x, event->motion.y, + fprintf(stderr, "Mouse: moved to %d,%d (%d,%d) in window %d", + event->motion.x, event->motion.y, event->motion.xrel, event->motion.yrel, event->motion.windowID); break; case SDL_MOUSEBUTTONDOWN: - fprintf(stderr, "Mouse %d: button %d pressed at %d,%d in window %d", - event->button.which, event->button.button, event->button.x, - event->button.y, event->button.windowID); + fprintf(stderr, "Mouse: button %d pressed at %d,%d in window %d", + event->button.button, event->button.x, event->button.y, + event->button.windowID); break; case SDL_MOUSEBUTTONUP: - fprintf(stderr, "Mouse %d: button %d released at %d,%d in window %d", - event->button.which, event->button.button, event->button.x, - event->button.y, event->button.windowID); + fprintf(stderr, "Mouse: button %d released at %d,%d in window %d", + event->button.button, event->button.x, event->button.y, + event->button.windowID); break; case SDL_MOUSEWHEEL: fprintf(stderr, - "Mouse %d: wheel scrolled %d in x and %d in y in window %d", - event->wheel.which, event->wheel.x, event->wheel.y, - event->wheel.windowID); + "Mouse: wheel scrolled %d in x and %d in y in window %d", + event->wheel.x, event->wheel.y, event->wheel.windowID); break; case SDL_JOYBALLMOTION: fprintf(stderr, "Joystick %d: ball %d moved by %d,%d", diff --git a/test/testime.c b/test/testime.c index cf6768ac8..6975d652d 100644 --- a/test/testime.c +++ b/test/testime.c @@ -279,8 +279,8 @@ int main(int argc, char *argv[]) } fprintf(stderr, - "Keyboard %d: scancode 0x%08X = %s, keycode 0x%08X = %s\n", - event.key.which, event.key.keysym.scancode, + "Keyboard: scancode 0x%08X = %s, keycode 0x%08X = %s\n", + event.key.keysym.scancode, SDL_GetScancodeName(event.key.keysym.scancode), event.key.keysym.sym, SDL_GetKeyName(event.key.keysym.sym)); break; @@ -290,8 +290,7 @@ int main(int argc, char *argv[]) markedRect.w < 0) break; - fprintf(stderr, "Keyboard %d: text input \"%s\"\n", - event.text.which, event.text.text); + fprintf(stderr, "Keyboard: text input \"%s\"\n", event.text.text); if (SDL_strlen(text) + SDL_strlen(event.text.text) < sizeof(text)) strcpy(text + SDL_strlen(text), event.text.text); diff --git a/test/testintersections.c b/test/testintersections.c index 7327e3a02..9eed373e2 100644 --- a/test/testintersections.c +++ b/test/testintersections.c @@ -288,20 +288,16 @@ main(int argc, char *argv[]) CommonEvent(state, &event, &done); switch (event.type) { case SDL_MOUSEBUTTONDOWN: - if (event.button.which == 0) { - mouse_begin_x = event.button.x; - mouse_begin_y = event.button.y; - } + mouse_begin_x = event.button.x; + mouse_begin_y = event.button.y; break; case SDL_MOUSEBUTTONUP: - if (event.button.which == 0) { - if (event.button.button == 3) - add_line(mouse_begin_x, mouse_begin_y, event.button.x, - event.button.y); - if (event.button.button == 1) - add_rect(mouse_begin_x, mouse_begin_y, event.button.x, - event.button.y); - } + if (event.button.button == 3) + add_line(mouse_begin_x, mouse_begin_y, event.button.x, + event.button.y); + if (event.button.button == 1) + add_rect(mouse_begin_x, mouse_begin_y, event.button.x, + event.button.y); break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { From b249f9bd9617daa3ecf65e33e8cb7f4bf6d142f8 Mon Sep 17 00:00:00 2001 From: Eric Wing Date: Wed, 12 May 2010 12:49:28 -0700 Subject: [PATCH 002/272] Added the automated test plist file and modified .hgignore to be less aggressive. Discovered that the new plist file for the automated test was not checked in because the .hgignore file was too aggressive. I changed the .hgignore to not ignore the Xcode directory and instead added a longer list of things to ignore. --- .hgignore | 14 +++++++++++++- Xcode/SDL/testsdl-Info.plist | 28 ++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 Xcode/SDL/testsdl-Info.plist diff --git a/.hgignore b/.hgignore index f9ca7b01b..8ec7021e9 100644 --- a/.hgignore +++ b/.hgignore @@ -14,7 +14,19 @@ build build-deps VisualC VisualCE -Xcode +# for Xcode +*.orig +*.swp +*.tmp +*.rej +*~ +*.o +*.mode1* +*.model* +*.perspective* +*.perspective* +*.pbxuser +(^|/)build($|/) .DS_Store sdl.pc include/SDL_config.h diff --git a/Xcode/SDL/testsdl-Info.plist b/Xcode/SDL/testsdl-Info.plist new file mode 100644 index 000000000..88ac6abca --- /dev/null +++ b/Xcode/SDL/testsdl-Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + com.yourcompany.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSMainNibFile + SDLMain + NSPrincipalClass + NSApplication + + From 47a8620d9742a7a63eb1dd664e5a3a67062aa55f Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Mon, 17 May 2010 15:14:34 +1200 Subject: [PATCH 003/272] Initial commit, adding __ANDROID__ to the platform list --- include/SDL_platform.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/SDL_platform.h b/include/SDL_platform.h index f9429bdec..a41f56309 100644 --- a/include/SDL_platform.h +++ b/include/SDL_platform.h @@ -65,6 +65,13 @@ #undef __LINUX__ #define __LINUX__ 1 #endif +#if defined(ANDROID) +#undef __ANDROID__ +#undef __LINUX__ //do we need to do this? +#define __ANDROID__ 1 +#endif + + #if defined(__APPLE__) /* lets us know what version of Mac OS X we're compiling on */ From 0a4a7759f06c5491a1f99129527af572d0ba45bd Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Wed, 19 May 2010 18:58:28 +0530 Subject: [PATCH 004/272] Adding a few #defines for Xrender support. --- include/SDL_config.h.in | 1 + src/video/x11/SDL_x11dyn.h | 4 ++++ src/video/x11/SDL_x11video.h | 3 +++ 3 files changed, 8 insertions(+) diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in index 5c47f11b2..473a0f323 100644 --- a/include/SDL_config.h.in +++ b/include/SDL_config.h.in @@ -278,6 +278,7 @@ #undef SDL_VIDEO_DRIVER_X11_XINPUT #undef SDL_VIDEO_DRIVER_X11_SCRNSAVER #undef SDL_VIDEO_DRIVER_X11_XV +#undef SDL_VIDEO_DRIVER_X11_XRENDER #undef SDL_VIDEO_RENDER_D3D #undef SDL_VIDEO_RENDER_GDI diff --git a/src/video/x11/SDL_x11dyn.h b/src/video/x11/SDL_x11dyn.h index 0f722aff0..c06a2d6fe 100644 --- a/src/video/x11/SDL_x11dyn.h +++ b/src/video/x11/SDL_x11dyn.h @@ -52,6 +52,10 @@ #include #endif +#if SDL_VIDEO_DRIVER_X11_XRENDER +#include +#endif + /* * When using the "dynamic X11" functionality, we duplicate all the Xlib * symbols that would be referenced by SDL inside of SDL itself. diff --git a/src/video/x11/SDL_x11video.h b/src/video/x11/SDL_x11video.h index 1ba0ba392..6c2377376 100644 --- a/src/video/x11/SDL_x11video.h +++ b/src/video/x11/SDL_x11video.h @@ -45,6 +45,9 @@ #if SDL_VIDEO_DRIVER_X11_SCRNSAVER #include #endif +#if SDL_VIDEO_DRIVER_X11_XRENDER +#include +#endif #include "SDL_x11dyn.h" From 1c62b779c7959c44c66751bb40c700e2b7eeead1 Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Sun, 23 May 2010 15:08:30 +1200 Subject: [PATCH 005/272] Fixed comment style --- include/SDL_platform.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/include/SDL_platform.h b/include/SDL_platform.h index a41f56309..90eed561c 100644 --- a/include/SDL_platform.h +++ b/include/SDL_platform.h @@ -67,12 +67,10 @@ #endif #if defined(ANDROID) #undef __ANDROID__ -#undef __LINUX__ //do we need to do this? +#undef __LINUX__ /*do we need to do this?*/ #define __ANDROID__ 1 #endif - - #if defined(__APPLE__) /* lets us know what version of Mac OS X we're compiling on */ #include "AvailabilityMacros.h" From 8706b8163d61c15dd9079eb6f74a9afb3678fb8f Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Sun, 23 May 2010 15:10:18 +1200 Subject: [PATCH 006/272] Fix compile errors under Android toolchain. Seems to have the same issue as the NDS. --- include/SDL_stdinc.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/SDL_stdinc.h b/include/SDL_stdinc.h index c7e7edd57..504ff32c4 100644 --- a/include/SDL_stdinc.h +++ b/include/SDL_stdinc.h @@ -167,9 +167,10 @@ SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); -#ifndef __NINTENDODS__ /* TODO: figure out why the following happens: - include/SDL_stdinc.h:150: error: size of array 'SDL_dummy_uint64' is negative - include/SDL_stdinc.h:151: error: size of array 'SDL_dummy_sint64' is negative */ +#if !defined(__NINTENDODS__) && !defined(__ANDROID__) +/* TODO: figure out why the following happens: + include/SDL_stdinc.h:150: error: size of array 'SDL_dummy_uint64' is negative + include/SDL_stdinc.h:151: error: size of array 'SDL_dummy_sint64' is negative */ SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); #endif @@ -188,7 +189,8 @@ SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); /** \cond */ #ifndef DOXYGEN_SHOULD_IGNORE_THIS -#ifndef __NINTENDODS__ /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ +#if !defined(__NINTENDODS__) && !defined(__ANDROID__) + /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ typedef enum { DUMMY_ENUM_VALUE From 0781a76fafb0698a3826ec7e0ac6a7deddce514d Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Sun, 23 May 2010 15:12:41 +1200 Subject: [PATCH 007/272] Fix a compile error when SDL_JOYSTICK_DISABLED is set --- src/events/SDL_events.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index e99a55d93..5fb5f075b 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -92,11 +92,13 @@ SDL_Unlock_EventThread(void) static __inline__ SDL_bool SDL_ShouldPollJoystick() { +#if !SDL_JOYSTICK_DISABLED if (SDL_numjoysticks && (!SDL_disabled_events[SDL_JOYAXISMOTION >> 8] || SDL_JoystickEventState(SDL_QUERY))) { return SDL_TRUE; } +#endif return SDL_FALSE; } From adfffe82b1e4ea1d729d24a07055b71b3fbc438a Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Sun, 23 May 2010 15:13:39 +1200 Subject: [PATCH 008/272] Added some wrapper shell scripts to make android compiling easier --- build-scripts/acc.sh | 15 +++++++++++++++ build-scripts/ald.sh | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100755 build-scripts/acc.sh create mode 100755 build-scripts/ald.sh diff --git a/build-scripts/acc.sh b/build-scripts/acc.sh new file mode 100755 index 000000000..e4be71c75 --- /dev/null +++ b/build-scripts/acc.sh @@ -0,0 +1,15 @@ +#!/bin/bash +ANDROID_NDK="/home/paul/Projects/gsoc/sdk/android-ndk-r4" +TOOLS_PATH="$ANDROID_NDK/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin" + +export PATH=$TOOLS_PATH:$PATH + +CC="arm-eabi-gcc" + +#cflags +ACC_C=" -I$ANDROID_NDK/build/platforms/android-4/common/include \ + -I$ANDROID_NDK/build/platforms/android-4/arch-arm/usr/include \ + -DANDROID -c" + + +$CC $CFLAGS $ACC_C $@ diff --git a/build-scripts/ald.sh b/build-scripts/ald.sh new file mode 100755 index 000000000..4aa6c3a4a --- /dev/null +++ b/build-scripts/ald.sh @@ -0,0 +1,18 @@ +#!/bin/bash +ANDROID_NDK="/home/paul/Projects/gsoc/sdk/android-ndk-r4" +TOOLS_PATH="$ANDROID_NDK/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin" + +export PATH=$TOOLS_PATH:$PATH + +LD="arm-eabi-ld" + +#ldflags +ACC_L=" -rpath-link=$ANDROID_NDK/build/platforms/android-4/arch-arm/usr/lib/ \ + -dynamic-linker=/system/bin/linker \ + -L$ANDROID_NDK/build/platforms/android-3/arch-arm/usr/lib/ -lc -nostdlib \ + $ANDROID_NDK/build/platforms/android-4/arch-arm/usr/lib/crtbegin_static.o \ + -L$ANDROID_NDK/build/prebuilt/linux-x86/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1 " + +$LD $ACC_L $LDFLAGS $@ -lgcc + + From e9e78ea46e02f4e3577d07cdb1c3740fcd576ae6 Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Sun, 23 May 2010 15:18:16 +1200 Subject: [PATCH 009/272] Added some android build stuff --- Makefile.android | 51 +++++++++++++++++++++++++ include/SDL_config_android.h | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100755 Makefile.android create mode 100755 include/SDL_config_android.h diff --git a/Makefile.android b/Makefile.android new file mode 100755 index 000000000..e60d4abab --- /dev/null +++ b/Makefile.android @@ -0,0 +1,51 @@ +# Makefile to build the SDL library + +ANDROID_NDK=/home/paul/Projects/gsoc/sdk/android-ndk-r4 +TOOLS_PATH=$(ANDROID_NDK)/build/prebuilt/linux-x86/arm-eabi-4.2.1/bin +ANDROID_INCLUDES = -I$(ANDROID_NDK)/build/platforms/android-4/common/include \ + -I$(ANDROID_NDK)/build/platforms/android-4/arch-arm/usr/include +INCLUDE = -I./include +CFLAGS = -g -O2 $(INCLUDE) $(ANDROID_INCLUDES) -DANDROID -static + +AR = $(TOOLS_PATH)/arm-eabi-ar +RANLIB = $(TOOLS_PATH)/arm-eabi-ranlib +CC = $(TOOLS_PATH)/arm-eabi-gcc + + +CONFIG_H = include/SDL_config.h +TARGET = libSDL.a +SOURCES = \ + src/*.c \ + src/audio/*.c \ + src/cpuinfo/*.c \ + src/events/*.c \ + src/file/*.c \ + src/joystick/*.c \ + src/haptic/*.c \ + src/stdlib/*.c \ + src/thread/*.c \ + src/timer/*.c \ + src/video/*.c \ + src/power/*.c \ + src/audio/dummy/*.c \ + src/video/dummy/*.c \ + src/joystick/dummy/*.c \ + src/haptic/dummy/*.c \ + src/atomic/dummy/*.c \ + src/thread/generic/*.c \ + src/timer/dummy/*.c \ + src/loadso/dummy/*.c \ + +OBJECTS = $(shell echo $(SOURCES) | sed -e 's,\.c,\.o,g') + +all: $(TARGET) + +$(TARGET): $(CONFIG_H) $(OBJECTS) + $(AR) crv $@ $^ + $(RANLIB) $@ + +$(CONFIG_H): + cp $(CONFIG_H).default $(CONFIG_H) + +clean: + rm -f $(TARGET) $(OBJECTS) diff --git a/include/SDL_config_android.h b/include/SDL_config_android.h new file mode 100755 index 000000000..c5877c49f --- /dev/null +++ b/include/SDL_config_android.h @@ -0,0 +1,72 @@ +/* + 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 +*/ + +#ifndef _SDL_config_android_h +#define _SDL_config_android_h + +#include "SDL_platform.h" + +/** + * \file SDL_config_android.h + * + * This is a configuration that can be used to build SDL for Android + */ + +#include + +/* +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +*/ + +#define SIZEOF_VOIDP 4 + +typedef unsigned int size_t; +//typedef unsigned long uintptr_t; + +#define SDL_AUDIO_DRIVER_DUMMY 1 + +#define SDL_CDROM_DISABLED 1 + +#define SDL_HAPTIC_DISABLED 1 + +#define SDL_JOYSTICK_DISABLED 1 + +#define SDL_LOADSO_DISABLED 1 + +#define SDL_THREADS_DISABLED 1 + +#define SDL_TIMERS_DISABLED 1 + +#define SDL_TIMER_UNIX 1 + +#define SDL_VIDEO_DRIVER_DUMMY 1 + +#define HAVE_STDIO_H 1 +#define HAVE_SYS_TYPES_H 1 + +#endif /* _SDL_config_minimal_h */ + From bcb2a5aa5ccc678afc4334be4f5815809ac4b429 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Mon, 24 May 2010 21:02:58 +0530 Subject: [PATCH 010/272] Added a #define option for compile time Xrender support. Added some more attributes (specific to Xrender) to the X11 structs. Added some code for querying the Xrender extension. --- src/video/x11/SDL_x11render.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index dcc26c1dc..e04a2ef3b 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -95,6 +95,13 @@ typedef struct int scanline_pad; Window xwindow; Pixmap pixmaps[3]; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + Picture xwindow_pict; + XRenderPictFormat* xwindow_pict_fmt; + XRenderPictureAttributes xwindow_pict_attr; + unsigned int xwindow_pict_attr_valuemask; + SDL_bool xrender_available; +#endif int current_pixmap; Drawable drawable; SDL_PixelFormat format; @@ -108,6 +115,9 @@ typedef struct SDL_SW_YUVTexture *yuv; Uint32 format; Pixmap pixmap; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + Picture picture; +#endif XImage *image; #ifndef NO_SHARED_MEMORY /* MIT shared memory extension information */ @@ -198,7 +208,22 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) data->depth = displaydata->depth; data->scanline_pad = displaydata->scanline_pad; data->xwindow = windowdata->xwindow; - +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + int event_basep, error_basep; + if(XRenderQueryExtension(data->display, &event_basep, &error_basep) == True) { + data->xrender_available = SDL_TRUE; + data->xwindow_pict_fmt = XRenderFindVisualFormat(data->display, data->visual); + data->xwindow_pict_attr_valuemask = 0; // FIXME + data->xwindow_pict = XRenderCreatePicture(data->display, + data->xwindow, + data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, + &data->xwindow_pict_attr); + } + else { + data->xrender_available = SDL_FALSE; + } +#endif renderer->DisplayModeChanged = X11_DisplayModeChanged; renderer->CreateTexture = X11_CreateTexture; renderer->QueryTexturePixels = X11_QueryTexturePixels; From ecae2b2aa9c6485cf04eaa41aa4cb9f2b9b0d34c Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Mon, 24 May 2010 23:44:24 -0400 Subject: [PATCH 011/272] Added Test Directory. Touch input works in touchSimp for wacom bamboo fun on Ubuntu linux. Not yet integrated into library. Should support other touch devices and other linux distros, but not tested on anything else. --- touchTest/makefile | 3 + touchTest/makefile~ | 3 + touchTest/testIn | Bin 0 -> 7451 bytes touchTest/testIn.c | 69 +++++++++++ touchTest/testIn.c~ | 69 +++++++++++ touchTest/touchPong | Bin 0 -> 28731 bytes touchTest/touchPong.c | 272 +++++++++++++++++++++++++++++++++++++++++ touchTest/touchPong.c~ | 243 ++++++++++++++++++++++++++++++++++++ touchTest/touchSimp | Bin 0 -> 28540 bytes touchTest/touchSimp.c | 238 ++++++++++++++++++++++++++++++++++++ touchTest/touchSimp.c~ | 241 ++++++++++++++++++++++++++++++++++++ 11 files changed, 1138 insertions(+) create mode 100644 touchTest/makefile create mode 100644 touchTest/makefile~ create mode 100755 touchTest/testIn create mode 100644 touchTest/testIn.c create mode 100644 touchTest/testIn.c~ create mode 100755 touchTest/touchPong create mode 100644 touchTest/touchPong.c create mode 100644 touchTest/touchPong.c~ create mode 100755 touchTest/touchSimp create mode 100644 touchTest/touchSimp.c create mode 100644 touchTest/touchSimp.c~ diff --git a/touchTest/makefile b/touchTest/makefile new file mode 100644 index 000000000..820205541 --- /dev/null +++ b/touchTest/makefile @@ -0,0 +1,3 @@ +SDLTest : touchSimp.c touchPong.c + gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g + gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g diff --git a/touchTest/makefile~ b/touchTest/makefile~ new file mode 100644 index 000000000..f27b5aa3d --- /dev/null +++ b/touchTest/makefile~ @@ -0,0 +1,3 @@ +SDLTest : touchSimp.c touchPong.c + gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -gSDLTest : + gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g diff --git a/touchTest/testIn b/touchTest/testIn new file mode 100755 index 0000000000000000000000000000000000000000..6ec332a5c71551edfb3feba2ed7af05c0bc3080f GIT binary patch literal 7451 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + +int main (int argc, char *argv[]) +{ + struct input_event ev[64]; + int fd, rd, value, size = sizeof (struct input_event); + char name[256] = "Unknown"; + char *device = NULL; + + //Setup check + if (argv[1] == NULL){ + printf("Please specify (on the command line) the path to the dev event interface device\n"); + exit (0); + } + + if ((getuid ()) != 0) + printf ("You are not root! This may not work...\n"); + + if (argc > 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + while (1){ + + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + printf("time: %i\n type: %X\n code: %X\n value: %i\n ",ev[0].time,ev[0].type,ev[0].value,ev[0].value); + + value = ev[0].value; + + if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Only read the key press event + printf ("Code[%d]\n", (ev[1].code)); + } + } + + return 0; +} diff --git a/touchTest/testIn.c~ b/touchTest/testIn.c~ new file mode 100644 index 000000000..73a8364b0 --- /dev/null +++ b/touchTest/testIn.c~ @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + +int main (int argc, char *argv[]) +{ + struct input_event ev[64]; + int fd, rd, value, size = sizeof (struct input_event); + char name[256] = "Unknown"; + char *device = NULL; + + //Setup check + if (argv[1] == NULL){ + printf("Please specify (on the command line) the path to the dev event interface device\n"); + exit (0); + } + + if ((getuid ()) != 0) + printf ("You are not root! This may not work...\n"); + + if (argc > 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + while (1){ + + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + printf("time: %i\n type: %X\n code: %X\n value: %i\n ",ev[0].time,ev[0].type,ev[0].value,ev[0].value); + + value = ev[0].value; + + if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){ // Only read the key press event + printf ("Code[%d]\n", (ev[1].code)); + } + } + + return 0; +} diff --git a/touchTest/touchPong b/touchTest/touchPong new file mode 100755 index 0000000000000000000000000000000000000000..29e892b462ebea82de922f31e41e8095bcd2283e GIT binary patch literal 28731 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 +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +//Pong Code +Point ball,ballv; + + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + ball.x = screen->w/2; + ball.y = screen->h/2; + ballv.x = -3; + ballv.y = 1; + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + + //Pong code + ball.x += ballv.x; + ball.y += ballv.y; + for(i=0;i 0 || finger[i].y > 0) + { + int d2 = (finger[i].x-ball.x)*(finger[i].x-ball.x) + + (finger[i].y-ball.y)*(finger[i].y-ball.y); + ballv.x += (50*(ball.x-finger[i].x))/d2; + ballv.y += (30*(ball.y-finger[i].y))/d2; + } + } + if((unsigned int)ball.x > screen->w){ + ball.x = screen->w/2; + ball.y = screen->h/2; + ballv.x = -3; + ballv.y = 1; + } + if((unsigned int)ball.y > screen->h) ballv.y *= -1; + printf("(%i,%i)\n",ball.x,ball.y); + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} diff --git a/touchTest/touchPong.c~ b/touchTest/touchPong.c~ new file mode 100644 index 000000000..4a60816eb --- /dev/null +++ b/touchTest/touchPong.c~ @@ -0,0 +1,243 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + +//Pong Code +Point ball,ballv; + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + ball.x = screen->width()/2; + ball.y = screen->height()/2; + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} diff --git a/touchTest/touchSimp b/touchTest/touchSimp new file mode 100755 index 0000000000000000000000000000000000000000..0caf1d15a2bc7b50101c6e91c88fdddeeeac137a GIT binary patch literal 28540 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 Jkf=Ul^}lfpK-~ZU literal 0 HcmV?d00001 diff --git a/touchTest/touchSimp.c b/touchTest/touchSimp.c new file mode 100644 index 000000000..b89f78207 --- /dev/null +++ b/touchTest/touchSimp.c @@ -0,0 +1,238 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} diff --git a/touchTest/touchSimp.c~ b/touchTest/touchSimp.c~ new file mode 100644 index 000000000..218cb4a8b --- /dev/null +++ b/touchTest/touchSimp.c~ @@ -0,0 +1,241 @@ +#include +#include +#include +#include +#include + + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + + +#define MAX_FINGERS 2 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + +typedef struct { + int x,y; +} Point; + +Point finger[MAX_FINGERS]; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i 1) + device = argv[1]; + + //Open Device + if ((fd = open (device, O_RDONLY)) == -1) + printf ("%s is not a vaild device.\n", device); + + //Print Device Name + ioctl (fd, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s (%s)\n", device, name); + + + + + + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + int tx,ty,curf=0; + + Point ball,ballv; + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + ball.x = screen->width()/2; + ball.y = screen->height()/2; + while(!keystat[27]) + { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + } + } + + //poll for Touch <- Goal: make this a case: + if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); + //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", + // ev->time,ev->type,ev->code,ev->value); + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} From 5282223c793ab3e0b77587d9d36d1f99644cbdaa Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 24 May 2010 22:56:36 -0700 Subject: [PATCH 012/272] SDL_KillThread() is no longer supported - it was always dangerous! :) --- include/SDL_compat.h | 1 + include/SDL_thread.h | 10 ---------- src/SDL_compat.c | 1 - src/thread/SDL_thread.c | 6 ------ 4 files changed, 1 insertion(+), 17 deletions(-) diff --git a/include/SDL_compat.h b/include/SDL_compat.h index 3b7a7acf7..1af228ac5 100644 --- a/include/SDL_compat.h +++ b/include/SDL_compat.h @@ -324,6 +324,7 @@ extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); #define SDL_RenderPoint SDL_RenderDrawPoint #define SDL_RenderLine SDL_RenderDrawLine #define SDL_RenderFill(X) (X) ? SDL_RenderFillRect(X) : SDL_RenderClear() +#define SDL_KillThread(X) extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); diff --git a/include/SDL_thread.h b/include/SDL_thread.h index fc3d36d75..cca172dee 100644 --- a/include/SDL_thread.h +++ b/include/SDL_thread.h @@ -149,16 +149,6 @@ extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); */ extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); -/** - * \deprecated This function is here for binary compatibility with legacy apps, - * but in SDL 1.3 and later, it's a no-op. - * - * You cannot forcibly kill a thread in a safe manner on many platforms. You - * should instead find a way to alert your thread that it is time to terminate, - * and then have it gracefully exit on its own. Do not ever call this function! - */ -extern DECLSPEC void SDLCALL SDL_KillThread(SDL_Thread * thread); - /* Ends C function definitions when using C++ */ #ifdef __cplusplus diff --git a/src/SDL_compat.c b/src/SDL_compat.c index 0c094e8a7..87feffc8d 100644 --- a/src/SDL_compat.c +++ b/src/SDL_compat.c @@ -1750,7 +1750,6 @@ SDL_EnableUNICODE(int enable) return previous; } - int SDL_putenv(const char *_var) { diff --git a/src/thread/SDL_thread.c b/src/thread/SDL_thread.c index 08181cac9..8004757de 100644 --- a/src/thread/SDL_thread.c +++ b/src/thread/SDL_thread.c @@ -305,10 +305,4 @@ SDL_GetThreadID(SDL_Thread * thread) return id; } -void -SDL_KillThread(SDL_Thread * thread) -{ - /* This is a no-op in SDL 1.3 and later. */ -} - /* vi: set ts=4 sw=4 expandtab: */ From 309b1b6ee70f196e6c2965f238f40a165862a4a7 Mon Sep 17 00:00:00 2001 From: dewyatt Date: Tue, 25 May 2010 18:53:09 -0400 Subject: [PATCH 013/272] Adding GLTSF (somewhat based on SFML, no actual TSF code yet) --- EXCLUDE/GLTSF/GLTSF.sln | 20 ++ EXCLUDE/GLTSF/GLTSF.vcxproj | 97 ++++++++ EXCLUDE/GLTSF/GLTSF.vcxproj.filters | 45 ++++ EXCLUDE/GLTSF/include/App.hpp | 26 +++ EXCLUDE/GLTSF/include/Video_Mode.hpp | 30 +++ EXCLUDE/GLTSF/include/Window.hpp | 55 +++++ EXCLUDE/GLTSF/include/Window_Listener.hpp | 13 ++ EXCLUDE/GLTSF/src/App.cpp | 56 +++++ EXCLUDE/GLTSF/src/Main.cpp | 17 ++ EXCLUDE/GLTSF/src/Video_Mode.cpp | 100 ++++++++ EXCLUDE/GLTSF/src/Window.cpp | 263 ++++++++++++++++++++++ 11 files changed, 722 insertions(+) create mode 100644 EXCLUDE/GLTSF/GLTSF.sln create mode 100644 EXCLUDE/GLTSF/GLTSF.vcxproj create mode 100644 EXCLUDE/GLTSF/GLTSF.vcxproj.filters create mode 100644 EXCLUDE/GLTSF/include/App.hpp create mode 100644 EXCLUDE/GLTSF/include/Video_Mode.hpp create mode 100644 EXCLUDE/GLTSF/include/Window.hpp create mode 100644 EXCLUDE/GLTSF/include/Window_Listener.hpp create mode 100644 EXCLUDE/GLTSF/src/App.cpp create mode 100644 EXCLUDE/GLTSF/src/Main.cpp create mode 100644 EXCLUDE/GLTSF/src/Video_Mode.cpp create mode 100644 EXCLUDE/GLTSF/src/Window.cpp diff --git a/EXCLUDE/GLTSF/GLTSF.sln b/EXCLUDE/GLTSF/GLTSF.sln new file mode 100644 index 000000000..f69c11422 --- /dev/null +++ b/EXCLUDE/GLTSF/GLTSF.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GLTSF", "GLTSF.vcxproj", "{790D58BA-E5F6-4286-A9C6-0DC28779789D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {790D58BA-E5F6-4286-A9C6-0DC28779789D}.Debug|Win32.ActiveCfg = Debug|Win32 + {790D58BA-E5F6-4286-A9C6-0DC28779789D}.Debug|Win32.Build.0 = Debug|Win32 + {790D58BA-E5F6-4286-A9C6-0DC28779789D}.Release|Win32.ActiveCfg = Release|Win32 + {790D58BA-E5F6-4286-A9C6-0DC28779789D}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/EXCLUDE/GLTSF/GLTSF.vcxproj b/EXCLUDE/GLTSF/GLTSF.vcxproj new file mode 100644 index 000000000..374e16c12 --- /dev/null +++ b/EXCLUDE/GLTSF/GLTSF.vcxproj @@ -0,0 +1,97 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {790D58BA-E5F6-4286-A9C6-0DC28779789D} + Win32Proj + GLTSF + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + true + $(SolutionDir)bin\ + obj\$(Configuration)\ + + + false + $(SolutionDir)bin\ + obj\$(Configuration)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + include;%(AdditionalIncludeDirectories) + + + Console + true + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EXCLUDE/GLTSF/GLTSF.vcxproj.filters b/EXCLUDE/GLTSF/GLTSF.vcxproj.filters new file mode 100644 index 000000000..04c10f6df --- /dev/null +++ b/EXCLUDE/GLTSF/GLTSF.vcxproj.filters @@ -0,0 +1,45 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/EXCLUDE/GLTSF/include/App.hpp b/EXCLUDE/GLTSF/include/App.hpp new file mode 100644 index 000000000..658f73b81 --- /dev/null +++ b/EXCLUDE/GLTSF/include/App.hpp @@ -0,0 +1,26 @@ +#ifndef APP_HPP +#define APP_HPP + +#include "Window.hpp" + +class App : public Window_Listener +{ +public: + App(); + virtual ~App(); + + void Initialize(); + void Finalize(); + + void Run(); + + virtual void On_Close(); + virtual void On_Key_Down(int Key); + virtual void On_Key_Up(int Key); + +private: + Window my_Window; + bool my_Done; +}; + +#endif diff --git a/EXCLUDE/GLTSF/include/Video_Mode.hpp b/EXCLUDE/GLTSF/include/Video_Mode.hpp new file mode 100644 index 000000000..00a801400 --- /dev/null +++ b/EXCLUDE/GLTSF/include/Video_Mode.hpp @@ -0,0 +1,30 @@ +#ifndef VIDEO_MODE_HPP +#define VIDEO_MODE_HPP + +#include + +class Video_Mode +{ +public: + Video_Mode(); + Video_Mode(unsigned int The_Width, unsigned int The_Height, unsigned int The_Bits_Per_Pixel); + + static Video_Mode Get_Desktop_Mode(); + + static std::size_t Get_Mode_Count(); + static Video_Mode Get_Mode(std::size_t Index); + + bool Is_Valid() const; + + bool operator==(const Video_Mode &Mode) const; + bool operator!=(const Video_Mode &Mode) const; + + unsigned int Width; + unsigned int Height; + unsigned int Bits_Per_Pixel; + +private: + static void Initialize_Modes(); +}; + +#endif diff --git a/EXCLUDE/GLTSF/include/Window.hpp b/EXCLUDE/GLTSF/include/Window.hpp new file mode 100644 index 000000000..f07fd477a --- /dev/null +++ b/EXCLUDE/GLTSF/include/Window.hpp @@ -0,0 +1,55 @@ +#ifndef WINDOW_HPP +#define WINDOW_HPP + +#include + +#define WIN32_LEAN_AND_MEAN +#include + +#include "Video_Mode.hpp" +#include "Window_Listener.hpp" + +class Window +{ +public: + Window(); + ~Window(); + + void Initialize(const std::wstring &Title, const Video_Mode &Mode, bool Fullscreen); + void Finalize(); + + void Set_Listener(Window_Listener *Listener); + + void Show(); + void Hide(); + + void Update(); + void Display(); + +private: + static const wchar_t *Window_Class_Name; + + void Register_Class(); + void Unregister_Class(); + + void Create_Window(const std::wstring &Title, const Video_Mode &Mode, bool Fullscreen); + void Destroy_Window(); + + void Create_Context(const Video_Mode &Mode); + void Destroy_Context(); + + void Switch_To_Fullscreen(const Video_Mode &Mode); + + LRESULT Handle_Message(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK Window_Procedure(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam); + + HWND my_Handle; + Video_Mode my_Video_Mode; + bool my_Fullscreen; + HDC my_Device_Context; + HGLRC my_GL_Context; + bool my_Class_Registered; + Window_Listener *my_Listener; +}; + +#endif diff --git a/EXCLUDE/GLTSF/include/Window_Listener.hpp b/EXCLUDE/GLTSF/include/Window_Listener.hpp new file mode 100644 index 000000000..52396f7e8 --- /dev/null +++ b/EXCLUDE/GLTSF/include/Window_Listener.hpp @@ -0,0 +1,13 @@ +#ifndef WINDOW_LISTENER_HPP +#define WINDOW_LISTENER_HPP + +class Window_Listener +{ +public: + virtual void On_Close(){} + + virtual void On_Key_Down(int Key){} + virtual void On_Key_Up(int Key){} +}; + +#endif diff --git a/EXCLUDE/GLTSF/src/App.cpp b/EXCLUDE/GLTSF/src/App.cpp new file mode 100644 index 000000000..ae8ca73a5 --- /dev/null +++ b/EXCLUDE/GLTSF/src/App.cpp @@ -0,0 +1,56 @@ +#include "App.hpp" + +App::App() : my_Done(false) +{ + +} + +App::~App() +{ + Finalize(); +} + +void App::Initialize() +{ + Finalize(); + + my_Window.Initialize(L"GLTSF", Video_Mode(800, 600, 32), false); + my_Window.Set_Listener(this); + my_Window.Show(); +} + +void App::Finalize() +{ + my_Window.Finalize(); +} + +void App::Run() +{ + Initialize(); + while (!my_Done) + { + my_Window.Update(); + my_Window.Display(); + } +} + +void App::On_Close() +{ + my_Done = true; + my_Window.Hide(); +} + +void App::On_Key_Down(int Key) +{ + switch (Key) + { + case VK_ESCAPE: + On_Close(); + break; + } +} + +void App::On_Key_Up(int Key) +{ + +} diff --git a/EXCLUDE/GLTSF/src/Main.cpp b/EXCLUDE/GLTSF/src/Main.cpp new file mode 100644 index 000000000..31febadbf --- /dev/null +++ b/EXCLUDE/GLTSF/src/Main.cpp @@ -0,0 +1,17 @@ +#include "App.hpp" +#include + +int main(int argc, char *argv[]) +{ + try + { + App theApp; + theApp.Run(); + } + catch (const std::exception& e) + { + printf("Error: %s\n", e.what()); + return 1; + } + return 0; +} diff --git a/EXCLUDE/GLTSF/src/Video_Mode.cpp b/EXCLUDE/GLTSF/src/Video_Mode.cpp new file mode 100644 index 000000000..177e8b956 --- /dev/null +++ b/EXCLUDE/GLTSF/src/Video_Mode.cpp @@ -0,0 +1,100 @@ +#include "Video_Mode.hpp" +#include +#include +#define WIN32_LEAN_AND_MEAN +#include + +namespace +{ + + typedef std::vector Video_Mode_List; + Video_Mode_List Supported_Modes; + + struct Compare_Modes + { + bool operator()(const Video_Mode &Mode_1, const Video_Mode &Mode_2) const + { + if (Mode_1.Bits_Per_Pixel > Mode_2.Bits_Per_Pixel) + return true; + else if (Mode_1.Bits_Per_Pixel < Mode_2.Bits_Per_Pixel) + return false; + else if (Mode_1.Width > Mode_2.Width) + return true; + else if (Mode_1.Width < Mode_2.Width) + return false; + else + return Mode_1.Height > Mode_2.Height; + } + }; + +} + +Video_Mode::Video_Mode() : Width(0), + Height(0), + Bits_Per_Pixel(0) +{ + +} + +Video_Mode::Video_Mode(unsigned int The_Width, unsigned int The_Height, unsigned int The_Bits_Per_Pixel) + : Width(The_Width), + Height(The_Height), + Bits_Per_Pixel(The_Bits_Per_Pixel) +{ + +} + +Video_Mode Video_Mode::Get_Desktop_Mode() +{ + DEVMODE Device_Mode = {0}; + Device_Mode.dmSize = sizeof(Device_Mode); + EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &Device_Mode); + return Video_Mode(Device_Mode.dmPelsWidth, Device_Mode.dmPelsHeight, Device_Mode.dmBitsPerPel); +} + +std::size_t Video_Mode::Get_Mode_Count() +{ + Initialize_Modes(); + return Supported_Modes.size(); +} + +Video_Mode Video_Mode::Get_Mode(std::size_t Index) +{ + Initialize_Modes(); + return Supported_Modes[Index]; +} + +bool Video_Mode::Is_Valid() const +{ + Initialize_Modes(); + return Supported_Modes.end() != std::find(Supported_Modes.begin(), Supported_Modes.end(), *this); +} + +bool Video_Mode::operator==(const Video_Mode &Mode) const +{ + return (Width == Mode.Width + && Height == Mode.Height + && Bits_Per_Pixel == Mode.Bits_Per_Pixel); +} + +bool Video_Mode::operator!=(const Video_Mode &Mode) const +{ + return !(*this == Mode); +} + +void Video_Mode::Initialize_Modes() +{ + static bool Initialized = false; + if (!Initialized) + { + DEVMODE Device_Mode = {0}; + Device_Mode.dmSize = sizeof(Device_Mode); + for (std::size_t i = 0; 0 != EnumDisplaySettings(NULL, i, &Device_Mode); ++i) + { + Video_Mode Mode(Device_Mode.dmPelsWidth, Device_Mode.dmPelsHeight, Device_Mode.dmBitsPerPel); + if (Supported_Modes.end() == std::find(Supported_Modes.begin(), Supported_Modes.end(), Mode)) + Supported_Modes.push_back(Mode); + } + std::sort(Supported_Modes.begin(), Supported_Modes.end(), Compare_Modes()); + } +} diff --git a/EXCLUDE/GLTSF/src/Window.cpp b/EXCLUDE/GLTSF/src/Window.cpp new file mode 100644 index 000000000..955693c05 --- /dev/null +++ b/EXCLUDE/GLTSF/src/Window.cpp @@ -0,0 +1,263 @@ +#include "Window.hpp" + +#pragma comment(lib, "opengl32.lib") + +const wchar_t *Window::Window_Class_Name = L"GLTSF"; + +Window::Window() : my_Handle(0), + my_Device_Context(0), + my_GL_Context(0), + my_Class_Registered(false), + my_Listener(0) +{ + +} + +Window::~Window() +{ + Finalize(); +} + +void Window::Initialize(const std::wstring &Title, const Video_Mode &Mode, bool Fullscreen) +{ + Finalize(); + + my_Video_Mode = Mode; + if (!my_Video_Mode.Is_Valid()) + throw std::runtime_error("Invalid video mode"); + + my_Fullscreen = Fullscreen; + Register_Class(); + Create_Window(Title, Mode, Fullscreen); +} + +void Window::Finalize() +{ + Destroy_Window(); + Unregister_Class(); +} + +void Window::Set_Listener(Window_Listener *Listener) +{ + my_Listener = Listener; +} + +void Window::Register_Class() +{ + WNDCLASSEXW Window_Class = {0}; + Window_Class.cbSize = sizeof(Window_Class); + Window_Class.style = 0; + Window_Class.lpfnWndProc = &Window::Window_Procedure; + Window_Class.cbClsExtra = 0; + Window_Class.cbWndExtra = 0; + Window_Class.hInstance = GetModuleHandle(NULL); + Window_Class.hIcon = NULL; + Window_Class.hCursor = NULL; + Window_Class.hbrBackground = NULL; + Window_Class.lpszMenuName = NULL; + Window_Class.lpszClassName = Window_Class_Name; + Window_Class.hIconSm = NULL; + if (0 == RegisterClassExW(&Window_Class)) + throw std::runtime_error("Failed to register window class"); + + my_Class_Registered = true; +} + +void Window::Unregister_Class() +{ + if (my_Class_Registered) + { + if (0 == UnregisterClassW(Window_Class_Name, GetModuleHandle(NULL))) + printf("Warning: Failed to unregister window class\n"); + + my_Class_Registered = false; + } +} + +void Window::Create_Window(const std::wstring &Title, const Video_Mode &Mode, bool Fullscreen) +{ + HDC Screen_DC = GetDC(NULL); + int Left = (GetDeviceCaps(Screen_DC, HORZRES) - my_Video_Mode.Width) / 2; + int Top = (GetDeviceCaps(Screen_DC, VERTRES) - my_Video_Mode.Height) / 2; + int Width = my_Video_Mode.Width; + int Height = my_Video_Mode.Height; + ReleaseDC(NULL, Screen_DC); + + DWORD Style = WS_OVERLAPPEDWINDOW; + if (!my_Fullscreen) + { + RECT Rect = {0, 0, Width, Height}; + AdjustWindowRect(&Rect, Style, false); + Width = Rect.right - Rect.left; + Height = Rect.bottom - Rect.top; + } + my_Handle = CreateWindowW(Window_Class_Name, Title.c_str(), Style, Left, Top, Width, Height, NULL, NULL, GetModuleHandle(NULL), this); + if (!my_Handle) + throw std::runtime_error("Failed to create window"); + + if (Fullscreen) + Switch_To_Fullscreen(Mode); + + Create_Context(Mode); + + RECT Rect = {0}; + GetClientRect(my_Handle, &Rect); + //TODO: ... +} + +void Window::Destroy_Window() +{ + Destroy_Context(); + if (my_Handle) + { + DestroyWindow(my_Handle); + my_Handle = 0; + + if (my_Fullscreen) + ChangeDisplaySettings(NULL, 0); + } +} + +void Window::Create_Context(const Video_Mode &Mode) +{ + my_Device_Context = GetDC(my_Handle); + if (!my_Device_Context) + throw std::runtime_error("Failed to get device context"); + + PIXELFORMATDESCRIPTOR Pixel_Descriptor = {0}; + Pixel_Descriptor.nSize = sizeof(Pixel_Descriptor); + Pixel_Descriptor.nVersion = 1; + Pixel_Descriptor.iLayerType = PFD_MAIN_PLANE; + Pixel_Descriptor.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + Pixel_Descriptor.iPixelType = PFD_TYPE_RGBA; + Pixel_Descriptor.cColorBits = static_cast(Mode.Bits_Per_Pixel); + Pixel_Descriptor.cDepthBits = 24; + Pixel_Descriptor.cStencilBits = 8; + Pixel_Descriptor.cAlphaBits = Mode.Bits_Per_Pixel == 32 ? 8 : 0; + + int Best_Format = ChoosePixelFormat(my_Device_Context, &Pixel_Descriptor); + if (0 == Best_Format) + throw std::runtime_error("Failed to find suitable pixel format"); + + PIXELFORMATDESCRIPTOR Actual_Format = {0}; + Actual_Format.nSize = sizeof(Actual_Format); + Actual_Format.nVersion = 1; + DescribePixelFormat(my_Device_Context, Best_Format, sizeof(Actual_Format), &Actual_Format); + if (!SetPixelFormat(my_Device_Context, Best_Format, &Actual_Format)) + throw std::runtime_error("Failed to set device pixel format"); + + my_GL_Context = wglCreateContext(my_Device_Context); + if (!my_GL_Context) + throw std::runtime_error("Failed to create OpenGL context"); + + wglMakeCurrent(my_Device_Context, my_GL_Context); +} + +void Window::Destroy_Context() +{ + if (my_GL_Context) + { + wglDeleteContext(my_GL_Context); + my_GL_Context = 0; + } + if (my_Device_Context) + { + ReleaseDC(my_Handle, my_Device_Context); + my_Device_Context = 0; + } +} + +void Window::Switch_To_Fullscreen(const Video_Mode &Mode) +{ + DEVMODE Device_Mode = {0}; + Device_Mode.dmSize = sizeof(Device_Mode); + Device_Mode.dmPelsWidth = Mode.Width; + Device_Mode.dmPelsHeight = Mode.Height; + Device_Mode.dmBitsPerPel = Mode.Bits_Per_Pixel; + Device_Mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; + + if (DISP_CHANGE_SUCCESSFUL != ChangeDisplaySettings(&Device_Mode, CDS_FULLSCREEN)) + throw std::runtime_error("Failed to change to fullscreen mode"); + + SetWindowLong(my_Handle, GWL_STYLE, WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); + SetWindowLong(my_Handle, GWL_EXSTYLE, WS_EX_APPWINDOW); + + SetWindowPos(my_Handle, HWND_TOP, 0, 0, Mode.Width, Mode.Height, SWP_FRAMECHANGED); +} + +LRESULT CALLBACK Window::Window_Procedure(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_CREATE: + { + LONG This = reinterpret_cast(reinterpret_cast(lParam)->lpCreateParams); + SetWindowLongPtr(Handle, GWLP_USERDATA, This); + return 0; + } + break; + case WM_DESTROY: + PostQuitMessage(0); + return 0; + break; + default: + { + Window* Win = reinterpret_cast(GetWindowLongPtr(Handle, GWLP_USERDATA)); + if (Win) + return Win->Handle_Message(Handle, Message, wParam, lParam); + } + break; + } + return DefWindowProcW(Handle, Message, wParam, lParam); +} + +#define Call_Listener(x)\ + if (my_Listener) my_Listener->x + +LRESULT Window::Handle_Message(HWND Handle, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_CLOSE: + Call_Listener(On_Close()); + break; + case WM_KEYDOWN: + Call_Listener(On_Key_Down(wParam)); + break; + case WM_KEYUP: + Call_Listener(On_Key_Up(wParam)); + break; + default: + return DefWindowProcW(Handle, Message, wParam, lParam); + break; + } + return 0; +} + +void Window::Show() +{ + if (my_Handle) + ShowWindow(my_Handle, SW_SHOW); +} + +void Window::Hide() +{ + if (my_Handle) + ShowWindow(my_Handle, SW_HIDE); +} + +void Window::Update() +{ + MSG Message = {0}; + while (PeekMessageW(&Message, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&Message); + DispatchMessageW(&Message); + } +} + +void Window::Display() +{ + if (my_Device_Context && my_GL_Context) + SwapBuffers(my_Device_Context); +} From 3ce819866e6cf8d3a618f674248bd788c7ad9594 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Tue, 25 May 2010 23:23:23 -0400 Subject: [PATCH 014/272] Added SDL_touch.c/SDL_touch_c.h as slightly modifeind SDL_mouse*. Made reads in touchSimp non-blocking. --- src/events/SDL_events_c.h | 1 + src/events/SDL_touch.c | 575 ++++++++++++++++++++++++++++++++++ src/events/SDL_touch_c.h | 113 +++++++ src/video/x11/SDL_x11events.c | 4 + touchTest/touchSimp | Bin 28540 -> 28772 bytes touchTest/touchSimp.c | 92 +++--- 6 files changed, 741 insertions(+), 44 deletions(-) create mode 100644 src/events/SDL_touch.c create mode 100644 src/events/SDL_touch_c.h diff --git a/src/events/SDL_events_c.h b/src/events/SDL_events_c.h index 2f48e0614..ea1ec445b 100644 --- a/src/events/SDL_events_c.h +++ b/src/events/SDL_events_c.h @@ -26,6 +26,7 @@ #include "SDL_thread.h" #include "SDL_mouse_c.h" #include "SDL_keyboard_c.h" +#include "SDL_touch_c.h" #include "SDL_windowevents_c.h" /* Start and stop the event processing loop */ diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c new file mode 100644 index 000000000..0700abc01 --- /dev/null +++ b/src/events/SDL_touch.c @@ -0,0 +1,575 @@ +/* + 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 +*/ +#include "SDL_config.h" + +/* General touch handling code for SDL */ + +#include "SDL_events.h" +#include "SDL_events_c.h" +#include "../video/SDL_sysvideo.h" + + +static int SDL_num_touch = 0; +static int SDL_current_touch = -1; +static SDL_Touch **SDL_touch = NULL; + + +/* Public functions */ +int +SDL_TouchInit(void) +{ + return (0); +} + +SDL_Touch * +SDL_GetTouch(int index) +{ + if (index < 0 || index >= SDL_num_touch) { + return NULL; + } + return SDL_touch[index]; +} + +static int +SDL_GetTouchIndexId(int id) +{ + int index; + SDL_Touch *touch; + + for (index = 0; index < SDL_num_touch; ++index) { + touch = SDL_GetTouch(index); + if (touch->id == id) { + return index; + } + } + return -1; +} + +int +SDL_AddTouch(const SDL_Touch * touch, char *name, int pressure_max, + int pressure_min, int ends) +{ + SDL_Touch **touch; + int selected_touch; + int index; + size_t length; + + if (SDL_GetTouchIndexId(touch->id) != -1) { + SDL_SetError("Touch ID already in use"); + } + + /* Add the touch to the list of touch */ + touch = (SDL_Touch **) SDL_realloc(SDL_touch, + (SDL_num_touch + 1) * sizeof(*touch)); + if (!touch) { + SDL_OutOfMemory(); + return -1; + } + + SDL_touch = touch; + index = SDL_num_touch++; + + SDL_touch[index] = (SDL_Touch *) SDL_malloc(sizeof(*SDL_touch[index])); + if (!SDL_touch[index]) { + SDL_OutOfMemory(); + return -1; + } + *SDL_touch[index] = *touch; + + /* we're setting the touch properties */ + length = 0; + length = SDL_strlen(name); + SDL_touch[index]->focus = 0; + SDL_touch[index]->name = SDL_malloc((length + 2) * sizeof(char)); + SDL_strlcpy(SDL_touch[index]->name, name, length + 1); + SDL_touch[index]->pressure_max = pressure_max; + SDL_touch[index]->pressure_min = pressure_min; + SDL_touch[index]->cursor_shown = SDL_TRUE; + selected_touch = SDL_SelectTouch(index); + SDL_touch[index]->cur_cursor = NULL; + SDL_touch[index]->def_cursor = + /* we're assuming that all touch are in the computer sensing zone */ + SDL_touch[index]->proximity = SDL_TRUE; + /* we're assuming that all touch are working in the absolute position mode + thanx to that, the users that don't want to use many touch don't have to + worry about anything */ + SDL_touch[index]->relative_mode = SDL_FALSE; + SDL_touch[index]->current_end = 0; + SDL_touch[index]->total_ends = ends; + SDL_SelectTouch(selected_touch); + + return index; +} + +void +SDL_DelTouch(int index) +{ + SDL_Touch *touch = SDL_GetTouch(index); + + if (!touch) { + return; + } + + touch->def_cursor = NULL; + SDL_free(touch->name); + + if (touch->FreeTouch) { + touch->FreeTouch(touch); + } + SDL_free(touch); + + SDL_touch[index] = NULL; +} + +void +SDL_ResetTouch(int index) +{ + SDL_Touch *touch = SDL_GetTouch(index); + + if (!touch) { + return; + } + + /* FIXME */ +} + +void +SDL_TouchQuit(void) +{ + int i; + + for (i = 0; i < SDL_num_touch; ++i) { + SDL_DelTouch(i); + } + SDL_num_touch = 0; + SDL_current_touch = -1; + + if (SDL_touch) { + SDL_free(SDL_touch); + SDL_touch = NULL; + } +} + +int +SDL_GetNumTouch(void) +{ + return SDL_num_touch; +} + +int +SDL_SelectTouch(int index) +{ + if (index >= 0 && index < SDL_num_touch) { + SDL_current_touch = index; + } + return SDL_current_touch; +} + +SDL_Window * +SDL_GetTouchFocusWindow(int index) +{ + SDL_Touch *touch = SDL_GetTouch(index); + + if (!touch) { + return 0; + } + return touch->focus; +} + +static int SDLCALL +FlushTouchMotion(void *param, SDL_Event * event) +{ + if (event->type == SDL_TOUCHMOTION + && event->motion.which == (Uint8) SDL_current_touch) { + return 0; + } else { + return 1; + } +} + +int +SDL_SetRelativeTouchMode(int index, SDL_bool enabled) +{ + SDL_Touch *touch = SDL_GetTouch(index); + + if (!touch) { + return -1; + } + + /* Flush pending touch motion */ + touch->flush_motion = SDL_TRUE; + SDL_PumpEvents(); + touch->flush_motion = SDL_FALSE; + SDL_FilterEvents(FlushTouchMotion, touch); + + /* Set the relative mode */ + touch->relative_mode = enabled; + + + + if (!enabled) { + /* Restore the expected touch position */ + SDL_WarpTouchInWindow(touch->focus, touch->x, touch->y); + } + return 0; +} + +SDL_bool +SDL_GetRelativeTouchMode(int index) +{ + SDL_Touch *touch = SDL_GetTouch(index); + + if (!touch) { + return SDL_FALSE; + } + return touch->relative_mode; +} + +Uint8 +SDL_GetTouchState(int *x, int *y) +{ + SDL_Touch *touch = SDL_GetTouch(SDL_current_touch); + + if (!touch) { + if (x) { + *x = 0; + } + if (y) { + *y = 0; + } + return 0; + } + + if (x) { + *x = touch->x; + } + if (y) { + *y = touch->y; + } + return touch->buttonstate; +} + +Uint8 +SDL_GetRelativeTouchState(int index, int *x, int *y) +{ + SDL_Touch *touch = SDL_GetTouch(index); + + if (!touch) { + if (x) { + *x = 0; + } + if (y) { + *y = 0; + } + return 0; + } + + if (x) { + *x = touch->xdelta; + } + if (y) { + *y = touch->ydelta; + } + touch->xdelta = 0; + touch->ydelta = 0; + return touch->buttonstate; +} + +void +SDL_SetTouchFocus(int id, SDL_Window * window) +{ + int index = SDL_GetTouchIndexId(id); + SDL_Touch *touch = SDL_GetTouch(index); + int i; + SDL_bool focus; + + if (!touch || (touch->focus == window)) { + return; + } + + /* See if the current window has lost focus */ + if (touch->focus) { + focus = SDL_FALSE; + for (i = 0; i < SDL_num_touch; ++i) { + SDL_Touch *check; + if (i != index) { + check = SDL_GetTouch(i); + if (check && check->focus == touch->focus) { + focus = SDL_TRUE; + break; + } + } + } + if (!focus) { + SDL_SendWindowEvent(touch->focus, SDL_WINDOWEVENT_LEAVE, 0, 0); + } + } + + touch->focus = window; + + if (touch->focus) { + focus = SDL_FALSE; + for (i = 0; i < SDL_num_touch; ++i) { + SDL_Touch *check; + if (i != index) { + check = SDL_GetTouch(i); + if (check && check->focus == touch->focus) { + focus = SDL_TRUE; + break; + } + } + } + if (!focus) { + SDL_SendWindowEvent(touch->focus, SDL_WINDOWEVENT_ENTER, 0, 0); + } + } +} + +int +SDL_SendProximity(int id, int x, int y, int type) +{ + int index = SDL_GetTouchIndexId(id); + SDL_Touch *touch = SDL_GetTouch(index); + int posted = 0; + + if (!touch) { + return 0; + } + + touch->last_x = x; + touch->last_y = y; + if (SDL_GetEventState(type) == SDL_ENABLE) { + SDL_Event event; + event.proximity.which = (Uint8) index; + event.proximity.x = x; + event.proximity.y = y; + event.proximity.cursor = touch->current_end; + event.proximity.type = type; + /* FIXME: is this right? */ + event.proximity.windowID = touch->focus ? touch->focus->id : 0; + posted = (SDL_PushEvent(&event) > 0); + if (type == SDL_PROXIMITYIN) { + touch->proximity = SDL_TRUE; + } else { + touch->proximity = SDL_FALSE; + } + } + return posted; +} + +int +SDL_SendTouchMotion(int id, int relative, int x, int y, int pressure) +{ + int index = SDL_GetTouchIndexId(id); + SDL_Touch *touch = SDL_GetTouch(index); + int posted; + int xrel; + int yrel; + int x_max = 0, y_max = 0; + + if (!touch || touch->flush_motion) { + return 0; + } + + /* if the touch is out of proximity we don't to want to have any motion from it */ + if (touch->proximity == SDL_FALSE) { + touch->last_x = x; + touch->last_y = y; + return 0; + } + + /* the relative motion is calculated regarding the system cursor last position */ + if (relative) { + xrel = x; + yrel = y; + x = (touch->last_x + x); + y = (touch->last_y + y); + } else { + xrel = x - touch->last_x; + yrel = y - touch->last_y; + } + + /* Drop events that don't change state */ + if (!xrel && !yrel) { +#if 0 + printf("Touch event didn't change state - dropped!\n"); +#endif + return 0; + } + + /* Update internal touch coordinates */ + if (touch->relative_mode == SDL_FALSE) { + touch->x = x; + touch->y = y; + } else { + touch->x += xrel; + touch->y += yrel; + } + + SDL_GetWindowSize(touch->focus, &x_max, &y_max); + + /* make sure that the pointers find themselves inside the windows */ + /* only check if touch->xmax is set ! */ + if (x_max && touch->x > x_max) { + touch->x = x_max; + } else if (touch->x < 0) { + touch->x = 0; + } + + if (y_max && touch->y > y_max) { + touch->y = y_max; + } else if (touch->y < 0) { + touch->y = 0; + } + + touch->xdelta += xrel; + touch->ydelta += yrel; + touch->pressure = pressure; + + + + /* Post the event, if desired */ + posted = 0; + if (SDL_GetEventState(SDL_TOUCHMOTION) == SDL_ENABLE && + touch->proximity == SDL_TRUE) { + SDL_Event event; + event.motion.type = SDL_TOUCHMOTION; + event.motion.which = (Uint8) index; + event.motion.state = touch->buttonstate; + event.motion.x = touch->x; + event.motion.y = touch->y; + event.motion.z = touch->z; + event.motion.pressure = touch->pressure; + event.motion.pressure_max = touch->pressure_max; + event.motion.pressure_min = touch->pressure_min; + event.motion.rotation = 0; + event.motion.tilt_x = 0; + event.motion.tilt_y = 0; + event.motion.cursor = touch->current_end; + event.motion.xrel = xrel; + event.motion.yrel = yrel; + event.motion.windowID = touch->focus ? touch->focus->id : 0; + posted = (SDL_PushEvent(&event) > 0); + } + touch->last_x = touch->x; + touch->last_y = touch->y; + return posted; +} + +int +SDL_SendTouchButton(int id, Uint8 state, Uint8 button) +{ + int index = SDL_GetTouchIndexId(id); + SDL_Touch *touch = SDL_GetTouch(index); + int posted; + Uint32 type; + + if (!touch) { + return 0; + } + + /* Figure out which event to perform */ + switch (state) { + case SDL_PRESSED: + if (touch->buttonstate & SDL_BUTTON(button)) { + /* Ignore this event, no state change */ + return 0; + } + type = SDL_TOUCHBUTTONDOWN; + touch->buttonstate |= SDL_BUTTON(button); + break; + case SDL_RELEASED: + if (!(touch->buttonstate & SDL_BUTTON(button))) { + /* Ignore this event, no state change */ + return 0; + } + type = SDL_TOUCHBUTTONUP; + touch->buttonstate &= ~SDL_BUTTON(button); + break; + default: + /* Invalid state -- bail */ + return 0; + } + + /* Post the event, if desired */ + posted = 0; + if (SDL_GetEventState(type) == SDL_ENABLE) { + SDL_Event event; + event.type = type; + event.button.which = (Uint8) index; + event.button.state = state; + event.button.button = button; + event.button.x = touch->x; + event.button.y = touch->y; + event.button.windowID = touch->focus ? touch->focus->id : 0; + posted = (SDL_PushEvent(&event) > 0); + } + return posted; +} + +int +SDL_SendTouchWheel(int index, int x, int y) +{ + SDL_Touch *touch = SDL_GetTouch(index); + int posted; + + if (!touch || (!x && !y)) { + return 0; + } + + /* Post the event, if desired */ + posted = 0; + if (SDL_GetEventState(SDL_TOUCHWHEEL) == SDL_ENABLE) { + SDL_Event event; + event.type = SDL_TOUCHWHEEL; + event.wheel.which = (Uint8) index; + event.wheel.x = x; + event.wheel.y = y; + event.wheel.windowID = touch->focus ? touch->focus->id : 0; + posted = (SDL_PushEvent(&event) > 0); + } + return posted; +} + + +char * +SDL_GetTouchName(int index) +{ + SDL_Touch *touch = SDL_GetTouch(index); + if (!touch) { + return NULL; + } + return touch->name; +} + +void +SDL_ChangeEnd(int id, int end) +{ + int index = SDL_GetTouchIndexId(id); + SDL_Touch *touch = SDL_GetTouch(index); + + if (touch) { + touch->current_end = end; + } +} + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h new file mode 100644 index 000000000..62a950ceb --- /dev/null +++ b/src/events/SDL_touch_c.h @@ -0,0 +1,113 @@ +/* + 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 +*/ +#include "SDL_config.h" + +#ifndef _SDL_touch_c_h +#define _SDL_touch_c_h + +typedef struct SDL_Touch SDL_Touch; + + +struct SDL_Touch +{ + /* Warp the touch to (x,y) */ + void (*WarpTouch) (SDL_Touch * touch, SDL_Window * window, int x, + int y); + + /* Free the touch when it's time */ + void (*FreeTouch) (SDL_Touch * touch); + + /* data common for tablets */ + int pressure; + int pressure_max; + int pressure_min; + int tilt; /* for future use */ + int rotation; /* for future use */ + int total_ends; + int current_end; + + /* Data common to all touch */ + int id; + SDL_Window *focus; + int which; + int x; + int y; + int z; /* for future use */ + int xdelta; + int ydelta; + int last_x, last_y; /* the last reported x and y coordinates */ + char *name; + Uint8 buttonstate; + SDL_bool relative_mode; + SDL_bool proximity; + SDL_bool flush_motion; + + SDL_Cursor *cursors; + SDL_Cursor *def_cursor; + SDL_Cursor *cur_cursor; + SDL_bool cursor_shown; + + void *driverdata; +}; + +/* Initialize the touch subsystem */ +extern int SDL_TouchInit(void); + +/* Get the touch at an index */ +extern SDL_Touch *SDL_GetTouch(int index); + +/* Add a touch, possibly reattaching at a particular index (or -1), + returning the index of the touch, or -1 if there was an error. + */ +extern int SDL_AddTouch(const SDL_Touch * touch, char *name, + int pressure_max, int pressure_min, int ends); + +/* Remove a touch at an index, clearing the slot for later */ +extern void SDL_DelTouch(int index); + +/* Clear the button state of a touch at an index */ +extern void SDL_ResetTouch(int index); + +/* Set the touch focus window */ +extern void SDL_SetTouchFocus(int id, SDL_Window * window); + +/* Send a touch motion event for a touch */ +extern int SDL_SendTouchMotion(int id, int relative, int x, int y, int z); + +/* Send a touch button event for a touch */ +extern int SDL_SendTouchButton(int id, Uint8 state, Uint8 button); + +/* Send a touch wheel event for a touch */ +extern int SDL_SendTouchWheel(int id, int x, int y); + +/* Send a proximity event for a touch */ +extern int SDL_SendProximity(int id, int x, int y, int type); + +/* Shutdown the touch subsystem */ +extern void SDL_TouchQuit(void); + +/* FIXME: Where do these functions go in this header? */ +extern void SDL_ChangeEnd(int id, int end); + +#endif /* _SDL_touch_c_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 598093fed..c65c67d83 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -408,6 +408,10 @@ X11_PumpEvents(_THIS) while (X11_Pending(data->display)) { X11_DispatchEvent(_this); } + + + /* Process Touch events - TODO When X gets touch support, REMOVE THIS*/ + } /* This is so wrong it hurts */ diff --git a/touchTest/touchSimp b/touchTest/touchSimp index 0caf1d15a2bc7b50101c6e91c88fdddeeeac137a..57e1c92596505a47915abd237a5d58eeb272e174 100755 GIT binary patch delta 7428 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 Ixpc_?0jXNd+yDRo delta 6935 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 diff --git a/touchTest/touchSimp.c b/touchTest/touchSimp.c index b89f78207..cc3ff292b 100644 --- a/touchTest/touchSimp.c +++ b/touchTest/touchSimp.c @@ -20,6 +20,7 @@ int bstatus; + typedef struct { int x,y; } Point; @@ -120,7 +121,7 @@ int main(int argc, char* argv[]) device = argv[1]; //Open Device - if ((fd = open (device, O_RDONLY)) == -1) + if ((fd = open (device, O_RDONLY | O_NONBLOCK)) == -1) printf ("%s is not a vaild device.\n", device); //Print Device Name @@ -189,50 +190,53 @@ int main(int argc, char* argv[]) } //poll for Touch <- Goal: make this a case: - if ((rd = read (fd, ev, size * 64)) < size) - perror_exit ("read()"); + + + /*if ((rd = read (fd, ev, size * 64)) < size) + perror_exit ("read()"); */ //printf("time: %i\n type: %X\n code: %X\n value: %i\n ", // ev->time,ev->type,ev->code,ev->value); - for (i = 0; i < rd / sizeof(struct input_event); i++) - switch (ev[i].type) - { - case EV_ABS: - if(ev[i].code == ABS_X) - tx = ev[i].value; - else if (ev[i].code == ABS_Y) - ty = ev[i].value; - else if (ev[i].code == ABS_MISC) - { - //printf("Misc:type: %X\n code: %X\n value: %i\n ", - // ev[i].type,ev[i].code,ev[i].value); - } - break; - case EV_MSC: - if(ev[i].code == MSC_SERIAL) - curf = ev[i].value; - break; - case EV_SYN: - curf -= 1; - if(tx >= 0) - finger[curf].x = tx; - if(ty >= 0) - finger[curf].y = ty; - - //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); - tx = -1; - ty = -1; - break; - - } - //And draw - DrawScreen(screen,h); - /* - for(i=0;i<512;i++) - if(keystat[i]) printf("%i\n",i); - printf("Buttons:%i\n",bstatus); - */ - } - SDL_Quit(); - + if((rd = read (fd, ev, size * 64)) >= size) + for (i = 0; i < rd / sizeof(struct input_event); i++) + switch (ev[i].type) + { + case EV_ABS: + if(ev[i].code == ABS_X) + tx = ev[i].value; + else if (ev[i].code == ABS_Y) + ty = ev[i].value; + else if (ev[i].code == ABS_MISC) + { + //printf("Misc:type: %X\n code: %X\n value: %i\n ", + // ev[i].type,ev[i].code,ev[i].value); + } + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + curf = ev[i].value; + break; + case EV_SYN: + curf -= 1; + if(tx >= 0) + finger[curf].x = tx; + if(ty >= 0) + finger[curf].y = ty; + + //printf("Synched: %i tx: %i, ty: %i\n",curf,finger[curf].x,finger[curf].y); + tx = -1; + ty = -1; + break; + + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + return 0; } From 1490cd435abf3e6a8b5fb5e50ccb5a6d564acb28 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Wed, 26 May 2010 20:11:56 +0530 Subject: [PATCH 015/272] Correctly handle the availability of Xrender in X11_CreateRenderer and X11_DisplayModeChanged. Fixed the XRenderPictureAttributes value in X11_CreateRenderer with graphics_exposures = False. Start work on Xrender specific additions to X11_TextureData and X11_CreateTexture. --- src/video/x11/SDL_x11render.c | 54 ++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index e04a2ef3b..30421b61f 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -97,6 +97,8 @@ typedef struct Pixmap pixmaps[3]; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER Picture xwindow_pict; + Picture pixmap_picts[3]; + Picture * drawable_pict; XRenderPictFormat* xwindow_pict_fmt; XRenderPictureAttributes xwindow_pict_attr; unsigned int xwindow_pict_attr_valuemask; @@ -117,6 +119,9 @@ typedef struct Pixmap pixmap; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER Picture picture; + XRenderPictFormat* picture_fmt; + XRenderPictureAttributes picture_attr; + unsigned int picture_attr_valuemask; #endif XImage *image; #ifndef NO_SHARED_MEMORY @@ -213,12 +218,10 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) if(XRenderQueryExtension(data->display, &event_basep, &error_basep) == True) { data->xrender_available = SDL_TRUE; data->xwindow_pict_fmt = XRenderFindVisualFormat(data->display, data->visual); - data->xwindow_pict_attr_valuemask = 0; // FIXME - data->xwindow_pict = XRenderCreatePicture(data->display, - data->xwindow, - data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, - &data->xwindow_pict_attr); + data->xwindow_pict_attr.graphics_exposures = False; + data->xwindow_pict_attr_valuemask = CPGraphicsExposure; + data->xwindow_pict = XRenderCreatePicture(data->display, data->xwindow, data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); } else { data->xrender_available = SDL_FALSE; @@ -272,12 +275,23 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) SDL_SetError("XCreatePixmap() failed"); return NULL; } + data->pixmap_picts[i] = + XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, &xwindow_pict_attr); } if (n > 0) { data->drawable = data->pixmaps[0]; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(data->xrender_available == SDL_TRUE) + data->drawable_pict = &(data->pixmap_picts[0]); +#endif data->makedirty = SDL_TRUE; } else { data->drawable = data->xwindow; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(data->xrender_available == SDL_TRUE) + data->drawable_pict = &(data->xwindow_pict); +#endif data->makedirty = SDL_FALSE; } data->current_pixmap = 0; @@ -325,6 +339,9 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) if (data->pixmaps[i] != None) { XFreePixmap(data->display, data->pixmaps[i]); data->pixmaps[i] = None; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + data->pictures[i] = None; +#endif } } for (i = 0; i < n; ++i) { @@ -335,9 +352,17 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) SDL_SetError("XCreatePixmap() failed"); return -1; } +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + data->pictures[i] = + XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); +#endif } if (n > 0) { data->drawable = data->pixmaps[0]; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + data->drawable_pict = &(data->pictures[0]); +#endif } data->current_pixmap = 0; @@ -360,7 +385,6 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) } texture->driverdata = data; - if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { data->yuv = SDL_SW_CreateYUVTexture(texture->format, texture->w, texture->h); @@ -371,11 +395,21 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) } else { /* The image/pixmap depth must be the same as the window or you get a BadMatch error when trying to putimage or copyarea. + This BadMatch error */ +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(renderdata->xrender_available == SDL_False) { + if (texture->format != display->current_mode.format) { + SDL_SetError("Texture format doesn't match window format"); + return -1; + } + } +#else if (texture->format != display->current_mode.format) { SDL_SetError("Texture format doesn't match window format"); return -1; } +#endif data->format = texture->format; } data->pitch = texture->w * SDL_BYTESPERPIXEL(data->format); @@ -455,6 +489,12 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) SDL_SetError("XCreatePixmap() failed"); return -1; } + +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + data->picture_fmt = + XRenderFindVisualFormat(renderdata->display, + data->picture = + XCreatePicture(renderdata->display, data->pixmap, data->image = XCreateImage(renderdata->display, renderdata->visual, From dcd8a5fd97447ccedabbddcae9d40f8c9fb5a90e Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Thu, 27 May 2010 01:21:37 -0400 Subject: [PATCH 016/272] Added touch event definitions. Heavily modified events/SDL_touch*. --- include/SDL_events.h | 41 ++++ src/events/SDL_touch.c | 452 +++++++++++++++------------------------ src/events/SDL_touch_c.h | 89 ++++---- touchTest/touchPong | Bin 28731 -> 29171 bytes touchTest/touchSimp | Bin 28772 -> 28976 bytes 5 files changed, 252 insertions(+), 330 deletions(-) diff --git a/include/SDL_events.h b/include/SDL_events.h index fbdc46c94..87096d1d6 100644 --- a/include/SDL_events.h +++ b/include/SDL_events.h @@ -86,11 +86,19 @@ typedef enum SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ SDL_JOYBUTTONUP, /**< Joystick button released */ + /*Touch events - is 0x700 the correct place?*/ + SDL_FINGERDOWN = 0x700, + SDL_FINGERUP, + SDL_FINGERMOTION, + SDL_TOUCHBUTTONDOWN, + SDL_TOUCHBUTTONUP, + /* Obsolete events */ SDL_EVENT_COMPAT1 = 0x7000, /**< SDL 1.2 events for compatibility */ SDL_EVENT_COMPAT2, SDL_EVENT_COMPAT3, + /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, * and should be allocated with SDL_RegisterEvents() */ @@ -289,6 +297,37 @@ typedef struct SDL_JoyButtonEvent Uint8 padding1; } SDL_JoyButtonEvent; + +/** + * \brief Touch finger motion/finger event structure (event.tmotion.*) + */ +typedef struct SDL_TouchFingerEvent +{ + Uint32 type; /**< ::SDL_FINGERMOTION OR + SDL_FINGERDOWN OR SDL_FINGERUP*/ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint8 touchId; /**< The touch device id */ + Uint8 state; /**< The current button state */ + Uint8 fingerId; + Uint8 padding1; +} SDL_TouchFingerEvent; + + +/** + * \brief Touch finger motion/finger event structure (event.tmotion.*) + */ +typedef struct SDL_TouchButtonEvent +{ + Uint32 type; /**< ::SDL_TOUCHBUTTONUP OR SDL_TOUCHBUTTONDOWN */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint8 touchId; /**< The touch device index */ + Uint8 state; /**< The current button state */ + Uint8 button; /**< The button changing state */ + Uint8 padding1; + +} SDL_TouchButtonEvent; + + /** * \brief The "quit requested" event */ @@ -372,6 +411,8 @@ typedef union SDL_Event SDL_UserEvent user; /**< Custom event data */ SDL_SysWMEvent syswm; /**< System dependent window event data */ SDL_ProximityEvent proximity; /**< Proximity In or Out event */ + SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ + SDL_TouchButtonEvent tbutton; /**< Touch button event data */ /** Temporarily here for backwards compatibility */ /*@{*/ diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 0700abc01..88505daec 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -29,8 +29,7 @@ static int SDL_num_touch = 0; -static int SDL_current_touch = -1; -static SDL_Touch **SDL_touch = NULL; +static SDL_Touch **SDL_touchPads = NULL; /* Public functions */ @@ -39,24 +38,43 @@ SDL_TouchInit(void) { return (0); } - SDL_Touch * -SDL_GetTouch(int index) +SDL_GetTouch(int id) { + int index = SDL_GetTouchIndexId(id); if (index < 0 || index >= SDL_num_touch) { return NULL; } - return SDL_touch[index]; + return SDL_touchPads[index]; +} + +SDL_Finger * +SDL_GetFinger(SDL_Touch* touch,int id) +{ + int index = SDL_GetFingerIndexId(touch,id); + if(index < 0 || index >= touch->num_fingers) + return NULL; + return touch->fingers[index]; +} + +int +SDL_GetFingerIndexId(SDL_Touch* touch,int fingerid) +{ + int i; + for(i = 0;i < touch->num_fingers;i++) + if(touch->fingers[i]->id == fingerid) + return i; + return -1; } -static int +int SDL_GetTouchIndexId(int id) { int index; SDL_Touch *touch; for (index = 0; index < SDL_num_touch; ++index) { - touch = SDL_GetTouch(index); + touch = SDL_touchPads[index]; if (touch->id == id) { return index; } @@ -68,7 +86,7 @@ int SDL_AddTouch(const SDL_Touch * touch, char *name, int pressure_max, int pressure_min, int ends) { - SDL_Touch **touch; + SDL_Touch **touchPads; int selected_touch; int index; size_t length; @@ -78,58 +96,47 @@ SDL_AddTouch(const SDL_Touch * touch, char *name, int pressure_max, } /* Add the touch to the list of touch */ - touch = (SDL_Touch **) SDL_realloc(SDL_touch, + touchPads = (SDL_Touch **) SDL_realloc(SDL_touchPads, (SDL_num_touch + 1) * sizeof(*touch)); - if (!touch) { + if (!touchPads) { SDL_OutOfMemory(); return -1; } - SDL_touch = touch; + SDL_touchPads = touchPads; index = SDL_num_touch++; - SDL_touch[index] = (SDL_Touch *) SDL_malloc(sizeof(*SDL_touch[index])); - if (!SDL_touch[index]) { + SDL_touchPads[index] = (SDL_Touch *) SDL_malloc(sizeof(*SDL_touchPads[index])); + if (!SDL_touchPads[index]) { SDL_OutOfMemory(); return -1; } - *SDL_touch[index] = *touch; + *SDL_touchPads[index] = *touch; /* we're setting the touch properties */ length = 0; length = SDL_strlen(name); - SDL_touch[index]->focus = 0; - SDL_touch[index]->name = SDL_malloc((length + 2) * sizeof(char)); - SDL_strlcpy(SDL_touch[index]->name, name, length + 1); - SDL_touch[index]->pressure_max = pressure_max; - SDL_touch[index]->pressure_min = pressure_min; - SDL_touch[index]->cursor_shown = SDL_TRUE; - selected_touch = SDL_SelectTouch(index); - SDL_touch[index]->cur_cursor = NULL; - SDL_touch[index]->def_cursor = - /* we're assuming that all touch are in the computer sensing zone */ - SDL_touch[index]->proximity = SDL_TRUE; - /* we're assuming that all touch are working in the absolute position mode - thanx to that, the users that don't want to use many touch don't have to - worry about anything */ - SDL_touch[index]->relative_mode = SDL_FALSE; - SDL_touch[index]->current_end = 0; - SDL_touch[index]->total_ends = ends; - SDL_SelectTouch(selected_touch); + SDL_touchPads[index]->focus = 0; + SDL_touchPads[index]->name = SDL_malloc((length + 2) * sizeof(char)); + SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1); + SDL_touchPads[index]->pressure_max = pressure_max; + SDL_touchPads[index]->pressure_min = pressure_min; + return index; } void -SDL_DelTouch(int index) +SDL_DelTouch(int id) { - SDL_Touch *touch = SDL_GetTouch(index); + int index = SDL_GetTouchIndexId(id); + SDL_Touch *touch = SDL_GetTouch(id); if (!touch) { return; } - touch->def_cursor = NULL; + SDL_free(touch->name); if (touch->FreeTouch) { @@ -137,19 +144,8 @@ SDL_DelTouch(int index) } SDL_free(touch); - SDL_touch[index] = NULL; -} - -void -SDL_ResetTouch(int index) -{ - SDL_Touch *touch = SDL_GetTouch(index); - - if (!touch) { - return; - } - - /* FIXME */ + SDL_num_touch--; + SDL_touchPads[index] = SDL_touchPads[SDL_num_touch]; } void @@ -157,15 +153,14 @@ SDL_TouchQuit(void) { int i; - for (i = 0; i < SDL_num_touch; ++i) { + for (i = SDL_num_touch-1; i > 0 ; --i) { SDL_DelTouch(i); } SDL_num_touch = 0; - SDL_current_touch = -1; - if (SDL_touch) { - SDL_free(SDL_touch); - SDL_touch = NULL; + if (SDL_touchPads) { + SDL_free(SDL_touchPads); + SDL_touchPads = NULL; } } @@ -174,20 +169,10 @@ SDL_GetNumTouch(void) { return SDL_num_touch; } - -int -SDL_SelectTouch(int index) -{ - if (index >= 0 && index < SDL_num_touch) { - SDL_current_touch = index; - } - return SDL_current_touch; -} - SDL_Window * -SDL_GetTouchFocusWindow(int index) +SDL_GetTouchFocusWindow(int id) { - SDL_Touch *touch = SDL_GetTouch(index); + SDL_Touch *touch = SDL_GetTouch(id); if (!touch) { return 0; @@ -195,110 +180,11 @@ SDL_GetTouchFocusWindow(int index) return touch->focus; } -static int SDLCALL -FlushTouchMotion(void *param, SDL_Event * event) -{ - if (event->type == SDL_TOUCHMOTION - && event->motion.which == (Uint8) SDL_current_touch) { - return 0; - } else { - return 1; - } -} - -int -SDL_SetRelativeTouchMode(int index, SDL_bool enabled) -{ - SDL_Touch *touch = SDL_GetTouch(index); - - if (!touch) { - return -1; - } - - /* Flush pending touch motion */ - touch->flush_motion = SDL_TRUE; - SDL_PumpEvents(); - touch->flush_motion = SDL_FALSE; - SDL_FilterEvents(FlushTouchMotion, touch); - - /* Set the relative mode */ - touch->relative_mode = enabled; - - - - if (!enabled) { - /* Restore the expected touch position */ - SDL_WarpTouchInWindow(touch->focus, touch->x, touch->y); - } - return 0; -} - -SDL_bool -SDL_GetRelativeTouchMode(int index) -{ - SDL_Touch *touch = SDL_GetTouch(index); - - if (!touch) { - return SDL_FALSE; - } - return touch->relative_mode; -} - -Uint8 -SDL_GetTouchState(int *x, int *y) -{ - SDL_Touch *touch = SDL_GetTouch(SDL_current_touch); - - if (!touch) { - if (x) { - *x = 0; - } - if (y) { - *y = 0; - } - return 0; - } - - if (x) { - *x = touch->x; - } - if (y) { - *y = touch->y; - } - return touch->buttonstate; -} - -Uint8 -SDL_GetRelativeTouchState(int index, int *x, int *y) -{ - SDL_Touch *touch = SDL_GetTouch(index); - - if (!touch) { - if (x) { - *x = 0; - } - if (y) { - *y = 0; - } - return 0; - } - - if (x) { - *x = touch->xdelta; - } - if (y) { - *y = touch->ydelta; - } - touch->xdelta = 0; - touch->ydelta = 0; - return touch->buttonstate; -} - void SDL_SetTouchFocus(int id, SDL_Window * window) { int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(index); + SDL_Touch *touch = SDL_GetTouch(id); int i; SDL_bool focus; @@ -312,7 +198,7 @@ SDL_SetTouchFocus(int id, SDL_Window * window) for (i = 0; i < SDL_num_touch; ++i) { SDL_Touch *check; if (i != index) { - check = SDL_GetTouch(i); + check = SDL_touchPads[i]; if (check && check->focus == touch->focus) { focus = SDL_TRUE; break; @@ -331,7 +217,7 @@ SDL_SetTouchFocus(int id, SDL_Window * window) for (i = 0; i < SDL_num_touch; ++i) { SDL_Touch *check; if (i != index) { - check = SDL_GetTouch(i); + check = SDL_touchPads[i]; if (check && check->focus == touch->focus) { focus = SDL_TRUE; break; @@ -344,43 +230,106 @@ SDL_SetTouchFocus(int id, SDL_Window * window) } } +int +SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) +{ + int index; + SDL_Finger **fingers; + size_t length; + + if (SDL_GetFingerIndexId(touch,finger->id) != -1) { + SDL_SetError("Finger ID already in use"); + } + + /* Add the touch to the list of touch */ + fingers = (SDL_Finger **) SDL_realloc(touch->fingers, + (touch->num_fingers + 1) * sizeof(*touch)); + if (!fingers) { + SDL_OutOfMemory(); + return -1; + } + + touch->fingers = fingers; + index = SDL_num_touch++; + + touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index]))); + if (!touch->fingers[index]) { + SDL_OutOfMemory(); + return -1; + } + *touch->fingers[index] = *finger; + + return index; +} + int -SDL_SendProximity(int id, int x, int y, int type) +SDL_DelFinger(SDL_Touch* touch,int fingerid) { - int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(index); - int posted = 0; + int index = SLD_GetFingerIndexId(touch,fingerid); + SDL_Finger* finger = SDL_GetFinger(touch,fingerid); - if (!touch) { - return 0; + if (!finger) { + return; } + - touch->last_x = x; - touch->last_y = y; - if (SDL_GetEventState(type) == SDL_ENABLE) { - SDL_Event event; - event.proximity.which = (Uint8) index; - event.proximity.x = x; - event.proximity.y = y; - event.proximity.cursor = touch->current_end; - event.proximity.type = type; - /* FIXME: is this right? */ - event.proximity.windowID = touch->focus ? touch->focus->id : 0; - posted = (SDL_PushEvent(&event) > 0); - if (type == SDL_PROXIMITYIN) { - touch->proximity = SDL_TRUE; - } else { - touch->proximity = SDL_FALSE; - } + SDL_free(finger); + touch->num_fingers--; + touch->fingers[index] = touch->fingers[touch->num_fingers]; +} + + +int +SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressure) +{ + SDL_Touch* touch = SDL_GetTouch(id); + if(down) { + SDL_Finger nf; + nf.id = id; + nf.x = x; + nf.y = y; + nf.pressure = pressure; + nf.xdelta = 0; + nf.ydelta = 0; + nf.last_x = x; + nf.last_y = y; + SDL_AddFinger(touch,&nf); + + posted = 0; + if (SDL_GetEventState(SDL_FINGERDOWN) == SDL_ENABLE) { + SDL_Event event; + event.tfinger.type = SDL_FINGERDOWN; + event.tfinger.touchId = (Uint8) id; + event.tfinger.state = touch->buttonstate; + event.tfinger.windowID = touch->focus ? touch->focus->id : 0; + event.fingerId = id; + posted = (SDL_PushEvent(&event) > 0); + } + return posted; + } + else { + SDL_DelFinger(touch,id); + posted = 0; + if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) { + SDL_Event event; + event.tfinger.type = SDL_FINGERUP; + event.tfinger.touchId = (Uint8) id; + event.tfinger.state = touch->buttonstate; + event.tfinger.windowID = touch->focus ? touch->focus->id : 0; + event.fingerId = id; + posted = (SDL_PushEvent(&event) > 0); + } + return posted; } - return posted; } int -SDL_SendTouchMotion(int id, int relative, int x, int y, int pressure) +SDL_SendTouchMotion(int id, int fingerid, int relative, + int x, int y, int pressure) { int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(index); + SDL_Touch *touch = SDL_GetTouch(id); + SDL_Finger *finger = SDL_GetFinger(touch,fingerid); int posted; int xrel; int yrel; @@ -390,22 +339,15 @@ SDL_SendTouchMotion(int id, int relative, int x, int y, int pressure) return 0; } - /* if the touch is out of proximity we don't to want to have any motion from it */ - if (touch->proximity == SDL_FALSE) { - touch->last_x = x; - touch->last_y = y; - return 0; - } - /* the relative motion is calculated regarding the system cursor last position */ if (relative) { xrel = x; yrel = y; - x = (touch->last_x + x); - y = (touch->last_y + y); + x = (finger->last_x + x); + y = (finger->last_y + y); } else { - xrel = x - touch->last_x; - yrel = y - touch->last_y; + xrel = x - finger->last_x; + yrel = y - finger->last_y; } /* Drop events that don't change state */ @@ -417,18 +359,16 @@ SDL_SendTouchMotion(int id, int relative, int x, int y, int pressure) } /* Update internal touch coordinates */ - if (touch->relative_mode == SDL_FALSE) { - touch->x = x; - touch->y = y; - } else { - touch->x += xrel; - touch->y += yrel; - } - SDL_GetWindowSize(touch->focus, &x_max, &y_max); + finger->x = x; + finger->y = y; + + /*Should scale to window? Normalize? Maintain Aspect?*/ + //SDL_GetWindowSize(touch->focus, &x_max, &y_max); /* make sure that the pointers find themselves inside the windows */ /* only check if touch->xmax is set ! */ + /* if (x_max && touch->x > x_max) { touch->x = x_max; } else if (touch->x < 0) { @@ -440,46 +380,32 @@ SDL_SendTouchMotion(int id, int relative, int x, int y, int pressure) } else if (touch->y < 0) { touch->y = 0; } - - touch->xdelta += xrel; - touch->ydelta += yrel; - touch->pressure = pressure; + */ + finger->xdelta += xrel; + finger->ydelta += yrel; + finger->pressure = pressure; /* Post the event, if desired */ posted = 0; - if (SDL_GetEventState(SDL_TOUCHMOTION) == SDL_ENABLE && - touch->proximity == SDL_TRUE) { + if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { SDL_Event event; - event.motion.type = SDL_TOUCHMOTION; - event.motion.which = (Uint8) index; - event.motion.state = touch->buttonstate; - event.motion.x = touch->x; - event.motion.y = touch->y; - event.motion.z = touch->z; - event.motion.pressure = touch->pressure; - event.motion.pressure_max = touch->pressure_max; - event.motion.pressure_min = touch->pressure_min; - event.motion.rotation = 0; - event.motion.tilt_x = 0; - event.motion.tilt_y = 0; - event.motion.cursor = touch->current_end; - event.motion.xrel = xrel; - event.motion.yrel = yrel; - event.motion.windowID = touch->focus ? touch->focus->id : 0; + event.tfinger.type = SDL_FINGERMOTION; + event.tfinger.which = (Uint8) index; + event.tfinger.state = touch->buttonstate; + event.tfinger.windowID = touch->focus ? touch->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); } - touch->last_x = touch->x; - touch->last_y = touch->y; + finger->last_x = finger->x; + finger->last_y = finger->y; return posted; } int SDL_SendTouchButton(int id, Uint8 state, Uint8 button) { - int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(index); + SDL_Touch *touch = SDL_GetTouch(id); int posted; Uint32 type; @@ -515,61 +441,23 @@ SDL_SendTouchButton(int id, Uint8 state, Uint8 button) if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; - event.button.which = (Uint8) index; - event.button.state = state; - event.button.button = button; - event.button.x = touch->x; - event.button.y = touch->y; - event.button.windowID = touch->focus ? touch->focus->id : 0; - posted = (SDL_PushEvent(&event) > 0); - } - return posted; -} - -int -SDL_SendTouchWheel(int index, int x, int y) -{ - SDL_Touch *touch = SDL_GetTouch(index); - int posted; - - if (!touch || (!x && !y)) { - return 0; - } - - /* Post the event, if desired */ - posted = 0; - if (SDL_GetEventState(SDL_TOUCHWHEEL) == SDL_ENABLE) { - SDL_Event event; - event.type = SDL_TOUCHWHEEL; - event.wheel.which = (Uint8) index; - event.wheel.x = x; - event.wheel.y = y; - event.wheel.windowID = touch->focus ? touch->focus->id : 0; + event.tbutton.which = (Uint8) index; + event.tbutton.state = state; + event.tbutton.button = button; + event.tbutton.windowID = touch->focus ? touch->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); } return posted; } - char * -SDL_GetTouchName(int index) +SDL_GetTouchName(int id) { - SDL_Touch *touch = SDL_GetTouch(index); + SDL_Touch *touch = SDL_GetTouch(id); if (!touch) { return NULL; } return touch->name; } -void -SDL_ChangeEnd(int id, int end) -{ - int index = SDL_GetTouchIndexId(id); - SDL_Touch *touch = SDL_GetTouch(index); - - if (touch) { - touch->current_end = end; - } -} - /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h index 62a950ceb..fdc221d79 100644 --- a/src/events/SDL_touch_c.h +++ b/src/events/SDL_touch_c.h @@ -25,50 +25,51 @@ #define _SDL_touch_c_h typedef struct SDL_Touch SDL_Touch; +typedef struct SDL_Finger SDL_Finger; + +struct SDL_Finger { + int id; + int x; + int y; + int z; /* for future use */ + int xdelta; + int ydelta; + int last_x, last_y; /* the last reported x and y coordinates */ + int pressure; +}; struct SDL_Touch { - /* Warp the touch to (x,y) */ - void (*WarpTouch) (SDL_Touch * touch, SDL_Window * window, int x, - int y); - - /* Free the touch when it's time */ - void (*FreeTouch) (SDL_Touch * touch); - - /* data common for tablets */ - int pressure; - int pressure_max; - int pressure_min; - int tilt; /* for future use */ - int rotation; /* for future use */ - int total_ends; - int current_end; - - /* Data common to all touch */ - int id; - SDL_Window *focus; - int which; - int x; - int y; - int z; /* for future use */ - int xdelta; - int ydelta; - int last_x, last_y; /* the last reported x and y coordinates */ - char *name; - Uint8 buttonstate; - SDL_bool relative_mode; - SDL_bool proximity; - SDL_bool flush_motion; - - SDL_Cursor *cursors; - SDL_Cursor *def_cursor; - SDL_Cursor *cur_cursor; - SDL_bool cursor_shown; - - void *driverdata; + + /* Free the touch when it's time */ + void (*FreeTouch) (SDL_Touch * touch); + + /* data common for tablets */ + int pressure_max; + int pressure_min; + int tilt; /* for future use */ + int rotation; /* for future use */ + + int total_ends; + int current_end; + + /* Data common to all touch */ + int id; + SDL_Window *focus; + + char *name; + Uint8 buttonstate; + SDL_bool relative_mode; + SDL_bool flush_motion; + + int num_fingers; + SDL_Finger** fingers; + + void *driverdata; }; + /* Initialize the touch subsystem */ extern int SDL_TouchInit(void); @@ -84,24 +85,16 @@ extern int SDL_AddTouch(const SDL_Touch * touch, char *name, /* Remove a touch at an index, clearing the slot for later */ extern void SDL_DelTouch(int index); -/* Clear the button state of a touch at an index */ -extern void SDL_ResetTouch(int index); - /* Set the touch focus window */ extern void SDL_SetTouchFocus(int id, SDL_Window * window); /* Send a touch motion event for a touch */ -extern int SDL_SendTouchMotion(int id, int relative, int x, int y, int z); +extern int SDL_SendTouchMotion(int id, int fingerid, + int relative, int x, int y, int z); /* Send a touch button event for a touch */ extern int SDL_SendTouchButton(int id, Uint8 state, Uint8 button); -/* Send a touch wheel event for a touch */ -extern int SDL_SendTouchWheel(int id, int x, int y); - -/* Send a proximity event for a touch */ -extern int SDL_SendProximity(int id, int x, int y, int type); - /* Shutdown the touch subsystem */ extern void SDL_TouchQuit(void); diff --git a/touchTest/touchPong b/touchTest/touchPong index 29e892b462ebea82de922f31e41e8095bcd2283e..16303ab5275a16d28c5fde83735805b32427c8f4 100755 GIT binary patch delta 6577 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

UEZauGTx} z-a!=|`$XbGu0Akl=v_I3qA&JuX1M=VP>>fr+`nPs(20{rkL@`*5}8=oXG(ryw6gzq z6=&{xfGlUBuk*hOvJk0gGr-aU5!bk)`@kYI5c#WPSFvUI#W)_CGptwtp2LO?%^3tH zOCQ*$CEwHgzeoLP+MzW3p_^Jo&cl;+?R=f+-n@p|on4}r@|tLu?u^#RZ=&UOk9Nv$ o;vbCf4!vIVk^F|*&{5F^SeW;4^bLrkW1^=Z9xklV9?1^=KkJAI%K!iX delta 6236 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 IDD4;cAAOm;H2?qr diff --git a/touchTest/touchSimp b/touchTest/touchSimp index 57e1c92596505a47915abd237a5d58eeb272e174..a3fbc3d7c7ef6d760057ff959a07159ba0d19463 100755 GIT binary patch delta 9799 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 From 7327c7a12e2a6f209aa58feb7c8dec805c0adc67 Mon Sep 17 00:00:00 2001 From: dewyatt Date: Thu, 27 May 2010 20:47:52 -0400 Subject: [PATCH 017/272] Adding some initial TSF code --- EXCLUDE/GLTSF/GLTSF.vcxproj | 2 ++ EXCLUDE/GLTSF/GLTSF.vcxproj.filters | 6 ++++ EXCLUDE/GLTSF/include/TSF.hpp | 44 +++++++++++++++++++++++++++++ EXCLUDE/GLTSF/src/TSF.cpp | 1 + 4 files changed, 53 insertions(+) create mode 100644 EXCLUDE/GLTSF/include/TSF.hpp create mode 100644 EXCLUDE/GLTSF/src/TSF.cpp diff --git a/EXCLUDE/GLTSF/GLTSF.vcxproj b/EXCLUDE/GLTSF/GLTSF.vcxproj index 374e16c12..bc2928c22 100644 --- a/EXCLUDE/GLTSF/GLTSF.vcxproj +++ b/EXCLUDE/GLTSF/GLTSF.vcxproj @@ -81,6 +81,7 @@ + @@ -88,6 +89,7 @@ + diff --git a/EXCLUDE/GLTSF/GLTSF.vcxproj.filters b/EXCLUDE/GLTSF/GLTSF.vcxproj.filters index 04c10f6df..acab9f8e0 100644 --- a/EXCLUDE/GLTSF/GLTSF.vcxproj.filters +++ b/EXCLUDE/GLTSF/GLTSF.vcxproj.filters @@ -27,6 +27,9 @@ Header Files + + Header Files + @@ -41,5 +44,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/EXCLUDE/GLTSF/include/TSF.hpp b/EXCLUDE/GLTSF/include/TSF.hpp new file mode 100644 index 000000000..5453b9acd --- /dev/null +++ b/EXCLUDE/GLTSF/include/TSF.hpp @@ -0,0 +1,44 @@ +#ifndef TSF_HPP +#define TSF_HPP + +#include + +class TSF +{ +public: + +protected: + class UI_Sink : public ITfUIElementSink, public ITfInputProcessorProfileActivationSink + { + public: + UI_Sink(); + ~UI_Sink(); + + // IUnknown + STDMETHODIMP QueryInterface(REFIID riid, void **ppvObj); + STDMETHODIMP_(ULONG) AddRef(void); + STDMETHODIMP_(ULONG) Release(void); + + // ITfUIElementSink + STDMETHODIMP BeginUIElement(DWORD dwUIElementId, BOOL *pbShow); + STDMETHODIMP UpdateUIElement(DWORD dwUIElementId); + STDMETHODIMP EndUIElement(DWORD dwUIElementId); + + // ITfInputProcessorProfileActivationSink + STDMETHODIMP OnActivated(DWORD dwProfileType, LANGID langid, + REFCLSID clsid, REFGUID catid, + REFGUID guidProfile, HKL hkl, + DWORD dwFlags); + + // ITfCompartmentEventSink + STDMETHODIMP OnChange(REFGUID rguid); + + private: + LONG my_Reference_Count; + }; + +private: + +}; + +#endif diff --git a/EXCLUDE/GLTSF/src/TSF.cpp b/EXCLUDE/GLTSF/src/TSF.cpp new file mode 100644 index 000000000..f21d968cd --- /dev/null +++ b/EXCLUDE/GLTSF/src/TSF.cpp @@ -0,0 +1 @@ +#include "TSF.hpp" From edc9cefb719ace028059cb1d911795ca7a42899d Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Fri, 28 May 2010 01:26:52 -0400 Subject: [PATCH 018/272] Added reading of event* for touch events. --- include/SDL_events.h | 2 + src/events/SDL_events.c | 1 + src/events/SDL_touch.c | 183 +++++++++++++++++++-------------- src/events/SDL_touch_c.h | 24 +++-- src/video/x11/SDL_eventtouch.h | 42 ++++++++ src/video/x11/SDL_x11events.c | 68 +++++++++++- src/video/x11/SDL_x11video.h | 1 + touchTest/makefile | 2 + touchTest/touchPong | Bin 29171 -> 29203 bytes touchTest/touchSimp | Bin 28976 -> 29012 bytes touchTest/touchSimp.c | 4 + touchTest/touchTest.c | 168 ++++++++++++++++++++++++++++++ 12 files changed, 407 insertions(+), 88 deletions(-) create mode 100644 src/video/x11/SDL_eventtouch.h create mode 100644 touchTest/touchTest.c diff --git a/include/SDL_events.h b/include/SDL_events.h index 87096d1d6..150f3305c 100644 --- a/include/SDL_events.h +++ b/include/SDL_events.h @@ -310,6 +310,8 @@ typedef struct SDL_TouchFingerEvent Uint8 state; /**< The current button state */ Uint8 fingerId; Uint8 padding1; + int x; + int y; } SDL_TouchFingerEvent; diff --git a/src/events/SDL_events.c b/src/events/SDL_events.c index e99a55d93..ae82171b9 100644 --- a/src/events/SDL_events.c +++ b/src/events/SDL_events.c @@ -254,6 +254,7 @@ SDL_StartEventLoop(Uint32 flags) retcode = 0; retcode += SDL_KeyboardInit(); retcode += SDL_MouseInit(); + retcode += SDL_TouchInit(); retcode += SDL_QuitInit(); if (retcode < 0) { /* We don't expect them to fail, but... */ diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 88505daec..cce06c586 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -36,8 +36,15 @@ static SDL_Touch **SDL_touchPads = NULL; int SDL_TouchInit(void) { + SDL_Touch touch; + touch.pressure_max = 0; + touch.pressure_min = 0; + touch.id = 0; //Should be function? + + SDL_AddTouch(&touch, "Touch1"); return (0); } + SDL_Touch * SDL_GetTouch(int id) { @@ -48,13 +55,13 @@ SDL_GetTouch(int id) return SDL_touchPads[index]; } -SDL_Finger * -SDL_GetFinger(SDL_Touch* touch,int id) +SDL_Touch * +SDL_GetTouchIndex(int index) { - int index = SDL_GetFingerIndexId(touch,id); - if(index < 0 || index >= touch->num_fingers) - return NULL; - return touch->fingers[index]; + if (index < 0 || index >= SDL_num_touch) { + return NULL; + } + return SDL_touchPads[index]; } int @@ -67,6 +74,17 @@ SDL_GetFingerIndexId(SDL_Touch* touch,int fingerid) return -1; } + +SDL_Finger * +SDL_GetFinger(SDL_Touch* touch,int id) +{ + int index = SDL_GetFingerIndexId(touch,id); + if(index < 0 || index >= touch->num_fingers) + return NULL; + return touch->fingers[index]; +} + + int SDL_GetTouchIndexId(int id) { @@ -83,8 +101,7 @@ SDL_GetTouchIndexId(int id) } int -SDL_AddTouch(const SDL_Touch * touch, char *name, int pressure_max, - int pressure_min, int ends) +SDL_AddTouch(const SDL_Touch * touch, char *name) { SDL_Touch **touchPads; int selected_touch; @@ -118,11 +135,13 @@ SDL_AddTouch(const SDL_Touch * touch, char *name, int pressure_max, length = SDL_strlen(name); SDL_touchPads[index]->focus = 0; SDL_touchPads[index]->name = SDL_malloc((length + 2) * sizeof(char)); - SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1); - SDL_touchPads[index]->pressure_max = pressure_max; - SDL_touchPads[index]->pressure_min = pressure_min; - + SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1); + SDL_touchPads[index]->num_fingers = 0; + SDL_touchPads[index]->buttonstate = 0; + SDL_touchPads[index]->relative_mode = SDL_FALSE; + SDL_touchPads[index]->flush_motion = SDL_FALSE; + return index; } @@ -239,7 +258,7 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) if (SDL_GetFingerIndexId(touch,finger->id) != -1) { SDL_SetError("Finger ID already in use"); - } + } /* Add the touch to the list of touch */ fingers = (SDL_Finger **) SDL_realloc(touch->fingers, @@ -250,7 +269,7 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) } touch->fingers = fingers; - index = SDL_num_touch++; + index = touch->num_fingers++; touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index]))); if (!touch->fingers[index]) { @@ -265,7 +284,7 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) int SDL_DelFinger(SDL_Touch* touch,int fingerid) { - int index = SLD_GetFingerIndexId(touch,fingerid); + int index = SDL_GetFingerIndexId(touch,fingerid); SDL_Finger* finger = SDL_GetFinger(touch,fingerid); if (!finger) { @@ -282,6 +301,7 @@ SDL_DelFinger(SDL_Touch* touch,int fingerid) int SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressure) { + int posted; SDL_Touch* touch = SDL_GetTouch(id); if(down) { SDL_Finger nf; @@ -300,9 +320,11 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu SDL_Event event; event.tfinger.type = SDL_FINGERDOWN; event.tfinger.touchId = (Uint8) id; + event.tfinger.x = x; + event.tfinger.y = y; event.tfinger.state = touch->buttonstate; event.tfinger.windowID = touch->focus ? touch->focus->id : 0; - event.fingerId = id; + event.tfinger.fingerId = id; posted = (SDL_PushEvent(&event) > 0); } return posted; @@ -316,7 +338,7 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu event.tfinger.touchId = (Uint8) id; event.tfinger.state = touch->buttonstate; event.tfinger.windowID = touch->focus ? touch->focus->id : 0; - event.fingerId = id; + event.tfinger.fingerId = id; posted = (SDL_PushEvent(&event) > 0); } return posted; @@ -339,69 +361,76 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, return 0; } - /* the relative motion is calculated regarding the system cursor last position */ - if (relative) { - xrel = x; - yrel = y; - x = (finger->last_x + x); - y = (finger->last_y + y); - } else { - xrel = x - finger->last_x; - yrel = y - finger->last_y; - } - - /* Drop events that don't change state */ - if (!xrel && !yrel) { + if(finger == NULL) + SDL_SendFingerDown(id,fingerid,SDL_TRUE,x,y,pressure); + else { + /* the relative motion is calculated regarding the last position */ + if (relative) { + xrel = x; + yrel = y; + x = (finger->last_x + x); + y = (finger->last_y + y); + } else { + if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/ + if(y < 0) y = finger->last_y; /*The other is marked as -1*/ + xrel = x - finger->last_x; + yrel = y - finger->last_y; + } + + /* Drop events that don't change state */ + if (!xrel && !yrel) { #if 0 - printf("Touch event didn't change state - dropped!\n"); + printf("Touch event didn't change state - dropped!\n"); #endif - return 0; - } - - /* Update internal touch coordinates */ - - finger->x = x; - finger->y = y; - - /*Should scale to window? Normalize? Maintain Aspect?*/ - //SDL_GetWindowSize(touch->focus, &x_max, &y_max); - - /* make sure that the pointers find themselves inside the windows */ - /* only check if touch->xmax is set ! */ - /* - if (x_max && touch->x > x_max) { - touch->x = x_max; - } else if (touch->x < 0) { - touch->x = 0; - } - - if (y_max && touch->y > y_max) { - touch->y = y_max; - } else if (touch->y < 0) { - touch->y = 0; - } - */ - finger->xdelta += xrel; - finger->ydelta += yrel; - finger->pressure = pressure; - - - - /* Post the event, if desired */ - posted = 0; - if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { - SDL_Event event; - event.tfinger.type = SDL_FINGERMOTION; - event.tfinger.which = (Uint8) index; - event.tfinger.state = touch->buttonstate; - event.tfinger.windowID = touch->focus ? touch->focus->id : 0; - posted = (SDL_PushEvent(&event) > 0); + return 0; + } + + /* Update internal touch coordinates */ + + finger->x = x; + finger->y = y; + + /*Should scale to window? Normalize? Maintain Aspect?*/ + //SDL_GetWindowSize(touch->focus, &x_max, &y_max); + + /* make sure that the pointers find themselves inside the windows */ + /* only check if touch->xmax is set ! */ + /* + if (x_max && touch->x > x_max) { + touch->x = x_max; + } else if (touch->x < 0) { + touch->x = 0; + } + + if (y_max && touch->y > y_max) { + touch->y = y_max; + } else if (touch->y < 0) { + touch->y = 0; + } + */ + finger->xdelta += xrel; + finger->ydelta += yrel; + finger->pressure = pressure; + + + + /* Post the event, if desired */ + posted = 0; + if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { + SDL_Event event; + event.tfinger.type = SDL_FINGERMOTION; + event.tfinger.touchId = (Uint8) index; + event.tfinger.x = x; + event.tfinger.y = y; + event.tfinger.state = touch->buttonstate; + event.tfinger.windowID = touch->focus ? touch->focus->id : 0; + posted = (SDL_PushEvent(&event) > 0); + } + finger->last_x = finger->x; + finger->last_y = finger->y; + return posted; } - finger->last_x = finger->x; - finger->last_y = finger->y; - return posted; } - int SDL_SendTouchButton(int id, Uint8 state, Uint8 button) { @@ -441,7 +470,7 @@ SDL_SendTouchButton(int id, Uint8 state, Uint8 button) if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; - event.tbutton.which = (Uint8) index; + event.tbutton.touchId = (Uint8) index; event.tbutton.state = state; event.tbutton.button = button; event.tbutton.windowID = touch->focus ? touch->focus->id : 0; diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h index fdc221d79..6a0ebf62d 100644 --- a/src/events/SDL_touch_c.h +++ b/src/events/SDL_touch_c.h @@ -51,9 +51,6 @@ struct SDL_Touch int tilt; /* for future use */ int rotation; /* for future use */ - int total_ends; - int current_end; - /* Data common to all touch */ int id; SDL_Window *focus; @@ -73,14 +70,23 @@ struct SDL_Touch /* Initialize the touch subsystem */ extern int SDL_TouchInit(void); -/* Get the touch at an index */ -extern SDL_Touch *SDL_GetTouch(int index); +/*Get the touch at an index */ +extern SDL_Touch *SDL_GetTouchIndex(int index); + +/* Get the touch with id = id */ +extern SDL_Touch *SDL_GetTouch(int id); + +/*Get the finger at an index */ +extern SDL_Finger *SDL_GetFingerIndex(SDL_Touch *touch, int index); + +/* Get the finger with id = id */ +extern SDL_Finger *SDL_GetFinger(SDL_Touch *touch,int id); + /* Add a touch, possibly reattaching at a particular index (or -1), - returning the index of the touch, or -1 if there was an error. - */ -extern int SDL_AddTouch(const SDL_Touch * touch, char *name, - int pressure_max, int pressure_min, int ends); + returning the index of the touch, or -1 if there was an error. */ +extern int SDL_AddTouch(const SDL_Touch * touch, char *name); + /* Remove a touch at an index, clearing the slot for later */ extern void SDL_DelTouch(int index); diff --git a/src/video/x11/SDL_eventtouch.h b/src/video/x11/SDL_eventtouch.h new file mode 100644 index 000000000..44227318c --- /dev/null +++ b/src/video/x11/SDL_eventtouch.h @@ -0,0 +1,42 @@ +/* + 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 +*/ +#include "SDL_config.h" + +#ifndef _SDL_eventtouch_h +#define _SDL_eventtouch_h + + +//What should this be? +#if SDL_VIDEO_DRIVER_X11_XINPUT +typedef struct EventTouchData +{ + int x,y,pressure,finger; //Temporary Variables until sync + int eventStream; +} EventTouchData; +#endif + +//extern void X11_InitMouse(_THIS); +//extern void X11_QuitMouse(_THIS); + +#endif /* _SDL_eventtouch_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index c65c67d83..c095a4d64 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -28,9 +28,16 @@ #include "SDL_x11video.h" #include "../../events/SDL_events_c.h" #include "../../events/SDL_mouse_c.h" +#include "../../events/SDL_touch_c.h" #include "SDL_syswm.h" +#include + +//Touch Input/event* includes +#include +#include + static void X11_DispatchEvent(_THIS) { @@ -410,8 +417,65 @@ X11_PumpEvents(_THIS) } - /* Process Touch events - TODO When X gets touch support, REMOVE THIS*/ - + /* Process Touch events - TODO When X gets touch support, use that instead*/ + int i = 0,rd; + char * name[256]; + struct input_event ev[64]; + int size = sizeof (struct input_event); + static int initd = 0; //TODO - HACK! + for(i = 0;i < SDL_GetNumTouch();++i) { + SDL_Touch* touch = SDL_GetTouchIndex(i); + if(!touch) printf("Touch %i/%i DNE\n",i,SDL_GetNumTouch()); + EventTouchData* data; + if(!initd){//data->eventStream <= 0) { + touch->driverdata = SDL_malloc(sizeof(EventTouchData)); + data = (EventTouchData*)(touch->driverdata); + printf("Openning device...\n"); + data->eventStream = open("/dev/input/wacom-touch", + O_RDONLY | O_NONBLOCK); + ioctl (data->eventStream, EVIOCGNAME (sizeof (name)), name); + printf ("Reading From : %s\n", name); + initd = 1; + } + else + data = (EventTouchData*)(touch->driverdata); + if(data->eventStream <= 0) + printf("Error: Couldn't open stream\n"); + rd = read(data->eventStream, ev, size * 64); + //printf("Got %i/%i bytes\n",rd,size); + if(rd >= size) { + for (i = 0; i < rd / sizeof(struct input_event); i++) { + switch (ev[i].type) { + case EV_ABS: + //printf("Got position x: %i!\n",data->x); + if(ev[i].code == ABS_X) + data->x = ev[i].value; + else if (ev[i].code == ABS_Y) + data->y = ev[i].value; + break; + case EV_MSC: + if(ev[i].code == MSC_SERIAL) + data->finger = ev[i].value; + break; + case EV_SYN: + data->finger -= 1; /*Wacom indexes fingers from 1, + I index from 0*/ + if(data->x >= 0 || data->y >= 0) + SDL_SendTouchMotion(touch->id,data->finger, + SDL_FALSE,data->x,data->y, + data->pressure); + + //printf("Synched: %i tx: %i, ty: %i\n", + // data->finger,data->x,data->y); + data->x = -1; + data->y = -1; + data->pressure = -1; + + break; + } + } + } + } } /* This is so wrong it hurts */ diff --git a/src/video/x11/SDL_x11video.h b/src/video/x11/SDL_x11video.h index 1ba0ba392..bf82547f8 100644 --- a/src/video/x11/SDL_x11video.h +++ b/src/video/x11/SDL_x11video.h @@ -53,6 +53,7 @@ #include "SDL_x11keyboard.h" #include "SDL_x11modes.h" #include "SDL_x11mouse.h" +#include "SDL_eventtouch.h" #include "SDL_x11opengl.h" #include "SDL_x11window.h" diff --git a/touchTest/makefile b/touchTest/makefile index 820205541..a244a2982 100644 --- a/touchTest/makefile +++ b/touchTest/makefile @@ -1,3 +1,5 @@ SDLTest : touchSimp.c touchPong.c + gcc touchTest.c -o touchTest `sdl-config --cflags --libs` -g gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g + diff --git a/touchTest/touchPong b/touchTest/touchPong index 16303ab5275a16d28c5fde83735805b32427c8f4..d2f1862cc97da9ed0cf7c9e26d5fd98846589489 100755 GIT binary patch delta 3652 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 TM`JC1zf&FfZSL7Ux5E8@k9M1{ delta 3645 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 diff --git a/touchTest/touchSimp.c b/touchTest/touchSimp.c index cc3ff292b..fb02a7b8d 100644 --- a/touchTest/touchSimp.c +++ b/touchTest/touchSimp.c @@ -186,6 +186,10 @@ int main(int argc, char* argv[]) case SDL_MOUSEBUTTONUP: bstatus &= ~(1<<(event.button.button-1)); break; + case SDL_FINGERMOTION: + printf("Holy SH!T\n"); + break; + } } diff --git a/touchTest/touchTest.c b/touchTest/touchTest.c new file mode 100644 index 000000000..2c6d926a6 --- /dev/null +++ b/touchTest/touchTest.c @@ -0,0 +1,168 @@ +#include +#include +#include +#include "../src/events/SDL_touch_c.h" //BAD!!! + +#define PI 3.1415926535897 +#define WIDTH 640 +#define HEIGHT 480 +#define BPP 4 +#define DEPTH 32 + +int mousx,mousy; +int keystat[512]; +int bstatus; + + + + +typedef struct { + int x,y; +} Point; + +void handler (int sig) +{ + printf ("\nexiting...(%d)\n", sig); + exit (0); +} + +void perror_exit (char *error) +{ + perror (error); + handler (9); +} + + +void setpix(SDL_Surface *screen, int x, int y, int col) +{ + Uint32 *pixmem32; + Uint32 colour; + + if((unsigned)x > screen->w) return; + if((unsigned)y > screen->h) return; + + colour = SDL_MapRGB( screen->format, (col>>16)&0xFF, (col>>8)&0xFF, col&0xFF); + + pixmem32 = (Uint32*) screen->pixels + y*screen->pitch/BPP + x; + *pixmem32 = colour; +} + +void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) +{ + + float a; + for(a=0;a<2*PI;a+=1.f/(float)r) + { + setpix(screen,(int)(x+r*cos(a)),(int)(y+r*sin(a)),c); + } +} + +void DrawScreen(SDL_Surface* screen, int h) +{ + int x, y, xm,ym,c; + if(SDL_MUSTLOCK(screen)) + { + if(SDL_LockSurface(screen) < 0) return; + } + for(y = 0; y < screen->h; y++ ) + { + for( x = 0; x < screen->w; x++ ) + { + //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); + //xm = (x+h)%screen->w; + //ym = (y+h)%screen->w; + //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; + //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); + } + } + drawCircle(screen,mousx,mousy,30,0xFFFFFF); + + + if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); + + SDL_Flip(screen); +} + +SDL_Surface* initScreen(int width,int height) +{ + return SDL_SetVideoMode(width, height, DEPTH, + SDL_HWSURFACE | SDL_RESIZABLE); +} + +int main(int argc, char* argv[]) +{ + SDL_Surface *screen; + SDL_Event event; + + int keypress = 0; + int h=0,s=1,i,j; + + memset(keystat,0,512*sizeof(keystat[0])); + if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; + + if (!(screen = initScreen(WIDTH,HEIGHT))) + { + SDL_Quit(); + return 1; + } + + while(!keystat[27]) { + //Poll SDL + while(SDL_PollEvent(&event)) + { + switch (event.type) + { + case SDL_QUIT: + keystat[27] = 1; + break; + case SDL_KEYDOWN: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 1; + //keypress = 1; + break; + case SDL_KEYUP: + //printf("%i\n",event.key.keysym.sym); + keystat[event.key.keysym.sym] = 0; + //keypress = 1; + break; + case SDL_VIDEORESIZE: + if (!(screen = initScreen(event.resize.w, + event.resize.h))) + { + SDL_Quit(); + return 1; + } + break; + case SDL_MOUSEMOTION: + mousx = event.motion.x; + mousy = event.motion.y; + break; + case SDL_MOUSEBUTTONDOWN: + bstatus |= (1<<(event.button.button-1)); + break; + case SDL_MOUSEBUTTONUP: + bstatus &= ~(1<<(event.button.button-1)); + break; + case SDL_FINGERMOTION: + i = 1; + + + printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, + event.tfinger.x,event.tfinger.y); + + break; + } + } + //And draw + DrawScreen(screen,h); + /* + for(i=0;i<512;i++) + if(keystat[i]) printf("%i\n",i); + printf("Buttons:%i\n",bstatus); + */ + } + SDL_Quit(); + + return 0; +} From f3d4dc95b25131f62946ebcfacaff543d9dec338 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Fri, 28 May 2010 20:40:09 +0530 Subject: [PATCH 019/272] Completed work on X11_CreateTexture. Added lots of safety features. These include support for drawing a texture using the core protocol while other textures are drawn using Xrender if Xrender does not support the color format of the said texture or any other fault with Xrender. --- src/video/x11/SDL_x11render.c | 87 +++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 15 deletions(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 30421b61f..4a8d3dca7 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -122,6 +122,7 @@ typedef struct XRenderPictFormat* picture_fmt; XRenderPictureAttributes picture_attr; unsigned int picture_attr_valuemask; + SDL_bool xrender_available; #endif XImage *image; #ifndef NO_SHARED_MEMORY @@ -218,10 +219,16 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) if(XRenderQueryExtension(data->display, &event_basep, &error_basep) == True) { data->xrender_available = SDL_TRUE; data->xwindow_pict_fmt = XRenderFindVisualFormat(data->display, data->visual); + if(!xwindow_pict_fmt) { + data->xrender_available = SDL_FALSE; + } data->xwindow_pict_attr.graphics_exposures = False; data->xwindow_pict_attr_valuemask = CPGraphicsExposure; data->xwindow_pict = XRenderCreatePicture(data->display, data->xwindow, data->xwindow_pict_fmt, data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); + if(!data->xwindow_pict) { + data->xrender_available = SDL_FALSE; + } } else { data->xrender_available = SDL_FALSE; @@ -275,9 +282,16 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) SDL_SetError("XCreatePixmap() failed"); return NULL; } - data->pixmap_picts[i] = - XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, &xwindow_pict_attr); +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(data->xrender_available == SDL_TRUE) { + data->pixmap_picts[i] = + XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, &xwindow_pict_attr); + if(!data->pixmap_picts[i]) { + data->xrender_available = SDL_FALSE; + } + } +#endif } if (n > 0) { data->drawable = data->pixmaps[0]; @@ -353,9 +367,14 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) return -1; } #ifdef SDL_VIDEO_DRIVER_X11_XRENDER - data->pictures[i] = - XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); + if(data->xrender_available == SDL_TRUE) { + data->pictures[i] = + XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); + if(!data->pictures[i]) { + data->xrender_available = SDL_FALSE; + } + } #endif } if (n > 0) { @@ -378,6 +397,7 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) X11_TextureData *data; int pitch_alignmask = ((renderdata->scanline_pad / 8) - 1); + data = (X11_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { SDL_OutOfMemory(); @@ -393,10 +413,10 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) } data->format = display->current_mode.format; } else { - /* The image/pixmap depth must be the same as the window or you - get a BadMatch error when trying to putimage or copyarea. - This BadMatch error - */ + /* If Xrender support is builtin we only need to check whether + Xrender is available at runtime. If it is available there + can be no BadMatch error since Xrender takes care of that. + */ #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(renderdata->xrender_available == SDL_False) { if (texture->format != display->current_mode.format) { @@ -405,6 +425,10 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) } } #else + /* The image/pixmap depth must be the same as the window or you + get a BadMatch error when trying to putimage or copyarea. + This BadMatch error + */ if (texture->format != display->current_mode.format) { SDL_SetError("Texture format doesn't match window format"); return -1; @@ -491,11 +515,44 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) } #ifdef SDL_VIDEO_DRIVER_X11_XRENDER - data->picture_fmt = - XRenderFindVisualFormat(renderdata->display, - data->picture = - XCreatePicture(renderdata->display, data->pixmap, - + if(renderdata->xrender_available) { + data->xrender_available = SDL_TRUE; + unsigned long x11_fmt_mask; // Format mask + XRenderPictFormat x11_templ_fmt; // Format template + x11_fmt_mask = + (PictFormatDepth | PictFormatRedMask | PictFormatGreenMask + | PictFormatBlueMask); + x11_templ_fmt.depth = (data->format).BitsPerPixel; + x11_temp_fmt.direct.redMask = (data->format).Rmask; + x11_temp_fmt.direct.greenMask = (data->format).Gmask; + x11_temp_fmt.direct.blueMask = (data->format).Bmask; + x11_temp_fmt.direct.alphaMask = (data->format).Amask; + /* Return one matching XRenderPictFormat */ + data->pict_fmt = + XRenderFindFormat(renderdata->display, x11_fmt_mask, &x11_templ_fmt, 1); + if(!data->pict_fmt) { + data->xrender_available = SDL_FALSE; + } + data->picture_attr_valuemask = CPGraphicsExposure; + (data->picture_attr).graphics_exposures = False; + data->picture = + XCreatePicture(renderdata->display, data->pixmap, data->picture_fmt, + data->picture_attr_valuemask, &(data->picture_attr)); + if(!data->picture) { + data->xrender_available = SDL_FALSE; + } + } + /* We thought we could render the texture with Xrender but this was + not possible for some reason. Now we must ensure that texture + format and window format match to avoid a BadMatch error. + */ + if(data->xrender_available == SDL_FALSE) { + if (texture->format != display->current_mode.format) { + SDL_SetError("Texture format doesn't match window format"); + return -1; + } + } +#endif data->image = XCreateImage(renderdata->display, renderdata->visual, renderdata->depth, ZPixmap, 0, NULL, texture->w, From d4d53a4609c3f9fb72f45334618a6e3555779280 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Fri, 28 May 2010 20:47:24 +0530 Subject: [PATCH 020/272] Fix initial value of the xrender_available boolean in X11_CreateTexture. --- src/video/x11/SDL_x11render.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 4a8d3dca7..db2e42c07 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -397,7 +397,6 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) X11_TextureData *data; int pitch_alignmask = ((renderdata->scanline_pad / 8) - 1); - data = (X11_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { SDL_OutOfMemory(); @@ -418,6 +417,8 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) can be no BadMatch error since Xrender takes care of that. */ #ifdef SDL_VIDEO_DRIVER_X11_XRENDER + // Assume the texture is supported by Xrender + data->xrender_available = TRUE if(renderdata->xrender_available == SDL_False) { if (texture->format != display->current_mode.format) { SDL_SetError("Texture format doesn't match window format"); From c8d828b8da2e7c5a106ddba5289f208573912587 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Fri, 28 May 2010 20:48:58 +0530 Subject: [PATCH 021/272] Fix typo. --- src/video/x11/SDL_x11render.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index db2e42c07..939330687 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -418,7 +418,7 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) */ #ifdef SDL_VIDEO_DRIVER_X11_XRENDER // Assume the texture is supported by Xrender - data->xrender_available = TRUE + data->xrender_available = SDL_TRUE; if(renderdata->xrender_available == SDL_False) { if (texture->format != display->current_mode.format) { SDL_SetError("Texture format doesn't match window format"); From 632271c373c28e1f7e3e39809abc793fce6d759c Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Sat, 29 May 2010 01:47:19 -0400 Subject: [PATCH 022/272] Bug fixes. Basic touch events (finger up, finger down, finger move) supported. --- src/events/SDL_touch.c | 14 ++++++++------ src/video/x11/SDL_eventtouch.h | 1 + src/video/x11/SDL_x11events.c | 17 ++++++++++++----- touchTest/touchTest.c | 32 ++++++++++++++++++++++++++------ 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index cce06c586..abab0b435 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -301,11 +301,12 @@ SDL_DelFinger(SDL_Touch* touch,int fingerid) int SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressure) { - int posted; + int posted; SDL_Touch* touch = SDL_GetTouch(id); + if(down) { SDL_Finger nf; - nf.id = id; + nf.id = fingerid; nf.x = x; nf.y = y; nf.pressure = pressure; @@ -324,13 +325,13 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu event.tfinger.y = y; event.tfinger.state = touch->buttonstate; event.tfinger.windowID = touch->focus ? touch->focus->id : 0; - event.tfinger.fingerId = id; + event.tfinger.fingerId = fingerid; posted = (SDL_PushEvent(&event) > 0); } return posted; } else { - SDL_DelFinger(touch,id); + SDL_DelFinger(touch,fingerid); posted = 0; if (SDL_GetEventState(SDL_FINGERUP) == SDL_ENABLE) { SDL_Event event; @@ -338,7 +339,7 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu event.tfinger.touchId = (Uint8) id; event.tfinger.state = touch->buttonstate; event.tfinger.windowID = touch->focus ? touch->focus->id : 0; - event.tfinger.fingerId = id; + event.tfinger.fingerId = fingerid; posted = (SDL_PushEvent(&event) > 0); } return posted; @@ -419,7 +420,8 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { SDL_Event event; event.tfinger.type = SDL_FINGERMOTION; - event.tfinger.touchId = (Uint8) index; + event.tfinger.touchId = (Uint8) id; + event.tfinger.fingerId = (Uint8) fingerid; event.tfinger.x = x; event.tfinger.y = y; event.tfinger.state = touch->buttonstate; diff --git a/src/video/x11/SDL_eventtouch.h b/src/video/x11/SDL_eventtouch.h index 44227318c..debdb59ae 100644 --- a/src/video/x11/SDL_eventtouch.h +++ b/src/video/x11/SDL_eventtouch.h @@ -31,6 +31,7 @@ typedef struct EventTouchData { int x,y,pressure,finger; //Temporary Variables until sync int eventStream; + SDL_bool up; } EventTouchData; #endif diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index c095a4d64..01a944b40 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -419,7 +419,7 @@ X11_PumpEvents(_THIS) /* Process Touch events - TODO When X gets touch support, use that instead*/ int i = 0,rd; - char * name[256]; + char name[256]; struct input_event ev[64]; int size = sizeof (struct input_event); static int initd = 0; //TODO - HACK! @@ -431,7 +431,7 @@ X11_PumpEvents(_THIS) touch->driverdata = SDL_malloc(sizeof(EventTouchData)); data = (EventTouchData*)(touch->driverdata); printf("Openning device...\n"); - data->eventStream = open("/dev/input/wacom-touch", + data->eventStream = open("/dev/input/wacom", O_RDONLY | O_NONBLOCK); ioctl (data->eventStream, EVIOCGNAME (sizeof (name)), name); printf ("Reading From : %s\n", name); @@ -452,24 +452,31 @@ X11_PumpEvents(_THIS) data->x = ev[i].value; else if (ev[i].code == ABS_Y) data->y = ev[i].value; + else if (ev[i].code == ABS_MISC) { + data->up = SDL_TRUE; + data->finger = ev[i].value; + } break; case EV_MSC: if(ev[i].code == MSC_SERIAL) data->finger = ev[i].value; break; case EV_SYN: - data->finger -= 1; /*Wacom indexes fingers from 1, - I index from 0*/ if(data->x >= 0 || data->y >= 0) SDL_SendTouchMotion(touch->id,data->finger, SDL_FALSE,data->x,data->y, data->pressure); - + if(data->up) + SDL_SendFingerDown(touch->id,data->finger, + SDL_FALSE,data->x,data->y, + data->pressure); //printf("Synched: %i tx: %i, ty: %i\n", // data->finger,data->x,data->y); data->x = -1; data->y = -1; data->pressure = -1; + data->finger = 0; + data->up = SDL_FALSE; break; } diff --git a/touchTest/touchTest.c b/touchTest/touchTest.c index 2c6d926a6..d041d22e1 100644 --- a/touchTest/touchTest.c +++ b/touchTest/touchTest.c @@ -9,6 +9,8 @@ #define BPP 4 #define DEPTH 32 +#define MAXFINGERS 3 + int mousx,mousy; int keystat[512]; int bstatus; @@ -20,6 +22,9 @@ typedef struct { int x,y; } Point; + +Point finger[MAXFINGERS]; + void handler (int sig) { printf ("\nexiting...(%d)\n", sig); @@ -78,6 +83,10 @@ void DrawScreen(SDL_Surface* screen, int h) } drawCircle(screen,mousx,mousy,30,0xFFFFFF); + int i; + for(i=0;i= 0 && finger[i].y >= 0) + drawCircle(screen,finger[i].x,finger[i].y,20,0xFF6600); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); @@ -144,14 +153,25 @@ int main(int argc, char* argv[]) case SDL_MOUSEBUTTONUP: bstatus &= ~(1<<(event.button.button-1)); break; - case SDL_FINGERMOTION: - i = 1; + case SDL_FINGERMOTION: - - printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, - event.tfinger.x,event.tfinger.y); - + //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, + // event.tfinger.x,event.tfinger.y); + finger[event.tfinger.fingerId].x = event.tfinger.x; + finger[event.tfinger.fingerId].y = event.tfinger.y; break; + case SDL_FINGERDOWN: + printf("Figner: %i down - x: %i, y: %i\n",event.tfinger.fingerId, + event.tfinger.x,event.tfinger.y); + finger[event.tfinger.fingerId].x = event.tfinger.x; + finger[event.tfinger.fingerId].y = event.tfinger.y; + break; + case SDL_FINGERUP: + printf("Figner: %i up - x: %i, y: %i\n",event.tfinger.fingerId, + event.tfinger.x,event.tfinger.y); + finger[event.tfinger.fingerId].x = -1; + finger[event.tfinger.fingerId].y = -1; + break; } } //And draw From ec612e614dde272307b06cd286b994781b30fca4 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Sat, 29 May 2010 02:09:16 -0400 Subject: [PATCH 023/272] Added pressure support for touch events. --- include/SDL_events.h | 1 + src/events/SDL_touch.c | 1 + src/video/x11/SDL_x11events.c | 23 +++++++++++++++-------- touchTest/touchPong | Bin 29203 -> 29219 bytes touchTest/touchSimp | Bin 29012 -> 29024 bytes touchTest/touchTest.c | 31 +++++++++++++++++++++---------- 6 files changed, 38 insertions(+), 18 deletions(-) diff --git a/include/SDL_events.h b/include/SDL_events.h index 150f3305c..0e19359b0 100644 --- a/include/SDL_events.h +++ b/include/SDL_events.h @@ -312,6 +312,7 @@ typedef struct SDL_TouchFingerEvent Uint8 padding1; int x; int y; + int pressure; } SDL_TouchFingerEvent; diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index abab0b435..af78ac1ea 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -424,6 +424,7 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, event.tfinger.fingerId = (Uint8) fingerid; event.tfinger.x = x; event.tfinger.y = y; + event.tfinger.pressure = pressure; event.tfinger.state = touch->buttonstate; event.tfinger.windowID = touch->focus ? touch->focus->id : 0; posted = (SDL_PushEvent(&event) > 0); diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 01a944b40..4e5934a98 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -448,14 +448,21 @@ X11_PumpEvents(_THIS) switch (ev[i].type) { case EV_ABS: //printf("Got position x: %i!\n",data->x); - if(ev[i].code == ABS_X) - data->x = ev[i].value; - else if (ev[i].code == ABS_Y) - data->y = ev[i].value; - else if (ev[i].code == ABS_MISC) { - data->up = SDL_TRUE; - data->finger = ev[i].value; - } + switch (ev[i].code) { + case ABS_X: + data->x = ev[i].value; + break; + case ABS_Y: + data->y = ev[i].value; + break; + case ABS_PRESSURE: + data->pressure = ev[i].value; + break; + case ABS_MISC: + data->up = SDL_TRUE; + data->finger = ev[i].value; + break; + } break; case EV_MSC: if(ev[i].code == MSC_SERIAL) diff --git a/touchTest/touchPong b/touchTest/touchPong index d2f1862cc97da9ed0cf7c9e26d5fd98846589489..f969adce99dec05d063dee650e79933de5a6813b 100755 GIT binary patch delta 1506 zcmX|BZERCz6h5aPaM$(S?rnRwt{rY=ks4z#G6wCoxMg&FCkCf60b$nBudVBr_QFOs zEx`>X8D#Sn6@iTb$w-jMT+|s&jNylb7-L2>5{Z5AezZoUBK6KJW^9emZ_nU(W8?bZ5@>_^VjsP;IE~lZ6Qk)a4z10BAaWq69y`&_BDJaasXehB*O*>KeVK!I6ls}yjpihF7O6x1jJg%OnC3~V95gN@ z_TY6c`Y~afcoADyi*}WYg2qnq64sH=^{)lMBlhF$YT$uVVBvJHuAXk*Nofa*O)Bc2 zlpzk`7?|~)>OG}vIR?FMUbhREPIgk7Cx_6UY_&d#%Ew3M!%;Gw=zoRh6E#W#!8PP^ggJg%_L zzID8t6F6e(u;ZD2 z&L!NwU{)@}f>|4B*vMHsuce_)Tk-#pX=7qA+)6@L>=5KoUwYs*=EjymJC@;(Y~1IGmY>y_4=jtNmY@wd< z367(jl{115T5H0;=0W zw5v!J^*Yrfy72+SYgJ$1!`q9rLcQoEx}!*K>St7sc)Ca{!NGaNE76sNQ zOB{n0B7w_pbz`yCqbV*PrdRiQ3~9Ym%j!5 z__bUc+HChzxdn4)UJish&@WGhTI~GB7tGu9@~hCGljZ(-#k!lm*Jx4i*2yQ@gT4U0 zz#bd*8HbH+J_ep1gR#S;*VjiT023W@v3bofcI&C$<*ywc&%@ZU@mTmM67G|{lonIRKe%x9Ms zYvT~L30-_8vdodicArA=Uyu=sGzU42_tS#rgB8+jrke3VK1Z6P9OV$*scgxT1<-*H zRkhnKzXLsrIbB}#mJb_J(g{yS{0Y5-0 zp6TsRWTB1l!9+GYnBAWkN#`L&JeSBHOpm~Ig1y=Ja7Q}Z)1QE?0f0`TJA1N;LhIlJ3C$sxk1;8OX(BlPAr_JQ(#4vIo zs9r14t_roNKT<2=NqoTYD(Wr{-dv$Jb-teHmI}42?^0)CE7JmL)qsl&iS4++Mb8qp zh;D3MD!Q{;6kO~SPh%tb+<%(@yka-bEd}nW29{6v{L<;pJ1A{$rAbBog)+oGJO)O6 zhx$A7{mkh&D!5o#9KbDPcKLjSd+=kzPR8ioL%k`Y4{wpFJeB@xUC%%+31Yx-nL-v= zW_gD-I74Lc6TS^I|n!9pj-Msm#ezp5oC8wStRtMFH=#&h`f0%@~dv zI_!90+FYfoWe71!gDNi8clQ&w7V23&KUPV8>E)SjInC%GKxSg}OjYap; z3B?@Fa_%kO+PrabwJW^*3&y~;&Siuz8bbpY^=}2SfD>}@iKdR*lw$jV8g%+*jEev^ z9*NUGMGjL)vGFBx2FlECTWu#+d)n|hz^`CH_~n|&D!eUsL;~0*Q;{&H=PRO(mL1o7o@`A5qU?E-biX*GQmyb0_l=&xIj#Wr~PThqwa{}5LE zNs~wSA^Byj!7oUMzc)q-`S!6~aG`iVcF$bAw@GcrtJ0>2&@Ug+!+1&V(!(Z8n>?yF l<8SgjneNDM^ssf+0f1-ZI^823NtH&}kPPFsVpq~>{~sFi2S@+_ delta 1402 zcmX|BduUr_6h9}A?Iz9F+&pd)``E03#xiu4Oih}?WNF=~Oqpd!-PVz9Ng9);Be`oc zbw;~RrEJ*l^RY+QtpgRtz>R=T91JO9g@Gcz>0qr75J7N%$ncNOb8eCblKg((`F`hp z@9ky$ZW*WU$K2Jn=g=FrEj_YuZ0?WWC;Fex9{usv&wu!|yK)@c)|YQI0oeQiLy7!> zT(SV2gbyYQg^|MEWGSP=0P$i{KbR@O*8~p~5@Yd9VSg?OT>*d|qW${|$z&d`5zXW? zdX3&8I-JPlAx;5?M-CNBu(O5^Ly1r}dAO)2*6A=wWFJBOP!TQ@PG$0GN`yb3Rr=c8 z9;;V$;*?Bm8Y_b<+5jM8*ysUp|E2&q#1^!80o2oGGQ=^20Hz?QUMta_8nvjuQ0}4^ z*BDks-N~1qtWleKv6<-B8nvq*QSM?}jW&Rb>xS2P?!dULox6 zHPkO+hgMg=R9CCxWp3)rwZ>SgT|82wR&cRayn=tTpQl=RHm_lB)z5g{k7o?T(OR(< z&k%@-dgb6^nK*`zlFIuHx$72h;V6}*8RIQa89uZY4m6Eh1b~nB2*gRePFPcU$`T)J zB>V|4%G-F6aXZiV9lYWsY|Q#y+@umt^PTtb8sh~X`YHU_MR+6Q(-?6R-p=?8o?~2| zV@GGvMBAtRLpQ~Yu?N}+l`PH~qt>po(^*`mBke4ga~}KH=^n~ZT)-*T{>4+9GZt6- zl866+(QvJ2E#VK1rh$v=7niU^y|8{kBX9J}rN{m8TcovpPn9}-v&M#ijho~2kCTDc z$Hv>_3{;uj)?p`h-wDI!0KbBP6`zbn9>802FcQE{ITi`wfIJ@wIp)b}(=7SI4fFEb zNEpA8Yod=i!qkE4adcj8i^ec4C!#?IKk(J#_`Iw{Q*M@9Pgs z{VOElH;o}7+aSAZnW;Fs@0zK4s92s*+wq3fQbAN?G!??jGLZ_I?rxTosdikHSLtY3 W{!G6= 0 && finger[i].y >= 0) - drawCircle(screen,finger[i].x,finger[i].y,20,0xFF6600); + if(finger[i].p.x >= 0 && finger[i].p.y >= 0) + drawCircle(screen,finger[i].p.x,finger[i].p.y,20,0xFF6600-finger[i].pressure); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); @@ -157,20 +165,23 @@ int main(int argc, char* argv[]) //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, // event.tfinger.x,event.tfinger.y); - finger[event.tfinger.fingerId].x = event.tfinger.x; - finger[event.tfinger.fingerId].y = event.tfinger.y; + finger[event.tfinger.fingerId].p.x = event.tfinger.x; + finger[event.tfinger.fingerId].p.y = event.tfinger.y; + finger[event.tfinger.fingerId].pressure = event.tfinger.pressure; + printf("Finger: %i, pressure: %i\n",event.tfinger.fingerId, + event.tfinger.pressure); break; case SDL_FINGERDOWN: printf("Figner: %i down - x: %i, y: %i\n",event.tfinger.fingerId, event.tfinger.x,event.tfinger.y); - finger[event.tfinger.fingerId].x = event.tfinger.x; - finger[event.tfinger.fingerId].y = event.tfinger.y; + finger[event.tfinger.fingerId].p.x = event.tfinger.x; + finger[event.tfinger.fingerId].p.y = event.tfinger.y; break; case SDL_FINGERUP: printf("Figner: %i up - x: %i, y: %i\n",event.tfinger.fingerId, event.tfinger.x,event.tfinger.y); - finger[event.tfinger.fingerId].x = -1; - finger[event.tfinger.fingerId].y = -1; + finger[event.tfinger.fingerId].p.x = -1; + finger[event.tfinger.fingerId].p.y = -1; break; } } From 54edf7b933d2dcadc705a50cd635232c20a5323a Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Sun, 30 May 2010 20:06:30 +0530 Subject: [PATCH 024/272] Add Xrender support to X11_FillRectangles. --- src/video/x11/SDL_x11render.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 939330687..0111ccacd 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -98,7 +98,7 @@ typedef struct #ifdef SDL_VIDEO_DRIVER_X11_XRENDER Picture xwindow_pict; Picture pixmap_picts[3]; - Picture * drawable_pict; + Picture drawable_pict; XRenderPictFormat* xwindow_pict_fmt; XRenderPictureAttributes xwindow_pict_attr; unsigned int xwindow_pict_attr_valuemask; @@ -297,14 +297,14 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) data->drawable = data->pixmaps[0]; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(data->xrender_available == SDL_TRUE) - data->drawable_pict = &(data->pixmap_picts[0]); + data->drawable_pict = data->pixmap_picts[0]; #endif data->makedirty = SDL_TRUE; } else { data->drawable = data->xwindow; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(data->xrender_available == SDL_TRUE) - data->drawable_pict = &(data->xwindow_pict); + data->drawable_pict = data->xwindow_pict; #endif data->makedirty = SDL_FALSE; } @@ -380,7 +380,7 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) if (n > 0) { data->drawable = data->pixmaps[0]; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER - data->drawable_pict = &(data->pictures[0]); + data->drawable_pict = data->pictures[0]; #endif } data->current_pixmap = 0; @@ -994,8 +994,18 @@ X11_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) } } if (xcount > 0) { +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(data->xrender_available == SDL_TRUE) + { + XRenderFillRectangles(data->display, PictOpSrc, data->drawable_pict, + (XRenderColor)foreground, xrects, xcount); + } + else +#endif + { XFillRectangles(data->display, data->drawable, data->gc, xrects, xcount); + } } SDL_stack_free(xpoints); From e0a87edc6ea750dfc90a6fa097b019bf415df467 Mon Sep 17 00:00:00 2001 From: dewyatt Date: Sun, 30 May 2010 15:48:16 -0400 Subject: [PATCH 025/272] Implementing base parts of TSF --- EXCLUDE/GLTSF/include/TSF.hpp | 13 ++++ EXCLUDE/GLTSF/src/TSF.cpp | 139 ++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) diff --git a/EXCLUDE/GLTSF/include/TSF.hpp b/EXCLUDE/GLTSF/include/TSF.hpp index 5453b9acd..c37f4a4be 100644 --- a/EXCLUDE/GLTSF/include/TSF.hpp +++ b/EXCLUDE/GLTSF/include/TSF.hpp @@ -2,6 +2,7 @@ #define TSF_HPP #include +#include class TSF { @@ -37,8 +38,20 @@ class TSF LONG my_Reference_Count; }; + TSF(); + ~TSF(); + + void Initialize(); + void Finalize(); + private: + bool my_COM_Initialized; + + CComPtr my_Thread_Manager; + UI_Sink *my_UI_Sink; + DWORD my_UI_Element_Sink_Cookie; + DWORD my_IPPA_Sink_Cookie; }; #endif diff --git a/EXCLUDE/GLTSF/src/TSF.cpp b/EXCLUDE/GLTSF/src/TSF.cpp index f21d968cd..2f2df17c5 100644 --- a/EXCLUDE/GLTSF/src/TSF.cpp +++ b/EXCLUDE/GLTSF/src/TSF.cpp @@ -1 +1,140 @@ #include "TSF.hpp" +#include + +TSF::TSF() : my_COM_Initialized(false), + my_UI_Sink(0), + my_UI_Element_Sink_Cookie(TF_INVALID_COOKIE), + my_IPPA_Sink_Cookie(TF_INVALID_COOKIE) +{ + +} + +TSF::~TSF() +{ + Finalize(); +} + +void TSF::Initialize() +{ + Finalize(); + + if (S_OK != CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)) + throw std::runtime_error("Failed to initialize COM"); + + my_COM_Initialized = true; + if (S_OK != CoCreateInstance(CLSID_TF_ThreadMgr, NULL, CLSCTX_INPROC_SERVER, __uuidof(ITfThreadMgrEx), (void **)&my_Thread_Manager)) + throw std::runtime_error("Failed to create ITfThreadMgrEx instance"); + + TfClientId Client_Id = 0; + if (FAILED(my_Thread_Manager->ActivateEx(&Client_Id, TF_TMAE_UIELEMENTENABLEDONLY))) + throw std::runtime_error("ITfThreadMgrEx::ActivateEx failed"); + + my_UI_Sink = new UI_Sink(); + ITfSource *Source = NULL; + if (FAILED(my_Thread_Manager->QueryInterface(__uuidof(ITfSource), (void **)&Source))) + throw std::runtime_error("QueryInterface failed"); + + if (FAILED(Source->AdviseSink(__uuidof(ITfUIElementSink), (ITfUIElementSink *)my_UI_Sink, &my_UI_Element_Sink_Cookie))) + throw std::runtime_error("AdviseSink failed"); + + if (FAILED(Source->AdviseSink(__uuidof(ITfInputProcessorProfileActivationSink), (ITfInputProcessorProfileActivationSink *)my_UI_Sink, &my_IPPA_Sink_Cookie))) + throw std::runtime_error("AdviseSink failed"); +} + +void TSF::Finalize() +{ + if (my_UI_Sink) + { + ITfSource *Source = NULL; + if (SUCCEEDED(my_Thread_Manager->QueryInterface(__uuidof(ITfSource), (void **)&Source))) + { + Source->UnadviseSink(my_IPPA_Sink_Cookie); + Source->UnadviseSink(my_UI_Element_Sink_Cookie); + Source->Release(); + } + if (my_Thread_Manager) + my_Thread_Manager->Deactivate(); + + my_UI_Sink->Release(); + delete my_UI_Sink; + my_UI_Sink = NULL; + } + my_Thread_Manager = NULL; + if (my_COM_Initialized) + { + CoUninitialize(); + my_COM_Initialized = false; + } +} + +TSF::UI_Sink::UI_Sink() +{ + my_Reference_Count = 1; +} + +TSF::UI_Sink::~UI_Sink() +{ + +} + +STDMETHODIMP TSF::UI_Sink::QueryInterface(REFIID riid, void **ppvObj) +{ + if (NULL == ppvObj) + return E_INVALIDARG; + + *ppvObj = NULL; + if (IsEqualIID(riid, IID_IUnknown)) + *ppvObj = reinterpret_cast(this); + else if (IsEqualIID(riid, __uuidof(ITfUIElementSink))) + *ppvObj = reinterpret_cast(this); + else if (IsEqualIID(riid, __uuidof(ITfInputProcessorProfileActivationSink))) + *ppvObj = reinterpret_cast(this); + else if (IsEqualIID(riid, __uuidof(ITfCompartmentEventSink))) + *ppvObj = reinterpret_cast(this); + + if (*ppvObj) + { + AddRef(); + return S_OK; + } + return E_NOINTERFACE; +} + +ULONG TSF::UI_Sink::AddRef(void) +{ + return ++my_Reference_Count; +} + +ULONG TSF::UI_Sink::Release(void) +{ + LONG Count = --my_Reference_Count; + if (0 == Count) + delete this; + + return Count; +} + +STDMETHODIMP TSF::UI_Sink::BeginUIElement(DWORD dwUIElementId, BOOL *pbShow) +{ + return S_OK; +} + +STDMETHODIMP TSF::UI_Sink::UpdateUIElement(DWORD dwUIElementId) +{ + return S_OK; +} + +STDMETHODIMP TSF::UI_Sink::EndUIElement(DWORD dwUIElementId) +{ + return S_OK; +} + +STDMETHODIMP TSF::UI_Sink::OnActivated(DWORD dwProfileType, LANGID langid, REFCLSID clsid, REFGUID catid, REFGUID guidProfile, HKL hkl, DWORD dwFlags) +{ + return S_OK; +} + +STDMETHODIMP TSF::UI_Sink::OnChange(REFGUID rguid) +{ + return S_OK; +} From e36fc80c35b2e9feb3cc0dcb5b3880deb92d9756 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Mon, 31 May 2010 00:24:37 -0400 Subject: [PATCH 026/272] Auto-detects Wacom touch devices. --- src/events/SDL_touch.c | 27 ++++++--- src/events/SDL_touch_c.h | 1 + src/video/x11/SDL_eventtouch.c | 100 +++++++++++++++++++++++++++++++++ src/video/x11/SDL_eventtouch.h | 4 +- src/video/x11/SDL_x11events.c | 19 ++----- src/video/x11/SDL_x11video.c | 3 + touchTest/makefile | 2 + touchTest/parseDevicesTest.c | 50 +++++++++++++++++ 8 files changed, 182 insertions(+), 24 deletions(-) create mode 100644 src/video/x11/SDL_eventtouch.c create mode 100644 touchTest/parseDevicesTest.c diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index af78ac1ea..0b4957701 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -36,12 +36,7 @@ static SDL_Touch **SDL_touchPads = NULL; int SDL_TouchInit(void) { - SDL_Touch touch; - touch.pressure_max = 0; - touch.pressure_min = 0; - touch.id = 0; //Should be function? - SDL_AddTouch(&touch, "Touch1"); return (0); } @@ -138,6 +133,9 @@ SDL_AddTouch(const SDL_Touch * touch, char *name) SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1); SDL_touchPads[index]->num_fingers = 0; + SDL_touchPads[index]->max_fingers = 0; + SDL_touchPads[index]->fingers = NULL; + SDL_touchPads[index]->buttonstate = 0; SDL_touchPads[index]->relative_mode = SDL_FALSE; SDL_touchPads[index]->flush_motion = SDL_FALSE; @@ -261,16 +259,27 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) } /* Add the touch to the list of touch */ - fingers = (SDL_Finger **) SDL_realloc(touch->fingers, - (touch->num_fingers + 1) * sizeof(*touch)); + if(touch->num_fingers >= touch->max_fingers){ + if(fingers == NULL) { + touch->max_fingers = 1; + fingers = (SDL_Finger **) SDL_malloc(sizeof(finger)); + } + else { + fingers = (SDL_Finger **) SDL_realloc(touch->fingers, + (touch->num_fingers + 1) * sizeof(finger)); + touch->max_fingers = touch->num_fingers+1; + } + + } + if (!fingers) { SDL_OutOfMemory(); return -1; } touch->fingers = fingers; - index = touch->num_fingers++; - + index = touch->num_fingers; + touch->num_fingers++; touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index]))); if (!touch->fingers[index]) { SDL_OutOfMemory(); diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h index 6a0ebf62d..eb2a0cbbb 100644 --- a/src/events/SDL_touch_c.h +++ b/src/events/SDL_touch_c.h @@ -61,6 +61,7 @@ struct SDL_Touch SDL_bool flush_motion; int num_fingers; + int max_fingers; SDL_Finger** fingers; void *driverdata; diff --git a/src/video/x11/SDL_eventtouch.c b/src/video/x11/SDL_eventtouch.c new file mode 100644 index 000000000..691169e56 --- /dev/null +++ b/src/video/x11/SDL_eventtouch.c @@ -0,0 +1,100 @@ +/* + 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 +*/ +#include "SDL_config.h" +#include "SDL_x11video.h" +#include "SDL_eventtouch.h" +#include "../../events/SDL_touch_c.h" + +#include +#include + +void +X11_InitTouch(_THIS) +{ + printf("Initializing touch...\n"); + + FILE *fd; + fd = fopen("/proc/bus/input/devices","r"); + + char c; + int i = 0; + char line[256]; + char tstr[256]; + int vendor = -1,product = -1,event = -1; + while(!feof(fd)) { + if(fgets(line,256,fd) <=0) continue; + //printf("%s",line); + if(line[0] == '\n') { + if(vendor == 1386){ + printf("Wacom... Assuming it is a touch device\n"); + sprintf(tstr,"/dev/input/event%i",event); + printf("At location: %s\n",tstr); + + SDL_Touch touch; + touch.pressure_max = 0; + touch.pressure_min = 0; + touch.id = event; + + + + touch.driverdata = SDL_malloc(sizeof(EventTouchData)); + EventTouchData* data = (EventTouchData*)(touch.driverdata); + printf("Opening device...\n"); + //printf("New Touch - DataPtr: %i\n",data); + data->eventStream = open(tstr, + O_RDONLY | O_NONBLOCK); + ioctl (data->eventStream, EVIOCGNAME (sizeof (tstr)), tstr); + printf ("Reading From : %s\n", tstr); + SDL_AddTouch(&touch, tstr); + + } + vendor = -1; + product = -1; + event = -1; + } + else if(line[0] == 'I') { + i = 1; + while(line[i]) { + sscanf(&line[i],"Vendor=%x",&vendor); + sscanf(&line[i],"Product=%x",&product); + i++; + } + } + else if(line[0] == 'H') { + i = 1; + while(line[i]) { + sscanf(&line[i],"event%d",&event); + i++; + } + } + } + + close(fd); +} + +void +X11_QuitTouch(_THIS) +{ + SDL_TouchQuit(); +} + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_eventtouch.h b/src/video/x11/SDL_eventtouch.h index debdb59ae..1cee9ec0a 100644 --- a/src/video/x11/SDL_eventtouch.h +++ b/src/video/x11/SDL_eventtouch.h @@ -35,8 +35,8 @@ typedef struct EventTouchData } EventTouchData; #endif -//extern void X11_InitMouse(_THIS); -//extern void X11_QuitMouse(_THIS); +extern void X11_InitTouch(_THIS); +extern void X11_QuitTouch(_THIS); #endif /* _SDL_eventtouch_h */ diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 4e5934a98..8c5ec04c8 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -109,7 +109,6 @@ X11_DispatchEvent(_THIS) #endif } break; - /* Losing mouse coverage? */ case LeaveNotify:{ #ifdef DEBUG_XEVENTS @@ -422,23 +421,16 @@ X11_PumpEvents(_THIS) char name[256]; struct input_event ev[64]; int size = sizeof (struct input_event); - static int initd = 0; //TODO - HACK! + for(i = 0;i < SDL_GetNumTouch();++i) { SDL_Touch* touch = SDL_GetTouchIndex(i); if(!touch) printf("Touch %i/%i DNE\n",i,SDL_GetNumTouch()); EventTouchData* data; - if(!initd){//data->eventStream <= 0) { - touch->driverdata = SDL_malloc(sizeof(EventTouchData)); - data = (EventTouchData*)(touch->driverdata); - printf("Openning device...\n"); - data->eventStream = open("/dev/input/wacom", - O_RDONLY | O_NONBLOCK); - ioctl (data->eventStream, EVIOCGNAME (sizeof (name)), name); - printf ("Reading From : %s\n", name); - initd = 1; + data = (EventTouchData*)(touch->driverdata); + if(data == NULL) { + printf("No driver data\n"); + continue; } - else - data = (EventTouchData*)(touch->driverdata); if(data->eventStream <= 0) printf("Error: Couldn't open stream\n"); rd = read(data->eventStream, ev, size * 64); @@ -469,6 +461,7 @@ X11_PumpEvents(_THIS) data->finger = ev[i].value; break; case EV_SYN: + printf("Id: %i\n",touch->id); if(data->x >= 0 || data->y >= 0) SDL_SendTouchMotion(touch->id,data->finger, SDL_FALSE,data->x,data->y, diff --git a/src/video/x11/SDL_x11video.c b/src/video/x11/SDL_x11video.c index 2494bce39..4575b634e 100644 --- a/src/video/x11/SDL_x11video.c +++ b/src/video/x11/SDL_x11video.c @@ -23,6 +23,7 @@ #include "SDL_video.h" #include "SDL_mouse.h" +#include "SDL_eventtouch.h" #include "../SDL_sysvideo.h" #include "../SDL_pixels_c.h" @@ -269,6 +270,7 @@ X11_VideoInit(_THIS) } X11_InitMouse(_this); + X11_InitTouch(_this); return 0; } @@ -289,6 +291,7 @@ X11_VideoQuit(_THIS) X11_QuitModes(_this); X11_QuitKeyboard(_this); X11_QuitMouse(_this); + X11_QuitTouch(_this); } SDL_bool diff --git a/touchTest/makefile b/touchTest/makefile index a244a2982..50bce657c 100644 --- a/touchTest/makefile +++ b/touchTest/makefile @@ -2,4 +2,6 @@ SDLTest : touchSimp.c touchPong.c gcc touchTest.c -o touchTest `sdl-config --cflags --libs` -g gcc touchSimp.c -o touchSimp `sdl-config --cflags --libs` -g gcc touchPong.c -o touchPong `sdl-config --cflags --libs` -g + gcc parseDevicesTest.c -o parseDevicesTest -g + diff --git a/touchTest/parseDevicesTest.c b/touchTest/parseDevicesTest.c new file mode 100644 index 000000000..85d4ffef3 --- /dev/null +++ b/touchTest/parseDevicesTest.c @@ -0,0 +1,50 @@ +#include +#include +#include + + +int main(int agrc,char **argv) +{ + FILE *fd; + fd = fopen("/proc/bus/input/devices","r"); + + char c; + int i = 0; + char line[256]; + char tstr[256]; + int vendor = -1,product = -1,event = -1; + while(!feof(fd)) { + fgets(line,256,fd); + //printf("%s",line); + if(line[0] == '\n') { + if(vendor == 1386){ + printf("Wacom... Assuming it is a touch device\n"); + sprintf(tstr,"/dev/input/event%i",event); + printf("At location: %s\n",tstr); + + + } + vendor = -1; + product = -1; + event = -1; + } + else if(line[0] == 'I') { + i = 1; + while(line[i]) { + sscanf(&line[i],"Vendor=%x",&vendor); + sscanf(&line[i],"Product=%x",&product); + i++; + } + } + else if(line[0] == 'H') { + i = 1; + while(line[i]) { + sscanf(&line[i],"event%d",&event); + i++; + } + } + } + + close(fd); + return 0; +} From 941436daab31addb7706293e74383dfd1ba789de Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Mon, 31 May 2010 13:27:27 +0530 Subject: [PATCH 027/272] Modified configure.in to allow building with Xrender. Fixed all problems that prevented compilation. Builds fine now :) --- configure.in | 33 ++++++++++++++++++++++---- include/SDL_config.h.in | 2 ++ src/video/x11/SDL_x11render.c | 44 +++++++++++++++++++++-------------- 3 files changed, 56 insertions(+), 23 deletions(-) diff --git a/configure.in b/configure.in index 00c15101d..bc901943b 100644 --- a/configure.in +++ b/configure.in @@ -1128,16 +1128,13 @@ AC_HELP_STRING([--enable-video-x11-xrandr], [enable X11 Xrandr extension for ful ]) if test x$have_xrandr_h_hdr = xyes; then if test x$enable_x11_shared = xyes && test x$xrandr_lib != x ; then - echo "-- dynamic libXrender -> $xrender_lib" echo "-- dynamic libXrandr -> $xrandr_lib" - AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER, "$xrender_lib") AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR, "$xrandr_lib") definitely_enable_video_x11_xrandr=yes else - AC_CHECK_LIB(Xrender, XRenderQueryExtension, have_xrender_lib=yes) AC_CHECK_LIB(Xrandr, XRRQueryExtension, have_xrandr_lib=yes) - if test x$have_xrender_lib = xyes && test x$have_xrandr_lib = xyes ; then - EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXrandr -lXrender" + if test x$have_xrandr_lib = xyes ; then + EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXrandr" definitely_enable_video_x11_xrandr=yes fi fi @@ -1199,6 +1196,32 @@ AC_HELP_STRING([--enable-video-x11-scrnsaver], [enable X11 screensaver extension if test x$definitely_enable_video_x11_scrnsaver = xyes; then AC_DEFINE(SDL_VIDEO_DRIVER_X11_SCRNSAVER) fi + AC_ARG_ENABLE(video-x11-xrender, +AC_HELP_STRING([--enable-video-x11-xrender], [enable X11 Xrender extension [[default=yes]]]), + , enable_video_x11_xrender=yes) + if test x$enable_video_x11_xrender = xyes; then + AC_CHECK_HEADER(X11/extensions/Xrender.h, + have_xrender_h_hdr=yes, + have_xrender_h_hdr=no, + [#include + ]) + if test x$have_xrender_h_hdr = xyes; then + if test x$enable_x11_shared = xyes && test x$xrender_lib != x ; then + echo "-- dynamic libXrender -> $xrender_lib" + AC_DEFINE_UNQUOTED(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRENDER, "$xrender_lib") + definitely_enable_video_x11_xrender=yes + else + AC_CHECK_LIB(Xrender, XRenderQueryExtension, have_xrender_lib=yes) + if test x$have_xrender_lib = xyes ; then + EXTRA_LDFLAGS="$EXTRA_LDFLAGS -lXrender" + definitely_enable_video_x11_xrender=yes + fi + fi + fi + fi + if test x$definitely_enable_video_x11_xrender = xyes; then + AC_DEFINE(SDL_VIDEO_DRIVER_X11_XRENDER) + fi AC_ARG_ENABLE(render-x11, AC_HELP_STRING([--enable-render-x11], [enable the X11 render driver [[default=yes]]]), diff --git a/include/SDL_config.h.in b/include/SDL_config.h.in index 473a0f323..b9e1ef300 100644 --- a/include/SDL_config.h.in +++ b/include/SDL_config.h.in @@ -280,6 +280,8 @@ #undef SDL_VIDEO_DRIVER_X11_XV #undef SDL_VIDEO_DRIVER_X11_XRENDER +#undef SDL_VIDEO_RENDER_X11 + #undef SDL_VIDEO_RENDER_D3D #undef SDL_VIDEO_RENDER_GDI #undef SDL_VIDEO_RENDER_OGL diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 0111ccacd..d5631197c 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -219,7 +219,7 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) if(XRenderQueryExtension(data->display, &event_basep, &error_basep) == True) { data->xrender_available = SDL_TRUE; data->xwindow_pict_fmt = XRenderFindVisualFormat(data->display, data->visual); - if(!xwindow_pict_fmt) { + if(!data->xwindow_pict_fmt) { data->xrender_available = SDL_FALSE; } data->xwindow_pict_attr.graphics_exposures = False; @@ -285,8 +285,8 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(data->xrender_available == SDL_TRUE) { data->pixmap_picts[i] = - XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, - data->xwindow_pict_attr_valuemask, &xwindow_pict_attr); + XRenderCreatePicture(data->display, data->pixmaps[i], data->xwindow_pict_fmt, + data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); if(!data->pixmap_picts[i]) { data->xrender_available = SDL_FALSE; } @@ -354,7 +354,7 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) XFreePixmap(data->display, data->pixmaps[i]); data->pixmaps[i] = None; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER - data->pictures[i] = None; + data->pixmap_picts[i] = None; #endif } } @@ -368,10 +368,10 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) } #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(data->xrender_available == SDL_TRUE) { - data->pictures[i] = - XCreatePicture(data->display, data->pixmap[i], data->xwindow_pict_fmt, + data->pixmap_picts[i] = + XRenderCreatePicture(data->display, data->pixmaps[i], data->xwindow_pict_fmt, data->xwindow_pict_attr_valuemask, &data->xwindow_pict_attr); - if(!data->pictures[i]) { + if(!data->pixmap_picts[i]) { data->xrender_available = SDL_FALSE; } } @@ -380,7 +380,7 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) if (n > 0) { data->drawable = data->pixmaps[0]; #ifdef SDL_VIDEO_DRIVER_X11_XRENDER - data->drawable_pict = data->pictures[0]; + data->drawable_pict = data->pixmap_picts[0]; #endif } data->current_pixmap = 0; @@ -419,7 +419,7 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) #ifdef SDL_VIDEO_DRIVER_X11_XRENDER // Assume the texture is supported by Xrender data->xrender_available = SDL_TRUE; - if(renderdata->xrender_available == SDL_False) { + if(renderdata->xrender_available == SDL_FALSE) { if (texture->format != display->current_mode.format) { SDL_SetError("Texture format doesn't match window format"); return -1; @@ -523,21 +523,24 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) x11_fmt_mask = (PictFormatDepth | PictFormatRedMask | PictFormatGreenMask | PictFormatBlueMask); - x11_templ_fmt.depth = (data->format).BitsPerPixel; - x11_temp_fmt.direct.redMask = (data->format).Rmask; - x11_temp_fmt.direct.greenMask = (data->format).Gmask; - x11_temp_fmt.direct.blueMask = (data->format).Bmask; - x11_temp_fmt.direct.alphaMask = (data->format).Amask; + Uint32 Rmask, Gmask, Bmask, Amask; + int bpp; + SDL_PixelFormatEnumToMasks(data->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); + x11_templ_fmt.depth = bpp; + x11_templ_fmt.direct.redMask = Rmask; + x11_templ_fmt.direct.greenMask = Gmask; + x11_templ_fmt.direct.blueMask = Bmask; + x11_templ_fmt.direct.alphaMask = Amask; /* Return one matching XRenderPictFormat */ - data->pict_fmt = + data->picture_fmt = XRenderFindFormat(renderdata->display, x11_fmt_mask, &x11_templ_fmt, 1); - if(!data->pict_fmt) { + if(!data->picture_fmt) { data->xrender_available = SDL_FALSE; } data->picture_attr_valuemask = CPGraphicsExposure; (data->picture_attr).graphics_exposures = False; data->picture = - XCreatePicture(renderdata->display, data->pixmap, data->picture_fmt, + XRenderCreatePicture(renderdata->display, data->pixmap, data->picture_fmt, data->picture_attr_valuemask, &(data->picture_attr)); if(!data->picture) { data->xrender_available = SDL_FALSE; @@ -997,8 +1000,13 @@ X11_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(data->xrender_available == SDL_TRUE) { + XRenderColor xrender_foreground_color; + xrender_foreground_color.red = renderer->r; + xrender_foreground_color.green = renderer->g; + xrender_foreground_color.blue = renderer->b; + xrender_foreground_color.alpha = renderer->a; XRenderFillRectangles(data->display, PictOpSrc, data->drawable_pict, - (XRenderColor)foreground, xrects, xcount); + &xrender_foreground_color, xrects, xcount); } else #endif From bb399ee9cf91e1512347d642add140c2446af276 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Mon, 31 May 2010 15:09:36 +0530 Subject: [PATCH 028/272] Xrender uses 16 bit color per channel. Fixed the color handling in X11_RenderFillRects to match this. Xrender just works now for filling rectangles :D . --- src/video/x11/SDL_x11render.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index d5631197c..b30336290 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -1001,10 +1001,10 @@ X11_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) if(data->xrender_available == SDL_TRUE) { XRenderColor xrender_foreground_color; - xrender_foreground_color.red = renderer->r; - xrender_foreground_color.green = renderer->g; - xrender_foreground_color.blue = renderer->b; - xrender_foreground_color.alpha = renderer->a; + xrender_foreground_color.red = (unsigned short) ((renderer->r / 255.0) * 0xFFFF); + xrender_foreground_color.green = (unsigned short) ((renderer->g / 255.0) * 0xFFFF); + xrender_foreground_color.blue = (unsigned short) ((renderer->b / 255.0) * 0xFFFF); + xrender_foreground_color.alpha = (unsigned short) ((renderer->a / 255.0) * 0xFFFF); XRenderFillRectangles(data->display, PictOpSrc, data->drawable_pict, &xrender_foreground_color, xrects, xcount); } From 83d881011d5c0a80d083433916fbbdf5f4e8ccaf Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Mon, 31 May 2010 17:04:20 +0530 Subject: [PATCH 029/272] X11_RenderPresent now uses XRender to blit back-buffers to the screen. --- src/video/x11/SDL_x11render.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index b30336290..184f7479a 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -1205,9 +1205,19 @@ X11_RenderPresent(SDL_Renderer * renderer) if (!(renderer->info.flags & SDL_RENDERER_SINGLEBUFFER)) { for (dirty = data->dirty.list; dirty; dirty = dirty->next) { const SDL_Rect *rect = &dirty->rect; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(data->xrender_available == SDL_TRUE) + { + XRenderComposite(data->display, PictOpSrc, data->drawable_pict, None, data->xwindow_pict, + rect->x, rect->y, 0, 0, rect->x, rect->y, rect->w, rect->h); + } + else +#endif + { XCopyArea(data->display, data->drawable, data->xwindow, data->gc, rect->x, rect->y, rect->w, rect->h, rect->x, rect->y); + } } SDL_ClearDirtyRects(&data->dirty); } @@ -1217,9 +1227,15 @@ X11_RenderPresent(SDL_Renderer * renderer) if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP2) { data->current_pixmap = (data->current_pixmap + 1) % 2; data->drawable = data->pixmaps[data->current_pixmap]; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + data->drawable_pict = data->pixmap_picts[data->current_pixmap]; +#endif } else if (renderer->info.flags & SDL_RENDERER_PRESENTFLIP3) { data->current_pixmap = (data->current_pixmap + 1) % 3; data->drawable = data->pixmaps[data->current_pixmap]; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + data->drawable_pict = data->pixmap_picts[data->current_pixmap]; +#endif } } From 02f0a3b7c364ba7a011b7137de124d2c261012d7 Mon Sep 17 00:00:00 2001 From: Jim Grandpre Date: Tue, 1 Jun 2010 02:54:33 -0400 Subject: [PATCH 030/272] Added include/touch.h Now reading in resolution of touch pad. --- include/SDL_touch.h | 118 +++++++++++++++++++++++++++++++++ src/events/SDL_touch.c | 51 +++++++------- src/events/SDL_touch_c.h | 43 +----------- src/video/x11/SDL_eventtouch.c | 22 +++++- src/video/x11/SDL_x11events.c | 3 +- touchTest/parseDevicesTest.c | 17 +++++ touchTest/touchTest.c | 54 +++++++++++---- 7 files changed, 226 insertions(+), 82 deletions(-) create mode 100644 include/SDL_touch.h diff --git a/include/SDL_touch.h b/include/SDL_touch.h new file mode 100644 index 000000000..359748ccb --- /dev/null +++ b/include/SDL_touch.h @@ -0,0 +1,118 @@ +/* + 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_touch.h + * + * Include file for SDL mouse event handling. + */ + +#ifndef _SDL_touch_h +#define _SDL_touch_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 + +typedef struct SDL_Touch SDL_Touch; +typedef struct SDL_Finger SDL_Finger; + +struct SDL_Finger { + int id; + int x; + int y; + int z; /* for future use */ + int xdelta; + int ydelta; + int last_x, last_y,last_pressure; /* the last reported coordinates */ + int pressure; +}; + + +struct SDL_Touch +{ + + /* Free the touch when it's time */ + void (*FreeTouch) (SDL_Touch * touch); + + /* data common for tablets */ + int pressure_max, pressure_min; + int x_max,x_min; + int y_max,y_min; + int xres,yres,pressureres; + int tilt; /* for future use */ + int rotation; /* for future use */ + + /* Data common to all touch */ + int id; + SDL_Window *focus; + + char *name; + Uint8 buttonstate; + SDL_bool relative_mode; + SDL_bool flush_motion; + + int num_fingers; + int max_fingers; + SDL_Finger** fingers; + + void *driverdata; +}; + + +/* Function prototypes */ + +/** + * \brief Get the touch object at the given id. + * + * + */ + extern DECLSPEC SDL_Touch* SDLCALL SDL_GetTouch(int id); + + + +/** + * \brief Get the finger object of the given touch, at the given id. + * + * + */ + extern DECLSPEC SDL_Finger* SDLCALL SDL_GetFinger(SDL_Touch *touch, int id); + +/* 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: */ diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 0b4957701..571d3d4af 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -133,9 +133,9 @@ SDL_AddTouch(const SDL_Touch * touch, char *name) SDL_strlcpy(SDL_touchPads[index]->name, name, length + 1); SDL_touchPads[index]->num_fingers = 0; - SDL_touchPads[index]->max_fingers = 0; - SDL_touchPads[index]->fingers = NULL; - + SDL_touchPads[index]->max_fingers = 1; + SDL_touchPads[index]->fingers = (SDL_Finger **) SDL_malloc(sizeof(SDL_Finger*)); + SDL_touchPads[index]->fingers[0] = NULL; SDL_touchPads[index]->buttonstate = 0; SDL_touchPads[index]->relative_mode = SDL_FALSE; SDL_touchPads[index]->flush_motion = SDL_FALSE; @@ -253,39 +253,37 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) int index; SDL_Finger **fingers; size_t length; - + //printf("Adding Finger...\n"); if (SDL_GetFingerIndexId(touch,finger->id) != -1) { SDL_SetError("Finger ID already in use"); } /* Add the touch to the list of touch */ - if(touch->num_fingers >= touch->max_fingers){ - if(fingers == NULL) { - touch->max_fingers = 1; - fingers = (SDL_Finger **) SDL_malloc(sizeof(finger)); - } - else { - fingers = (SDL_Finger **) SDL_realloc(touch->fingers, - (touch->num_fingers + 1) * sizeof(finger)); + if(touch->num_fingers >= touch->max_fingers){ + printf("Making room for it!\n"); + fingers = (SDL_Finger **) SDL_realloc(touch->fingers, + (touch->num_fingers + 1) * sizeof(SDL_Finger *)); touch->max_fingers = touch->num_fingers+1; - } - - } - - if (!fingers) { - SDL_OutOfMemory(); - return -1; + if (!fingers) { + SDL_OutOfMemory(); + return -1; + } + else { + touch->max_fingers = touch->num_fingers+1; + touch->fingers = fingers; + } } - touch->fingers = fingers; index = touch->num_fingers; - touch->num_fingers++; - touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(*(touch->fingers[index]))); + //printf("Max_Fingers: %i Index: %i\n",touch->max_fingers,index); + + touch->fingers[index] = (SDL_Finger *) SDL_malloc(sizeof(SDL_Finger)); if (!touch->fingers[index]) { SDL_OutOfMemory(); return -1; } - *touch->fingers[index] = *finger; + *(touch->fingers[index]) = *finger; + touch->num_fingers++; return index; } @@ -323,6 +321,7 @@ SDL_SendFingerDown(int id, int fingerid, SDL_bool down, int x, int y, int pressu nf.ydelta = 0; nf.last_x = x; nf.last_y = y; + nf.last_pressure = pressure; SDL_AddFinger(touch,&nf); posted = 0; @@ -383,6 +382,7 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, } else { if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/ if(y < 0) y = finger->last_y; /*The other is marked as -1*/ + if(pressure < 0) pressure = finger->last_pressure; xrel = x - finger->last_x; yrel = y - finger->last_y; } @@ -418,8 +418,8 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, touch->y = 0; } */ - finger->xdelta += xrel; - finger->ydelta += yrel; + finger->xdelta = xrel; + finger->ydelta = yrel; finger->pressure = pressure; @@ -440,6 +440,7 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, } finger->last_x = finger->x; finger->last_y = finger->y; + finger->last_pressure = finger->pressure; return posted; } } diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h index eb2a0cbbb..1c61bc948 100644 --- a/src/events/SDL_touch_c.h +++ b/src/events/SDL_touch_c.h @@ -20,52 +20,11 @@ slouken@libsdl.org */ #include "SDL_config.h" +#include "../../include/SDL_touch.h" #ifndef _SDL_touch_c_h #define _SDL_touch_c_h -typedef struct SDL_Touch SDL_Touch; -typedef struct SDL_Finger SDL_Finger; - -struct SDL_Finger { - int id; - int x; - int y; - int z; /* for future use */ - int xdelta; - int ydelta; - int last_x, last_y; /* the last reported x and y coordinates */ - int pressure; -}; - - -struct SDL_Touch -{ - - /* Free the touch when it's time */ - void (*FreeTouch) (SDL_Touch * touch); - - /* data common for tablets */ - int pressure_max; - int pressure_min; - int tilt; /* for future use */ - int rotation; /* for future use */ - - /* Data common to all touch */ - int id; - SDL_Window *focus; - - char *name; - Uint8 buttonstate; - SDL_bool relative_mode; - SDL_bool flush_motion; - - int num_fingers; - int max_fingers; - SDL_Finger** fingers; - - void *driverdata; -}; /* Initialize the touch subsystem */ diff --git a/src/video/x11/SDL_eventtouch.c b/src/video/x11/SDL_eventtouch.c index 691169e56..1c74779b3 100644 --- a/src/video/x11/SDL_eventtouch.c +++ b/src/video/x11/SDL_eventtouch.c @@ -53,7 +53,9 @@ X11_InitTouch(_THIS) touch.pressure_max = 0; touch.pressure_min = 0; touch.id = event; - + + + touch.driverdata = SDL_malloc(sizeof(EventTouchData)); @@ -64,6 +66,24 @@ X11_InitTouch(_THIS) O_RDONLY | O_NONBLOCK); ioctl (data->eventStream, EVIOCGNAME (sizeof (tstr)), tstr); printf ("Reading From : %s\n", tstr); + + + + int abs[5]; + ioctl(data->eventStream,EVIOCGABS(0),abs); + touch.x_min = abs[1]; + touch.x_max = abs[2]; + touch.xres = touch.x_max - touch.x_min; + ioctl(data->eventStream,EVIOCGABS(ABS_Y),abs); + touch.y_min = abs[1]; + touch.y_max = abs[2]; + touch.yres = touch.y_max - touch.y_min; + ioctl(data->eventStream,EVIOCGABS(ABS_PRESSURE),abs); + touch.pressure_min = abs[1]; + touch.pressure_max = abs[2]; + touch.pressureres = touch.pressure_max - touch.pressure_min; + + SDL_AddTouch(&touch, tstr); } diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index 8c5ec04c8..85db7725f 100644 --- a/src/video/x11/SDL_x11events.c +++ b/src/video/x11/SDL_x11events.c @@ -449,6 +449,7 @@ X11_PumpEvents(_THIS) break; case ABS_PRESSURE: data->pressure = ev[i].value; + if(data->pressure < 0) data->pressure = 0; break; case ABS_MISC: data->up = SDL_TRUE; @@ -461,7 +462,7 @@ X11_PumpEvents(_THIS) data->finger = ev[i].value; break; case EV_SYN: - printf("Id: %i\n",touch->id); + //printf("Id: %i\n",touch->id); if(data->x >= 0 || data->y >= 0) SDL_SendTouchMotion(touch->id,data->finger, SDL_FALSE,data->x,data->y, diff --git a/touchTest/parseDevicesTest.c b/touchTest/parseDevicesTest.c index 85d4ffef3..28ef82e06 100644 --- a/touchTest/parseDevicesTest.c +++ b/touchTest/parseDevicesTest.c @@ -1,6 +1,7 @@ #include #include #include +#include int main(int agrc,char **argv) @@ -22,7 +23,23 @@ int main(int agrc,char **argv) sprintf(tstr,"/dev/input/event%i",event); printf("At location: %s\n",tstr); + int inFile = open(tstr,O_RDONLY); + unsigned long bits[4]; + int abs[5]; + ioctl(inFile,EVIOCGABS(ABS_X),abs); + int minx,maxx,miny,maxy,minp,maxp; + minx = abs[1]; + maxx = abs[2]; + ioctl(inFile,EVIOCGABS(ABS_Y),abs); + miny = abs[1]; + maxy = abs[2]; + ioctl(inFile,EVIOCGABS(ABS_PRESSURE),abs); + minp = abs[1]; + maxp = abs[2]; + + + close(inFile); } vendor = -1; product = -1; diff --git a/touchTest/touchTest.c b/touchTest/touchTest.c index f169c3574..b77a00e5c 100644 --- a/touchTest/touchTest.c +++ b/touchTest/touchTest.c @@ -1,7 +1,7 @@ #include #include #include -#include "../src/events/SDL_touch_c.h" //BAD!!! +#include #define PI 3.1415926535897 #define WIDTH 640 @@ -19,12 +19,12 @@ int bstatus; typedef struct { - int x,y; + float x,y; } Point; typedef struct { Point p; - int pressure; + float pressure; } Finger; @@ -32,7 +32,7 @@ Finger finger[MAXFINGERS]; void handler (int sig) { - printf ("\nexiting...(%d)\n", sig); + printf ("\exiting...(%d)\n", sig); exit (0); } @@ -61,8 +61,17 @@ void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) { float a; - for(a=0;a 0) { //r<0 ==> unfilled circle + for(tx=x-r*cos(a);tx= 0 && finger[i].p.y >= 0) - drawCircle(screen,finger[i].p.x,finger[i].p.y,20,0xFF6600-finger[i].pressure); + if(finger[i].pressure > 0) + drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h + ,20,0xFF*finger[i].pressure); + else + drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h + ,20,0xFF); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); @@ -162,14 +176,28 @@ int main(int argc, char* argv[]) bstatus &= ~(1<<(event.button.button-1)); break; case SDL_FINGERMOTION: - + ; //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, // event.tfinger.x,event.tfinger.y); - finger[event.tfinger.fingerId].p.x = event.tfinger.x; - finger[event.tfinger.fingerId].p.y = event.tfinger.y; - finger[event.tfinger.fingerId].pressure = event.tfinger.pressure; - printf("Finger: %i, pressure: %i\n",event.tfinger.fingerId, - event.tfinger.pressure); + SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId); + SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); + + finger[event.tfinger.fingerId].p.x = ((float)event.tfinger.x)/ + inTouch->xres; + finger[event.tfinger.fingerId].p.y = ((float)event.tfinger.y)/ + inTouch->yres; + + finger[event.tfinger.fingerId].pressure = + ((float)event.tfinger.pressure)/inTouch->pressureres; + + printf("Finger: %i, Pressure: %f Pressureres: %i\n", + event.tfinger.fingerId, + finger[event.tfinger.fingerId].pressure, + inTouch->pressureres); + //printf("Finger: %i, pressure: %f\n",event.tfinger.fingerId, + // finger[event.tfinger.fingerId].pressure); + + break; case SDL_FINGERDOWN: printf("Figner: %i down - x: %i, y: %i\n",event.tfinger.fingerId, From 181aedae38682b63a7a1cb015fb065b02476ff96 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Wed, 2 Jun 2010 09:01:37 +0530 Subject: [PATCH 031/272] Fix the rendering color channels to be premultiplied with the alpha channel as thats what Xrender expects. Small fixes in X11_CreateTexture. Add some new functions in SDL_x11sym.h as well as support for Xrender. --- src/video/x11/SDL_x11dyn.h | 2 +- src/video/x11/SDL_x11render.c | 137 +++++++++++++++++++++------------- src/video/x11/SDL_x11sym.h | 11 +++ src/video/x11/SDL_x11video.h | 3 +- 4 files changed, 98 insertions(+), 55 deletions(-) diff --git a/src/video/x11/SDL_x11dyn.h b/src/video/x11/SDL_x11dyn.h index c06a2d6fe..f8b3114fd 100644 --- a/src/video/x11/SDL_x11dyn.h +++ b/src/video/x11/SDL_x11dyn.h @@ -53,7 +53,7 @@ #endif #if SDL_VIDEO_DRIVER_X11_XRENDER -#include +#include #endif /* diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 184f7479a..019845e12 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -473,7 +473,13 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) XShmCreateImage(renderdata->display, renderdata->visual, renderdata->depth, ZPixmap, shminfo->shmaddr, shminfo, texture->w, texture->h); - if (!data->image) { + + // This Pixmap is used by Xrender + data->pixmap = + XShmCreatePixmap(renderdata->display, renderdata->xwindow, shminfo->shmaddr, + shminfo, texture->w, texture->h, renderdata->depth); + + if (!(data->pixmap && data->image)) { XShmDetach(renderdata->display, shminfo); XSync(renderdata->display, False); shmdt(shminfo->shmaddr); @@ -486,6 +492,14 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) if (!data->image) #endif /* not NO_SHARED_MEMORY */ { + /* This is the case where the server does not have + shared memory support and the texture is streaming. + It does not make sense to use Xrender here because + we would have to copy the data onto a server side + pixmap with XPutImage first and only then can we + use Xrender + */ + data->pixels = SDL_malloc(texture->h * data->pitch); if (!data->pixels) { X11_DestroyTexture(renderer, texture); @@ -505,7 +519,8 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) return -1; } } - } else { + } + else { data->pixmap = XCreatePixmap(renderdata->display, renderdata->xwindow, texture->w, texture->h, renderdata->depth); @@ -514,53 +529,11 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) SDL_SetError("XCreatePixmap() failed"); return -1; } - -#ifdef SDL_VIDEO_DRIVER_X11_XRENDER - if(renderdata->xrender_available) { - data->xrender_available = SDL_TRUE; - unsigned long x11_fmt_mask; // Format mask - XRenderPictFormat x11_templ_fmt; // Format template - x11_fmt_mask = - (PictFormatDepth | PictFormatRedMask | PictFormatGreenMask - | PictFormatBlueMask); - Uint32 Rmask, Gmask, Bmask, Amask; - int bpp; - SDL_PixelFormatEnumToMasks(data->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); - x11_templ_fmt.depth = bpp; - x11_templ_fmt.direct.redMask = Rmask; - x11_templ_fmt.direct.greenMask = Gmask; - x11_templ_fmt.direct.blueMask = Bmask; - x11_templ_fmt.direct.alphaMask = Amask; - /* Return one matching XRenderPictFormat */ - data->picture_fmt = - XRenderFindFormat(renderdata->display, x11_fmt_mask, &x11_templ_fmt, 1); - if(!data->picture_fmt) { - data->xrender_available = SDL_FALSE; - } - data->picture_attr_valuemask = CPGraphicsExposure; - (data->picture_attr).graphics_exposures = False; - data->picture = - XRenderCreatePicture(renderdata->display, data->pixmap, data->picture_fmt, - data->picture_attr_valuemask, &(data->picture_attr)); - if(!data->picture) { - data->xrender_available = SDL_FALSE; - } - } - /* We thought we could render the texture with Xrender but this was - not possible for some reason. Now we must ensure that texture - format and window format match to avoid a BadMatch error. - */ - if(data->xrender_available == SDL_FALSE) { - if (texture->format != display->current_mode.format) { - SDL_SetError("Texture format doesn't match window format"); - return -1; - } - } -#endif data->image = XCreateImage(renderdata->display, renderdata->visual, - renderdata->depth, ZPixmap, 0, NULL, texture->w, - texture->h, SDL_BYTESPERPIXEL(data->format) * 8, + renderdata->depth, ZPixmap, 0, NULL, + texture->w, texture->h, + SDL_BYTESPERPIXEL(data->format) * 8, data->pitch); if (!data->image) { X11_DestroyTexture(renderer, texture); @@ -568,7 +541,48 @@ X11_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) return -1; } } - +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + if(renderdata->xrender_available && data->pixmap) { + data->xrender_available = SDL_TRUE; + unsigned long x11_fmt_mask; // Format mask + XRenderPictFormat x11_templ_fmt; // Format template + x11_fmt_mask = + (PictFormatDepth | PictFormatRedMask | PictFormatGreenMask + | PictFormatBlueMask); + Uint32 Rmask, Gmask, Bmask, Amask; + int bpp; + SDL_PixelFormatEnumToMasks(data->format, &bpp, &Rmask, &Gmask, &Bmask, &Amask); + x11_templ_fmt.depth = bpp; + x11_templ_fmt.direct.redMask = Rmask; + x11_templ_fmt.direct.greenMask = Gmask; + x11_templ_fmt.direct.blueMask = Bmask; + x11_templ_fmt.direct.alphaMask = Amask; + /* Return one matching XRenderPictFormat */ + data->picture_fmt = + XRenderFindFormat(renderdata->display, x11_fmt_mask, &x11_templ_fmt, 1); + if(!data->picture_fmt) { + data->xrender_available = SDL_FALSE; + } + data->picture_attr_valuemask = CPGraphicsExposure; + (data->picture_attr).graphics_exposures = False; + data->picture = + XRenderCreatePicture(renderdata->display, data->pixmap, data->picture_fmt, + data->picture_attr_valuemask, &(data->picture_attr)); + if(!data->picture) { + data->xrender_available = SDL_FALSE; + } + } + /* We thought we could render the texture with Xrender but this was + not possible for some reason. Now we must ensure that texture + format and window format match to avoid a BadMatch error. + */ + if(data->xrender_available == SDL_FALSE) { + if (texture->format != display->current_mode.format) { + SDL_SetError("Texture format doesn't match window format"); + return -1; + } + } +#endif return 0; } @@ -638,6 +652,7 @@ X11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, X11_RenderData *renderdata = (X11_RenderData *) renderer->driverdata; if (data->pixels) { + // If we have already allocated memory or were given memory by XShm Uint8 *src, *dst; int row; size_t length; @@ -652,6 +667,23 @@ X11_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, src += pitch; dst += data->pitch; } + /* If this is a static texture we would use Xrender for it + but this requires that the server side Pixmap associated + with this texture be updated with the data as well and + that the pixmap is not a shared memory pixmap. + Hopefully the user will not update static textures so + frequently as to cause a slowdown. + */ + if (texture->access == SDL_TEXTUREACCESS_STATIC) { +#ifndef NO_SHARED_MEMORY + if(!data->shminfo.shmaddr) +#endif + { + XPutImage(renderdata->display, data->pixmap, renderdata->gc, + data->image, 0, 0, rect->x, rect->y, rect->w, rect->h); + } + } + } else { data->image->width = rect->w; data->image->height = rect->h; @@ -1001,10 +1033,11 @@ X11_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) if(data->xrender_available == SDL_TRUE) { XRenderColor xrender_foreground_color; - xrender_foreground_color.red = (unsigned short) ((renderer->r / 255.0) * 0xFFFF); - xrender_foreground_color.green = (unsigned short) ((renderer->g / 255.0) * 0xFFFF); - xrender_foreground_color.blue = (unsigned short) ((renderer->b / 255.0) * 0xFFFF); - xrender_foreground_color.alpha = (unsigned short) ((renderer->a / 255.0) * 0xFFFF); + // Premultiply the color channels as well as modulate them to a 16 bit color space + xrender_foreground_color.red = ((unsigned short)renderer->r + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_foreground_color.green = ((unsigned short)renderer->g + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_foreground_color.blue = ((unsigned short)renderer->b + 1) * ((unsigned short)renderer->a + 1) - 1; + xrender_foreground_color.alpha = ((unsigned short)renderer->a + 1) * ((unsigned short)renderer->a + 1) - 1; XRenderFillRectangles(data->display, PictOpSrc, data->drawable_pict, &xrender_foreground_color, xrects, xcount); } diff --git a/src/video/x11/SDL_x11sym.h b/src/video/x11/SDL_x11sym.h index 0cdcfe8dc..d01503eec 100644 --- a/src/video/x11/SDL_x11sym.h +++ b/src/video/x11/SDL_x11sym.h @@ -177,6 +177,7 @@ SDL_X11_SYM(Status,XShmAttach,(Display* a,XShmSegmentInfo* b),(a,b),return) SDL_X11_SYM(Status,XShmDetach,(Display* a,XShmSegmentInfo* b),(a,b),return) SDL_X11_SYM(Status,XShmPutImage,(Display* a,Drawable b,GC c,XImage* d,int e,int f,int g,int h,unsigned int i,unsigned int j,Bool k),(a,b,c,d,e,f,g,h,i,j,k),return) SDL_X11_SYM(XImage*,XShmCreateImage,(Display* a,Visual* b,unsigned int c,int d,char* e,XShmSegmentInfo* f,unsigned int g,unsigned int h),(a,b,c,d,e,f,g,h),return) +SDL_X11_SYM(Pixmap,XShmCreatePixmap,(Display *a,Drawable b,char* c,XShmSegmentInfo* d, unsigned int e, unsigned int f, unsigned int g),(a,b,c,d,e,f,g),return) SDL_X11_SYM(Bool,XShmQueryExtension,(Display* a),(a),return) #endif @@ -232,6 +233,16 @@ SDL_X11_SYM(Status,XScreenSaverQueryVersion,(Display *dpy,int *major_versionp,in SDL_X11_SYM(void,XScreenSaverSuspend,(Display *dpy,Bool suspend),(dpy,suspend),return) #endif +/* XRender support */ +#if SDL_VIDEO_DRIVER_X11_XRENDER +SDL_X11_MODULE(XRENDER) +SDL_X11_SYM(Bool,XRenderQueryExtension,(Display *dpy,int *event_base,int *error_base),(dpy,event_base,error_base),return) +SDL_X11_SYM(XRenderPictFormat*,XRenderFindVisualFormat,(Display *dpy,_Xconst Visual *visual),(dpy,visual),return) +SDL_X11_SYM(XRenderPictFormat*,XRenderFindFormat,(Display *dpy,unsigned long mask,_Xconst XRenderPictFormat* templ,int count),(dpy,mask,templ,count),return) +SDL_X11_SYM(Picture,XRenderCreatePicture,(Display *dpy,Drawable drawable,_Xconst XRenderPictFormat* format,unsigned long valuemask,_Xconst XRenderPictureAttributes* attributes),(dpy,drawable,format,valuemask,attributes),return) +SDL_X11_SYM(void,XRenderComposite,(Display *dpy,int op,Picture src,Picture mask,Picture dst,int src_x,int src_y,int mask_x,int mask_y,int dst_x,int dst_y,unsigned int width,unsigned int height),(dpy,op,src,mask,dst,src_x,src_y,mask_x,mask_y,dst_x,dst_y,width,height),return) +SDL_X11_SYM(void,XRenderFillRectangles,(Display *dpy,int op,Picture dst,_Xconst XRenderColor* color,_Xconst XRectangle* rectangles,int n_rects),(dpy,op,dst,color,rectangles,n_rects),return) +#endif /* *INDENT-ON* */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/x11/SDL_x11video.h b/src/video/x11/SDL_x11video.h index 6c2377376..7f5d73421 100644 --- a/src/video/x11/SDL_x11video.h +++ b/src/video/x11/SDL_x11video.h @@ -46,9 +46,8 @@ #include #endif #if SDL_VIDEO_DRIVER_X11_XRENDER -#include +#include #endif - #include "SDL_x11dyn.h" #include "SDL_x11events.h" From e4d5d55364ad2f53404bf3d4ee619e3464f51cf6 Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Wed, 2 Jun 2010 11:45:15 +0530 Subject: [PATCH 032/272] Fix X11_FillRects to work with double buffering as well as triple buffering. This requires that the buffer pixmap be cleared after every render. --- src/video/x11/SDL_x11render.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 019845e12..9a91e966f 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -290,6 +290,8 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) if(!data->pixmap_picts[i]) { data->xrender_available = SDL_FALSE; } + XRenderComposite(data->display, PictOpClear, data->pixmap_picts[i], None, data->pixmap_picts[i], + 0, 0, 0, 0, 0, 0, window->w, window->h); } #endif } @@ -374,6 +376,8 @@ X11_DisplayModeChanged(SDL_Renderer * renderer) if(!data->pixmap_picts[i]) { data->xrender_available = SDL_FALSE; } + XRenderComposite(data->display, PictOpClear, data->pixmap_picts[i], None, data->pixmap_picts[i], + 0, 0, 0, 0, 0, 0, window->w, window->h); } #endif } @@ -735,6 +739,13 @@ X11_SetDrawBlendMode(SDL_Renderer * renderer) switch (renderer->blendMode) { case SDL_BLENDMODE_NONE: return 0; +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + case SDL_BLENDMODE_MASK: // Use src pict as mask + case SDL_BLENDMODE_ADD: // PictOpAdd + case SDL_BLENDMODE_BLEND: // PictOpOver + /* FIXME case SDL_BLENDMODE_MOD: */ +#endif + return 0; default: SDL_Unsupported(); renderer->blendMode = SDL_BLENDMODE_NONE; @@ -1038,7 +1049,7 @@ X11_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) xrender_foreground_color.green = ((unsigned short)renderer->g + 1) * ((unsigned short)renderer->a + 1) - 1; xrender_foreground_color.blue = ((unsigned short)renderer->b + 1) * ((unsigned short)renderer->a + 1) - 1; xrender_foreground_color.alpha = ((unsigned short)renderer->a + 1) * ((unsigned short)renderer->a + 1) - 1; - XRenderFillRectangles(data->display, PictOpSrc, data->drawable_pict, + XRenderFillRectangles(data->display, PictOpOver, data->drawable_pict, &xrender_foreground_color, xrects, xcount); } else @@ -1241,7 +1252,7 @@ X11_RenderPresent(SDL_Renderer * renderer) #ifdef SDL_VIDEO_DRIVER_X11_XRENDER if(data->xrender_available == SDL_TRUE) { - XRenderComposite(data->display, PictOpSrc, data->drawable_pict, None, data->xwindow_pict, + XRenderComposite(data->display, PictOpOver, data->drawable_pict, None, data->xwindow_pict, rect->x, rect->y, 0, 0, rect->x, rect->y, rect->w, rect->h); } else @@ -1253,6 +1264,13 @@ X11_RenderPresent(SDL_Renderer * renderer) } } SDL_ClearDirtyRects(&data->dirty); +#ifdef SDL_VIDEO_DRIVER_X11_XRENDER + // Clear each pixmap after a render + if(data->xrender_available == SDL_TRUE) { + XRenderComposite(data->display, PictOpClear, data->drawable_pict, None, data->drawable_pict, + 0, 0, 0, 0, 0, 0, renderer->window->w, renderer->window->h); + } +#endif } XSync(data->display, False); From d3ed0db8db6bc3f6ee45538a7e105ec359c5856b Mon Sep 17 00:00:00 2001 From: Sunny Sachanandani Date: Wed, 2 Jun 2010 11:55:40 +0530 Subject: [PATCH 033/272] It seems that the off-screen buffers (or pixmaps) only need to be cleared while initializing. --- src/video/x11/SDL_x11render.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 9a91e966f..5af377882 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -1264,13 +1264,13 @@ X11_RenderPresent(SDL_Renderer * renderer) } } SDL_ClearDirtyRects(&data->dirty); -#ifdef SDL_VIDEO_DRIVER_X11_XRENDER +/*#ifdef SDL_VIDEO_DRIVER_X11_XRENDER // Clear each pixmap after a render if(data->xrender_available == SDL_TRUE) { XRenderComposite(data->display, PictOpClear, data->drawable_pict, None, data->drawable_pict, 0, 0, 0, 0, 0, 0, renderer->window->w, renderer->window->h); } -#endif +#endif*/ } XSync(data->display, False); From edc978692d262921691ae733ca2a12c5005fe1a4 Mon Sep 17 00:00:00 2001 From: jimtla Date: Thu, 3 Jun 2010 11:08:17 -0400 Subject: [PATCH 034/272] Fixed some windows compilation bugs - Still does not compile. --- VisualC/SDL.sln | 4 ++-- VisualC/SDL/SDL.vcproj | 21 ++++++++++++++------- VisualC/SDLmain/SDLmain.vcproj | 9 +++++---- src/events/SDL_touch_c.h | 7 +++++-- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/VisualC/SDL.sln b/VisualC/SDL.sln index 83ea90b3b..9a200bf60 100644 --- a/VisualC/SDL.sln +++ b/VisualC/SDL.sln @@ -1,5 +1,5 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDL", "SDL\SDL.vcproj", "{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SDLmain", "SDLmain\SDLmain.vcproj", "{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}" diff --git a/VisualC/SDL/SDL.vcproj b/VisualC/SDL/SDL.vcproj index 9ae52b1ea..a9d71d732 100644 --- a/VisualC/SDL/SDL.vcproj +++ b/VisualC/SDL/SDL.vcproj @@ -1,10 +1,11 @@ @@ -106,9 +109,6 @@ - @@ -185,6 +185,8 @@ IgnoreAllDefaultLibraries="true" ProgramDatabaseFile=".\Release/SDL.pdb" SubSystem="2" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" ImportLibrary=".\Release/SDL.lib" /> - @@ -928,6 +927,14 @@ RelativePath="..\..\src\timer\SDL_timer_c.h" > + + + + diff --git a/VisualC/SDLmain/SDLmain.vcproj b/VisualC/SDLmain/SDLmain.vcproj index 8c6a95dc4..16c191458 100644 --- a/VisualC/SDLmain/SDLmain.vcproj +++ b/VisualC/SDLmain/SDLmain.vcproj @@ -1,9 +1,10 @@ Date: Thu, 3 Jun 2010 13:21:35 -0400 Subject: [PATCH 035/272] Fixed windo build errors. Should now be compilable. --- src/events/SDL_touch.c | 178 +++++++++++++++++++-------------------- src/events/SDL_touch_c.h | 2 +- 2 files changed, 90 insertions(+), 90 deletions(-) diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 571d3d4af..1d24524a5 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -27,6 +27,8 @@ #include "SDL_events_c.h" #include "../video/SDL_sysvideo.h" +#include + static int SDL_num_touch = 0; static SDL_Touch **SDL_touchPads = NULL; @@ -99,9 +101,7 @@ int SDL_AddTouch(const SDL_Touch * touch, char *name) { SDL_Touch **touchPads; - int selected_touch; - int index; - size_t length; + int index,length; if (SDL_GetTouchIndexId(touch->id) != -1) { SDL_SetError("Touch ID already in use"); @@ -252,7 +252,6 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) { int index; SDL_Finger **fingers; - size_t length; //printf("Adding Finger...\n"); if (SDL_GetFingerIndexId(touch,finger->id) != -1) { SDL_SetError("Finger ID already in use"); @@ -260,19 +259,18 @@ SDL_AddFinger(SDL_Touch* touch,SDL_Finger* finger) /* Add the touch to the list of touch */ if(touch->num_fingers >= touch->max_fingers){ - printf("Making room for it!\n"); - fingers = (SDL_Finger **) SDL_realloc(touch->fingers, - (touch->num_fingers + 1) * sizeof(SDL_Finger *)); - touch->max_fingers = touch->num_fingers+1; - if (!fingers) { - SDL_OutOfMemory(); - return -1; - } - else { - touch->max_fingers = touch->num_fingers+1; - touch->fingers = fingers; + //printf("Making room for it!\n"); + fingers = (SDL_Finger **) SDL_realloc(touch->fingers, + (touch->num_fingers + 1) * sizeof(SDL_Finger *)); + touch->max_fingers = touch->num_fingers+1; + if (!fingers) { + SDL_OutOfMemory(); + return -1; + } else { + touch->max_fingers = touch->num_fingers+1; + touch->fingers = fingers; + } } - } index = touch->num_fingers; //printf("Max_Fingers: %i Index: %i\n",touch->max_fingers,index); @@ -295,13 +293,14 @@ SDL_DelFinger(SDL_Touch* touch,int fingerid) SDL_Finger* finger = SDL_GetFinger(touch,fingerid); if (!finger) { - return; + return -1; } SDL_free(finger); touch->num_fingers--; touch->fingers[index] = touch->fingers[touch->num_fingers]; + return 0; } @@ -370,79 +369,80 @@ SDL_SendTouchMotion(int id, int fingerid, int relative, return 0; } - if(finger == NULL) - SDL_SendFingerDown(id,fingerid,SDL_TRUE,x,y,pressure); - else { - /* the relative motion is calculated regarding the last position */ - if (relative) { - xrel = x; - yrel = y; - x = (finger->last_x + x); - y = (finger->last_y + y); + if(finger == NULL) { + SDL_SendFingerDown(id,fingerid,SDL_TRUE,x,y,pressure); + return 0; } else { - if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/ - if(y < 0) y = finger->last_y; /*The other is marked as -1*/ - if(pressure < 0) pressure = finger->last_pressure; - xrel = x - finger->last_x; - yrel = y - finger->last_y; - } - - /* Drop events that don't change state */ - if (!xrel && !yrel) { -#if 0 - printf("Touch event didn't change state - dropped!\n"); -#endif - return 0; - } - - /* Update internal touch coordinates */ - - finger->x = x; - finger->y = y; - - /*Should scale to window? Normalize? Maintain Aspect?*/ - //SDL_GetWindowSize(touch->focus, &x_max, &y_max); - - /* make sure that the pointers find themselves inside the windows */ - /* only check if touch->xmax is set ! */ - /* - if (x_max && touch->x > x_max) { - touch->x = x_max; - } else if (touch->x < 0) { - touch->x = 0; - } - - if (y_max && touch->y > y_max) { - touch->y = y_max; - } else if (touch->y < 0) { - touch->y = 0; - } - */ - finger->xdelta = xrel; - finger->ydelta = yrel; - finger->pressure = pressure; - - - - /* Post the event, if desired */ - posted = 0; - if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { - SDL_Event event; - event.tfinger.type = SDL_FINGERMOTION; - event.tfinger.touchId = (Uint8) id; - event.tfinger.fingerId = (Uint8) fingerid; - event.tfinger.x = x; - event.tfinger.y = y; - event.tfinger.pressure = pressure; - event.tfinger.state = touch->buttonstate; - event.tfinger.windowID = touch->focus ? touch->focus->id : 0; - posted = (SDL_PushEvent(&event) > 0); + /* the relative motion is calculated regarding the last position */ + if (relative) { + xrel = x; + yrel = y; + x = (finger->last_x + x); + y = (finger->last_y + y); + } else { + if(x < 0) x = finger->last_x; /*If movement is only in one axis,*/ + if(y < 0) y = finger->last_y; /*The other is marked as -1*/ + if(pressure < 0) pressure = finger->last_pressure; + xrel = x - finger->last_x; + yrel = y - finger->last_y; + } + + /* Drop events that don't change state */ + if (!xrel && !yrel) { + #if 0 + printf("Touch event didn't change state - dropped!\n"); + #endif + return 0; + } + + /* Update internal touch coordinates */ + + finger->x = x; + finger->y = y; + + /*Should scale to window? Normalize? Maintain Aspect?*/ + //SDL_GetWindowSize(touch->focus, &x_max, &y_max); + + /* make sure that the pointers find themselves inside the windows */ + /* only check if touch->xmax is set ! */ + /* + if (x_max && touch->x > x_max) { + touch->x = x_max; + } else if (touch->x < 0) { + touch->x = 0; + } + + if (y_max && touch->y > y_max) { + touch->y = y_max; + } else if (touch->y < 0) { + touch->y = 0; + } + */ + finger->xdelta = xrel; + finger->ydelta = yrel; + finger->pressure = pressure; + + + + /* Post the event, if desired */ + posted = 0; + if (SDL_GetEventState(SDL_FINGERMOTION) == SDL_ENABLE) { + SDL_Event event; + event.tfinger.type = SDL_FINGERMOTION; + event.tfinger.touchId = (Uint8) id; + event.tfinger.fingerId = (Uint8) fingerid; + event.tfinger.x = x; + event.tfinger.y = y; + event.tfinger.pressure = pressure; + event.tfinger.state = touch->buttonstate; + event.tfinger.windowID = touch->focus ? touch->focus->id : 0; + posted = (SDL_PushEvent(&event) > 0); + } + finger->last_x = finger->x; + finger->last_y = finger->y; + finger->last_pressure = finger->pressure; + return posted; } - finger->last_x = finger->x; - finger->last_y = finger->y; - finger->last_pressure = finger->pressure; - return posted; - } } int SDL_SendTouchButton(int id, Uint8 state, Uint8 button) @@ -483,7 +483,7 @@ SDL_SendTouchButton(int id, Uint8 state, Uint8 button) if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; - event.tbutton.touchId = (Uint8) index; + event.tbutton.touchId = (Uint8) touch->id; event.tbutton.state = state; event.tbutton.button = button; event.tbutton.windowID = touch->focus ? touch->focus->id : 0; diff --git a/src/events/SDL_touch_c.h b/src/events/SDL_touch_c.h index 84d94a05d..f69b1bab7 100644 --- a/src/events/SDL_touch_c.h +++ b/src/events/SDL_touch_c.h @@ -65,7 +65,7 @@ extern int SDL_SendTouchButton(int id, Uint8 state, Uint8 button); extern void SDL_TouchQuit(void); /* Get the index of a touch device */ -extern int SDL_GetTouchIndexId(int id) +extern int SDL_GetTouchIndexId(int id); From 0fe728087d80c03144a439a50e09f023576d933f Mon Sep 17 00:00:00 2001 From: jimtla Date: Sat, 5 Jun 2010 01:58:56 -0400 Subject: [PATCH 036/272] Addition of VC project for touchTest.c --- include/SDL_touch.h | 9 +- touchTest/touchTest.c | 24 ++- touchTest/touchTest2/touchTest2.ncb | Bin 0 -> 1027072 bytes touchTest/touchTest2/touchTest2.sln | 20 ++ touchTest/touchTest2/touchTest2.suo | Bin 0 -> 10240 bytes touchTest/touchTest2/touchTest2/SDL.dll | Bin 0 -> 1126912 bytes .../touchTest2/touchTest2/touchTest2.vcproj | 186 ++++++++++++++++++ ...uchTest2.vcproj.jgran-virtualPC.jgran.user | 65 ++++++ 8 files changed, 290 insertions(+), 14 deletions(-) create mode 100644 touchTest/touchTest2/touchTest2.ncb create mode 100644 touchTest/touchTest2/touchTest2.sln create mode 100644 touchTest/touchTest2/touchTest2.suo create mode 100644 touchTest/touchTest2/touchTest2/SDL.dll create mode 100644 touchTest/touchTest2/touchTest2/touchTest2.vcproj create mode 100644 touchTest/touchTest2/touchTest2/touchTest2.vcproj.jgran-virtualPC.jgran.user diff --git a/include/SDL_touch.h b/include/SDL_touch.h index 359748ccb..a8bff29a7 100644 --- a/include/SDL_touch.h +++ b/include/SDL_touch.h @@ -41,8 +41,6 @@ extern "C" { /* *INDENT-ON* */ #endif -typedef struct SDL_Touch SDL_Touch; -typedef struct SDL_Finger SDL_Finger; struct SDL_Finger { int id; @@ -55,9 +53,11 @@ struct SDL_Finger { int pressure; }; +typedef struct SDL_Touch SDL_Touch; +typedef struct SDL_Finger SDL_Finger; + -struct SDL_Touch -{ +struct SDL_Touch { /* Free the touch when it's time */ void (*FreeTouch) (SDL_Touch * touch); @@ -87,6 +87,7 @@ struct SDL_Touch }; + /* Function prototypes */ /** diff --git a/touchTest/touchTest.c b/touchTest/touchTest.c index b77a00e5c..66646af4f 100644 --- a/touchTest/touchTest.c +++ b/touchTest/touchTest.c @@ -3,6 +3,8 @@ #include #include + + #define PI 3.1415926535897 #define WIDTH 640 #define HEIGHT 480 @@ -32,7 +34,7 @@ Finger finger[MAXFINGERS]; void handler (int sig) { - printf ("\exiting...(%d)\n", sig); + printf ("exiting...(%d)\n", sig); exit (0); } @@ -81,7 +83,7 @@ void drawCircle(SDL_Surface* screen,int x,int y,int r,int c) void DrawScreen(SDL_Surface* screen, int h) { - int x, y, xm,ym,c; + int x, y, xm,ym,c,i; if(SDL_MUSTLOCK(screen)) { if(SDL_LockSurface(screen) < 0) return; @@ -98,9 +100,10 @@ void DrawScreen(SDL_Surface* screen, int h) setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); } } + drawCircle(screen,mousx,mousy,-30,0xFFFFFF); - int i; + for(i=0;i= 0 && finger[i].p.y >= 0) if(finger[i].pressure > 0) @@ -131,8 +134,8 @@ int main(int argc, char* argv[]) memset(keystat,0,512*sizeof(keystat[0])); if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; - - if (!(screen = initScreen(WIDTH,HEIGHT))) + screen = initScreen(WIDTH,HEIGHT); + if (!screen) { SDL_Quit(); return 1; @@ -179,21 +182,22 @@ int main(int argc, char* argv[]) ; //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, // event.tfinger.x,event.tfinger.y); - SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId); - SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); - + //SDL_Touch *inTouch = SDL_GetTouch(event.tfinger.touchId); + //SDL_Finger *inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); + /* finger[event.tfinger.fingerId].p.x = ((float)event.tfinger.x)/ inTouch->xres; finger[event.tfinger.fingerId].p.y = ((float)event.tfinger.y)/ inTouch->yres; finger[event.tfinger.fingerId].pressure = - ((float)event.tfinger.pressure)/inTouch->pressureres; - + ((float)event.tfinger.pressure)/inTouch->pressureres;*/ + /* printf("Finger: %i, Pressure: %f Pressureres: %i\n", event.tfinger.fingerId, finger[event.tfinger.fingerId].pressure, inTouch->pressureres); + */ //printf("Finger: %i, pressure: %f\n",event.tfinger.fingerId, // finger[event.tfinger.fingerId].pressure); diff --git a/touchTest/touchTest2/touchTest2.ncb b/touchTest/touchTest2/touchTest2.ncb new file mode 100644 index 0000000000000000000000000000000000000000..284832a93d2e7888b6a21f501829bdd68a5bbe19 GIT binary patch literal 1027072 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

^@Q)ZdFk0{#GcKt=x}hT{?jABE9Lony;v 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

)|Mi*nSF~WG?m~JdFmK$r0?M6~&^iwjM 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

&En3+N?>s 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 literal 0 HcmV?d00001 diff --git a/touchTest/touchTest2/touchTest2/SDL.dll b/touchTest/touchTest2/touchTest2/SDL.dll new file mode 100644 index 0000000000000000000000000000000000000000..73ca7fdd1ad99097d304f61a6c96108dfc9af1db GIT binary patch literal 1126912 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

uKCLO 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%0D*b&{dcu$NHI9Pmv*6E~ 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