Mercurial > sdl-ios-xcode
changeset 4429:faa9fc8e7f67
General improvements for user custom event registration
* Switched event type to enum (int32)
* Switched polling by mask to polling by type range
* Added SDL_RegisterEvents() to allow dynamic user event registration
* Spread events out to allow inserting new related events without breaking binary compatibility
* Added padding to event structures so they're the same size regardless of 32-bit compiler structure packing settings
* Split SDL_HasEvent() to SDL_HasEvent() for a single event and SDL_HasEvents() for a range of events
* Added SDL_GetEventState() as a shortcut for SDL_EventState(X, SDL_QUERY)
* Added SDL_FlushEvent() and SDL_FlushEvents() to clear events from the event queue
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 25 Mar 2010 01:08:26 -0700 |
parents | 68dfd6df47da |
children | 77ebcd41b577 |
files | include/SDL_compat.h include/SDL_events.h src/SDL_compat.c src/events/SDL_events.c src/events/SDL_events_c.h src/events/SDL_keyboard.c src/events/SDL_mouse.c src/events/SDL_quit.c src/events/SDL_windowevents.c src/joystick/SDL_joystick.c src/video/win32/SDL_win32events.c src/video/x11/SDL_x11events.c test/threadwin.c |
diffstat | 13 files changed, 313 insertions(+), 208 deletions(-) [+] |
line wrap: on
line diff
--- a/include/SDL_compat.h Wed Mar 10 15:07:20 2010 +0000 +++ b/include/SDL_compat.h Thu Mar 25 01:08:26 2010 -0700 @@ -91,12 +91,34 @@ #define SDL_LOGPAL 0x01 #define SDL_PHYSPAL 0x02 -#define SDL_ACTIVEEVENT SDL_EVENT_RESERVED1 -#define SDL_VIDEORESIZE SDL_EVENT_RESERVED2 -#define SDL_VIDEOEXPOSE SDL_EVENT_RESERVED3 -#define SDL_ACTIVEEVENTMASK SDL_EVENTMASK(SDL_ACTIVEEVENT) -#define SDL_VIDEORESIZEMASK SDL_EVENTMASK(SDL_VIDEORESIZE) -#define SDL_VIDEOEXPOSEMASK SDL_EVENTMASK(SDL_VIDEOEXPOSE) +#define SDL_ACTIVEEVENT SDL_EVENT_COMPAT1 +#define SDL_VIDEORESIZE SDL_EVENT_COMPAT2 +#define SDL_VIDEOEXPOSE SDL_EVENT_COMPAT3 +#define SDL_ACTIVEEVENTMASK SDL_ACTIVEEVENT, SDL_ACTIVEEVENT +#define SDL_VIDEORESIZEMASK SDL_VIDEORESIZE, SDL_VIDEORESIZE +#define SDL_VIDEOEXPOSEMASK SDL_VIDEOEXPOSE, SDL_VIDEOEXPOSE +#define SDL_WINDOWEVENTMASK SDL_WINDOWEVENT, SDL_WINDOWEVENT +#define SDL_KEYDOWNMASK SDL_KEYDOWN, SDL_KEYDOWN +#define SDL_KEYUPMASK SDL_KEYUP, SDL_KEYUP +#define SDL_KEYEVENTMASK SDL_KEYDOWN, SDL_KEYUP +#define SDL_TEXTEDITINGMASK SDL_TEXTEDITING, SDL_TEXTEDITING +#define SDL_TEXTINPUTMASK SDL_TEXTINPUT, SDL_TEXTINPUT +#define SDL_MOUSEMOTIONMASK SDL_MOUSEMOTION, SDL_MOUSEMOTION +#define SDL_MOUSEBUTTONDOWNMASK SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONDOWN +#define SDL_MOUSEBUTTONUPMASK SDL_MOUSEBUTTONUP, SDL_MOUSEBUTTONUP +#define SDL_MOUSEWHEELMASK SDL_MOUSEWHEEL, SDL_MOUSEWHEEL +#define SDL_MOUSEEVENTMASK SDL_MOUSEMOTION, SDL_MOUSEBUTTONUP +#define SDL_JOYAXISMOTIONMASK SDL_JOYAXISMOTION, SDL_JOYAXISMOTION +#define SDL_JOYBALLMOTIONMASK SDL_JOYBALLMOTION, SDL_JOYBALLMOTION +#define SDL_JOYHATMOTIONMASK SDL_JOYHATMOTION, SDL_JOYHATMOTION +#define SDL_JOYBUTTONDOWNMASK SDL_JOYBUTTONDOWN, SDL_JOYBUTTONDOWN +#define SDL_JOYBUTTONUPMASK SDL_JOYBUTTONUP, SDL_JOYBUTTONUP +#define SDL_JOYEVENTMASK SDL_JOYAXISMOTION, SDL_JOYBUTTONUP +#define SDL_QUITMASK SDL_QUIT, SDL_QUIT +#define SDL_SYSWMEVENTMASK SDL_SYSWMEVENT, SDL_SYSWMEVENT +#define SDL_PROXIMITYINMASK SDL_PROXIMITYIN, SDL_PROXIMITYIN +#define SDL_PROXIMITYOUTMASK SDL_PROXIMITYOUT, SDL_PROXIMITYOUT +#define SDL_ALLEVENTS SDL_FIRSTEVENT, SDL_LASTEVENT #define SDL_BUTTON_WHEELUP 4 #define SDL_BUTTON_WHEELDOWN 5
--- a/include/SDL_events.h Wed Mar 10 15:07:20 2010 +0000 +++ b/include/SDL_events.h Thu Mar 25 01:08:26 2010 -0700 @@ -54,83 +54,67 @@ */ typedef enum { - SDL_NOEVENT = 0, /**< Unused (do not remove) */ - SDL_WINDOWEVENT, /**< Window state change */ - SDL_KEYDOWN, /**< Keys pressed */ + SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */ + + /* Application events */ + SDL_QUIT = 0x100, /**< User-requested quit */ + + /* Window events */ + SDL_WINDOWEVENT = 0x200, /**< Window state change */ + SDL_SYSWMEVENT, /**< System specific event */ + + /* Keyboard events */ + SDL_KEYDOWN = 0x300, /**< Keys pressed */ SDL_KEYUP, /**< Keys released */ SDL_TEXTEDITING, /**< Keyboard text editing (composition) */ SDL_TEXTINPUT, /**< Keyboard text input */ - SDL_MOUSEMOTION, /**< Mouse moved */ + + /* Mouse events */ + SDL_MOUSEMOTION = 0x400, /**< Mouse moved */ SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ SDL_MOUSEBUTTONUP, /**< Mouse button released */ SDL_MOUSEWHEEL, /**< Mouse wheel motion */ - SDL_JOYAXISMOTION, /**< Joystick axis motion */ + + /* Tablet events */ + SDL_PROXIMITYIN = 0x500, /**< Proximity In event */ + SDL_PROXIMITYOUT, /**< Proximity Out event */ + + /* Joystick events */ + SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */ SDL_JOYBALLMOTION, /**< Joystick trackball motion */ SDL_JOYHATMOTION, /**< Joystick hat position change */ SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ SDL_JOYBUTTONUP, /**< Joystick button released */ - SDL_QUIT, /**< User-requested quit */ - SDL_SYSWMEVENT, /**< System specific event */ - SDL_PROXIMITYIN, /**< Proximity In event */ - SDL_PROXIMITYOUT, /**< Proximity Out event */ - SDL_EVENT_RESERVED1, /**< Reserved for future use... */ - SDL_EVENT_RESERVED2, /**< Reserved for future use... */ - SDL_EVENT_RESERVED3, /**< Reserved for future use... */ - /** Events ::SDL_USEREVENT through ::SDL_MAXEVENTS-1 are for your use */ - SDL_USEREVENT = 24, + + /* 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() + */ + SDL_USEREVENT = 0x8000, + /** * This last event is only for bounding internal arrays - * It is the number of bits in the event mask datatype -- Uint32 */ - SDL_NUMEVENTS = 32 + SDL_LASTEVENT = 0xFFFF } SDL_EventType; -/*@{*/ -#define SDL_EVENTMASK(X) (1<<(X)) -/** - * \brief Predefined event masks - */ -typedef enum -{ - SDL_WINDOWEVENTMASK = SDL_EVENTMASK(SDL_WINDOWEVENT), - SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), - SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), - SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN) | SDL_EVENTMASK(SDL_KEYUP), - SDL_TEXTEDITINGMASK = SDL_EVENTMASK(SDL_TEXTEDITING), - SDL_TEXTINPUTMASK = SDL_EVENTMASK(SDL_TEXTINPUT), - SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), - SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), - SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_MOUSEWHEELMASK = SDL_EVENTMASK(SDL_MOUSEWHEEL), - SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION) | - SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN) | SDL_EVENTMASK(SDL_MOUSEBUTTONUP), - SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), - SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), - SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), - SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), - SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION) | - SDL_EVENTMASK(SDL_JOYBALLMOTION) | - SDL_EVENTMASK(SDL_JOYHATMOTION) | - SDL_EVENTMASK(SDL_JOYBUTTONDOWN) | SDL_EVENTMASK(SDL_JOYBUTTONUP), - SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), - SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT), - SDL_PROXIMITYINMASK = SDL_EVENTMASK(SDL_PROXIMITYIN), - SDL_PROXIMITYOUTMASK = SDL_EVENTMASK(SDL_PROXIMITYOUT) -} SDL_EventMask; -#define SDL_ALLEVENTS 0xFFFFFFFF -/*@}*/ - /** * \brief Window state change event data (event.window.*) */ typedef struct SDL_WindowEvent { - Uint8 type; /**< ::SDL_WINDOWEVENT */ - Uint32 windowID; /**< The associated window */ - Uint8 event; /**< ::SDL_WindowEventID */ - int data1; /**< event dependent data */ - int data2; /**< event dependent data */ + Uint32 type; /**< ::SDL_WINDOWEVENT */ + Uint32 windowID; /**< The associated window */ + Uint8 event; /**< ::SDL_WindowEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + int data1; /**< event dependent data */ + int data2; /**< event dependent data */ } SDL_WindowEvent; /** @@ -138,11 +122,13 @@ */ typedef struct SDL_KeyboardEvent { - Uint8 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 */ - SDL_keysym keysym; /**< The key that was pressed or released */ + 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; + SDL_keysym keysym; /**< The key that was pressed or released */ } SDL_KeyboardEvent; #define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32) @@ -151,7 +137,7 @@ */ typedef struct SDL_TextEditingEvent { - Uint8 type; /**< ::SDL_TEXTEDITING */ + Uint32 type; /**< ::SDL_TEXTEDITING */ 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 */ @@ -164,9 +150,12 @@ */ typedef struct SDL_TextInputEvent { - Uint8 type; /**< ::SDL_TEXTINPUT */ + 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; @@ -175,22 +164,24 @@ */ typedef struct SDL_MouseMotionEvent { - Uint8 type; /**< ::SDL_MOUSEMOTION */ - Uint32 windowID; /**< The window with mouse focus, if any */ - Uint8 which; /**< The mouse device index */ - Uint8 state; /**< The current button state */ - 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 */ + 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; + 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; /** @@ -198,13 +189,14 @@ */ typedef struct SDL_MouseButtonEvent { - Uint8 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 */ - int x; /**< X coordinate, relative to window */ - int y; /**< Y coordinate, relative to window */ + 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; + int x; /**< X coordinate, relative to window */ + int y; /**< Y coordinate, relative to window */ } SDL_MouseButtonEvent; /** @@ -212,21 +204,42 @@ */ typedef struct SDL_MouseWheelEvent { - Uint8 type; /**< ::SDL_MOUSEWHEEL */ - Uint32 windowID; /**< The window with mouse focus, if any */ - Uint8 which; /**< The mouse device index */ - int x; /**< The amount scrolled horizontally */ - int y; /**< The amount scrolled vertically */ + 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.*) */ typedef struct SDL_JoyAxisEvent { - Uint8 type; /**< ::SDL_JOYAXISMOTION */ + Uint32 type; /**< ::SDL_JOYAXISMOTION */ Uint8 which; /**< The joystick device index */ Uint8 axis; /**< The joystick axis index */ + Uint8 padding1; + Uint8 padding2; int value; /**< The axis value (range: -32768 to 32767) */ } SDL_JoyAxisEvent; @@ -235,9 +248,11 @@ */ typedef struct SDL_JoyBallEvent { - Uint8 type; /**< ::SDL_JOYBALLMOTION */ + Uint32 type; /**< ::SDL_JOYBALLMOTION */ Uint8 which; /**< The joystick device index */ Uint8 ball; /**< The joystick trackball index */ + Uint8 padding1; + Uint8 padding2; int xrel; /**< The relative motion in the X direction */ int yrel; /**< The relative motion in the Y direction */ } SDL_JoyBallEvent; @@ -247,7 +262,7 @@ */ typedef struct SDL_JoyHatEvent { - Uint8 type; /**< ::SDL_JOYHATMOTION */ + Uint32 type; /**< ::SDL_JOYHATMOTION */ Uint8 which; /**< The joystick device index */ Uint8 hat; /**< The joystick hat index */ Uint8 value; /**< The hat position value. @@ -257,6 +272,7 @@ * * Note that zero means the POV is centered. */ + Uint8 padding1; } SDL_JoyHatEvent; /** @@ -264,10 +280,11 @@ */ typedef struct SDL_JoyButtonEvent { - Uint8 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ + Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ Uint8 which; /**< The joystick device index */ Uint8 button; /**< The joystick button index */ Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; } SDL_JoyButtonEvent; /** @@ -275,7 +292,7 @@ */ typedef struct SDL_QuitEvent { - Uint8 type; /**< ::SDL_QUIT */ + Uint32 type; /**< ::SDL_QUIT */ } SDL_QuitEvent; /** @@ -283,11 +300,11 @@ */ typedef struct SDL_UserEvent { - Uint8 type; /**< ::SDL_USEREVENT through ::SDL_NUMEVENTS-1 */ - Uint32 windowID; /**< The associated window if any*/ - int code; /**< User defined event code */ - void *data1; /**< User defined data pointer */ - void *data2; /**< User defined data pointer */ + Uint32 type; /**< ::SDL_USEREVENT through ::SDL_NUMEVENTS-1 */ + Uint32 windowID; /**< The associated window if any */ + int code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ } SDL_UserEvent; struct SDL_SysWMmsg; @@ -300,20 +317,10 @@ */ typedef struct SDL_SysWMEvent { - Uint8 type; /**< ::SDL_SYSWMEVENT */ + Uint32 type; /**< ::SDL_SYSWMEVENT */ SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ } SDL_SysWMEvent; -typedef struct SDL_ProximityEvent -{ - Uint8 type; - Uint32 windowID; /**< The associated window */ - Uint8 which; - int cursor; - int x; - int y; -} SDL_ProximityEvent; - #ifndef SDL_NO_COMPAT /** * \addtogroup Compatibility @@ -326,14 +333,14 @@ /*@{*/ typedef struct SDL_ActiveEvent { - Uint8 type; + Uint32 type; Uint8 gain; Uint8 state; } SDL_ActiveEvent; typedef struct SDL_ResizeEvent { - Uint8 type; + Uint32 type; int w; int h; } SDL_ResizeEvent; @@ -347,7 +354,7 @@ */ typedef union SDL_Event { - Uint8 type; /**< Event type, shared with all events */ + Uint32 type; /**< Event type, shared with all events */ SDL_WindowEvent window; /**< Window event data */ SDL_KeyboardEvent key; /**< Keyboard event data */ SDL_TextEditingEvent edit; /**< Text editing event data */ @@ -413,13 +420,20 @@ */ extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, SDL_eventaction action, - Uint32 mask); + Uint32 minType, Uint32 maxType); /*@}*/ /** * Checks to see if certain event types are in the event queue. */ -extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 mask); +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); + +/** + * This function clears events from the event queue + */ +extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); +extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); /** * \brief Polls for currently pending events. @@ -520,8 +534,18 @@ * - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the * current processing state of the specified event. */ -extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state); /*@}*/ +#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY) + +/** + * This function allocates a set of user-defined events, and returns + * the beginning event number for that set of events. + * + * If there aren't enough user-defined events left, this function + * returns (Uint32)-1 + */ +extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); /* Ends C function definitions when using C++ */ #ifdef __cplusplus
--- a/src/SDL_compat.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/SDL_compat.c Thu Mar 25 01:08:26 2010 -0700 @@ -196,13 +196,13 @@ case SDL_WINDOWEVENT: switch (event->window.event) { case SDL_WINDOWEVENT_EXPOSED: - if (!SDL_HasEvent(SDL_VIDEOEXPOSEMASK)) { + if (!SDL_HasEvent(SDL_VIDEOEXPOSE)) { fake.type = SDL_VIDEOEXPOSE; SDL_PushEvent(&fake); } break; case SDL_WINDOWEVENT_RESIZED: - SDL_PeepEvents(&fake, 1, SDL_GETEVENT, SDL_VIDEORESIZEMASK); + SDL_FlushEvent(SDL_VIDEORESIZE); fake.type = SDL_VIDEORESIZE; fake.resize.w = event->window.data1; fake.resize.h = event->window.data2;
--- a/src/events/SDL_events.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/events/SDL_events.c Thu Mar 25 01:08:26 2010 -0700 @@ -37,8 +37,13 @@ /* Public data -- the event filter */ SDL_EventFilter SDL_EventOK = NULL; void *SDL_EventOKParam; -Uint8 SDL_ProcessEvents[SDL_NUMEVENTS]; -static Uint32 SDL_eventstate = 0; + +typedef struct { + Uint32 bits[8]; +} SDL_DisabledEventBlock; + +static SDL_DisabledEventBlock *SDL_disabled_events[256]; +static Uint32 SDL_userevents = SDL_USEREVENT; /* Private data -- event queue */ #define MAXEVENTS 128 @@ -84,6 +89,17 @@ } } +static __inline__ SDL_bool +SDL_ShouldPollJoystick() +{ + if (SDL_numjoysticks && + (!SDL_disabled_events[SDL_JOYAXISMOTION >> 8] || + SDL_JoystickEventState(SDL_QUERY))) { + return SDL_TRUE; + } + return SDL_FALSE; +} + static int SDLCALL SDL_GobbleEvents(void *unused) { @@ -98,7 +114,7 @@ } #if !SDL_JOYSTICK_DISABLED /* Check for joystick state change */ - if (SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK)) { + if (SDL_ShouldPollJoystick()) { SDL_JoystickUpdate(); } #endif @@ -195,6 +211,8 @@ void SDL_StopEventLoop(void) { + int i; + /* Halt the event thread, if running */ SDL_StopEventThread(); @@ -207,6 +225,14 @@ SDL_EventQ.head = 0; SDL_EventQ.tail = 0; SDL_EventQ.wmmsg_next = 0; + + /* Clear disabled event state */ + for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) { + if (SDL_disabled_events[i]) { + SDL_free(SDL_disabled_events[i]); + SDL_disabled_events[i] = NULL; + } + } } /* This function (and associated calls) may be called more than once */ @@ -222,11 +248,7 @@ /* No filter to start with, process most event types */ SDL_EventOK = NULL; - SDL_memset(SDL_ProcessEvents, SDL_ENABLE, sizeof(SDL_ProcessEvents)); - SDL_eventstate = ~0; - /* It's not save to call SDL_EventState() yet */ - SDL_eventstate &= ~(0x00000001 << SDL_SYSWMEVENT); - SDL_ProcessEvents[SDL_SYSWMEVENT] = SDL_IGNORE; + SDL_EventState(SDL_SYSWMEVENT, SDL_DISABLE); /* Initialize event handlers */ retcode = 0; @@ -305,7 +327,7 @@ /* Lock the event queue, take a peep at it, and unlock it */ int SDL_PeepEvents(SDL_Event * events, int numevents, SDL_eventaction action, - Uint32 mask) + Uint32 minType, Uint32 maxType) { int i, used; @@ -332,7 +354,8 @@ } spot = SDL_EventQ.head; while ((used < numevents) && (spot != SDL_EventQ.tail)) { - if (mask & SDL_EVENTMASK(SDL_EventQ.event[spot].type)) { + Uint32 type = SDL_EventQ.event[spot].type; + if (minType <= type && type <= maxType) { events[used++] = SDL_EventQ.event[spot]; if (action == SDL_GETEVENT) { spot = SDL_CutEvent(spot); @@ -353,9 +376,44 @@ } SDL_bool -SDL_HasEvent(Uint32 mask) +SDL_HasEvent(Uint32 type) +{ + return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0); +} + +SDL_bool +SDL_HasEvents(Uint32 minType, Uint32 maxType) +{ + return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0); +} + +void +SDL_FlushEvent(Uint32 type) { - return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, mask) > 0); + SDL_FlushEvents(type, type); +} + +void +SDL_FlushEvents(Uint32 minType, Uint32 maxType) +{ + /* Don't look after we've quit */ + if (!SDL_EventQ.active) { + return; + } + + /* Lock the event queue */ + if (SDL_mutexP(SDL_EventQ.lock) == 0) { + int spot = SDL_EventQ.head; + while (spot != SDL_EventQ.tail) { + Uint32 type = SDL_EventQ.event[spot].type; + if (minType <= type && type <= maxType) { + spot = SDL_CutEvent(spot); + } else { + spot = (spot + 1) % MAXEVENTS; + } + } + SDL_mutexV(SDL_EventQ.lock); + } } /* Run the system dependent event loops */ @@ -371,7 +429,7 @@ } #if !SDL_JOYSTICK_DISABLED /* Check for joystick state change */ - if (SDL_numjoysticks && (SDL_eventstate & SDL_JOYEVENTMASK)) { + if (SDL_ShouldPollJoystick()) { SDL_JoystickUpdate(); } #endif @@ -402,7 +460,7 @@ for (;;) { SDL_PumpEvents(); - switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_ALLEVENTS)) { + switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) { case -1: return 0; case 1: @@ -428,7 +486,7 @@ if (SDL_EventOK && !SDL_EventOK(SDL_EventOKParam, event)) { return 0; } - if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0) <= 0) { + if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) { return -1; } return 1; @@ -476,48 +534,58 @@ } Uint8 -SDL_EventState(Uint8 type, int state) +SDL_EventState(Uint32 type, int state) { - SDL_Event bitbucket; Uint8 current_state; + Uint8 hi = ((type >> 8) & 0xff); + Uint8 lo = (type & 0xff); - /* If SDL_ALLEVENTS was specified... */ - if (type == 0xFF) { - current_state = SDL_IGNORE; - for (type = 0; type < SDL_NUMEVENTS; ++type) { - if (SDL_ProcessEvents[type] != SDL_IGNORE) { - current_state = SDL_ENABLE; - } - SDL_ProcessEvents[type] = state; - if (state == SDL_ENABLE) { - SDL_eventstate |= (0x00000001 << (type)); - } else { - SDL_eventstate &= ~(0x00000001 << (type)); - } - } - while (SDL_PollEvent(&bitbucket) > 0); - return (current_state); + if (SDL_disabled_events[hi] && + (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) { + current_state = SDL_DISABLE; + } else { + current_state = SDL_ENABLE; } - /* Just set the state for one event type */ - current_state = SDL_ProcessEvents[type]; - switch (state) { - case SDL_IGNORE: - case SDL_ENABLE: - /* Set state and discard pending events */ - SDL_ProcessEvents[type] = state; - if (state == SDL_ENABLE) { - SDL_eventstate |= (0x00000001 << (type)); - } else { - SDL_eventstate &= ~(0x00000001 << (type)); + if (state != current_state) + { + switch (state) { + case SDL_DISABLE: + /* Disable this event type and discard pending events */ + if (!SDL_disabled_events[hi]) { + SDL_disabled_events[hi] = (SDL_DisabledEventBlock*) SDL_calloc(1, sizeof(SDL_DisabledEventBlock)); + if (!SDL_disabled_events[hi]) { + /* Out of memory, nothing we can do... */ + break; + } + } + SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31)); + SDL_FlushEvent(type); + break; + case SDL_ENABLE: + SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31)); + break; + default: + /* Querying state... */ + break; } - while (SDL_PollEvent(&bitbucket) > 0); - break; - default: - /* Querying state? */ - break; } - return (current_state); + + return current_state; +} + +Uint32 +SDL_RegisterEvents(int numevents) +{ + Uint32 event_base; + + if (SDL_userevents+numevents <= SDL_LASTEVENT) { + event_base = SDL_userevents; + SDL_userevents += numevents; + } else { + event_base = (Uint32)-1; + } + return event_base; } /* This is a generic event handler. @@ -528,7 +596,7 @@ int posted; posted = 0; - if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { SDL_Event event; SDL_memset(&event, 0, sizeof(event)); event.type = SDL_SYSWMEVENT;
--- a/src/events/SDL_events_c.h Wed Mar 10 15:07:20 2010 +0000 +++ b/src/events/SDL_events_c.h Thu Mar 25 01:08:26 2010 -0700 @@ -47,7 +47,4 @@ extern SDL_EventFilter SDL_EventOK; extern void *SDL_EventOKParam; -/* The array of event processing states */ -extern Uint8 SDL_ProcessEvents[SDL_NUMEVENTS]; - /* vi: set ts=4 sw=4 expandtab: */
--- a/src/events/SDL_keyboard.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/events/SDL_keyboard.c Thu Mar 25 01:08:26 2010 -0700 @@ -688,7 +688,7 @@ SDL_Keyboard *keyboard = SDL_GetKeyboard(index); int posted; Uint16 modstate; - Uint8 type; + Uint32 type; if (!keyboard || !scancode) { return 0; @@ -800,7 +800,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[type] == SDL_ENABLE) { + if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.key.type = type; event.key.which = (Uint8) index; @@ -827,7 +827,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[SDL_TEXTINPUT] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_TEXTINPUT) == SDL_ENABLE) { SDL_Event event; event.text.type = SDL_TEXTINPUT; event.text.which = (Uint8) index; @@ -845,7 +845,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[SDL_TEXTEDITING] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_TEXTEDITING) == SDL_ENABLE) { SDL_Event event; event.edit.type = SDL_TEXTEDITING; event.edit.start = start;
--- a/src/events/SDL_mouse.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/events/SDL_mouse.c Thu Mar 25 01:08:26 2010 -0700 @@ -365,7 +365,7 @@ mouse->last_x = x; mouse->last_y = y; - if (SDL_ProcessEvents[type] == SDL_ENABLE) { + if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.proximity.which = (Uint8) index; event.proximity.x = x; @@ -461,7 +461,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[SDL_MOUSEMOTION] == SDL_ENABLE && + if (SDL_GetEventState(SDL_MOUSEMOTION) == SDL_ENABLE && mouse->proximity == SDL_TRUE) { SDL_Event event; event.motion.type = SDL_MOUSEMOTION; @@ -493,7 +493,7 @@ int index = SDL_GetMouseIndexId(id); SDL_Mouse *mouse = SDL_GetMouse(index); int posted; - Uint8 type; + Uint32 type; if (!mouse) { return 0; @@ -524,7 +524,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[type] == SDL_ENABLE) { + if (SDL_GetEventState(type) == SDL_ENABLE) { SDL_Event event; event.type = type; event.button.which = (Uint8) index; @@ -550,7 +550,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[SDL_MOUSEWHEEL] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_MOUSEWHEEL) == SDL_ENABLE) { SDL_Event event; event.type = SDL_MOUSEWHEEL; event.wheel.which = (Uint8) index;
--- a/src/events/SDL_quit.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/events/SDL_quit.c Thu Mar 25 01:08:26 2010 -0700 @@ -85,7 +85,7 @@ int posted; posted = 0; - if (SDL_ProcessEvents[SDL_QUIT] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_QUIT) == SDL_ENABLE) { SDL_Event event; event.type = SDL_QUIT; posted = (SDL_PushEvent(&event) > 0);
--- a/src/events/SDL_windowevents.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/events/SDL_windowevents.c Thu Mar 25 01:08:26 2010 -0700 @@ -144,7 +144,7 @@ /* Post the event, if desired */ posted = 0; - if (SDL_ProcessEvents[SDL_WINDOWEVENT] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_WINDOWEVENT) == SDL_ENABLE) { SDL_Event event; event.type = SDL_WINDOWEVENT; event.window.event = windowevent;
--- a/src/joystick/SDL_joystick.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/joystick/SDL_joystick.c Thu Mar 25 01:08:26 2010 -0700 @@ -445,7 +445,7 @@ /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[SDL_JOYAXISMOTION] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_JOYAXISMOTION) == SDL_ENABLE) { SDL_Event event; event.type = SDL_JOYAXISMOTION; event.jaxis.which = joystick->index; @@ -472,7 +472,7 @@ /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[SDL_JOYHATMOTION] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_JOYHATMOTION) == SDL_ENABLE) { SDL_Event event; event.jhat.type = SDL_JOYHATMOTION; event.jhat.which = joystick->index; @@ -501,7 +501,7 @@ /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[SDL_JOYBALLMOTION] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_JOYBALLMOTION) == SDL_ENABLE) { SDL_Event event; event.jball.type = SDL_JOYBALLMOTION; event.jball.which = joystick->index; @@ -544,7 +544,7 @@ /* Post the event, if desired */ posted = 0; #if !SDL_EVENTS_DISABLED - if (SDL_ProcessEvents[event.type] == SDL_ENABLE) { + if (SDL_GetEventState(event.type) == SDL_ENABLE) { event.jbutton.which = joystick->index; event.jbutton.button = button; event.jbutton.state = state; @@ -574,7 +574,7 @@ #if SDL_EVENTS_DISABLED return SDL_IGNORE; #else - const Uint8 event_list[] = { + const Uint32 event_list[] = { SDL_JOYAXISMOTION, SDL_JOYBALLMOTION, SDL_JOYHATMOTION, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, };
--- a/src/video/win32/SDL_win32events.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/video/win32/SDL_win32events.c Thu Mar 25 01:08:26 2010 -0700 @@ -109,7 +109,7 @@ LRESULT returnCode = -1; /* Send a SDL_SYSWMEVENT if the application wants them */ - if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { SDL_SysWMmsg wmmsg; SDL_VERSION(&wmmsg.version);
--- a/src/video/x11/SDL_x11events.c Wed Mar 10 15:07:20 2010 +0000 +++ b/src/video/x11/SDL_x11events.c Thu Mar 25 01:08:26 2010 -0700 @@ -53,7 +53,7 @@ } /* Send a SDL_SYSWMEVENT if the application wants them */ - if (SDL_ProcessEvents[SDL_SYSWMEVENT] == SDL_ENABLE) { + if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) { SDL_SysWMmsg wmmsg; SDL_VERSION(&wmmsg.version);
--- a/test/threadwin.c Wed Mar 10 15:07:20 2010 +0000 +++ b/test/threadwin.c Thu Mar 25 01:08:26 2010 -0700 @@ -133,14 +133,10 @@ { SDL_Event events[10]; int i, found; - Uint32 mask; /* Handle mouse events here */ - mask = - (SDL_MOUSEMOTIONMASK | SDL_MOUSEBUTTONDOWNMASK | - SDL_MOUSEBUTTONUPMASK); while (!done) { - found = SDL_PeepEvents(events, 10, SDL_GETEVENT, mask); + found = SDL_PeepEvents(events, 10, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEBUTTONUP); for (i = 0; i < found; ++i) { switch (events[i].type) { /* We want to toggle visibility on buttonpress */ @@ -173,12 +169,10 @@ { SDL_Event events[10]; int i, found; - Uint32 mask; /* Handle mouse events here */ - mask = (SDL_KEYDOWNMASK | SDL_KEYUPMASK); while (!done) { - found = SDL_PeepEvents(events, 10, SDL_GETEVENT, mask); + found = SDL_PeepEvents(events, 10, SDL_GETEVENT, SDL_KEYDOWN, SDL_KEYUP); for (i = 0; i < found; ++i) { switch (events[i].type) { /* We want to toggle visibility on buttonpress */ @@ -329,7 +323,7 @@ if (!(init_flags & SDL_INIT_EVENTTHREAD)) { SDL_PumpEvents(); /* Needed when event thread is off */ } - if (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_QUITMASK)) { + if (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_QUIT, SDL_QUIT)) { done = 1; } /* Give up some CPU so the events can accumulate */