Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 45 additions & 14 deletions src_c/_pygame.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@
#include "stdbool.h"

#if SDL_VERSION_ATLEAST(3, 0, 0)

#include "include/SDL_gesture.h"

#define SDL_DOLLARGESTURE GESTURE_DOLLARGESTURE
#define SDL_DOLLARRECORD GESTURE_DOLLARRECORD
#define SDL_MULTIGESTURE GESTURE_MULTIGESTURE

#define PG_ShowCursor SDL_ShowCursor
#define PG_HideCursor SDL_HideCursor
#define PG_CursorVisible SDL_CursorVisible
Expand All @@ -68,12 +75,6 @@
#define PG_AUDIO_ALLOW_CHANNELS_CHANGE 0
#define PG_AUDIO_ALLOW_ANY_CHANGE 0

// Todo: deal with multigesture.. See
// https://github.com/pygame-community/pygame-ce/issues/2420
#define PG_MULTIGESTURE 0

#define PG_JOYBALLMOTION 0

#define PG_CreateSurface SDL_CreateSurface
#define PG_CreateSurfaceFrom SDL_CreateSurfaceFrom
#define PG_ConvertSurface SDL_ConvertSurface
Expand Down Expand Up @@ -183,10 +184,6 @@ PG_GetSurfaceFormat(SDL_Surface *surf)
#define PG_AUDIO_ALLOW_CHANNELS_CHANGE SDL_AUDIO_ALLOW_CHANNELS_CHANGE
#define PG_AUDIO_ALLOW_ANY_CHANGE SDL_AUDIO_ALLOW_ANY_CHANGE

#define PG_MULTIGESTURE SDL_MULTIGESTURE

#define PG_JOYBALLMOTION SDL_JOYBALLMOTION

#define PG_CreateSurface(width, height, format) \
SDL_CreateRGBSurfaceWithFormat(0, width, height, 0, format)
#define PG_CreateSurfaceFrom(width, height, format, pixels, pitch) \
Expand Down Expand Up @@ -425,6 +422,40 @@ typedef enum {
PGM_BUTTON_KEEP = 0x80
} PygameMouseFlags;

#if SDL_VERSION_ATLEAST(3, 0, 0)
typedef enum {
PGE_WINDOWSHOWN = SDL_EVENT_WINDOW_SHOWN,
PGE_WINDOWHIDDEN = SDL_EVENT_WINDOW_HIDDEN,
PGE_WINDOWEXPOSED = SDL_EVENT_WINDOW_EXPOSED,
PGE_WINDOWMOVED = SDL_EVENT_WINDOW_MOVED,
PGE_WINDOWRESIZED = SDL_EVENT_WINDOW_RESIZED,
PGE_WINDOWSIZECHANGED = SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED,
PGE_WINDOWMINIMIZED = SDL_EVENT_WINDOW_MINIMIZED,
PGE_WINDOWMAXIMIZED = SDL_EVENT_WINDOW_MAXIMIZED,
PGE_WINDOWRESTORED = SDL_EVENT_WINDOW_RESTORED,
PGE_WINDOWENTER = SDL_EVENT_WINDOW_MOUSE_ENTER,
PGE_WINDOWLEAVE = SDL_EVENT_WINDOW_MOUSE_LEAVE,
PGE_WINDOWFOCUSGAINED = SDL_EVENT_WINDOW_FOCUS_GAINED,
PGE_WINDOWFOCUSLOST = SDL_EVENT_WINDOW_FOCUS_LOST,
PGE_WINDOWCLOSE = SDL_EVENT_WINDOW_CLOSE_REQUESTED,
PGE_WINDOWTAKEFOCUS = -1, /* No SDL3 equivalent */
PGE_WINDOWHITTEST = SDL_EVENT_WINDOW_HIT_TEST,
PGE_WINDOWICCPROFCHANGED = SDL_EVENT_WINDOW_ICCPROF_CHANGED,
PGE_WINDOWDISPLAYCHANGED = SDL_EVENT_WINDOW_DISPLAY_CHANGED,
} PygameWindowEventCode;
/*
TODO: expose these window events in pygame API
SDL_EVENT_WINDOW_METAL_VIEW_RESIZED,
SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED,
SDL_EVENT_WINDOW_SAFE_AREA_CHANGED,
SDL_EVENT_WINDOW_OCCLUDED,
SDL_EVENT_WINDOW_ENTER_FULLSCREEN,
SDL_EVENT_WINDOW_LEAVE_FULLSCREEN,
SDL_EVENT_WINDOW_DESTROYED,
SDL_EVENT_WINDOW_HDR_STATE_CHANGED,
*/
#endif

