SDL  2.0
SDL_events.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2020 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 #undef SDL_PRIs64
37 #ifdef __WIN32__
38 #define SDL_PRIs64 "I64d"
39 #else
40 #define SDL_PRIs64 "lld"
41 #endif
42 
43 /* An arbitrary limit so we don't have unbounded growth */
44 #define SDL_MAX_QUEUED_EVENTS 65535
45 
46 typedef struct SDL_EventWatcher {
48  void *userdata;
51 
55 static int SDL_event_watchers_count = 0;
58 
59 typedef struct {
62 
65 
66 /* Private data -- event queue */
67 typedef struct _SDL_EventEntry
68 {
71  struct _SDL_EventEntry *prev;
72  struct _SDL_EventEntry *next;
74 
75 typedef struct _SDL_SysWMEntry
76 {
78  struct _SDL_SysWMEntry *next;
80 
81 static struct
82 {
92 } SDL_EventQ = { NULL, { 1 }, { 0 }, 0, NULL, NULL, NULL, NULL, NULL };
93 
94 
95 /* 0 (default) means no logging, 1 means logging, 2 means logging with mouse and finger motion */
96 static int SDL_DoEventLogging = 0;
97 
98 static void SDLCALL
99 SDL_EventLoggingChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
100 {
101  SDL_DoEventLogging = (hint && *hint) ? SDL_max(SDL_min(SDL_atoi(hint), 2), 0) : 0;
102 }
103 
104 static void
106 {
107  char name[32];
108  char details[128];
109 
110  /* mouse/finger motion are spammy, ignore these if they aren't demanded. */
111  if ( (SDL_DoEventLogging < 2) &&
112  ( (event->type == SDL_MOUSEMOTION) ||
113  (event->type == SDL_FINGERMOTION) ) ) {
114  return;
115  }
116 
117  /* this is to make SDL_snprintf() calls cleaner. */
118  #define uint unsigned int
119 
120  name[0] = '\0';
121  details[0] = '\0';
122 
123  /* !!! FIXME: This code is kinda ugly, sorry. */
124 
125  if ((event->type >= SDL_USEREVENT) && (event->type <= SDL_LASTEVENT)) {
126  char plusstr[16];
127  SDL_strlcpy(name, "SDL_USEREVENT", sizeof (name));
128  if (event->type > SDL_USEREVENT) {
129  SDL_snprintf(plusstr, sizeof (plusstr), "+%u", ((uint) event->type) - SDL_USEREVENT);
130  } else {
131  plusstr[0] = '\0';
132  }
133  SDL_snprintf(details, sizeof (details), "%s (timestamp=%u windowid=%u code=%d data1=%p data2=%p)",
134  plusstr, (uint) event->user.timestamp, (uint) event->user.windowID,
135  (int) event->user.code, event->user.data1, event->user.data2);
136  }
137 
138  switch (event->type) {
139  #define SDL_EVENT_CASE(x) case x: SDL_strlcpy(name, #x, sizeof (name));
140  SDL_EVENT_CASE(SDL_FIRSTEVENT) SDL_strlcpy(details, " (THIS IS PROBABLY A BUG!)", sizeof (details)); break;
141  SDL_EVENT_CASE(SDL_QUIT) SDL_snprintf(details, sizeof (details), " (timestamp=%u)", (uint) event->quit.timestamp); break;
152 
154  char name2[64];
155  switch(event->window.event) {
156  case SDL_WINDOWEVENT_NONE: SDL_strlcpy(name2, "SDL_WINDOWEVENT_NONE (THIS IS PROBABLY A BUG!)", sizeof (name2)); break;
157  #define SDL_WINDOWEVENT_CASE(x) case x: SDL_strlcpy(name2, #x, sizeof (name2)); break
174  #undef SDL_WINDOWEVENT_CASE
175  default: SDL_strlcpy(name2, "UNKNOWN (bug? fixme?)", sizeof (name2)); break;
176  }
177  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u event=%s data1=%d data2=%d)",
178  (uint) event->window.timestamp, (uint) event->window.windowID, name2, (int) event->window.data1, (int) event->window.data2);
179  break;
180  }
181 
183  /* !!! FIXME: we don't delve further at the moment. */
184  SDL_snprintf(details, sizeof (details), " (timestamp=%u)", (uint) event->syswm.timestamp);
185  break;
186 
187  #define PRINT_KEY_EVENT(event) \
188  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u state=%s repeat=%s scancode=%u keycode=%u mod=%u)", \
189  (uint) event->key.timestamp, (uint) event->key.windowID, \
190  event->key.state == SDL_PRESSED ? "pressed" : "released", \
191  event->key.repeat ? "true" : "false", \
192  (uint) event->key.keysym.scancode, \
193  (uint) event->key.keysym.sym, \
194  (uint) event->key.keysym.mod)
197  #undef PRINT_KEY_EVENT
198 
200  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u text='%s' start=%d length=%d)",
201  (uint) event->edit.timestamp, (uint) event->edit.windowID,
202  event->edit.text, (int) event->edit.start, (int) event->edit.length);
203  break;
204 
206  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u text='%s')", (uint) event->text.timestamp, (uint) event->text.windowID, event->text.text);
207  break;
208 
209 
211  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u which=%u state=%u x=%d y=%d xrel=%d yrel=%d)",
212  (uint) event->motion.timestamp, (uint) event->motion.windowID,
213  (uint) event->motion.which, (uint) event->motion.state,
214  (int) event->motion.x, (int) event->motion.y,
215  (int) event->motion.xrel, (int) event->motion.yrel);
216  break;
217 
218  #define PRINT_MBUTTON_EVENT(event) \
219  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u which=%u button=%u state=%s clicks=%u x=%d y=%d)", \
220  (uint) event->button.timestamp, (uint) event->button.windowID, \
221  (uint) event->button.which, (uint) event->button.button, \
222  event->button.state == SDL_PRESSED ? "pressed" : "released", \
223  (uint) event->button.clicks, (int) event->button.x, (int) event->button.y)
226  #undef PRINT_MBUTTON_EVENT
227 
228 
230  SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u which=%u x=%d y=%d direction=%s)",
231  (uint) event->wheel.timestamp, (uint) event->wheel.windowID,
232  (uint) event->wheel.which, (int) event->wheel.x, (int) event->wheel.y,
233  event->wheel.direction == SDL_MOUSEWHEEL_NORMAL ? "normal" : "flipped");
234  break;
235 
237  SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d axis=%u value=%d)",
238  (uint) event->jaxis.timestamp, (int) event->jaxis.which,
239  (uint) event->jaxis.axis, (int) event->jaxis.value);
240  break;
241 
243  SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d ball=%u xrel=%d yrel=%d)",
244  (uint) event->jball.timestamp, (int) event->jball.which,
245  (uint) event->jball.ball, (int) event->jball.xrel, (int) event->jball.yrel);
246  break;
247 
249  SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d hat=%u value=%u)",
250  (uint) event->jhat.timestamp, (int) event->jhat.which,
251  (uint) event->jhat.hat, (uint) event->jhat.value);
252  break;
253 
254  #define PRINT_JBUTTON_EVENT(event) \
255  SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d button=%u state=%s)", \
256  (uint) event->jbutton.timestamp, (int) event->jbutton.which, \
257  (uint) event->jbutton.button, event->jbutton.state == SDL_PRESSED ? "pressed" : "released")
260  #undef PRINT_JBUTTON_EVENT
261 
262  #define PRINT_JOYDEV_EVENT(event) SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->jdevice.timestamp, (int) event->jdevice.which)
265  #undef PRINT_JOYDEV_EVENT
266 
268  SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d axis=%u value=%d)",
269  (uint) event->caxis.timestamp, (int) event->caxis.which,
270  (uint) event->caxis.axis, (int) event->caxis.value);
271  break;
272 
273  #define PRINT_CBUTTON_EVENT(event) \
274  SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d button=%u state=%s)", \
275  (uint) event->cbutton.timestamp, (int) event->cbutton.which, \
276  (uint) event->cbutton.button, event->cbutton.state == SDL_PRESSED ? "pressed" : "released")
279  #undef PRINT_CBUTTON_EVENT
280 
281  #define PRINT_CONTROLLERDEV_EVENT(event) SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->cdevice.timestamp, (int) event->cdevice.which)
285  #undef PRINT_CONTROLLERDEV_EVENT
286 
287  #define PRINT_FINGER_EVENT(event) \
288  SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" fingerid=%"SDL_PRIs64" x=%f y=%f dx=%f dy=%f pressure=%f)", \
289  (uint) event->tfinger.timestamp, (long long)event->tfinger.touchId, \
290  (long long)event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, \
291  event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure)
295  #undef PRINT_FINGER_EVENT
296 
297  #define PRINT_DOLLAR_EVENT(event) \
298  SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" gestureid=%"SDL_PRIs64" numfingers=%u error=%f x=%f y=%f)", \
299  (uint) event->dgesture.timestamp, (long long)event->dgesture.touchId, \
300  (long long)event->dgesture.gestureId, (uint) event->dgesture.numFingers, \
301  event->dgesture.error, event->dgesture.x, event->dgesture.y);
304  #undef PRINT_DOLLAR_EVENT
305 
307  SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" dtheta=%f ddist=%f x=%f y=%f numfingers=%u)",
308  (uint) event->mgesture.timestamp, (long long)event->mgesture.touchId,
309  event->mgesture.dTheta, event->mgesture.dDist,
310  event->mgesture.x, event->mgesture.y, (uint) event->mgesture.numFingers);
311  break;
312 
313  #define PRINT_DROP_EVENT(event) SDL_snprintf(details, sizeof (details), " (file='%s' timestamp=%u windowid=%u)", event->drop.file, (uint) event->drop.timestamp, (uint) event->drop.windowID)
318  #undef PRINT_DROP_EVENT
319 
320  #define PRINT_AUDIODEV_EVENT(event) SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%u iscapture=%s)", (uint) event->adevice.timestamp, (uint) event->adevice.which, event->adevice.iscapture ? "true" : "false");
323  #undef PRINT_AUDIODEV_EVENT
324 
325  #undef SDL_EVENT_CASE
326 
327  default:
328  if (!name[0]) {
329  SDL_strlcpy(name, "UNKNOWN", sizeof (name));
330  SDL_snprintf(details, sizeof (details), " #%u! (Bug? FIXME?)", (uint) event->type);
331  }
332  break;
333  }
334 
335  if (name[0]) {
336  SDL_Log("SDL EVENT: %s%s", name, details);
337  }
338 
339  #undef uint
340 }
341 
342 
343 
344 /* Public functions */
345 
346 void
348 {
349  const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
350  int i;
351  SDL_EventEntry *entry;
352  SDL_SysWMEntry *wmmsg;
353 
354  if (SDL_EventQ.lock) {
356  }
357 
358  SDL_AtomicSet(&SDL_EventQ.active, 0);
359 
360  if (report && SDL_atoi(report)) {
361  SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
362  SDL_EventQ.max_events_seen);
363  }
364 
365  /* Clean out EventQ */
366  for (entry = SDL_EventQ.head; entry; ) {
367  SDL_EventEntry *next = entry->next;
368  SDL_free(entry);
369  entry = next;
370  }
371  for (entry = SDL_EventQ.free; entry; ) {
372  SDL_EventEntry *next = entry->next;
373  SDL_free(entry);
374  entry = next;
375  }
376  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
377  SDL_SysWMEntry *next = wmmsg->next;
378  SDL_free(wmmsg);
379  wmmsg = next;
380  }
381  for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
382  SDL_SysWMEntry *next = wmmsg->next;
383  SDL_free(wmmsg);
384  wmmsg = next;
385  }
386 
387  SDL_AtomicSet(&SDL_EventQ.count, 0);
388  SDL_EventQ.max_events_seen = 0;
389  SDL_EventQ.head = NULL;
390  SDL_EventQ.tail = NULL;
391  SDL_EventQ.free = NULL;
392  SDL_EventQ.wmmsg_used = NULL;
393  SDL_EventQ.wmmsg_free = NULL;
394 
395  /* Clear disabled event state */
396  for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
399  }
400 
404  }
405  if (SDL_event_watchers) {
409  }
411 
412  if (SDL_EventQ.lock) {
415  SDL_EventQ.lock = NULL;
416  }
417 }
418 
419 /* This function (and associated calls) may be called more than once */
420 int
422 {
423  /* We'll leave the event queue alone, since we might have gotten
424  some important events at launch (like SDL_DROPFILE)
425 
426  FIXME: Does this introduce any other bugs with events at startup?
427  */
428 
429  /* Create the lock and set ourselves active */
430 #if !SDL_THREADS_DISABLED
431  if (!SDL_EventQ.lock) {
432  SDL_EventQ.lock = SDL_CreateMutex();
433  if (SDL_EventQ.lock == NULL) {
434  return -1;
435  }
436  }
437 
440  if (SDL_event_watchers_lock == NULL) {
441  return -1;
442  }
443  }
444 #endif /* !SDL_THREADS_DISABLED */
445 
446  /* Process most event types */
450 #if 0 /* Leave these events enabled so apps can respond to items being dragged onto them at startup */
453 #endif
454 
455  SDL_AtomicSet(&SDL_EventQ.active, 1);
456 
457  return 0;
458 }
459 
460 
461 /* Add an event to the event queue -- called with the queue locked */
462 static int
464 {
465  SDL_EventEntry *entry;
466  const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);
467  int final_count;
468 
469  if (initial_count >= SDL_MAX_QUEUED_EVENTS) {
470  SDL_SetError("Event queue is full (%d events)", initial_count);
471  return 0;
472  }
473 
474  if (SDL_EventQ.free == NULL) {
475  entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
476  if (!entry) {
477  return 0;
478  }
479  } else {
480  entry = SDL_EventQ.free;
481  SDL_EventQ.free = entry->next;
482  }
483 
484  if (SDL_DoEventLogging) {
486  }
487 
488  entry->event = *event;
489  if (event->type == SDL_SYSWMEVENT) {
490  entry->msg = *event->syswm.msg;
491  entry->event.syswm.msg = &entry->msg;
492  }
493 
494  if (SDL_EventQ.tail) {
495  SDL_EventQ.tail->next = entry;
496  entry->prev = SDL_EventQ.tail;
497  SDL_EventQ.tail = entry;
498  entry->next = NULL;
499  } else {
500  SDL_assert(!SDL_EventQ.head);
501  SDL_EventQ.head = entry;
502  SDL_EventQ.tail = entry;
503  entry->prev = NULL;
504  entry->next = NULL;
505  }
506 
507  final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;
508  if (final_count > SDL_EventQ.max_events_seen) {
509  SDL_EventQ.max_events_seen = final_count;
510  }
511 
512  return 1;
513 }
514 
515 /* Remove an event from the queue -- called with the queue locked */
516 static void
518 {
519  if (entry->prev) {
520  entry->prev->next = entry->next;
521  }
522  if (entry->next) {
523  entry->next->prev = entry->prev;
524  }
525 
526  if (entry == SDL_EventQ.head) {
527  SDL_assert(entry->prev == NULL);
528  SDL_EventQ.head = entry->next;
529  }
530  if (entry == SDL_EventQ.tail) {
531  SDL_assert(entry->next == NULL);
532  SDL_EventQ.tail = entry->prev;
533  }
534 
535  entry->next = SDL_EventQ.free;
536  SDL_EventQ.free = entry;
537  SDL_assert(SDL_AtomicGet(&SDL_EventQ.count) > 0);
538  SDL_AtomicAdd(&SDL_EventQ.count, -1);
539 }
540 
541 /* Lock the event queue, take a peep at it, and unlock it */
542 int
544  Uint32 minType, Uint32 maxType)
545 {
546  int i, used;
547 
548  /* Don't look after we've quit */
549  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
550  /* We get a few spurious events at shutdown, so don't warn then */
551  if (action != SDL_ADDEVENT) {
552  SDL_SetError("The event system has been shut down");
553  }
554  return (-1);
555  }
556  /* Lock the event queue */
557  used = 0;
558  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
559  if (action == SDL_ADDEVENT) {
560  for (i = 0; i < numevents; ++i) {
561  used += SDL_AddEvent(&events[i]);
562  }
563  } else {
564  SDL_EventEntry *entry, *next;
565  SDL_SysWMEntry *wmmsg, *wmmsg_next;
566  Uint32 type;
567 
568  if (action == SDL_GETEVENT) {
569  /* Clean out any used wmmsg data
570  FIXME: Do we want to retain the data for some period of time?
571  */
572  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
573  wmmsg_next = wmmsg->next;
574  wmmsg->next = SDL_EventQ.wmmsg_free;
575  SDL_EventQ.wmmsg_free = wmmsg;
576  }
577  SDL_EventQ.wmmsg_used = NULL;
578  }
579 
580  for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
581  next = entry->next;
582  type = entry->event.type;
583  if (minType <= type && type <= maxType) {
584  if (events) {
585  events[used] = entry->event;
586  if (entry->event.type == SDL_SYSWMEVENT) {
587  /* We need to copy the wmmsg somewhere safe.
588  For now we'll guarantee it's valid at least until
589  the next call to SDL_PeepEvents()
590  */
591  if (SDL_EventQ.wmmsg_free) {
592  wmmsg = SDL_EventQ.wmmsg_free;
593  SDL_EventQ.wmmsg_free = wmmsg->next;
594  } else {
595  wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
596  }
597  wmmsg->msg = *entry->event.syswm.msg;
598  wmmsg->next = SDL_EventQ.wmmsg_used;
599  SDL_EventQ.wmmsg_used = wmmsg;
600  events[used].syswm.msg = &wmmsg->msg;
601  }
602 
603  if (action == SDL_GETEVENT) {
604  SDL_CutEvent(entry);
605  }
606  }
607  ++used;
608  }
609  }
610  }
611  if (SDL_EventQ.lock) {
613  }
614  } else {
615  return SDL_SetError("Couldn't lock event queue");
616  }
617  return (used);
618 }
619 
620 SDL_bool
622 {
623  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
624 }
625 
626 SDL_bool
627 SDL_HasEvents(Uint32 minType, Uint32 maxType)
628 {
629  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
630 }
631 
632 void
634 {
636 }
637 
638 void
639 SDL_FlushEvents(Uint32 minType, Uint32 maxType)
640 {
641  /* !!! FIXME: we need to manually SDL_free() the strings in TEXTINPUT and
642  drag'n'drop events if we're flushing them without passing them to the
643  app, but I don't know if this is the right place to do that. */
644 
645  /* Don't look after we've quit */
646  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
647  return;
648  }
649 
650  /* Make sure the events are current */
651 #if 0
652  /* Actually, we can't do this since we might be flushing while processing
653  a resize event, and calling this might trigger further resize events.
654  */
655  SDL_PumpEvents();
656 #endif
657 
658  /* Lock the event queue */
659  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
660  SDL_EventEntry *entry, *next;
661  Uint32 type;
662  for (entry = SDL_EventQ.head; entry; entry = next) {
663  next = entry->next;
664  type = entry->event.type;
665  if (minType <= type && type <= maxType) {
666  SDL_CutEvent(entry);
667  }
668  }
669  if (SDL_EventQ.lock) {
671  }
672  }
673 }
674 
675 /* Run the system dependent event loops */
676 void
678 {
680 
681  /* Get events from the video subsystem */
682  if (_this) {
684  }
685 #if !SDL_JOYSTICK_DISABLED
686  /* Check for joystick state change */
689  }
690 #endif
691 
692 #if !SDL_SENSOR_DISABLED
693  /* Check for sensor state change */
696  }
697 #endif
698 
699  SDL_SendPendingSignalEvents(); /* in case we had a signal handler fire, etc. */
700 }
701 
702 /* Public functions */
703 
704 int
706 {
707  return SDL_WaitEventTimeout(event, 0);
708 }
709 
710 int
712 {
713  return SDL_WaitEventTimeout(event, -1);
714 }
715 
716 int
718 {
719  Uint32 expiration = 0;
720 
721  if (timeout > 0)
722  expiration = SDL_GetTicks() + timeout;
723 
724  for (;;) {
725  SDL_PumpEvents();
727  case -1:
728  return 0;
729  case 0:
730  if (timeout == 0) {
731  /* Polling and no events, just return */
732  return 0;
733  }
734  if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
735  /* Timeout expired and no events */
736  return 0;
737  }
738  SDL_Delay(1);
739  break;
740  default:
741  /* Has events */
742  return 1;
743  }
744  }
745 }
746 
747 int
749 {
750  event->common.timestamp = SDL_GetTicks();
751 
757  }
758  return 0;
759  }
760 
761  if (SDL_event_watchers_count > 0) {
762  /* Make sure we only dispatch the current watcher list */
763  int i, event_watchers_count = SDL_event_watchers_count;
764 
766  for (i = 0; i < event_watchers_count; ++i) {
767  if (!SDL_event_watchers[i].removed) {
769  }
770  }
772 
774  for (i = SDL_event_watchers_count; i--; ) {
775  if (SDL_event_watchers[i].removed) {
777  if (i < SDL_event_watchers_count) {
779  }
780  }
781  }
783  }
784  }
785 
788  }
789  }
790  }
791 
792  if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
793  return -1;
794  }
795 
797 
798  return 1;
799 }
800 
801 void
803 {
805  /* Set filter and discard pending events */
807  SDL_EventOK.userdata = userdata;
809 
812  }
813  }
814 }
815 
816 SDL_bool
818 {
819  SDL_EventWatcher event_ok;
820 
822  event_ok = SDL_EventOK;
823 
826  }
827  } else {
828  SDL_zero(event_ok);
829  }
830 
831  if (filter) {
832  *filter = event_ok.callback;
833  }
834  if (userdata) {
835  *userdata = event_ok.userdata;
836  }
837  return event_ok.callback ? SDL_TRUE : SDL_FALSE;
838 }
839 
840 void
842 {
844  SDL_EventWatcher *event_watchers;
845 
846  event_watchers = SDL_realloc(SDL_event_watchers, (SDL_event_watchers_count + 1) * sizeof(*event_watchers));
847  if (event_watchers) {
848  SDL_EventWatcher *watcher;
849 
850  SDL_event_watchers = event_watchers;
852  watcher->callback = filter;
853  watcher->userdata = userdata;
854  watcher->removed = SDL_FALSE;
856  }
857 
860  }
861  }
862 }
863 
864 void
866 {
868  int i;
869 
870  for (i = 0; i < SDL_event_watchers_count; ++i) {
871  if (SDL_event_watchers[i].callback == filter && SDL_event_watchers[i].userdata == userdata) {
875  } else {
877  if (i < SDL_event_watchers_count) {
879  }
880  }
881  break;
882  }
883  }
884 
887  }
888  }
889 }
890 
891 void
893 {
894  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
895  SDL_EventEntry *entry, *next;
896  for (entry = SDL_EventQ.head; entry; entry = next) {
897  next = entry->next;
898  if (!filter(userdata, &entry->event)) {
899  SDL_CutEvent(entry);
900  }
901  }
902  if (SDL_EventQ.lock) {
904  }
905  }
906 }
907 
908 Uint8
910 {
911  const SDL_bool isdnd = ((state == SDL_DISABLE) || (state == SDL_ENABLE)) &&
912  ((type == SDL_DROPFILE) || (type == SDL_DROPTEXT));
913  Uint8 current_state;
914  Uint8 hi = ((type >> 8) & 0xff);
915  Uint8 lo = (type & 0xff);
916 
917  if (SDL_disabled_events[hi] &&
918  (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
919  current_state = SDL_DISABLE;
920  } else {
921  current_state = SDL_ENABLE;
922  }
923 
924  if (state != current_state)
925  {
926  switch (state) {
927  case SDL_DISABLE:
928  /* Disable this event type and discard pending events */
929  if (!SDL_disabled_events[hi]) {
931  if (!SDL_disabled_events[hi]) {
932  /* Out of memory, nothing we can do... */
933  break;
934  }
935  }
936  SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
938  break;
939  case SDL_ENABLE:
940  SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
941  break;
942  default:
943  /* Querying state... */
944  break;
945  }
946  }
947 
948  /* turn off drag'n'drop support if we've disabled the events.
949  This might change some UI details at the OS level. */
950  if (isdnd) {
952  }
953 
954  return current_state;
955 }
956 
957 Uint32
958 SDL_RegisterEvents(int numevents)
959 {
960  Uint32 event_base;
961 
962  if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
963  event_base = SDL_userevents;
964  SDL_userevents += numevents;
965  } else {
966  event_base = (Uint32)-1;
967  }
968  return event_base;
969 }
970 
971 int
973 {
974  int posted;
975 
976  posted = 0;
977  if (SDL_GetEventState(eventType) == SDL_ENABLE) {
979  event.type = eventType;
980  posted = (SDL_PushEvent(&event) > 0);
981  }
982  return (posted);
983 }
984 
985 int
987 {
988  int posted;
989 
990  posted = 0;
993  SDL_memset(&event, 0, sizeof(event));
994  event.type = SDL_SYSWMEVENT;
995  event.syswm.msg = message;
996  posted = (SDL_PushEvent(&event) > 0);
997  }
998  /* Update internal event state */
999  return (posted);
1000 }
1001 
1002 int
1004 {
1006 }
1007 
1008 int
1010 {
1012  if (SDL_StartEventLoop() < 0) {
1014  return -1;
1015  }
1016 
1017  SDL_QuitInit();
1018 
1019  return 0;
1020 }
1021 
1022 void
1024 {
1025  SDL_QuitQuit();
1028 }
1029 
1030 /* vi: set ts=4 sw=4 expandtab: */
SDL.h
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:418
SDL_SysWMmsg
Definition: SDL_syswm.h:143
SDL_SysWMEntry
Definition: SDL_events.c:76
SDL_Event::type
Uint32 type
Definition: SDL_events.h:560
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:817
PRINT_DOLLAR_EVENT
#define PRINT_DOLLAR_EVENT(event)
SDL_SendSysWMEvent
int SDL_SendSysWMEvent(SDL_SysWMmsg *message)
Definition: SDL_events.c:986
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:47
SDL_events.h
SDL_EventWatcher::removed
SDL_bool removed
Definition: SDL_events.c:49
SDL_strlcpy
#define SDL_strlcpy
Definition: SDL_dynapi_overrides.h:394
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:86
tail
SDL_EventEntry * tail
Definition: SDL_events.c:88
SDL_AddEvent
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:463
PRINT_MBUTTON_EVENT
#define PRINT_MBUTTON_EVENT(event)
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:48
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:55
SDL_ADDEVENT
@ SDL_ADDEVENT
Definition: SDL_events.h:616
NULL
#define NULL
Definition: begin_code.h:167
message
GLuint GLsizei const GLchar * message
Definition: SDL_opengl_glext.h:2486
SDL_FilterEvents
void SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:892
SDL_WINDOWEVENT_FOCUS_LOST
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:165
timeout
GLbitfield GLuint64 timeout
Definition: SDL_opengl_glext.h:1486
SDL_CutEvent
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:517
SDL_KEYUP
@ SDL_KEYUP
Definition: SDL_events.h:97
SDL_WINDOWEVENT_CLOSE
@ SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:166
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:700
PRINT_JOYDEV_EVENT
#define PRINT_JOYDEV_EVENT(event)
SDL_WINDOWEVENT_ENTER
@ SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:162
SDL_DOLLARRECORD
@ SDL_DOLLARRECORD
Definition: SDL_events.h:134
SDL_SysWMmsg::msg
union SDL_SysWMmsg::@8 msg
SDL_mutex
Definition: SDL_sysmutex.c:30
SDL_ToggleDragAndDropSupport
void SDL_ToggleDragAndDropSupport(void)
Definition: SDL_video.c:1392
SDLCALL
#define SDLCALL
Definition: SDL_internal.h:49
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:154
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:91
callback
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
SDL_GestureProcessEvent
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:551
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:203
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:760
uint
#define uint
SDL_DoEventLogging
static int SDL_DoEventLogging
Definition: SDL_events.c:96
SDL_JOYDEVICEREMOVED
@ SDL_JOYDEVICEREMOVED
Definition: SDL_events.h:117
SDL_WINDOWEVENT_MOVED
@ SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:152
SDL_GetHint
#define SDL_GetHint
Definition: SDL_dynapi_overrides.h:191
SDL_DisabledEventBlock::bits
Uint32 bits[8]
Definition: SDL_events.c:60
SDL_EventEntry
Definition: SDL_events.c:68
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:46
SDL_CONTROLLERDEVICEADDED
@ SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:123
SDL_QuitQuit
void SDL_QuitQuit(void)
Definition: SDL_quit.c:165
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:552
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:1187
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:52
PRINT_DROP_EVENT
#define PRINT_DROP_EVENT(event)
SDL_WINDOWEVENT_SHOWN
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:148
SDL_EventEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:70
SDL_FINGERUP
@ SDL_FINGERUP
Definition: SDL_events.h:129
SDL_EventQ
static struct @16 SDL_EventQ
SDL_HasEvents
SDL_bool SDL_HasEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:627
SDL_QUERY
#define SDL_QUERY
Definition: SDL_events.h:757
SDL_PushEvent
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:748
PRINT_JBUTTON_EVENT
#define PRINT_JBUTTON_EVENT(event)
SDL_event_watchers_removed
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:57
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2652
SDL_SysWMEntry::next
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:78
SDL_MOUSEMOTION
@ SDL_MOUSEMOTION
Definition: SDL_events.h:105
SDL_PRIs64
#define SDL_PRIs64
Definition: SDL_events.c:38
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:711
SDL_CONTROLLERBUTTONUP
@ SDL_CONTROLLERBUTTONUP
Definition: SDL_events.h:122
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:773
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
PRINT_AUDIODEV_EVENT
#define PRINT_AUDIODEV_EVENT(event)
SDL_PollEvent
int SDL_PollEvent(SDL_Event *event)
Polls for currently pending events.
Definition: SDL_events.c:705
SDL_eventaction
SDL_eventaction
Definition: SDL_events.h:615
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:56
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:958
active
SDL_atomic_t active
Definition: SDL_events.c:84
SDL_DROPTEXT
@ SDL_DROPTEXT
Definition: SDL_events.h:142
SDL_max
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407
SDL_QUIT
@ SDL_QUIT
Definition: SDL_events.h:60
name
GLuint const GLchar * name
Definition: SDL_opengl_glext.h:663
SDL_SendPendingSignalEvents
void SDL_SendPendingSignalEvents(void)
Definition: SDL_quit.c:175
SDL_WINDOWEVENT_EXPOSED
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:150
SDL_MOUSEWHEEL
@ SDL_MOUSEWHEEL
Definition: SDL_events.h:108
head
SDL_EventEntry * head
Definition: SDL_events.c:87
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_min
#define SDL_min(x, y)
Definition: SDL_stdinc.h:406
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:168
SDL_JOYAXISMOTION
@ SDL_JOYAXISMOTION
Definition: SDL_events.h:111
SDL_QuitInit
int SDL_QuitInit(void)
Definition: SDL_quit.c:154
SDL_APP_WILLENTERBACKGROUND
@ SDL_APP_WILLENTERBACKGROUND
Definition: SDL_events.h:71
SDL_WINDOWEVENT_SIZE_CHANGED
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:155
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:69
PRINT_KEY_EVENT
#define PRINT_KEY_EVENT(event)
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
SDL_DISABLE
#define SDL_DISABLE
Definition: SDL_events.h:759
PRINT_CBUTTON_EVENT
#define PRINT_CBUTTON_EVENT(event)
SDL_WINDOWEVENT_MINIMIZED
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:158
SDL_WINDOWEVENT_TAKE_FOCUS
@ SDL_WINDOWEVENT_TAKE_FOCUS
Definition: SDL_video.h:167
SDL_EVENT_CASE
#define SDL_EVENT_CASE(x)
SDL_SetEventFilter
void SDL_SetEventFilter(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:802
SDL_VideoDevice
Definition: SDL_sysvideo.h:150
PRINT_FINGER_EVENT
#define PRINT_FINGER_EVENT(event)
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
action
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst op &r &cond WK op &r &cond WK op &r &cond WK else op &m &cond &ia op &r &cond WK else op &m &cond &ia elseif elseif else error unsupported base if elseif elseif else error unsupported unaligned pixldst unaligned endm macro pixst base base else pixldst base endif endm macro PF base if bpp PF set rept prefetch_distance PF set OFFSET endr endif endm macro preload_leading_step2 base if bpp ifc DST PF PF else if bpp lsl PF PF lsl PF PF lsl PF PF PF else PF lsl PF lsl PF lsl PF endif SIZE macro preload_middle scratch_holds_offset if bpp if else PF PF endif endif endif endm macro preload_trailing base if bpp if bpp *pix_per_block PF PF lsl PF PF PF PF PF else PF lsl PF lsl PF PF PF PF PF base if bpp if narrow_case &&bpp<=dst_w_bpp) PF bic, WK0, base, #31 PF pld,[WK0] PF add, WK1, base, X, LSL #bpp_shift PF sub, WK1, WK1, #1 PF bic, WK1, WK1, #31 PF cmp, WK1, WK0 PF beq, 90f PF pld,[WK1]90:.else PF bic, WK0, base, #31 PF pld,[WK0] PF add, WK1, base, X, lsl #bpp_shift PF sub, WK1, WK1, #1 PF bic, WK1, WK1, #31 PF cmp, WK1, WK0 PF beq, 92f91:PF add, WK0, WK0, #32 PF cmp, WK0, WK1 PF pld,[WK0] PF bne, 91b92:.endif .endif.endm.macro conditional_process1_helper cond, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx process_head cond, numbytes, firstreg, unaligned_src, unaligned_mask, 0 .if decrementx sub &cond X, X, #8 *numbytes/dst_w_bpp .endif process_tail cond, numbytes, firstreg .if !((flags) &FLAG_PROCESS_DOES_STORE) pixst cond, numbytes, firstreg, DST .endif.endm.macro conditional_process1 cond, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx .if(flags) &FLAG_BRANCH_OVER .ifc cond, mi bpl 100f .endif .ifc cond, cs bcc 100f .endif .ifc cond, ne beq 100f .endif conditional_process1_helper, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx100:.else conditional_process1_helper cond, process_head, process_tail, numbytes, firstreg, unaligned_src, unaligned_mask, decrementx .endif.endm.macro conditional_process2 test, cond1, cond2, process_head, process_tail, numbytes1, numbytes2, firstreg1, firstreg2, unaligned_src, unaligned_mask, decrementx .if(flags) &(FLAG_DST_READWRITE|FLAG_BRANCH_OVER|FLAG_PROCESS_CORRUPTS_PSR|FLAG_PROCESS_DOES_STORE) test conditional_process1 cond1, process_head, process_tail, numbytes1, firstreg1, unaligned_src, unaligned_mask, decrementx .if(flags) &FLAG_PROCESS_CORRUPTS_PSR test .endif conditional_process1 cond2, process_head, process_tail, numbytes2, firstreg2, unaligned_src, unaligned_mask, decrementx .else test process_head cond1, numbytes1, firstreg1, unaligned_src, unaligned_mask, 0 process_head cond2, numbytes2, firstreg2, unaligned_src, unaligned_mask, 0 .if decrementx sub &cond1 X, X, #8 *numbytes1/dst_w_bpp sub &cond2 X, X, #8 *numbytes2/dst_w_bpp .endif process_tail cond1, numbytes1, firstreg1 process_tail cond2, numbytes2, firstreg2 pixst cond1, numbytes1, firstreg1, DST pixst cond2, numbytes2, firstreg2, DST .endif.endm.macro test_bits_1_0_ptr .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 movs SCRATCH, X, lsl #32-1 .else movs SCRATCH, WK0, lsl #32-1 .endif.endm.macro test_bits_3_2_ptr .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 movs SCRATCH, X, lsl #32-3 .else movs SCRATCH, WK0, lsl #32-3 .endif.endm.macro leading_15bytes process_head, process_tail .set DECREMENT_X, 1 .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 .set DECREMENT_X, 0 sub X, X, WK0, lsr #dst_bpp_shift str X,[sp, #LINE_SAVED_REG_COUNT *4] mov X, WK0 .endif .if dst_w_bpp==8 conditional_process2 test_bits_1_0_ptr, mi, cs, process_head, process_tail, 1, 2, 1, 2, 1, 1, DECREMENT_X .elseif dst_w_bpp==16 test_bits_1_0_ptr conditional_process1 cs, process_head, process_tail, 2, 2, 1, 1, DECREMENT_X .endif conditional_process2 test_bits_3_2_ptr, mi, cs, process_head, process_tail, 4, 8, 1, 2, 1, 1, DECREMENT_X .if(flags) &FLAG_PROCESS_CORRUPTS_WK0 ldr X,[sp, #LINE_SAVED_REG_COUNT *4] .endif.endm.macro test_bits_3_2_pix movs SCRATCH, X, lsl #dst_bpp_shift+32-3.endm.macro test_bits_1_0_pix .if dst_w_bpp==8 movs SCRATCH, X, lsl #dst_bpp_shift+32-1 .else movs SCRATCH, X, lsr #1 .endif.endm.macro trailing_15bytes process_head, process_tail, unaligned_src, unaligned_mask conditional_process2 test_bits_3_2_pix, cs, mi, process_head, process_tail, 8, 4, 0, 2, unaligned_src, unaligned_mask, 0 .if dst_w_bpp==16 test_bits_1_0_pix conditional_process1 cs, process_head, process_tail, 2, 0, unaligned_src, unaligned_mask, 0 .elseif dst_w_bpp==8 conditional_process2 test_bits_1_0_pix, cs, mi, process_head, process_tail, 2, 1, 0, 1, unaligned_src, unaligned_mask, 0 .endif.endm.macro wide_case_inner_loop process_head, process_tail, unaligned_src, unaligned_mask, dst_alignment110:.set SUBBLOCK, 0 .rept pix_per_block *dst_w_bpp/128 process_head, 16, 0, unaligned_src, unaligned_mask, 1 .if(src_bpp > 0) &&(mask_bpp==0) &&((flags) &FLAG_PROCESS_PRESERVES_SCRATCH) preload_middle src_bpp, SRC, 1 .elseif(src_bpp==0) &&(mask_bpp > 0) &&((flags) &FLAG_PROCESS_PRESERVES_SCRATCH) preload_middle mask_bpp, MASK, 1 .else preload_middle src_bpp, SRC, 0 preload_middle mask_bpp, MASK, 0 .endif .if(dst_r_bpp > 0) &&((SUBBLOCK % 2)==0) &&(((flags) &FLAG_NO_PRELOAD_DST)==0) PF pld,[DST, #32 *prefetch_distance - dst_alignment] .endif process_tail, 16, 0 .if !((flags) &FLAG_PROCESS_DOES_STORE) pixst, 16, 0, DST .endif .set SUBBLOCK, SUBBLOCK+1 .endr subs X, X, #pix_per_block bhs 110b.endm.macro wide_case_inner_loop_and_trailing_pixels process_head, process_tail, process_inner_loop, exit_label, unaligned_src, unaligned_mask .if dst_r_bpp > tst bne process_inner_loop DST_PRELOAD_BIAS endif preload_trailing SRC preload_trailing MASK DST endif add medium_case_inner_loop_and_trailing_pixels unaligned_mask endm macro medium_case_inner_loop_and_trailing_pixels DST endif subs bhs tst beq exit_label trailing_15bytes unaligned_mask endm macro narrow_case_inner_loop_and_trailing_pixels unaligned_mask tst conditional_process1 trailing_15bytes unaligned_mask endm macro switch_on_alignment action
Definition: pixman-arm-simd-asm.h:510
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:841
SDL_FlushEvent
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:633
SDL_userevents
static Uint32 SDL_userevents
Definition: SDL_events.c:64
SDL_EventEntry::prev
struct _SDL_EventEntry * prev
Definition: SDL_events.c:71
events
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:39
SDL_AddHintCallback
#define SDL_AddHintCallback
Definition: SDL_dynapi_overrides.h:192
SDL_EventState
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:909
SDL_AtomicAdd
#define SDL_AtomicAdd
Definition: SDL_dynapi_overrides.h:69
wmmsg_used
SDL_SysWMEntry * wmmsg_used
Definition: SDL_events.c:90
SDL_WINDOWEVENT_NONE
@ SDL_WINDOWEVENT_NONE
Definition: SDL_video.h:147
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:53
SDL_snprintf
#define SDL_snprintf
Definition: SDL_dynapi_overrides.h:40
SDL_HINT_EVENT_LOGGING
#define SDL_HINT_EVENT_LOGGING
A variable controlling whether SDL logs all events pushed onto its internal queue.
Definition: SDL_hints.h:1193
SDL_JOYBUTTONUP
@ SDL_JOYBUTTONUP
Definition: SDL_events.h:115
SDL_disabled_events
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:63
SDL_StopEventLoop
void SDL_StopEventLoop(void)
Definition: SDL_events.c:347
SDL_MULTIGESTURE
@ SDL_MULTIGESTURE
Definition: SDL_events.h:135
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:54
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:216
SDL_DestroyMutex
#define SDL_DestroyMutex
Definition: SDL_dynapi_overrides.h:263
SDL_SysWMEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:77
count
SDL_atomic_t count
Definition: SDL_events.c:85
SDL_GETEVENT
@ SDL_GETEVENT
Definition: SDL_events.h:618
SDL_SendKeymapChangedEvent
int SDL_SendKeymapChangedEvent(void)
Definition: SDL_events.c:1003
SDL_LogEvent
static void SDL_LogEvent(const SDL_Event *event)
Definition: SDL_events.c:105
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:717
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:677
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
PRINT_CONTROLLERDEV_EVENT
#define PRINT_CONTROLLERDEV_EVENT(event)
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:72
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:162
SDL_HasEvent
SDL_bool SDL_HasEvent(Uint32 type)
Definition: SDL_events.c:621
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:6179
SDL_WINDOWEVENT_HIDDEN
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:149
SDL_Event::syswm
SDL_SysWMEvent syswm
Definition: SDL_events.h:582
SDL_Event
General event structure.
Definition: SDL_events.h:559
SDL_WINDOWEVENT
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
SDL_GetVideoDevice
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:586
SDL_EventLoggingChanged
static void SDL_EventLoggingChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Definition: SDL_events.c:99
SDL_DelHintCallback
#define SDL_DelHintCallback
Definition: SDL_dynapi_overrides.h:193
SDL_WINDOWEVENT_RESTORED
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:160
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_EventsInit
int SDL_EventsInit(void)
Definition: SDL_events.c:1009
SDL_DisabledEventBlock
Definition: SDL_events.c:59
SDL_AUDIODEVICEREMOVED
@ SDL_AUDIODEVICEREMOVED
Definition: SDL_events.h:148
SDL_EventsQuit
void SDL_EventsQuit(void)
Definition: SDL_events.c:1023
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:164
SDL_VideoDevice::PumpEvents
void(* PumpEvents)(_THIS)
Definition: SDL_sysvideo.h:289
SDL_SendAppEvent
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:972
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:543
SDL_FlushEvents
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:639
SDL_DelEventWatch
void SDL_DelEventWatch(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:865
free
SDL_EventEntry * free
Definition: SDL_events.c:89
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
state
struct xkb_state * state
Definition: SDL_waylandsym.h:114
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:44
SDL_WINDOWEVENT_CASE
#define SDL_WINDOWEVENT_CASE(x)
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_StartEventLoop
int SDL_StartEventLoop(void)
Definition: SDL_events.c:421
SDL_WINDOWEVENT_MAXIMIZED
@ SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:159
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:617
SDL_WINDOWEVENT_LEAVE
@ SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:163
SDL_USEREVENT
@ SDL_USEREVENT
Definition: SDL_events.h:160
SDL_syswm.h
lock
SDL_mutex * lock
Definition: SDL_events.c:83