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