2525 */
2626#define PYGAMEAPI_EVENT_INTERNAL
2727
28+ #define SDL_GESTURE_IMPLEMENTATION 1
2829#include "pygame.h"
2930
3031#include "pgcompat.h"
@@ -401,10 +402,8 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
401402 _PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADMOTION );
402403 _PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADUP );
403404 _PG_HANDLE_PROXIFY (CONTROLLERSENSORUPDATE );
404- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
405405 _PG_HANDLE_PROXIFY (DOLLARGESTURE );
406406 _PG_HANDLE_PROXIFY (DOLLARRECORD );
407- #endif
408407 _PG_HANDLE_PROXIFY (DROPFILE );
409408 _PG_HANDLE_PROXIFY (DROPTEXT );
410409 _PG_HANDLE_PROXIFY (DROPBEGIN );
@@ -427,9 +426,7 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
427426 _PG_HANDLE_PROXIFY (MOUSEBUTTONDOWN );
428427 _PG_HANDLE_PROXIFY (MOUSEBUTTONUP );
429428 _PG_HANDLE_PROXIFY (MOUSEWHEEL );
430- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
431429 _PG_HANDLE_PROXIFY (MULTIGESTURE );
432- #endif
433430 _PG_HANDLE_PROXIFY (NOEVENT );
434431 _PG_HANDLE_PROXIFY (QUIT );
435432 _PG_HANDLE_PROXIFY (RENDER_TARGETS_RESET );
@@ -493,19 +490,28 @@ _pg_pgevent_type(SDL_Event *event)
493490 * Currently this only includes WINDOWEVENT, but can be expanded in the
494491 * future.
495492 */
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 )
493+ static bool
494+ _pg_event_psuedo_block (SDL_Event * event )
502495{
503496#if SDL_VERSION_ATLEAST (3 , 0 , 0 )
504497 if (event -> type >= SDL_EVENT_WINDOW_FIRST &&
505498 event -> type <= SDL_EVENT_WINDOW_LAST ) {
506499#else
507500 if (event -> type == SDL_WINDOWEVENT ) {
508501#endif
502+ return true;
503+ }
504+ return false;
505+ }
506+
507+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
508+ static bool SDLCALL
509+ #else
510+ static int SDLCALL
511+ #endif
512+ _pg_filter_blocked_events (void * _ , SDL_Event * event )
513+ {
514+ if (_pg_event_psuedo_block (event )) {
509515 return PG_EventEnabled (_pg_pgevent_proxify (_pg_pgevent_type (event )));
510516 }
511517 return 1 ;
@@ -732,14 +738,15 @@ pg_event_filter(void *_, SDL_Event *event)
732738 return RAISE(pgExc_SDLError, SDL_GetError()), 0;
733739 */
734740 }
735- /* TODO:
741+ /*
736742 * Any event that gets blocked here will not be visible to the event
737743 * 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.
740744 * If the user requests a block on WINDOWEVENTs we are going to handle
741745 * it specially and call it a "pseudo-block", where the filtering will
742746 * happen in a _pg_filter_blocked_events call. */
747+ if (_pg_event_psuedo_block (event )) {
748+ return 1 ;
749+ }
743750 return PG_EventEnabled (_pg_pgevent_proxify (event -> type ));
744751}
745752
@@ -773,6 +780,9 @@ static PyObject *
773780pgEvent_AutoQuit (PyObject * self , PyObject * _null )
774781{
775782 if (_pg_event_is_init ) {
783+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
784+ Gesture_Quit ();
785+ #endif
776786 PG_LOCK_EVFILTER_MUTEX
777787 if (_pg_repeat_timer ) {
778788 SDL_RemoveTimer (_pg_repeat_timer );
@@ -805,6 +815,11 @@ pgEvent_AutoInit(PyObject *self, PyObject *_null)
805815 }
806816#endif
807817 SDL_SetEventFilter (pg_event_filter , NULL );
818+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
819+ if (Gesture_Init () != 0 ) {
820+ return RAISE (pgExc_SDLError , SDL_GetError ());
821+ }
822+ #endif
808823 }
809824 _pg_event_is_init = 1 ;
810825 Py_RETURN_NONE ;
@@ -936,10 +951,8 @@ _pg_name_from_eventtype(int type)
936951 return "FingerDown" ;
937952 case SDL_FINGERUP :
938953 return "FingerUp" ;
939- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
940954 case SDL_MULTIGESTURE :
941955 return "MultiGesture" ;
942- #endif
943956 case SDL_MOUSEWHEEL :
944957 return "MouseWheel" ;
945958 case SDL_TEXTINPUT :
@@ -1142,7 +1155,6 @@ dict_from_event(SDL_Event *event)
11421155 state = SDL_APPACTIVE ;
11431156 break ;
11441157 default :
1145- assert (event -> window .event == SDL_WINDOWEVENT_RESTORED );
11461158 gain = 1 ;
11471159 state = SDL_APPACTIVE ;
11481160 }
@@ -1294,9 +1306,27 @@ dict_from_event(SDL_Event *event)
12941306 _pg_insobj (dict , "pressure" ,
12951307 PyFloat_FromDouble (event -> tfinger .dy ));
12961308 break ;
1297- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
12981309 case SDL_MULTIGESTURE :
1299- /* https://wiki.libsdl.org/SDL_MultiGestureEvent */
1310+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
1311+ _pg_insobj (dict , "touch_id" ,
1312+ PyLong_FromLongLong (
1313+ ((Gesture_MultiGestureEvent * )event )-> touchID ));
1314+ _pg_insobj (
1315+ dict , "x" ,
1316+ PyFloat_FromDouble (((Gesture_MultiGestureEvent * )event )-> x ));
1317+ _pg_insobj (
1318+ dict , "y" ,
1319+ PyFloat_FromDouble (((Gesture_MultiGestureEvent * )event )-> y ));
1320+ _pg_insobj (dict , "rotated" ,
1321+ PyFloat_FromDouble (
1322+ ((Gesture_MultiGestureEvent * )event )-> dTheta ));
1323+ _pg_insobj (dict , "pinched" ,
1324+ PyFloat_FromDouble (
1325+ ((Gesture_MultiGestureEvent * )event )-> dDist ));
1326+ _pg_insobj (dict , "num_fingers" ,
1327+ PyLong_FromLong (
1328+ ((Gesture_MultiGestureEvent * )event )-> numFingers ));
1329+ #else
13001330 _pg_insobj (dict , "touch_id" ,
13011331 PyLong_FromLongLong (event -> mgesture .touchId ));
13021332 _pg_insobj (dict , "x" , PyFloat_FromDouble (event -> mgesture .x ));
@@ -1307,8 +1337,8 @@ dict_from_event(SDL_Event *event)
13071337 PyFloat_FromDouble (event -> mgesture .dDist ));
13081338 _pg_insobj (dict , "num_fingers" ,
13091339 PyLong_FromLong (event -> mgesture .numFingers ));
1310- break ;
13111340#endif
1341+ break ;
13121342 case SDL_MOUSEWHEEL :
13131343 /* https://wiki.libsdl.org/SDL_MouseWheelEvent */
13141344#ifndef NO_SDL_MOUSEWHEEL_FLIPPED
0 commit comments