]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | SDL - Simple DirectMedia Layer | |
3 | Copyright (C) 1997-2006 Sam Lantinga | |
4 | ||
5 | This library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Lesser General Public | |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
9 | ||
10 | This library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Lesser General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Lesser General Public | |
16 | License along with this library; if not, write to the Free Software | |
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
18 | ||
19 | Sam Lantinga | |
20 | slouken@libsdl.org | |
21 | */ | |
22 | ||
23 | /* Include file for SDL event handling */ | |
24 | ||
25 | #ifndef _SDL_events_h | |
26 | #define _SDL_events_h | |
27 | ||
28 | #include "SDL_stdinc.h" | |
29 | #include "SDL_error.h" | |
30 | #include "SDL_active.h" | |
31 | #include "SDL_keyboard.h" | |
32 | #include "SDL_mouse.h" | |
33 | #include "SDL_joystick.h" | |
34 | #include "SDL_quit.h" | |
35 | ||
36 | #include "begin_code.h" | |
37 | /* Set up for C function definitions, even when using C++ */ | |
38 | #ifdef __cplusplus | |
39 | extern "C" { | |
40 | #endif | |
41 | ||
42 | /* General keyboard/mouse state definitions */ | |
43 | #define SDL_RELEASED 0 | |
44 | #define SDL_PRESSED 1 | |
45 | ||
46 | /* Event enumerations */ | |
47 | typedef enum { | |
48 | SDL_NOEVENT = 0, /* Unused (do not remove) */ | |
49 | SDL_ACTIVEEVENT, /* Application loses/gains visibility */ | |
50 | SDL_KEYDOWN, /* Keys pressed */ | |
51 | SDL_KEYUP, /* Keys released */ | |
52 | SDL_MOUSEMOTION, /* Mouse moved */ | |
53 | SDL_MOUSEBUTTONDOWN, /* Mouse button pressed */ | |
54 | SDL_MOUSEBUTTONUP, /* Mouse button released */ | |
55 | SDL_JOYAXISMOTION, /* Joystick axis motion */ | |
56 | SDL_JOYBALLMOTION, /* Joystick trackball motion */ | |
57 | SDL_JOYHATMOTION, /* Joystick hat position change */ | |
58 | SDL_JOYBUTTONDOWN, /* Joystick button pressed */ | |
59 | SDL_JOYBUTTONUP, /* Joystick button released */ | |
60 | SDL_QUIT, /* User-requested quit */ | |
61 | SDL_SYSWMEVENT, /* System specific event */ | |
62 | SDL_EVENT_RESERVEDA, /* Reserved for future use.. */ | |
63 | SDL_EVENT_RESERVEDB, /* Reserved for future use.. */ | |
64 | SDL_VIDEORESIZE, /* User resized video mode */ | |
65 | SDL_VIDEOEXPOSE, /* Screen needs to be redrawn */ | |
66 | SDL_EVENT_RESERVED2, /* Reserved for future use.. */ | |
67 | SDL_EVENT_RESERVED3, /* Reserved for future use.. */ | |
68 | SDL_EVENT_RESERVED4, /* Reserved for future use.. */ | |
69 | SDL_EVENT_RESERVED5, /* Reserved for future use.. */ | |
70 | SDL_EVENT_RESERVED6, /* Reserved for future use.. */ | |
71 | SDL_EVENT_RESERVED7, /* Reserved for future use.. */ | |
72 | /* Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use */ | |
73 | SDL_USEREVENT = 24, | |
74 | /* This last event is only for bounding internal arrays | |
75 | It is the number of bits in the event mask datatype -- Uint32 | |
76 | */ | |
77 | SDL_NUMEVENTS = 32 | |
78 | } SDL_EventType; | |
79 | ||
80 | /* Predefined event masks */ | |
81 | #define SDL_EVENTMASK(X) (1<<(X)) | |
82 | typedef enum { | |
83 | SDL_ACTIVEEVENTMASK = SDL_EVENTMASK(SDL_ACTIVEEVENT), | |
84 | SDL_KEYDOWNMASK = SDL_EVENTMASK(SDL_KEYDOWN), | |
85 | SDL_KEYUPMASK = SDL_EVENTMASK(SDL_KEYUP), | |
86 | SDL_KEYEVENTMASK = SDL_EVENTMASK(SDL_KEYDOWN)| | |
87 | SDL_EVENTMASK(SDL_KEYUP), | |
88 | SDL_MOUSEMOTIONMASK = SDL_EVENTMASK(SDL_MOUSEMOTION), | |
89 | SDL_MOUSEBUTTONDOWNMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN), | |
90 | SDL_MOUSEBUTTONUPMASK = SDL_EVENTMASK(SDL_MOUSEBUTTONUP), | |
91 | SDL_MOUSEEVENTMASK = SDL_EVENTMASK(SDL_MOUSEMOTION)| | |
92 | SDL_EVENTMASK(SDL_MOUSEBUTTONDOWN)| | |
93 | SDL_EVENTMASK(SDL_MOUSEBUTTONUP), | |
94 | SDL_JOYAXISMOTIONMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION), | |
95 | SDL_JOYBALLMOTIONMASK = SDL_EVENTMASK(SDL_JOYBALLMOTION), | |
96 | SDL_JOYHATMOTIONMASK = SDL_EVENTMASK(SDL_JOYHATMOTION), | |
97 | SDL_JOYBUTTONDOWNMASK = SDL_EVENTMASK(SDL_JOYBUTTONDOWN), | |
98 | SDL_JOYBUTTONUPMASK = SDL_EVENTMASK(SDL_JOYBUTTONUP), | |
99 | SDL_JOYEVENTMASK = SDL_EVENTMASK(SDL_JOYAXISMOTION)| | |
100 | SDL_EVENTMASK(SDL_JOYBALLMOTION)| | |
101 | SDL_EVENTMASK(SDL_JOYHATMOTION)| | |
102 | SDL_EVENTMASK(SDL_JOYBUTTONDOWN)| | |
103 | SDL_EVENTMASK(SDL_JOYBUTTONUP), | |
104 | SDL_VIDEORESIZEMASK = SDL_EVENTMASK(SDL_VIDEORESIZE), | |
105 | SDL_VIDEOEXPOSEMASK = SDL_EVENTMASK(SDL_VIDEOEXPOSE), | |
106 | SDL_QUITMASK = SDL_EVENTMASK(SDL_QUIT), | |
107 | SDL_SYSWMEVENTMASK = SDL_EVENTMASK(SDL_SYSWMEVENT) | |
108 | } SDL_EventMask ; | |
109 | #define SDL_ALLEVENTS 0xFFFFFFFF | |
110 | ||
111 | /* Application visibility event structure */ | |
112 | typedef struct SDL_ActiveEvent { | |
113 | Uint8 type; /* SDL_ACTIVEEVENT */ | |
114 | Uint8 gain; /* Whether given states were gained or lost (1/0) */ | |
115 | Uint8 state; /* A mask of the focus states */ | |
116 | } SDL_ActiveEvent; | |
117 | ||
118 | /* Keyboard event structure */ | |
119 | typedef struct SDL_KeyboardEvent { | |
120 | Uint8 type; /* SDL_KEYDOWN or SDL_KEYUP */ | |
121 | Uint8 which; /* The keyboard device index */ | |
122 | Uint8 state; /* SDL_PRESSED or SDL_RELEASED */ | |
123 | SDL_keysym keysym; | |
124 | } SDL_KeyboardEvent; | |
125 | ||
126 | /* Mouse motion event structure */ | |
127 | typedef struct SDL_MouseMotionEvent { | |
128 | Uint8 type; /* SDL_MOUSEMOTION */ | |
129 | Uint8 which; /* The mouse device index */ | |
130 | Uint8 state; /* The current button state */ | |
131 | Uint16 x, y; /* The X/Y coordinates of the mouse */ | |
132 | Sint16 xrel; /* The relative motion in the X direction */ | |
133 | Sint16 yrel; /* The relative motion in the Y direction */ | |
134 | } SDL_MouseMotionEvent; | |
135 | ||
136 | /* Mouse button event structure */ | |
137 | typedef struct SDL_MouseButtonEvent { | |
138 | Uint8 type; /* SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP */ | |
139 | Uint8 which; /* The mouse device index */ | |
140 | Uint8 button; /* The mouse button index */ | |
141 | Uint8 state; /* SDL_PRESSED or SDL_RELEASED */ | |
142 | Uint16 x, y; /* The X/Y coordinates of the mouse at press time */ | |
143 | } SDL_MouseButtonEvent; | |
144 | ||
145 | /* Joystick axis motion event structure */ | |
146 | typedef struct SDL_JoyAxisEvent { | |
147 | Uint8 type; /* SDL_JOYAXISMOTION */ | |
148 | Uint8 which; /* The joystick device index */ | |
149 | Uint8 axis; /* The joystick axis index */ | |
150 | Sint16 value; /* The axis value (range: -32768 to 32767) */ | |
151 | } SDL_JoyAxisEvent; | |
152 | ||
153 | /* Joystick trackball motion event structure */ | |
154 | typedef struct SDL_JoyBallEvent { | |
155 | Uint8 type; /* SDL_JOYBALLMOTION */ | |
156 | Uint8 which; /* The joystick device index */ | |
157 | Uint8 ball; /* The joystick trackball index */ | |
158 | Sint16 xrel; /* The relative motion in the X direction */ | |
159 | Sint16 yrel; /* The relative motion in the Y direction */ | |
160 | } SDL_JoyBallEvent; | |
161 | ||
162 | /* Joystick hat position change event structure */ | |
163 | typedef struct SDL_JoyHatEvent { | |
164 | Uint8 type; /* SDL_JOYHATMOTION */ | |
165 | Uint8 which; /* The joystick device index */ | |
166 | Uint8 hat; /* The joystick hat index */ | |
167 | Uint8 value; /* The hat position value: | |
168 | SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP | |
169 | SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT | |
170 | SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN | |
171 | Note that zero means the POV is centered. | |
172 | */ | |
173 | } SDL_JoyHatEvent; | |
174 | ||
175 | /* Joystick button event structure */ | |
176 | typedef struct SDL_JoyButtonEvent { | |
177 | Uint8 type; /* SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP */ | |
178 | Uint8 which; /* The joystick device index */ | |
179 | Uint8 button; /* The joystick button index */ | |
180 | Uint8 state; /* SDL_PRESSED or SDL_RELEASED */ | |
181 | } SDL_JoyButtonEvent; | |
182 | ||
183 | /* The "window resized" event | |
184 | When you get this event, you are responsible for setting a new video | |
185 | mode with the new width and height. | |
186 | */ | |
187 | typedef struct SDL_ResizeEvent { | |
188 | Uint8 type; /* SDL_VIDEORESIZE */ | |
189 | int w; /* New width */ | |
190 | int h; /* New height */ | |
191 | } SDL_ResizeEvent; | |
192 | ||
193 | /* The "screen redraw" event */ | |
194 | typedef struct SDL_ExposeEvent { | |
195 | Uint8 type; /* SDL_VIDEOEXPOSE */ | |
196 | } SDL_ExposeEvent; | |
197 | ||
198 | /* The "quit requested" event */ | |
199 | typedef struct SDL_QuitEvent { | |
200 | Uint8 type; /* SDL_QUIT */ | |
201 | } SDL_QuitEvent; | |
202 | ||
203 | /* A user-defined event type */ | |
204 | typedef struct SDL_UserEvent { | |
205 | Uint8 type; /* SDL_USEREVENT through SDL_NUMEVENTS-1 */ | |
206 | int code; /* User defined event code */ | |
207 | void *data1; /* User defined data pointer */ | |
208 | void *data2; /* User defined data pointer */ | |
209 | } SDL_UserEvent; | |
210 | ||
211 | /* If you want to use this event, you should include SDL_syswm.h */ | |
212 | struct SDL_SysWMmsg; | |
213 | typedef struct SDL_SysWMmsg SDL_SysWMmsg; | |
214 | typedef struct SDL_SysWMEvent { | |
215 | Uint8 type; | |
216 | SDL_SysWMmsg *msg; | |
217 | } SDL_SysWMEvent; | |
218 | ||
219 | /* General event structure */ | |
220 | typedef union SDL_Event { | |
221 | Uint8 type; | |
222 | SDL_ActiveEvent active; | |
223 | SDL_KeyboardEvent key; | |
224 | SDL_MouseMotionEvent motion; | |
225 | SDL_MouseButtonEvent button; | |
226 | SDL_JoyAxisEvent jaxis; | |
227 | SDL_JoyBallEvent jball; | |
228 | SDL_JoyHatEvent jhat; | |
229 | SDL_JoyButtonEvent jbutton; | |
230 | SDL_ResizeEvent resize; | |
231 | SDL_ExposeEvent expose; | |
232 | SDL_QuitEvent quit; | |
233 | SDL_UserEvent user; | |
234 | SDL_SysWMEvent syswm; | |
235 | } SDL_Event; | |
236 | ||
237 | ||
238 | /* Function prototypes */ | |
239 | ||
240 | /* Pumps the event loop, gathering events from the input devices. | |
241 | This function updates the event queue and internal input device state. | |
242 | This should only be run in the thread that sets the video mode. | |
243 | */ | |
244 | extern DECLSPEC void SDLCALL SDL_PumpEvents(void); | |
245 | ||
246 | /* Checks the event queue for messages and optionally returns them. | |
247 | If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to | |
248 | the back of the event queue. | |
249 | If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front | |
250 | of the event queue, matching 'mask', will be returned and will not | |
251 | be removed from the queue. | |
252 | If 'action' is SDL_GETEVENT, up to 'numevents' events at the front | |
253 | of the event queue, matching 'mask', will be returned and will be | |
254 | removed from the queue. | |
255 | This function returns the number of events actually stored, or -1 | |
256 | if there was an error. This function is thread-safe. | |
257 | */ | |
258 | typedef enum { | |
259 | SDL_ADDEVENT, | |
260 | SDL_PEEKEVENT, | |
261 | SDL_GETEVENT | |
262 | } SDL_eventaction; | |
263 | /* */ | |
264 | extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event *events, int numevents, | |
265 | SDL_eventaction action, Uint32 mask); | |
266 | ||
267 | /* Polls for currently pending events, and returns 1 if there are any pending | |
268 | events, or 0 if there are none available. If 'event' is not NULL, the next | |
269 | event is removed from the queue and stored in that area. | |
270 | */ | |
271 | extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event *event); | |
272 | ||
273 | /* Waits indefinitely for the next available event, returning 1, or 0 if there | |
274 | was an error while waiting for events. If 'event' is not NULL, the next | |
275 | event is removed from the queue and stored in that area. | |
276 | */ | |
277 | extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event *event); | |
278 | ||
279 | /* Add an event to the event queue. | |
280 | This function returns 0 on success, or -1 if the event queue was full | |
281 | or there was some other error. | |
282 | */ | |
283 | extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event *event); | |
284 | ||
285 | /* | |
286 | This function sets up a filter to process all events before they | |
287 | change internal state and are posted to the internal event queue. | |
288 | ||
289 | The filter is protypted as: | |
290 | */ | |
291 | typedef int (SDLCALL *SDL_EventFilter)(const SDL_Event *event); | |
292 | /* | |
293 | If the filter returns 1, then the event will be added to the internal queue. | |
294 | If it returns 0, then the event will be dropped from the queue, but the | |
295 | internal state will still be updated. This allows selective filtering of | |
296 | dynamically arriving events. | |
297 | ||
298 | WARNING: Be very careful of what you do in the event filter function, as | |
299 | it may run in a different thread! | |
300 | ||
301 | There is one caveat when dealing with the SDL_QUITEVENT event type. The | |
302 | event filter is only called when the window manager desires to close the | |
303 | application window. If the event filter returns 1, then the window will | |
304 | be closed, otherwise the window will remain open if possible. | |
305 | If the quit event is generated by an interrupt signal, it will bypass the | |
306 | internal queue and be delivered to the application at the next event poll. | |
307 | */ | |
308 | extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter); | |
309 | ||
310 | /* | |
311 | Return the current event filter - can be used to "chain" filters. | |
312 | If there is no event filter set, this function returns NULL. | |
313 | */ | |
314 | extern DECLSPEC SDL_EventFilter SDLCALL SDL_GetEventFilter(void); | |
315 | ||
316 | /* | |
317 | This function allows you to set the state of processing certain events. | |
318 | If 'state' is set to SDL_IGNORE, that event will be automatically dropped | |
319 | from the event queue and will not event be filtered. | |
320 | If 'state' is set to SDL_ENABLE, that event will be processed normally. | |
321 | If 'state' is set to SDL_QUERY, SDL_EventState() will return the | |
322 | current processing state of the specified event. | |
323 | */ | |
324 | #define SDL_QUERY -1 | |
325 | #define SDL_IGNORE 0 | |
326 | #define SDL_DISABLE 0 | |
327 | #define SDL_ENABLE 1 | |
328 | extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint8 type, int state); | |
329 | ||
330 | ||
331 | /* Ends C function definitions when using C++ */ | |
332 | #ifdef __cplusplus | |
333 | } | |
334 | #endif | |
335 | #include "close_code.h" | |
336 | ||
337 | #endif /* _SDL_events_h */ |