25
25
*/
26
26
#define PYGAMEAPI_EVENT_INTERNAL
27
27
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
28
33
#include "pygame.h"
29
34
30
35
#include "pgcompat.h"
@@ -401,10 +406,8 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
401
406
_PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADMOTION );
402
407
_PG_HANDLE_PROXIFY (CONTROLLERTOUCHPADUP );
403
408
_PG_HANDLE_PROXIFY (CONTROLLERSENSORUPDATE );
404
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
405
409
_PG_HANDLE_PROXIFY (DOLLARGESTURE );
406
410
_PG_HANDLE_PROXIFY (DOLLARRECORD );
407
- #endif
408
411
_PG_HANDLE_PROXIFY (DROPFILE );
409
412
_PG_HANDLE_PROXIFY (DROPTEXT );
410
413
_PG_HANDLE_PROXIFY (DROPBEGIN );
@@ -427,9 +430,7 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
427
430
_PG_HANDLE_PROXIFY (MOUSEBUTTONDOWN );
428
431
_PG_HANDLE_PROXIFY (MOUSEBUTTONUP );
429
432
_PG_HANDLE_PROXIFY (MOUSEWHEEL );
430
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
431
433
_PG_HANDLE_PROXIFY (MULTIGESTURE );
432
- #endif
433
434
_PG_HANDLE_PROXIFY (NOEVENT );
434
435
_PG_HANDLE_PROXIFY (QUIT );
435
436
_PG_HANDLE_PROXIFY (RENDER_TARGETS_RESET );
@@ -493,19 +494,28 @@ _pg_pgevent_type(SDL_Event *event)
493
494
* Currently this only includes WINDOWEVENT, but can be expanded in the
494
495
* future.
495
496
*/
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 )
502
499
{
503
500
#if SDL_VERSION_ATLEAST (3 , 0 , 0 )
504
501
if (event -> type >= SDL_EVENT_WINDOW_FIRST &&
505
502
event -> type <= SDL_EVENT_WINDOW_LAST ) {
506
503
#else
507
504
if (event -> type == SDL_WINDOWEVENT ) {
508
505
#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 )) {
509
519
return PG_EventEnabled (_pg_pgevent_proxify (_pg_pgevent_type (event )));
510
520
}
511
521
return 1 ;
@@ -732,14 +742,15 @@ pg_event_filter(void *_, SDL_Event *event)
732
742
return RAISE(pgExc_SDLError, SDL_GetError()), 0;
733
743
*/
734
744
}
735
- /* TODO:
745
+ /*
736
746
* Any event that gets blocked here will not be visible to the event
737
747
* 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
748
* If the user requests a block on WINDOWEVENTs we are going to handle
741
749
* it specially and call it a "pseudo-block", where the filtering will
742
750
* happen in a _pg_filter_blocked_events call. */
751
+ if (_pg_event_psuedo_block (event )) {
752
+ return 1 ;
753
+ }
743
754
return PG_EventEnabled (_pg_pgevent_proxify (event -> type ));
744
755
}
745
756
@@ -773,6 +784,9 @@ static PyObject *
773
784
pgEvent_AutoQuit (PyObject * self , PyObject * _null )
774
785
{
775
786
if (_pg_event_is_init ) {
787
+ #if SDL_VERSION_ATLEAST (3 , 0 , 0 )
788
+ Gesture_Quit ();
789
+ #endif
776
790
PG_LOCK_EVFILTER_MUTEX
777
791
if (_pg_repeat_timer ) {
778
792
SDL_RemoveTimer (_pg_repeat_timer );
@@ -805,6 +819,11 @@ pgEvent_AutoInit(PyObject *self, PyObject *_null)
805
819
}
806
820
#endif
807
821
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
808
827
}
809
828
_pg_event_is_init = 1 ;
810
829
Py_RETURN_NONE ;
@@ -936,10 +955,8 @@ _pg_name_from_eventtype(int type)
936
955
return "FingerDown" ;
937
956
case SDL_FINGERUP :
938
957
return "FingerUp" ;
939
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
940
958
case SDL_MULTIGESTURE :
941
959
return "MultiGesture" ;
942
- #endif
943
960
case SDL_MOUSEWHEEL :
944
961
return "MouseWheel" ;
945
962
case SDL_TEXTINPUT :
@@ -1142,7 +1159,6 @@ dict_from_event(SDL_Event *event)
1142
1159
state = SDL_APPACTIVE ;
1143
1160
break ;
1144
1161
default :
1145
- assert (event -> window .event == SDL_WINDOWEVENT_RESTORED );
1146
1162
gain = 1 ;
1147
1163
state = SDL_APPACTIVE ;
1148
1164
}
@@ -1294,9 +1310,27 @@ dict_from_event(SDL_Event *event)
1294
1310
_pg_insobj (dict , "pressure" ,
1295
1311
PyFloat_FromDouble (event -> tfinger .dy ));
1296
1312
break ;
1297
- #if !SDL_VERSION_ATLEAST (3 , 0 , 0 )
1298
1313
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
1300
1334
_pg_insobj (dict , "touch_id" ,
1301
1335
PyLong_FromLongLong (event -> mgesture .touchId ));
1302
1336
_pg_insobj (dict , "x" , PyFloat_FromDouble (event -> mgesture .x ));
@@ -1307,8 +1341,8 @@ dict_from_event(SDL_Event *event)
1307
1341
PyFloat_FromDouble (event -> mgesture .dDist ));
1308
1342
_pg_insobj (dict , "num_fingers" ,
1309
1343
PyLong_FromLong (event -> mgesture .numFingers ));
1310
- break ;
1311
1344
#endif
1345
+ break ;
1312
1346
case SDL_MOUSEWHEEL :
1313
1347
/* https://wiki.libsdl.org/SDL_MouseWheelEvent */
1314
1348
#ifndef NO_SDL_MOUSEWHEEL_FLIPPED
0 commit comments