SDL  2.0
SDL_events.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "../SDL_internal.h"
22 
23 /* General event handling code for SDL */
24 
25 #include "SDL.h"
26 #include "SDL_events.h"
27 #include "SDL_thread.h"
28 #include "SDL_events_c.h"
29 #include "../timer/SDL_timer_c.h"
30 #if !SDL_JOYSTICK_DISABLED
31 #include "../joystick/SDL_joystick_c.h"
32 #endif
33 #include "../video/SDL_sysvideo.h"
34 #include "SDL_syswm.h"
35 
36 /*#define SDL_DEBUG_EVENTS 1*/
37 
38 /* An arbitrary limit so we don't have unbounded growth */
39 #define SDL_MAX_QUEUED_EVENTS 65535
40 
41 typedef struct SDL_EventWatcher {
43  void *userdata;
46 
50 static int SDL_event_watchers_count = 0;
53 
54 typedef struct {
57 
60 
61 /* Private data -- event queue */
62 typedef struct _SDL_EventEntry
63 {
66  struct _SDL_EventEntry *prev;
67  struct _SDL_EventEntry *next;
69 
70 typedef struct _SDL_SysWMEntry
71 {
73  struct _SDL_SysWMEntry *next;
75 
76 static struct
77 {
87 } SDL_EventQ = { NULL, { 1 }, { 0 }, 0, NULL, NULL, NULL, NULL, NULL };
88 
89 
90 #ifdef SDL_DEBUG_EVENTS
91 
92 /* this is to make printf() calls cleaner. */
93 #define uint unsigned int
94 
95 static void
96 SDL_DebugPrintEvent(const SDL_Event *event)
97 {
98  /* !!! FIXME: This code is kinda ugly, sorry. */
99  printf("SDL EVENT: ");
100 
101  if ((event->type >= SDL_USEREVENT) && (event->type <= SDL_LASTEVENT)) {
102  printf("SDL_USEREVENT");
103  if (event->type > SDL_USEREVENT) {
104  printf("+%u", ((uint) event->type) - SDL_USEREVENT);
105  }
106  printf(" (timestamp=%u windowid=%u code=%d data1=%p data2=%p)",
107  (uint) event->user.timestamp, (uint) event->user.windowID,
108  (int) event->user.code, event->user.data1, event->user.data2);
109  return;
110  }
111 
112  switch (event->type) {
113  #define SDL_EVENT_CASE(x) case x: printf("%s", #x);
114  SDL_EVENT_CASE(SDL_FIRSTEVENT) printf("(THIS IS PROBABLY A BUG!)"); break;
115  SDL_EVENT_CASE(SDL_QUIT) printf("(timestamp=%u)", (uint) event->quit.timestamp); break;
116  SDL_EVENT_CASE(SDL_APP_TERMINATING) break;
117  SDL_EVENT_CASE(SDL_APP_LOWMEMORY) break;
118  SDL_EVENT_CASE(SDL_APP_WILLENTERBACKGROUND) break;
119  SDL_EVENT_CASE(SDL_APP_DIDENTERBACKGROUND) break;
120  SDL_EVENT_CASE(SDL_APP_WILLENTERFOREGROUND) break;
121  SDL_EVENT_CASE(SDL_APP_DIDENTERFOREGROUND) break;
122  SDL_EVENT_CASE(SDL_KEYMAPCHANGED) break;
123  SDL_EVENT_CASE(SDL_CLIPBOARDUPDATE) break;
124  SDL_EVENT_CASE(SDL_RENDER_TARGETS_RESET) break;
125  SDL_EVENT_CASE(SDL_RENDER_DEVICE_RESET) break;
126  #undef SDL_EVENT_CASE
127 
128  #define SDL_EVENT_CASE(x) case x: printf("%s ", #x);
129 
130  SDL_EVENT_CASE(SDL_WINDOWEVENT)
131  printf("(timestamp=%u windowid=%u event=", (uint) event->window.timestamp, (uint) event->window.windowID);
132  switch(event->window.event) {
133  case SDL_WINDOWEVENT_NONE: printf("none(THIS IS PROBABLY A BUG!)"); break;
134  #define SDL_WINDOWEVENT_CASE(x) case x: printf("%s", #x); break
135  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_SHOWN);
136  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_HIDDEN);
137  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_EXPOSED);
138  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_MOVED);
139  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_RESIZED);
140  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_SIZE_CHANGED);
141  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_MINIMIZED);
142  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_MAXIMIZED);
143  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_RESTORED);
144  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_ENTER);
145  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_LEAVE);
146  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_FOCUS_GAINED);
147  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_FOCUS_LOST);
148  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_CLOSE);
149  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_TAKE_FOCUS);
150  SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_HIT_TEST);
151  #undef SDL_WINDOWEVENT_CASE
152  default: printf("UNKNOWN(bug? fixme?)"); break;
153  }
154  printf(" data1=%d data2=%d)", (int) event->window.data1, (int) event->window.data2);
155  break;
156 
157  SDL_EVENT_CASE(SDL_SYSWMEVENT)
158  printf("(timestamp=%u)", (uint) event->syswm.timestamp);
159  /* !!! FIXME: we don't delve further at the moment. */
160  break;
161 
162  #define PRINT_KEY_EVENT(event) \
163  printf("(timestamp=%u windowid=%u state=%s repeat=%s scancode=%u keycode=%u mod=%u)", \
164  (uint) event->key.timestamp, (uint) event->key.windowID, \
165  event->key.state == SDL_PRESSED ? "pressed" : "released", \
166  event->key.repeat ? "true" : "false", \
167  (uint) event->key.keysym.scancode, \
168  (uint) event->key.keysym.sym, \
169  (uint) event->key.keysym.mod)
170  SDL_EVENT_CASE(SDL_KEYDOWN) PRINT_KEY_EVENT(event); break;
171  SDL_EVENT_CASE(SDL_KEYUP) PRINT_KEY_EVENT(event); break;
172  #undef PRINT_KEY_EVENT
173 
174  SDL_EVENT_CASE(SDL_TEXTEDITING)
175  printf("(timestamp=%u windowid=%u text='%s' start=%d length=%d)",
176  (uint) event->edit.timestamp, (uint) event->edit.windowID,
177  event->edit.text, (int) event->edit.start, (int) event->edit.length);
178  break;
179 
180  SDL_EVENT_CASE(SDL_TEXTINPUT)
181  printf("(timestamp=%u windowid=%u text='%s')", (uint) event->text.timestamp, (uint) event->text.windowID, event->text.text);
182  break;
183 
184 
185  SDL_EVENT_CASE(SDL_MOUSEMOTION)
186  printf("(timestamp=%u windowid=%u which=%u state=%u x=%d y=%d xrel=%d yrel=%d)",
187  (uint) event->motion.timestamp, (uint) event->motion.windowID,
188  (uint) event->motion.which, (uint) event->motion.state,
189  (int) event->motion.x, (int) event->motion.y,
190  (int) event->motion.xrel, (int) event->motion.yrel);
191  break;
192 
193  #define PRINT_MBUTTON_EVENT(event) \
194  printf("(timestamp=%u windowid=%u which=%u button=%u state=%s clicks=%u x=%d y=%d)", \
195  (uint) event->button.timestamp, (uint) event->button.windowID, \
196  (uint) event->button.which, (uint) event->button.button, \
197  event->button.state == SDL_PRESSED ? "pressed" : "released", \
198  (uint) event->button.clicks, (int) event->button.x, (int) event->button.y)
199  SDL_EVENT_CASE(SDL_MOUSEBUTTONDOWN) PRINT_MBUTTON_EVENT(event); break;
200  SDL_EVENT_CASE(SDL_MOUSEBUTTONUP) PRINT_MBUTTON_EVENT(event); break;
201  #undef PRINT_MBUTTON_EVENT
202 
203 
204  SDL_EVENT_CASE(SDL_MOUSEWHEEL)
205  printf("(timestamp=%u windowid=%u which=%u x=%d y=%d direction=%s)",
206  (uint) event->wheel.timestamp, (uint) event->wheel.windowID,
207  (uint) event->wheel.which, (int) event->wheel.x, (int) event->wheel.y,
208  event->wheel.direction == SDL_MOUSEWHEEL_NORMAL ? "normal" : "flipped");
209  break;
210 
211  SDL_EVENT_CASE(SDL_JOYAXISMOTION)
212  printf("(timestamp=%u which=%d axis=%u value=%d)",
213  (uint) event->jaxis.timestamp, (int) event->jaxis.which,
214  (uint) event->jaxis.axis, (int) event->jaxis.value);
215  break;
216 
217  SDL_EVENT_CASE(SDL_JOYBALLMOTION)
218  printf("(timestamp=%u which=%d ball=%u xrel=%d yrel=%d)",
219  (uint) event->jball.timestamp, (int) event->jball.which,
220  (uint) event->jball.ball, (int) event->jball.xrel, (int) event->jball.yrel);
221  break;
222 
223  SDL_EVENT_CASE(SDL_JOYHATMOTION)
224  printf("(timestamp=%u which=%d hat=%u value=%u)",
225  (uint) event->jhat.timestamp, (int) event->jhat.which,
226  (uint) event->jhat.hat, (uint) event->jhat.value);
227  break;
228 
229  #define PRINT_JBUTTON_EVENT(event) \
230  printf("(timestamp=%u which=%d button=%u state=%s)", \
231  (uint) event->jbutton.timestamp, (int) event->jbutton.which, \
232  (uint) event->jbutton.button, event->jbutton.state == SDL_PRESSED ? "pressed" : "released")
233  SDL_EVENT_CASE(SDL_JOYBUTTONDOWN) PRINT_JBUTTON_EVENT(event); break;
234  SDL_EVENT_CASE(SDL_JOYBUTTONUP) PRINT_JBUTTON_EVENT(event); break;
235  #undef PRINT_JBUTTON_EVENT
236 
237  #define PRINT_JOYDEV_EVENT(event) printf("(timestamp=%u which=%d)", (uint) event->jdevice.timestamp, (int) event->jdevice.which)
238  SDL_EVENT_CASE(SDL_JOYDEVICEADDED) PRINT_JOYDEV_EVENT(event); break;
239  SDL_EVENT_CASE(SDL_JOYDEVICEREMOVED) PRINT_JOYDEV_EVENT(event); break;
240  #undef PRINT_JOYDEV_EVENT
241 
242  SDL_EVENT_CASE(SDL_CONTROLLERAXISMOTION)
243  printf("(timestamp=%u which=%d axis=%u value=%d)",
244  (uint) event->caxis.timestamp, (int) event->caxis.which,
245  (uint) event->caxis.axis, (int) event->caxis.value);
246  break;
247 
248  #define PRINT_CBUTTON_EVENT(event) \
249  printf("(timestamp=%u which=%d button=%u state=%s)", \
250  (uint) event->cbutton.timestamp, (int) event->cbutton.which, \
251  (uint) event->cbutton.button, event->cbutton.state == SDL_PRESSED ? "pressed" : "released")
252  SDL_EVENT_CASE(SDL_CONTROLLERBUTTONDOWN) PRINT_CBUTTON_EVENT(event); break;
253  SDL_EVENT_CASE(SDL_CONTROLLERBUTTONUP) PRINT_CBUTTON_EVENT(event); break;
254  #undef PRINT_CBUTTON_EVENT
255 
256  #define PRINT_CONTROLLERDEV_EVENT(event) printf("(timestamp=%u which=%d)", (uint) event->cdevice.timestamp, (int) event->cdevice.which)
257  SDL_EVENT_CASE(SDL_CONTROLLERDEVICEADDED) PRINT_CONTROLLERDEV_EVENT(event); break;
258  SDL_EVENT_CASE(SDL_CONTROLLERDEVICEREMOVED) PRINT_CONTROLLERDEV_EVENT(event); break;
259  SDL_EVENT_CASE(SDL_CONTROLLERDEVICEREMAPPED) PRINT_CONTROLLERDEV_EVENT(event); break;
260  #undef PRINT_CONTROLLERDEV_EVENT
261 
262  #define PRINT_FINGER_EVENT(event) \
263  printf("(timestamp=%u touchid=%lld fingerid=%lld x=%f y=%f dx=%f dy=%f pressure=%f)", \
264  (uint) event->tfinger.timestamp, (long long) event->tfinger.touchId, \
265  (long long) event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, \
266  event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure)
267  SDL_EVENT_CASE(SDL_FINGERDOWN) PRINT_FINGER_EVENT(event); break;
268  SDL_EVENT_CASE(SDL_FINGERUP) PRINT_FINGER_EVENT(event); break;
269  SDL_EVENT_CASE(SDL_FINGERMOTION) PRINT_FINGER_EVENT(event); break;
270  #undef PRINT_FINGER_EVENT
271 
272  #define PRINT_DOLLAR_EVENT(event) \
273  printf("(timestamp=%u touchid=%lld gestureid=%lld numfingers=%u error=%f x=%f y=%f)", \
274  (uint) event->dgesture.timestamp, (long long) event->dgesture.touchId, \
275  (long long) event->dgesture.gestureId, (uint) event->dgesture.numFingers, \
276  event->dgesture.error, event->dgesture.x, event->dgesture.y);
277  SDL_EVENT_CASE(SDL_DOLLARGESTURE) PRINT_DOLLAR_EVENT(event); break;
278  SDL_EVENT_CASE(SDL_DOLLARRECORD) PRINT_DOLLAR_EVENT(event); break;
279  #undef PRINT_DOLLAR_EVENT
280 
281  SDL_EVENT_CASE(SDL_MULTIGESTURE)
282  printf("(timestamp=%u touchid=%lld dtheta=%f ddist=%f x=%f y=%f numfingers=%u)",
283  (uint) event->mgesture.timestamp, (long long) event->mgesture.touchId,
284  event->mgesture.dTheta, event->mgesture.dDist,
285  event->mgesture.x, event->mgesture.y, (uint) event->mgesture.numFingers);
286  break;
287 
288  #define PRINT_DROP_EVENT(event) printf("(file='%s' timestamp=%u windowid=%u)", event->drop.file, (uint) event->drop.timestamp, (uint) event->drop.windowID)
289  SDL_EVENT_CASE(SDL_DROPFILE) PRINT_DROP_EVENT(event); break;
290  SDL_EVENT_CASE(SDL_DROPTEXT) PRINT_DROP_EVENT(event); break;
291  SDL_EVENT_CASE(SDL_DROPBEGIN) PRINT_DROP_EVENT(event); break;
292  SDL_EVENT_CASE(SDL_DROPCOMPLETE) PRINT_DROP_EVENT(event); break;
293  #undef PRINT_DROP_EVENT
294 
295  #define PRINT_AUDIODEV_EVENT(event) printf("(timestamp=%u which=%u iscapture=%s)", (uint) event->adevice.timestamp, (uint) event->adevice.which, event->adevice.iscapture ? "true" : "false");
296  SDL_EVENT_CASE(SDL_AUDIODEVICEADDED) PRINT_AUDIODEV_EVENT(event); break;
297  SDL_EVENT_CASE(SDL_AUDIODEVICEREMOVED) PRINT_AUDIODEV_EVENT(event); break;
298  #undef PRINT_AUDIODEV_EVENT
299 
300  #undef SDL_EVENT_CASE
301 
302  default:
303  printf("UNKNOWN SDL EVENT #%u! (Bug? FIXME?)", (uint) event->type);
304  break;
305  }
306 
307  printf("\n");
308 }
309 #undef uint
310 #endif
311 
312 
313 
314 /* Public functions */
315 
316 void
318 {
319  const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
320  int i;
321  SDL_EventEntry *entry;
322  SDL_SysWMEntry *wmmsg;
323 
324  if (SDL_EventQ.lock) {
326  }
327 
328  SDL_AtomicSet(&SDL_EventQ.active, 0);
329 
330  if (report && SDL_atoi(report)) {
331  SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
332  SDL_EventQ.max_events_seen);
333  }
334 
335  /* Clean out EventQ */
336  for (entry = SDL_EventQ.head; entry; ) {
337  SDL_EventEntry *next = entry->next;
338  SDL_free(entry);
339  entry = next;
340  }
341  for (entry = SDL_EventQ.free; entry; ) {
342  SDL_EventEntry *next = entry->next;
343  SDL_free(entry);
344  entry = next;
345  }
346  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
347  SDL_SysWMEntry *next = wmmsg->next;
348  SDL_free(wmmsg);
349  wmmsg = next;
350  }
351  for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
352  SDL_SysWMEntry *next = wmmsg->next;
353  SDL_free(wmmsg);
354  wmmsg = next;
355  }
356 
357  SDL_AtomicSet(&SDL_EventQ.count, 0);
358  SDL_EventQ.max_events_seen = 0;
359  SDL_EventQ.head = NULL;
360  SDL_EventQ.tail = NULL;
361  SDL_EventQ.free = NULL;
362  SDL_EventQ.wmmsg_used = NULL;
363  SDL_EventQ.wmmsg_free = NULL;
364 
365  /* Clear disabled event state */
366  for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
369  }
370 
374  }
375  if (SDL_event_watchers) {
379  }
381 
382  if (SDL_EventQ.lock) {
385  SDL_EventQ.lock = NULL;
386  }
387 }
388 
389 /* This function (and associated calls) may be called more than once */
390 int
392 {
393  /* We'll leave the event queue alone, since we might have gotten
394  some important events at launch (like SDL_DROPFILE)
395 
396  FIXME: Does this introduce any other bugs with events at startup?
397  */
398 
399  /* Create the lock and set ourselves active */
400 #if !SDL_THREADS_DISABLED
401  if (!SDL_EventQ.lock) {
402  SDL_EventQ.lock = SDL_CreateMutex();
403  if (SDL_EventQ.lock == NULL) {
404  return -1;
405  }
406  }
407 
410  if (SDL_event_watchers_lock == NULL) {
411  return -1;
412  }
413  }
414 #endif /* !SDL_THREADS_DISABLED */
415 
416  /* Process most event types */
420 #if 0 /* Leave these events enabled so apps can respond to items being dragged onto them at startup */
423 #endif
424 
425  SDL_AtomicSet(&SDL_EventQ.active, 1);
426 
427  return 0;
428 }
429 
430 
431 /* Add an event to the event queue -- called with the queue locked */
432 static int
434 {
435  SDL_EventEntry *entry;
436  const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);
437  int final_count;
438 
439  if (initial_count >= SDL_MAX_QUEUED_EVENTS) {
440  SDL_SetError("Event queue is full (%d events)", initial_count);
441  return 0;
442  }
443 
444  if (SDL_EventQ.free == NULL) {
445  entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
446  if (!entry) {
447  return 0;
448  }
449  } else {
450  entry = SDL_EventQ.free;
451  SDL_EventQ.free = entry->next;
452  }
453 
454  #ifdef SDL_DEBUG_EVENTS
455  SDL_DebugPrintEvent(event);
456  #endif
457 
458  entry->event = *event;
459  if (event->type == SDL_SYSWMEVENT) {
460  entry->msg = *event->syswm.msg;
461  entry->event.syswm.msg = &entry->msg;
462  }
463 
464  if (SDL_EventQ.tail) {
465  SDL_EventQ.tail->next = entry;
466  entry->prev = SDL_EventQ.tail;
467  SDL_EventQ.tail = entry;
468  entry->next = NULL;
469  } else {
470  SDL_assert(!SDL_EventQ.head);
471  SDL_EventQ.head = entry;
472  SDL_EventQ.tail = entry;
473  entry->prev = NULL;
474  entry->next = NULL;
475  }
476 
477  final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;
478  if (final_count > SDL_EventQ.max_events_seen) {
479  SDL_EventQ.max_events_seen = final_count;
480  }
481 
482  return 1;
483 }
484 
485 /* Remove an event from the queue -- called with the queue locked */
486 static void
488 {
489  if (entry->prev) {
490  entry->prev->next = entry->next;
491  }
492  if (entry->next) {
493  entry->next->prev = entry->prev;
494  }
495 
496  if (entry == SDL_EventQ.head) {
497  SDL_assert(entry->prev == NULL);
498  SDL_EventQ.head = entry->next;
499  }
500  if (entry == SDL_EventQ.tail) {
501  SDL_assert(entry->next == NULL);
502  SDL_EventQ.tail = entry->prev;
503  }
504 
505  entry->next = SDL_EventQ.free;
506  SDL_EventQ.free = entry;
507  SDL_assert(SDL_AtomicGet(&SDL_EventQ.count) > 0);
508  SDL_AtomicAdd(&SDL_EventQ.count, -1);
509 }
510 
511 /* Lock the event queue, take a peep at it, and unlock it */
512 int
514  Uint32 minType, Uint32 maxType)
515 {
516  int i, used;
517 
518  /* Don't look after we've quit */
519  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
520  /* We get a few spurious events at shutdown, so don't warn then */
521  if (action != SDL_ADDEVENT) {
522  SDL_SetError("The event system has been shut down");
523  }
524  return (-1);
525  }
526  /* Lock the event queue */
527  used = 0;
528  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
529  if (action == SDL_ADDEVENT) {
530  for (i = 0; i < numevents; ++i) {
531  used += SDL_AddEvent(&events[i]);
532  }
533  } else {
534  SDL_EventEntry *entry, *next;
535  SDL_SysWMEntry *wmmsg, *wmmsg_next;
536  Uint32 type;
537 
538  if (action == SDL_GETEVENT) {
539  /* Clean out any used wmmsg data
540  FIXME: Do we want to retain the data for some period of time?
541  */
542  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
543  wmmsg_next = wmmsg->next;
544  wmmsg->next = SDL_EventQ.wmmsg_free;
545  SDL_EventQ.wmmsg_free = wmmsg;
546  }
547  SDL_EventQ.wmmsg_used = NULL;
548  }
549 
550  for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
551  next = entry->next;
552  type = entry->event.type;
553  if (minType <= type && type <= maxType) {
554  if (events) {
555  events[used] = entry->event;
556  if (entry->event.type == SDL_SYSWMEVENT) {
557  /* We need to copy the wmmsg somewhere safe.
558  For now we'll guarantee it's valid at least until
559  the next call to SDL_PeepEvents()
560  */
561  if (SDL_EventQ.wmmsg_free) {
562  wmmsg = SDL_EventQ.wmmsg_free;
563  SDL_EventQ.wmmsg_free = wmmsg->next;
564  } else {
565  wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
566  }
567  wmmsg->msg = *entry->event.syswm.msg;
568  wmmsg->next = SDL_EventQ.wmmsg_used;
569  SDL_EventQ.wmmsg_used = wmmsg;
570  events[used].syswm.msg = &wmmsg->msg;
571  }
572 
573  if (action == SDL_GETEVENT) {
574  SDL_CutEvent(entry);
575  }
576  }
577  ++used;
578  }
579  }
580  }
581  if (SDL_EventQ.lock) {
583  }
584  } else {
585  return SDL_SetError("Couldn't lock event queue");
586  }
587  return (used);
588 }
589 
590 SDL_bool
592 {
593  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
594 }
595 
596 SDL_bool
597 SDL_HasEvents(Uint32 minType, Uint32 maxType)
598 {
599  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
600 }
601 
602 void
604 {
606 }
607 
608 void
609 SDL_FlushEvents(Uint32 minType, Uint32 maxType)
610 {
611  /* !!! FIXME: we need to manually SDL_free() the strings in TEXTINPUT and
612  drag'n'drop events if we're flushing them without passing them to the
613  app, but I don't know if this is the right place to do that. */
614 
615  /* Don't look after we've quit */
616  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
617  return;
618  }
619 
620  /* Make sure the events are current */
621 #if 0
622  /* Actually, we can't do this since we might be flushing while processing
623  a resize event, and calling this might trigger further resize events.
624  */
625  SDL_PumpEvents();
626 #endif
627 
628  /* Lock the event queue */
629  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
630  SDL_EventEntry *entry, *next;
631  Uint32 type;
632  for (entry = SDL_EventQ.head; entry; entry = next) {
633  next = entry->next;
634  type = entry->event.type;
635  if (minType <= type && type <= maxType) {
636  SDL_CutEvent(entry);
637  }
638  }
639  if (SDL_EventQ.lock) {
641  }
642  }
643 }
644 
645 /* Run the system dependent event loops */
646 void
648 {
650 
651  /* Get events from the video subsystem */
652  if (_this) {
654  }
655 #if !SDL_JOYSTICK_DISABLED
656  /* Check for joystick state change */
659  }
660 #endif
661 
662 #if !SDL_SENSOR_DISABLED
663  /* Check for sensor state change */
666  }
667 #endif
668 
669  SDL_SendPendingQuit(); /* in case we had a signal handler fire, etc. */
670 }
671 
672 /* Public functions */
673 
674 int
676 {
677  return SDL_WaitEventTimeout(event, 0);
678 }
679 
680 int
682 {
683  return SDL_WaitEventTimeout(event, -1);
684 }
685 
686 int
688 {
689  Uint32 expiration = 0;
690 
691  if (timeout > 0)
692  expiration = SDL_GetTicks() + timeout;
693 
694  for (;;) {
695  SDL_PumpEvents();
697  case -1:
698  return 0;
699  case 0:
700  if (timeout == 0) {
701  /* Polling and no events, just return */
702  return 0;
703  }
704  if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
705  /* Timeout expired and no events */
706  return 0;
707  }
708  SDL_Delay(10);
709  break;
710  default:
711  /* Has events */
712  return 1;
713  }
714  }
715 }
716 
717 int
719 {
720  event->common.timestamp = SDL_GetTicks();
721 
727  }
728  return 0;
729  }
730 
731  if (SDL_event_watchers_count > 0) {
732  /* Make sure we only dispatch the current watcher list */
733  int i, event_watchers_count = SDL_event_watchers_count;
734 
736  for (i = 0; i < event_watchers_count; ++i) {
737  if (!SDL_event_watchers[i].removed) {
739  }
740  }
742 
744  for (i = SDL_event_watchers_count; i--; ) {
745  if (SDL_event_watchers[i].removed) {
747  if (i < SDL_event_watchers_count) {
749  }
750  }
751  }
753  }
754  }
755 
758  }
759  }
760  }
761 
762  if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
763  return -1;
764  }
765 
767 
768  return 1;
769 }
770 
771 void
773 {
775  /* Set filter and discard pending events */
777  SDL_EventOK.userdata = userdata;
779 
782  }
783  }
784 }
785 
786 SDL_bool
788 {
789  SDL_EventWatcher event_ok;
790 
792  event_ok = SDL_EventOK;
793 
796  }
797  } else {
798  SDL_zero(event_ok);
799  }
800 
801  if (filter) {
802  *filter = event_ok.callback;
803  }
804  if (userdata) {
805  *userdata = event_ok.userdata;
806  }
807  return event_ok.callback ? SDL_TRUE : SDL_FALSE;
808 }
809 
810 void
812 {
814  SDL_EventWatcher *event_watchers;
815 
816  event_watchers = SDL_realloc(SDL_event_watchers, (SDL_event_watchers_count + 1) * sizeof(*event_watchers));
817  if (event_watchers) {
818  SDL_EventWatcher *watcher;
819 
820  SDL_event_watchers = event_watchers;
822  watcher->callback = filter;
823  watcher->userdata = userdata;
824  watcher->removed = SDL_FALSE;
826  }
827 
830  }
831  }
832 }
833 
834 void
836 {
838  int i;
839 
840  for (i = 0; i < SDL_event_watchers_count; ++i) {
841  if (SDL_event_watchers[i].callback == filter && SDL_event_watchers[i].userdata == userdata) {
845  } else {
847  if (i < SDL_event_watchers_count) {
849  }
850  }
851  break;
852  }
853  }
854 
857  }
858  }
859 }
860 
861 void
863 {
864  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
865  SDL_EventEntry *entry, *next;
866  for (entry = SDL_EventQ.head; entry; entry = next) {
867  next = entry->next;
868  if (!filter(userdata, &entry->event)) {
869  SDL_CutEvent(entry);
870  }
871  }
872  if (SDL_EventQ.lock) {
874  }
875  }
876 }
877 
878 Uint8
880 {
881  const SDL_bool isdnd = ((state == SDL_DISABLE) || (state == SDL_ENABLE)) &&
882  ((type == SDL_DROPFILE) || (type == SDL_DROPTEXT));
883  Uint8 current_state;
884  Uint8 hi = ((type >> 8) & 0xff);
885  Uint8 lo = (type & 0xff);
886 
887  if (SDL_disabled_events[hi] &&
888  (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
889  current_state = SDL_DISABLE;
890  } else {
891  current_state = SDL_ENABLE;
892  }
893 
894  if (state != current_state)
895  {
896  switch (state) {
897  case SDL_DISABLE:
898  /* Disable this event type and discard pending events */
899  if (!SDL_disabled_events[hi]) {
901  if (!SDL_disabled_events[hi]) {
902  /* Out of memory, nothing we can do... */
903  break;
904  }
905  }
906  SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
908  break;
909  case SDL_ENABLE:
910  SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
911  break;
912  default:
913  /* Querying state... */
914  break;
915  }
916  }
917 
918  /* turn off drag'n'drop support if we've disabled the events.
919  This might change some UI details at the OS level. */
920  if (isdnd) {
922  }
923 
924  return current_state;
925 }
926 
927 Uint32
928 SDL_RegisterEvents(int numevents)
929 {
930  Uint32 event_base;
931 
932  if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
933  event_base = SDL_userevents;
934  SDL_userevents += numevents;
935  } else {
936  event_base = (Uint32)-1;
937  }
938  return event_base;
939 }
940 
941 int
943 {
944  int posted;
945 
946  posted = 0;
947  if (SDL_GetEventState(eventType) == SDL_ENABLE) {
949  event.type = eventType;
950  posted = (SDL_PushEvent(&event) > 0);
951  }
952  return (posted);
953 }
954 
955 int
957 {
958  int posted;
959 
960  posted = 0;
963  SDL_memset(&event, 0, sizeof(event));
964  event.type = SDL_SYSWMEVENT;
965  event.syswm.msg = message;
966  posted = (SDL_PushEvent(&event) > 0);
967  }
968  /* Update internal event state */
969  return (posted);
970 }
971 
972 int
974 {
976 }
977 
978 /* vi: set ts=4 sw=4 expandtab: */
SDL.h
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_SysWMmsg
Definition: SDL_syswm.h:136
SDL_SysWMEntry
Definition: SDL_events.c:71
SDL_Event::type
Uint32 type
Definition: SDL_events.h:559
SDL_CONTROLLERDEVICEREMOVED
@ SDL_CONTROLLERDEVICEREMOVED
Definition: SDL_events.h:124
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:386
SDL_GetEventFilter
SDL_bool SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata)
Definition: SDL_events.c:787
SDL_SendSysWMEvent
int SDL_SendSysWMEvent(SDL_SysWMmsg *message)
Definition: SDL_events.c:956
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:42
SDL_events.h
SDL_EventWatcher::removed
SDL_bool removed
Definition: SDL_events.c:44
SDL_SendPendingQuit
void SDL_SendPendingQuit(void)
Definition: SDL_quit.c:144
SDL_APP_TERMINATING
@ SDL_APP_TERMINATING
Definition: SDL_events.h:63
SDL_APP_DIDENTERBACKGROUND
@ SDL_APP_DIDENTERBACKGROUND
Definition: SDL_events.h:75
SDL_APP_DIDENTERFOREGROUND
@ SDL_APP_DIDENTERFOREGROUND
Definition: SDL_events.h:83
max_events_seen
int max_events_seen
Definition: SDL_events.c:81
tail
SDL_EventEntry * tail
Definition: SDL_events.c:83
SDL_AddEvent
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:433
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:43
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:50
SDL_ADDEVENT
@ SDL_ADDEVENT
Definition: SDL_events.h:612
NULL
#define NULL
Definition: begin_code.h:164
message
GLuint GLsizei const GLchar * message
Definition: SDL_opengl_glext.h:2483
SDL_FilterEvents
void SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:862
SDL_WINDOWEVENT_FOCUS_LOST
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
timeout
GLbitfield GLuint64 timeout
Definition: SDL_opengl_glext.h:1483
SDL_CutEvent
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:487
SDL_KEYUP
@ SDL_KEYUP
Definition: SDL_events.h:97
SDL_WINDOWEVENT_CLOSE
@ SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:167
SDL_CONTROLLERBUTTONDOWN
@ SDL_CONTROLLERBUTTONDOWN
Definition: SDL_events.h:121
SDL_SensorUpdate
#define SDL_SensorUpdate
Definition: SDL_dynapi_overrides.h:696
SDL_EventFilter
int(* SDL_EventFilter)(void *userdata, SDL_Event *event)
Definition: SDL_events.h:696
SDL_WINDOWEVENT_ENTER
@ SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:163
SDL_DOLLARRECORD
@ SDL_DOLLARRECORD
Definition: SDL_events.h:134
SDL_mutex
Definition: SDL_sysmutex.c:30
SDL_ToggleDragAndDropSupport
void SDL_ToggleDragAndDropSupport(void)
Definition: SDL_video.c:1374
SDL_MOUSEBUTTONUP
@ SDL_MOUSEBUTTONUP
Definition: SDL_events.h:107
SDL_realloc
#define SDL_realloc
Definition: SDL_dynapi_overrides.h:376
SDL_WINDOWEVENT_RESIZED
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
SDL_TEXTEDITING
@ SDL_TEXTEDITING
Definition: SDL_events.h:98
SDL_CreateMutex
#define SDL_CreateMutex
Definition: SDL_dynapi_overrides.h:259
wmmsg_free
SDL_SysWMEntry * wmmsg_free
Definition: SDL_events.c:86
SDL_SysWMmsg::msg
union SDL_SysWMmsg::@16 msg
callback
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
SDL_EventQ
static struct @21 SDL_EventQ
SDL_GestureProcessEvent
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:538
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:756
SDL_JOYDEVICEREMOVED
@ SDL_JOYDEVICEREMOVED
Definition: SDL_events.h:117
SDL_WINDOWEVENT_MOVED
@ SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:153
SDL_GetHint
#define SDL_GetHint
Definition: SDL_dynapi_overrides.h:191
SDL_DisabledEventBlock::bits
Uint32 bits[8]
Definition: SDL_events.c:55
SDL_EventEntry
Definition: SDL_events.c:63
SDL_AUDIODEVICEADDED
@ SDL_AUDIODEVICEADDED
Definition: SDL_events.h:147
SDL_KEYDOWN
@ SDL_KEYDOWN
Definition: SDL_events.h:96
SDL_APP_LOWMEMORY
@ SDL_APP_LOWMEMORY
Definition: SDL_events.h:67
SDL_EventWatcher
Definition: SDL_events.c:41
SDL_CONTROLLERDEVICEADDED
@ SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:123
SDL_FIRSTEVENT
@ SDL_FIRSTEVENT
Definition: SDL_events.h:57
SDL_APP_WILLENTERFOREGROUND
@ SDL_APP_WILLENTERFOREGROUND
Definition: SDL_events.h:79
SDL_CONTROLLERAXISMOTION
@ SDL_CONTROLLERAXISMOTION
Definition: SDL_events.h:120
SDL_SysWMEvent::msg
SDL_SysWMmsg * msg
Definition: SDL_events.h:551
SDL_RENDER_TARGETS_RESET
@ SDL_RENDER_TARGETS_RESET
Definition: SDL_events.h:154
filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: SDL_opengl_glext.h:1184
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_WINDOWEVENT_SHOWN
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
SDL_EventEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:65
SDL_FINGERUP
@ SDL_FINGERUP
Definition: SDL_events.h:129
SDL_HasEvents
SDL_bool SDL_HasEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:597
SDL_QUERY
#define SDL_QUERY
Definition: SDL_events.h:753
SDL_PushEvent
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:718
SDL_event_watchers_removed
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:52
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_SysWMEntry::next
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:73
SDL_MOUSEMOTION
@ SDL_MOUSEMOTION
Definition: SDL_events.h:105
SDL_FINGERDOWN
@ SDL_FINGERDOWN
Definition: SDL_events.h:128
SDL_thread.h
_this
static SDL_VideoDevice * _this
Definition: SDL_video.c:121
SDL_WaitEvent
int SDL_WaitEvent(SDL_Event *event)
Waits indefinitely for the next available event.
Definition: SDL_events.c:681
SDL_CONTROLLERBUTTONUP
@ SDL_CONTROLLERBUTTONUP
Definition: SDL_events.h:122
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:769
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_PollEvent
int SDL_PollEvent(SDL_Event *event)
Polls for currently pending events.
Definition: SDL_events.c:675
SDL_eventaction
SDL_eventaction
Definition: SDL_events.h:611
SDL_TEXTINPUT
@ SDL_TEXTINPUT
Definition: SDL_events.h:99
SDL_DROPCOMPLETE
@ SDL_DROPCOMPLETE
Definition: SDL_events.h:144
SDL_event_watchers_dispatching
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:51
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_SENSORUPDATE
@ SDL_SENSORUPDATE
Definition: SDL_events.h:151
SDL_RegisterEvents
Uint32 SDL_RegisterEvents(int numevents)
Definition: SDL_events.c:928
active
SDL_atomic_t active
Definition: SDL_events.c:79
SDL_DROPTEXT
@ SDL_DROPTEXT
Definition: SDL_events.h:142
SDL_QUIT
@ SDL_QUIT
Definition: SDL_events.h:60
SDL_WINDOWEVENT_EXPOSED
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:151
SDL_MOUSEWHEEL
@ SDL_MOUSEWHEEL
Definition: SDL_events.h:108
head
SDL_EventEntry * head
Definition: SDL_events.c:82
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_FINGERMOTION
@ SDL_FINGERMOTION
Definition: SDL_events.h:130
SDL_memmove
#define SDL_memmove
Definition: SDL_dynapi_overrides.h:388
SDL_WINDOWEVENT_HIT_TEST
@ SDL_WINDOWEVENT_HIT_TEST
Definition: SDL_video.h:169
SDL_JOYAXISMOTION
@ SDL_JOYAXISMOTION
Definition: SDL_events.h:111
SDL_APP_WILLENTERBACKGROUND
@ SDL_APP_WILLENTERBACKGROUND
Definition: SDL_events.h:71
SDL_WINDOWEVENT_SIZE_CHANGED
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156
SDL_TRUE
@ SDL_TRUE
Definition: SDL_stdinc.h:164
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
SDL_EventEntry::event
SDL_Event event
Definition: SDL_events.c:64
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
SDL_DISABLE
#define SDL_DISABLE
Definition: SDL_events.h:755
SDL_WINDOWEVENT_MINIMIZED
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:159
SDL_WINDOWEVENT_TAKE_FOCUS
@ SDL_WINDOWEVENT_TAKE_FOCUS
Definition: SDL_video.h:168
SDL_SetEventFilter
void SDL_SetEventFilter(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:772
SDL_VideoDevice
Definition: SDL_sysvideo.h:149
SDL_JoystickUpdate
#define SDL_JoystickUpdate
Definition: SDL_dynapi_overrides.h:209
SDL_DROPBEGIN
@ SDL_DROPBEGIN
Definition: SDL_events.h:143
SDL_KEYMAPCHANGED
@ SDL_KEYMAPCHANGED
Definition: SDL_events.h:100
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_atoi
#define SDL_atoi
Definition: SDL_dynapi_overrides.h:410
SDL_AddEventWatch
void SDL_AddEventWatch(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:811
SDL_FlushEvent
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:603
SDL_userevents
static Uint32 SDL_userevents
Definition: SDL_events.c:59
SDL_EventEntry::prev
struct _SDL_EventEntry * prev
Definition: SDL_events.c:66
events
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:35
SDL_EventState
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:879
SDL_AtomicAdd
#define SDL_AtomicAdd
Definition: SDL_dynapi_overrides.h:69
wmmsg_used
SDL_SysWMEntry * wmmsg_used
Definition: SDL_events.c:85
SDL_WINDOWEVENT_NONE
@ SDL_WINDOWEVENT_NONE
Definition: SDL_video.h:148
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
SDL_JOYBUTTONUP
@ SDL_JOYBUTTONUP
Definition: SDL_events.h:115
SDL_disabled_events
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
SDL_StopEventLoop
void SDL_StopEventLoop(void)
Definition: SDL_events.c:317
SDL_MULTIGESTURE
@ SDL_MULTIGESTURE
Definition: SDL_events.h:135
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_JoystickEventState
#define SDL_JoystickEventState
Definition: SDL_dynapi_overrides.h:210
SDL_RENDER_DEVICE_RESET
@ SDL_RENDER_DEVICE_RESET
Definition: SDL_events.h:155
SDL_atomic_t
A type representing an atomic integer value. It is a struct so people don't accidentally use numeric ...
Definition: SDL_atomic.h:198
SDL_DestroyMutex
#define SDL_DestroyMutex
Definition: SDL_dynapi_overrides.h:263
SDL_SysWMEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:72
count
SDL_atomic_t count
Definition: SDL_events.c:80
SDL_GETEVENT
@ SDL_GETEVENT
Definition: SDL_events.h:614
SDL_SendKeymapChangedEvent
int SDL_SendKeymapChangedEvent(void)
Definition: SDL_events.c:973
SDL_events_c.h
SDL_MOUSEBUTTONDOWN
@ SDL_MOUSEBUTTONDOWN
Definition: SDL_events.h:106
SDL_JOYDEVICEADDED
@ SDL_JOYDEVICEADDED
Definition: SDL_events.h:116
SDL_SYSWMEVENT
@ SDL_SYSWMEVENT
Definition: SDL_events.h:93
SDL_WaitEventTimeout
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event.
Definition: SDL_events.c:687
SDL_EventType
SDL_EventType
The types of events that can be delivered.
Definition: SDL_events.h:56
SDL_PumpEvents
void SDL_PumpEvents(void)
Definition: SDL_events.c:647
SDL_TICKS_PASSED
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
Definition: SDL_timer.h:56
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:162
SDL_HasEvent
SDL_bool SDL_HasEvent(Uint32 type)
Definition: SDL_events.c:591
SDL_MOUSEWHEEL_NORMAL
@ SDL_MOUSEWHEEL_NORMAL
Definition: SDL_mouse.h:68
bits
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
Definition: SDL_opengl_glext.h:6176
SDL_WINDOWEVENT_HIDDEN
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
SDL_Event::syswm
SDL_SysWMEvent syswm
Definition: SDL_events.h:581
SDL_Event
General event structure.
Definition: SDL_events.h:558
SDL_WINDOWEVENT
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
SDL_GetVideoDevice
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:586
SDL_WINDOWEVENT_RESTORED
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:161
SDL_FALSE
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SDL_AtomicSet
#define SDL_AtomicSet
Definition: SDL_dynapi_overrides.h:67
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_JOYBUTTONDOWN
@ SDL_JOYBUTTONDOWN
Definition: SDL_events.h:114
SDL_AtomicGet
#define SDL_AtomicGet
Definition: SDL_dynapi_overrides.h:68
SDL_DisabledEventBlock
Definition: SDL_events.c:54
SDL_AUDIODEVICEREMOVED
@ SDL_AUDIODEVICEREMOVED
Definition: SDL_events.h:148
SDL_LASTEVENT
@ SDL_LASTEVENT
Definition: SDL_events.h:165
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_CONTROLLERDEVICEREMAPPED
@ SDL_CONTROLLERDEVICEREMAPPED
Definition: SDL_events.h:125
SDL_WINDOWEVENT_FOCUS_GAINED
@ SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
SDL_VideoDevice::PumpEvents
void(* PumpEvents)(_THIS)
Definition: SDL_sysvideo.h:281
SDL_SendAppEvent
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:942
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:513
SDL_FlushEvents
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:609
SDL_DelEventWatch
void SDL_DelEventWatch(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:835
free
SDL_EventEntry * free
Definition: SDL_events.c:84
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_JOYHATMOTION
@ SDL_JOYHATMOTION
Definition: SDL_events.h:113
SDL_DOLLARGESTURE
@ SDL_DOLLARGESTURE
Definition: SDL_events.h:133
SDL_DROPFILE
@ SDL_DROPFILE
Definition: SDL_events.h:141
SDL_MAX_QUEUED_EVENTS
#define SDL_MAX_QUEUED_EVENTS
Definition: SDL_events.c:39
SDL_StartEventLoop
int SDL_StartEventLoop(void)
Definition: SDL_events.c:391
SDL_WINDOWEVENT_MAXIMIZED
@ SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:160
SDL_JOYBALLMOTION
@ SDL_JOYBALLMOTION
Definition: SDL_events.h:112
SDL_CLIPBOARDUPDATE
@ SDL_CLIPBOARDUPDATE
Definition: SDL_events.h:138
SDL_PEEKEVENT
@ SDL_PEEKEVENT
Definition: SDL_events.h:613
SDL_WINDOWEVENT_LEAVE
@ SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:164
SDL_USEREVENT
@ SDL_USEREVENT
Definition: SDL_events.h:160
SDL_syswm.h
lock
SDL_mutex * lock
Definition: SDL_events.c:78