2525 */
2626#define PYGAMEAPI_EVENT_INTERNAL
2727
28+ /* We include SDL_gesture.h in _pygame.h. That header defines the
29+ * implementation when this macro is set. So this macro needs to be set in only
30+ * one source file (and not any header) and we set it here because its API is
31+ * used here */
32+ #define SDL_GESTURE_IMPLEMENTATION 1
2833#include "pygame.h"
2934
3035#include "pgcompat.h"
@@ -401,10 +406,8 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
401406 _PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADMOTION );
402407 _PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADUP );
403408 _PG_HANDLE_PROXIFY (CONTROLLERSENSORUPDATE );
404- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
405409 _PG_HANDLE_PROXIFY (DOLLARGESTURE );
406410 _PG_HANDLE_PROXIFY (DOLLARRECORD );
407- #endif
408411 _PG_HANDLE_PROXIFY (DROPFILE );
409412 _PG_HANDLE_PROXIFY (DROPTEXT );
410413 _PG_HANDLE_PROXIFY (DROPBEGIN );
@@ -427,9 +430,7 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
427430 _PG_HANDLE_PROXIFY (MOUSEBUTTONDOWN );
428431 _PG_HANDLE_PROXIFY (MOUSEBUTTONUP );
429432 _PG_HANDLE_PROXIFY (MOUSEWHEEL );
430- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
431433 _PG_HANDLE_PROXIFY (MULTIGESTURE );
432- #endif
433434 _PG_HANDLE_PROXIFY (NOEVENT );
434435 _PG_HANDLE_PROXIFY (QUIT );
435436 _PG_HANDLE_PROXIFY (RENDER_TARGETS_RESET );
@@ -493,19 +494,28 @@ _pg_pgevent_type(SDL_Event *event)
493494 * Currently this only includes WINDOWEVENT, but can be expanded in the
494495 * future.
495496 */
496- #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
497- static bool SDLCALL
498- #else
499- static int SDLCALL
500- #endif
501- _pg_filter_blocked_events (void * _ , SDL_Event * event )
497+ static bool
498+ _pg_event_psuedo_block (SDL_Event * event )
502499{
503500#if SDL_VERSION_ATLEAST (3 , 0 , 0 )
504501 if (event -> type >= SDL_EVENT_WINDOW_FIRST &&
505502 event -> type <= SDL_EVENT_WINDOW_LAST ) {
506503#else
507504 if (event -> type == SDL_WINDOWEVENT ) {
508505#endif
506+ return true;
507+ }
508+ return false;
509+ }
510+
511+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
512+ static bool SDLCALL
513+ #else
514+ static int SDLCALL
515+ #endif
516+ _pg_filter_blocked_events (void * _ , SDL_Event * event )
517+ {
518+ if (_pg_event_psuedo_block (event )) {
509519 return PG_EventEnabled (_pg_pgevent_proxify (_pg_pgevent_type (event )));
510520 }
511521 return 1 ;
@@ -732,14 +742,15 @@ pg_event_filter(void *_, SDL_Event *event)
732742 return RAISE(pgExc_SDLError, SDL_GetError()), 0;
733743 */
734744 }
735- /* TODO:
745+ /*
736746 * Any event that gets blocked here will not be visible to the event
737747 * watchers. So things like WINDOWEVENT should never be blocked here.
738- * This is taken care of in SDL2 codepaths already but needs to also
739- * be verified in SDL3 porting.
740748 * If the user requests a block on WINDOWEVENTs we are going to handle
741749 * it specially and call it a "pseudo-block", where the filtering will
742750 * happen in a _pg_filter_blocked_events call. */
751+ if (_pg_event_psuedo_block (event )) {
752+ return 1 ;
753+ }
743754 return PG_EventEnabled (_pg_pgevent_proxify (event -> type ));
744755}
745756
@@ -773,6 +784,9 @@ static PyObject *
773784pgEvent_AutoQuit (PyObject * self , PyObject * _null )
774785{
775786 if (_pg_event_is_init ) {
787+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
788+ Gesture_Quit ();
789+ #endif
776790 PG_LOCK_EVFILTER_MUTEX
777791 if (_pg_repeat_timer ) {
778792 SDL_RemoveTimer (_pg_repeat_timer );
@@ -805,6 +819,11 @@ pgEvent_AutoInit(PyObject *self, PyObject *_null)
805819 }
806820#endif
807821 SDL_SetEventFilter (pg_event_filter , NULL );
822+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
823+ if (Gesture_Init () != 0 ) {
824+ return RAISE (pgExc_SDLError , SDL_GetError ());
825+ }
826+ #endif
808827 }
809828 _pg_event_is_init = 1 ;
810829 Py_RETURN_NONE ;
@@ -936,10 +955,8 @@ _pg_name_from_eventtype(int type)
936955 return "FingerDown" ;
937956 case SDL_FINGERUP :
938957 return "FingerUp" ;
939- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
940958 case SDL_MULTIGESTURE :
941959 return "MultiGesture" ;
942- #endif
943960 case SDL_MOUSEWHEEL :
944961 return "MouseWheel" ;
945962 case SDL_TEXTINPUT :
@@ -1142,7 +1159,6 @@ dict_from_event(SDL_Event *event)
11421159 state = SDL_APPACTIVE ;
11431160 break ;
11441161 default :
1145- assert (event -> window .event == SDL_WINDOWEVENT_RESTORED );
11461162 gain = 1 ;
11471163 state = SDL_APPACTIVE ;
11481164 }
@@ -1294,9 +1310,27 @@ dict_from_event(SDL_Event *event)
12941310 _pg_insobj (dict , "pressure" ,
12951311 PyFloat_FromDouble (event -> tfinger .dy ));
12961312 break ;
1297- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
12981313 case SDL_MULTIGESTURE :
1299- /* https://wiki.libsdl.org/SDL_MultiGestureEvent */
1314+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
1315+ _pg_insobj (dict , "touch_id" ,
1316+ PyLong_FromLongLong (
1317+ ((Gesture_MultiGestureEvent * )event )-> touchID ));
1318+ _pg_insobj (
1319+ dict , "x" ,
1320+ PyFloat_FromDouble (((Gesture_MultiGestureEvent * )event )-> x ));
1321+ _pg_insobj (
1322+ dict , "y" ,
1323+ PyFloat_FromDouble (((Gesture_MultiGestureEvent * )event )-> y ));
1324+ _pg_insobj (dict , "rotated" ,
1325+ PyFloat_FromDouble (
1326+ ((Gesture_MultiGestureEvent * )event )-> dTheta ));
1327+ _pg_insobj (dict , "pinched" ,
1328+ PyFloat_FromDouble (
1329+ ((Gesture_MultiGestureEvent * )event )-> dDist ));
1330+ _pg_insobj (dict , "num_fingers" ,
1331+ PyLong_FromLong (
1332+ ((Gesture_MultiGestureEvent * )event )-> numFingers ));
1333+ #else
13001334 _pg_insobj (dict , "touch_id" ,
13011335 PyLong_FromLongLong (event -> mgesture .touchId ));
13021336 _pg_insobj (dict , "x" , PyFloat_FromDouble (event -> mgesture .x ));
@@ -1307,8 +1341,8 @@ dict_from_event(SDL_Event *event)
13071341 PyFloat_FromDouble (event -> mgesture .dDist ));
13081342 _pg_insobj (dict , "num_fingers" ,
13091343 PyLong_FromLong (event -> mgesture .numFingers ));
1310- break ;
13111344#endif
1345+ break ;
13121346 case SDL_MOUSEWHEEL :
13131347 /* https://wiki.libsdl.org/SDL_MouseWheelEvent */
13141348#ifndef NO_SDL_MOUSEWHEEL_FLIPPED
0 commit comments