25
25
*/
26
26
#define PYGAMEAPI_EVENT_INTERNAL
27
27
28
+ #define SDL_GESTURE_IMPLEMENTATION 1
28
29
#include "pygame.h"
29
30
30
31
#include "pgcompat.h"
@@ -401,10 +402,8 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
401
402
_PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADMOTION );
402
403
_PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADUP );
403
404
_PG_HANDLE_PROXIFY (CONTROLLERSENSORUPDATE );
404
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
405
405
_PG_HANDLE_PROXIFY (DOLLARGESTURE );
406
406
_PG_HANDLE_PROXIFY (DOLLARRECORD );
407
- #endif
408
407
_PG_HANDLE_PROXIFY (DROPFILE );
409
408
_PG_HANDLE_PROXIFY (DROPTEXT );
410
409
_PG_HANDLE_PROXIFY (DROPBEGIN );
@@ -427,9 +426,7 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
427
426
_PG_HANDLE_PROXIFY (MOUSEBUTTONDOWN );
428
427
_PG_HANDLE_PROXIFY (MOUSEBUTTONUP );
429
428
_PG_HANDLE_PROXIFY (MOUSEWHEEL );
430
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
431
429
_PG_HANDLE_PROXIFY (MULTIGESTURE );
432
- #endif
433
430
_PG_HANDLE_PROXIFY (NOEVENT );
434
431
_PG_HANDLE_PROXIFY (QUIT );
435
432
_PG_HANDLE_PROXIFY (RENDER_TARGETS_RESET );
@@ -493,19 +490,28 @@ _pg_pgevent_type(SDL_Event *event)
493
490
* Currently this only includes WINDOWEVENT, but can be expanded in the
494
491
* future.
495
492
*/
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 )
502
495
{
503
496
#if SDL_VERSION_ATLEAST (3 , 0 , 0 )
504
497
if (event -> type >= SDL_EVENT_WINDOW_FIRST &&
505
498
event -> type <= SDL_EVENT_WINDOW_LAST ) {
506
499
#else
507
500
if (event -> type == SDL_WINDOWEVENT ) {
508
501
#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 )) {
509
515
return PG_EventEnabled (_pg_pgevent_proxify (_pg_pgevent_type (event )));
510
516
}
511
517
return 1 ;
@@ -732,14 +738,15 @@ pg_event_filter(void *_, SDL_Event *event)
732
738
return RAISE(pgExc_SDLError, SDL_GetError()), 0;
733
739
*/
734
740
}
735
- /* TODO:
741
+ /*
736
742
* Any event that gets blocked here will not be visible to the event
737
743
* 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.
740
744
* If the user requests a block on WINDOWEVENTs we are going to handle
741
745
* it specially and call it a "pseudo-block", where the filtering will
742
746
* happen in a _pg_filter_blocked_events call. */
747
+ if (_pg_event_psuedo_block (event )) {
748
+ return 1 ;
749
+ }
743
750
return PG_EventEnabled (_pg_pgevent_proxify (event -> type ));
744
751
}
745
752
@@ -773,6 +780,9 @@ static PyObject *
773
780
pgEvent_AutoQuit (PyObject * self , PyObject * _null )
774
781
{
775
782
if (_pg_event_is_init ) {
783
+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
784
+ Gesture_Quit ();
785
+ #endif
776
786
PG_LOCK_EVFILTER_MUTEX
777
787
if (_pg_repeat_timer ) {
778
788
SDL_RemoveTimer (_pg_repeat_timer );
@@ -805,6 +815,11 @@ pgEvent_AutoInit(PyObject *self, PyObject *_null)
805
815
}
806
816
#endif
807
817
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
808
823
}
809
824
_pg_event_is_init = 1 ;
810
825
Py_RETURN_NONE ;
@@ -936,10 +951,8 @@ _pg_name_from_eventtype(int type)
936
951
return "FingerDown" ;
937
952
case SDL_FINGERUP :
938
953
return "FingerUp" ;
939
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
940
954
case SDL_MULTIGESTURE :
941
955
return "MultiGesture" ;
942
- #endif
943
956
case SDL_MOUSEWHEEL :
944
957
return "MouseWheel" ;
945
958
case SDL_TEXTINPUT :
@@ -1142,7 +1155,6 @@ dict_from_event(SDL_Event *event)
1142
1155
state = SDL_APPACTIVE ;
1143
1156
break ;
1144
1157
default :
1145
- assert (event -> window .event == SDL_WINDOWEVENT_RESTORED );
1146
1158
gain = 1 ;
1147
1159
state = SDL_APPACTIVE ;
1148
1160
}
@@ -1294,9 +1306,27 @@ dict_from_event(SDL_Event *event)
1294
1306
_pg_insobj (dict , "pressure" ,
1295
1307
PyFloat_FromDouble (event -> tfinger .dy ));
1296
1308
break ;
1297
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
1298
1309
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
1300
1330
_pg_insobj (dict , "touch_id" ,
1301
1331
PyLong_FromLongLong (event -> mgesture .touchId ));
1302
1332
_pg_insobj (dict , "x" , PyFloat_FromDouble (event -> mgesture .x ));
@@ -1307,8 +1337,8 @@ dict_from_event(SDL_Event *event)
1307
1337
PyFloat_FromDouble (event -> mgesture .dDist ));
1308
1338
_pg_insobj (dict , "num_fingers" ,
1309
1339
PyLong_FromLong (event -> mgesture .numFingers ));
1310
- break ;
1311
1340
#endif
1341
+ break ;
1312
1342
case SDL_MOUSEWHEEL :
1313
1343
/* https://wiki.libsdl.org/SDL_MouseWheelEvent */
1314
1344
#ifndef NO_SDL_MOUSEWHEEL_FLIPPED
0 commit comments