typedef enum {
/* Any SDL_* events here are for backward compatibility. */
SDL_NOEVENT = 0,
Expand All @@ -440,6 +471,9 @@ typedef enum {
PGE_MIDIIN,
PGE_MIDIOUT,

/* These PGE events are only needed on SDL2: SDL3 has dedicated events for
* these */
#if !SDL_VERSION_ATLEAST(3, 0, 0)
/* DO NOT CHANGE THE ORDER OF EVENTS HERE */
PGE_WINDOWSHOWN,
PGE_WINDOWHIDDEN,
Expand All @@ -459,6 +493,7 @@ typedef enum {
PGE_WINDOWHITTEST,
PGE_WINDOWICCPROFCHANGED,
PGE_WINDOWDISPLAYCHANGED,
#endif

/* Here we define PGPOST_* events, events that act as a one-to-one
* proxy for SDL events (and some extra events too!), the proxy is used
Expand Down Expand Up @@ -494,10 +529,8 @@ typedef enum {
PGPOST_CONTROLLERTOUCHPADMOTION,
PGPOST_CONTROLLERTOUCHPADUP,
PGPOST_CONTROLLERSENSORUPDATE,
#if !SDL_VERSION_ATLEAST(3, 0, 0)
PGPOST_DOLLARGESTURE,
PGPOST_DOLLARRECORD,
#endif
PGPOST_DROPFILE,
PGPOST_DROPTEXT,
PGPOST_DROPBEGIN,
Expand All @@ -522,9 +555,7 @@ typedef enum {
PGPOST_MOUSEBUTTONDOWN,
PGPOST_MOUSEBUTTONUP,
PGPOST_MOUSEWHEEL,
#if !SDL_VERSION_ATLEAST(3, 0, 0)
PGPOST_MULTIGESTURE,
#endif
PGPOST_NOEVENT,
PGPOST_QUIT,
PGPOST_RENDER_TARGETS_RESET,
Expand Down
4 changes: 2 additions & 2 deletions src_c/constants.c
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ MODINIT_DEFINE(constants)
DEC_CONST(MOUSEBUTTONDOWN);
DEC_CONST(MOUSEBUTTONUP);
DEC_CONST(JOYAXISMOTION);
DEC_CONSTS(JOYBALLMOTION, PG_JOYBALLMOTION);
DEC_CONST(JOYBALLMOTION);
DEC_CONST(JOYHATMOTION);
DEC_CONST(JOYBUTTONDOWN);
DEC_CONST(JOYBUTTONUP);
Expand Down Expand Up @@ -302,7 +302,7 @@ MODINIT_DEFINE(constants)
DEC_CONST(FINGERMOTION);
DEC_CONST(FINGERDOWN);
DEC_CONST(FINGERUP);
DEC_CONSTS(MULTIGESTURE, PG_MULTIGESTURE);
DEC_CONST(MULTIGESTURE);
DEC_CONST(AUDIODEVICEADDED);
DEC_CONST(AUDIODEVICEREMOVED);
DEC_CONST(MOUSEWHEEL);
Expand Down
68 changes: 49 additions & 19 deletions src_c/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
*/
#define PYGAMEAPI_EVENT_INTERNAL

#define SDL_GESTURE_IMPLEMENTATION 1
#include "pygame.h"

#include "pgcompat.h"
Expand Down Expand Up @@ -401,10 +402,8 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
_PG_HANDLE_PROXIFY(CONTROLLERTOUCHPADMOTION);
_PG_HANDLE_PROXIFY(CONTROLLERTOUCHPADUP);
_PG_HANDLE_PROXIFY(CONTROLLERSENSORUPDATE);
#if !SDL_VERSION_ATLEAST(3, 0, 0)
_PG_HANDLE_PROXIFY(DOLLARGESTURE);
_PG_HANDLE_PROXIFY(DOLLARRECORD);
#endif
_PG_HANDLE_PROXIFY(DROPFILE);
_PG_HANDLE_PROXIFY(DROPTEXT);
_PG_HANDLE_PROXIFY(DROPBEGIN);
Expand All @@ -427,9 +426,7 @@ _pg_pgevent_proxify_helper(Uint32 type, Uint8 proxify)
_PG_HANDLE_PROXIFY(MOUSEBUTTONDOWN);
_PG_HANDLE_PROXIFY(MOUSEBUTTONUP);
_PG_HANDLE_PROXIFY(MOUSEWHEEL);
#if !SDL_VERSION_ATLEAST(3, 0, 0)
_PG_HANDLE_PROXIFY(MULTIGESTURE);
#endif
_PG_HANDLE_PROXIFY(NOEVENT);
_PG_HANDLE_PROXIFY(QUIT);
_PG_HANDLE_PROXIFY(RENDER_TARGETS_RESET);
Expand Down Expand Up @@ -493,19 +490,28 @@ _pg_pgevent_type(SDL_Event *event)
* Currently this only includes WINDOWEVENT, but can be expanded in the
* future.
*/
#if SDL_VERSION_ATLEAST(3, 0, 0)
static bool SDLCALL
#else
static int SDLCALL
#endif
_pg_filter_blocked_events(void *_, SDL_Event *event)
static bool
_pg_event_psuedo_block(SDL_Event *event)
{
#if SDL_VERSION_ATLEAST(3, 0, 0)
if (event->type >= SDL_EVENT_WINDOW_FIRST &&
event->type <= SDL_EVENT_WINDOW_LAST) {
#else
if (event->type == SDL_WINDOWEVENT) {
#endif
return true;
}
return false;
}

#if SDL_VERSION_ATLEAST(3, 0, 0)
static bool SDLCALL
#else
static int SDLCALL
#endif
_pg_filter_blocked_events(void *_, SDL_Event *event)
{
if (_pg_event_psuedo_block(event)) {
return PG_EventEnabled(_pg_pgevent_proxify(_pg_pgevent_type(event)));
}
return 1;
Expand Down Expand Up @@ -732,14 +738,15 @@ pg_event_filter(void *_, SDL_Event *event)
return RAISE(pgExc_SDLError, SDL_GetError()), 0;
*/
}
/* TODO:
/*
* Any event that gets blocked here will not be visible to the event
* watchers. So things like WINDOWEVENT should never be blocked here.
* This is taken care of in SDL2 codepaths already but needs to also
* be verified in SDL3 porting.
* If the user requests a block on WINDOWEVENTs we are going to handle
* it specially and call it a "pseudo-block", where the filtering will
* happen in a _pg_filter_blocked_events call. */
if (_pg_event_psuedo_block(event)) {
return 1;
}
return PG_EventEnabled(_pg_pgevent_proxify(event->type));
}

Expand Down Expand Up @@ -773,6 +780,9 @@ static PyObject *
pgEvent_AutoQuit(PyObject *self, PyObject *_null)
{
if (_pg_event_is_init) {
#if SDL_VERSION_ATLEAST(3, 0, 0)
Gesture_Quit();
#endif
PG_LOCK_EVFILTER_MUTEX
if (_pg_repeat_timer) {
SDL_RemoveTimer(_pg_repeat_timer);
Expand Down Expand Up @@ -805,6 +815,11 @@ pgEvent_AutoInit(PyObject *self, PyObject *_null)
}
#endif
SDL_SetEventFilter(pg_event_filter, NULL);
#if SDL_VERSION_ATLEAST(3, 0, 0)
if (Gesture_Init() != 0) {
return RAISE(pgExc_SDLError, SDL_GetError());
}
#endif
}
_pg_event_is_init = 1;
Py_RETURN_NONE;
Expand Down Expand Up @@ -936,10 +951,8 @@ _pg_name_from_eventtype(int type)
return "FingerDown";
case SDL_FINGERUP:
return "FingerUp";
#if !SDL_VERSION_ATLEAST(3, 0, 0)
case SDL_MULTIGESTURE:
return "MultiGesture";
#endif
case SDL_MOUSEWHEEL:
return "MouseWheel";
case SDL_TEXTINPUT:
Expand Down Expand Up @@ -1142,7 +1155,6 @@ dict_from_event(SDL_Event *event)
state = SDL_APPACTIVE;
break;
default:
assert(event->window.event == SDL_WINDOWEVENT_RESTORED);
gain = 1;
state = SDL_APPACTIVE;
}
Expand Down Expand Up @@ -1294,9 +1306,27 @@ dict_from_event(SDL_Event *event)
_pg_insobj(dict, "pressure",
PyFloat_FromDouble(event->tfinger.dy));
break;
#if !SDL_VERSION_ATLEAST(3, 0, 0)
case SDL_MULTIGESTURE:
/* https://wiki.libsdl.org/SDL_MultiGestureEvent */
#if SDL_VERSION_ATLEAST(3, 0, 0)
_pg_insobj(dict, "touch_id",
PyLong_FromLongLong(
((Gesture_MultiGestureEvent *)event)->touchID));
_pg_insobj(
dict, "x",
PyFloat_FromDouble(((Gesture_MultiGestureEvent *)event)->x));
_pg_insobj(
dict, "y",
PyFloat_FromDouble(((Gesture_MultiGestureEvent *)event)->y));
_pg_insobj(dict, "rotated",
PyFloat_FromDouble(
((Gesture_MultiGestureEvent *)event)->dTheta));
_pg_insobj(dict, "pinched",
PyFloat_FromDouble(
((Gesture_MultiGestureEvent *)event)->dDist));
_pg_insobj(dict, "num_fingers",
PyLong_FromLong(
((Gesture_MultiGestureEvent *)event)->numFingers));
#else
_pg_insobj(dict, "touch_id",
PyLong_FromLongLong(event->mgesture.touchId));
_pg_insobj(dict, "x", PyFloat_FromDouble(event->mgesture.x));
Expand All @@ -1307,8 +1337,8 @@ dict_from_event(SDL_Event *event)
PyFloat_FromDouble(event->mgesture.dDist));
_pg_insobj(dict, "num_fingers",
PyLong_FromLong(event->mgesture.numFingers));
break;
#endif
break;
case SDL_MOUSEWHEEL:
/* https://wiki.libsdl.org/SDL_MouseWheelEvent */
#ifndef NO_SDL_MOUSEWHEEL_FLIPPED
Expand Down
Loading
Loading