eventthread.cpp changes for SDL3 syka bliat

This commit is contained in:
ZakatTeamI2P 2026-03-30 19:00:58 +04:00
parent 72166a0c6c
commit 060eea022c
3 changed files with 88 additions and 93 deletions

View file

@ -24,7 +24,7 @@
#include "util.h" #include "util.h"
#include <SDL_rect.h> #include <SDL3/SDL_rect.h>
struct Vec2 struct Vec2
{ {

View file

@ -24,8 +24,8 @@
#include "serial-util.h" #include "serial-util.h"
#include "exception.h" #include "exception.h"
#include <SDL_types.h> #include <SDL3/SDL_types.h>
#include <SDL_pixels.h> #include <SDL3/SDL_pixels.h>
Color::Color(double red, double green, double blue, double alpha) Color::Color(double red, double green, double blue, double alpha)
: red(red), green(green), blue(blue), alpha(alpha) : red(red), green(green), blue(blue), alpha(alpha)

View file

@ -21,14 +21,14 @@
#include "eventthread.h" #include "eventthread.h"
#include <SDL_events.h> #include <SDL3/SDL_events.h>
#include <SDL_joystick.h> #include <SDL3/SDL_joystick.h>
#include <SDL_gamecontroller.h> #include <SDL3/SDL_gamecontroller.h>
#include <SDL_messagebox.h> #include <SDL3/SDL_messagebox.h>
#include <SDL_timer.h> #include <SDL3/SDL_timer.h>
#include <SDL_thread.h> #include <SDL3/SDL_thread.h>
#include <SDL_touch.h> #include <SDL3/SDL_touch.h>
#include <SDL_rect.h> #include <SDL3/SDL_rect.h>
#include <al.h> #include <al.h>
#include <alc.h> #include <alc.h>
@ -101,8 +101,8 @@ static uint32_t usrIdStart;
bool EventThread::allocUserEvents() bool EventThread::allocUserEvents()
{ {
usrIdStart = SDL_RegisterEvents(EVENT_COUNT); usrIdStart = SDL_RegisterEvents(EVENT_COUNT);
// SDL_RegisterEvents() now returns 0 if it couldn't allocate any user events.
if (usrIdStart == (uint32_t) -1) if (usrIdStart == (uint32_t) 0)
return false; return false;
return true; return true;
@ -147,19 +147,19 @@ void EventThread::process(RGSSThreadData &rtData)
bool terminate = false; bool terminate = false;
std::map<int, SDL_GameController*> controllers; std::map<int, SDL_Gamepad*> controllers;
std::map<int, SDL_Joystick*> joysticks; std::map<int, SDL_Joystick*> joysticks;
for (int i = 0; i < SDL_NumJoysticks(); ++i) { for (int i = 0; i < SDL_GetJoysticks(NULL); ++i) {
if (SDL_IsGameController(i)) { if (SDL_IsGamepad(i)) {
//Load as game controller //Load as game controller
SDL_GameController *gc = SDL_GameControllerOpen(i); SDL_Gamepad *gc = SDL_OpenGamepad(i);
int id = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(gc)); int id = SDL_GetJoystickID(SDL_GetGamepadJoystick(gc));
controllers[id] = gc; controllers[id] = gc;
} else { } else {
//Fall back to joystick //Fall back to joystick
SDL_Joystick *js = SDL_JoystickOpen(i); SDL_Joystick *js = SDL_OpenJoystick(i);
joysticks[SDL_JoystickInstanceID(js)] = js; joysticks[SDL_GetJoystickID(js)] = js;
} }
} }
@ -173,10 +173,10 @@ void EventThread::process(RGSSThreadData &rtData)
int i; int i;
SDL_Joystick *js; SDL_Joystick *js;
SDL_GameController *gc; SDL_Gamepad *gc;
int id; int id;
std::map<int, SDL_Joystick*>::iterator jsit; std::map<int, SDL_Joystick*>::iterator jsit;
std::map<int, SDL_GameController*>::iterator gcit; std::map<int, SDL_Gamepad*>::iterator gcit;
SDL_GetWindowSize(win, &winW, &winH); // SDL_GL_GetDrawableSize(win, &winW, &winH); SDL_GetWindowSize(win, &winW, &winH); // SDL_GL_GetDrawableSize(win, &winW, &winH);
@ -206,16 +206,16 @@ void EventThread::process(RGSSThreadData &rtData)
/* Preselect and discard unwanted events here */ /* Preselect and discard unwanted events here */
switch (event.type) switch (event.type)
{ {
case SDL_MOUSEBUTTONDOWN : case SDL_EVENT_MOUSE_BUTTON_DOWN :
case SDL_MOUSEBUTTONUP : case SDL_EVENT_MOUSE_BUTTON_UP :
case SDL_MOUSEMOTION : case SDL_EVENT_MOUSE_MOTION :
if (event.button.which == SDL_TOUCH_MOUSEID) if (event.button.which == SDL_TOUCH_MOUSEID)
continue; continue;
break; break;
case SDL_FINGERDOWN : case SDL_EVENT_FINGER_DOWN :
case SDL_FINGERUP : case SDL_EVENT_FINGER_UP :
case SDL_FINGERMOTION : case SDL_EVENT_FINGER_MOTION :
if (event.tfinger.fingerId >= MAX_FINGERS) if (event.tfinger.fingerId >= MAX_FINGERS)
continue; continue;
break; break;
@ -227,7 +227,8 @@ void EventThread::process(RGSSThreadData &rtData)
case SDL_WINDOWEVENT : case SDL_WINDOWEVENT :
switch (event.window.event) switch (event.window.event)
{ {
case SDL_WINDOWEVENT_SIZE_CHANGED : //SDL_WINDOWEVENT_SIZE_CHANGED - handle the SDL_EVENT_WINDOW_RESIZED and SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED events instead
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED :
winW = event.window.data1; winW = event.window.data1;
winH = event.window.data2; winH = event.window.data2;
@ -237,21 +238,21 @@ void EventThread::process(RGSSThreadData &rtData)
resetInputStates(); resetInputStates();
break; break;
case SDL_WINDOWEVENT_ENTER : case SDL_EVENT_WINDOW_MOUSE_ENTER :
cursorInWindow = true; cursorInWindow = true;
mouseState.inWindow = true; mouseState.inWindow = true;
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen); updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
break; break;
case SDL_WINDOWEVENT_LEAVE : case SDL_EVENT_WINDOW_MOUSE_LEAVE :
cursorInWindow = false; cursorInWindow = false;
mouseState.inWindow = false; mouseState.inWindow = false;
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen); updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
break; break;
case SDL_WINDOWEVENT_CLOSE : case SDL_EVENT_WINDOW_CLOSE_REQUESTED :
if (rtData.allowExit) { if (rtData.allowExit) {
terminate = true; terminate = true;
} else { } else {
@ -260,13 +261,13 @@ void EventThread::process(RGSSThreadData &rtData)
break; break;
case SDL_WINDOWEVENT_FOCUS_GAINED : case SDL_EVENT_WINDOW_FOCUS_GAINED :
windowFocused = true; windowFocused = true;
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen); updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
break; break;
case SDL_WINDOWEVENT_FOCUS_LOST : case SDL_EVENT_WINDOW_FOCUS_LOST :
windowFocused = false; windowFocused = false;
updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen); updateCursorState(cursorInWindow && windowFocused && !sMenu, gameScreen);
resetInputStates(); resetInputStates();
@ -275,7 +276,7 @@ void EventThread::process(RGSSThreadData &rtData)
} }
#ifdef __APPLE__ #ifdef __APPLE__
case SDL_WINDOWEVENT_MOVED: case SDL_EVENT_WINDOW_MOVED:
if (shState != NULL && event.window.data1 && event.window.data2) if (shState != NULL && event.window.data1 && event.window.data2)
shState->oneshot().setWindowPos(event.window.data1, event.window.data2); shState->oneshot().setWindowPos(event.window.data1, event.window.data2);
break; break;
@ -283,7 +284,7 @@ void EventThread::process(RGSSThreadData &rtData)
break; break;
case SDL_QUIT : case SDL_EVENT_QUIT :
if (rtData.allowExit) { if (rtData.allowExit) {
terminate = true; terminate = true;
Debug() << "EventThread termination requested"; Debug() << "EventThread termination requested";
@ -293,11 +294,11 @@ void EventThread::process(RGSSThreadData &rtData)
break; break;
case SDL_TEXTINPUT: case SDL_EVENT_TEXT_INPUT:
if (rtData.inputText.length() < (size_t)(rtData.inputTextLimit)) rtData.inputText += event.text.text; if (rtData.inputText.length() < (size_t)(rtData.inputTextLimit)) rtData.inputText += event.text.text;
break; break;
case SDL_KEYDOWN : case SDL_EVENT_KEY_DOWN :
if (event.key.keysym.scancode == SDL_SCANCODE_F1) if (event.key.keysym.scancode == SDL_SCANCODE_F1)
{ {
if (!sMenu) if (!sMenu)
@ -364,7 +365,7 @@ void EventThread::process(RGSSThreadData &rtData)
keyStates[event.key.keysym.scancode] = true; keyStates[event.key.keysym.scancode] = true;
break; break;
case SDL_KEYUP : case SDL_EVENT_KEY_UP :
if (event.key.keysym.scancode == SDL_SCANCODE_F12) if (event.key.keysym.scancode == SDL_SCANCODE_F12)
{ {
if (!rtData.config.debugMode) if (!rtData.config.debugMode)
@ -378,92 +379,92 @@ void EventThread::process(RGSSThreadData &rtData)
keyStates[event.key.keysym.scancode] = false; keyStates[event.key.keysym.scancode] = false;
break; break;
case SDL_CONTROLLERBUTTONDOWN: case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
gcState.buttons[event.cbutton.button] = true; gcState.buttons[event.cbutton.button] = true;
break; break;
case SDL_CONTROLLERBUTTONUP: case SDL_EVENT_GAMEPAD_BUTTON_UP:
gcState.buttons[event.cbutton.button] = false; gcState.buttons[event.cbutton.button] = false;
break; break;
case SDL_CONTROLLERAXISMOTION: case SDL_EVENT_GAMEPAD_AXIS_MOTION:
gcState.axes[event.caxis.axis] = event.caxis.value; gcState.axes[event.caxis.axis] = event.caxis.value;
break; break;
case SDL_CONTROLLERDEVICEADDED: case SDL_EVENT_GAMEPAD_ADDED:
gc = SDL_GameControllerOpen(event.jdevice.which); gc = SDL_OpenGamepad(event.jdevice.which);
id = SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(gc)); id = SDL_GetJoystickID(SDL_GetGamepadJoystick(gc));
controllers[id] = gc; controllers[id] = gc;
break; break;
case SDL_CONTROLLERDEVICEREMOVED: case SDL_EVENT_GAMEPAD_REMOVED:
gcit = controllers.find(event.jdevice.which); gcit = controllers.find(event.jdevice.which);
SDL_GameControllerClose(gcit->second); SDL_CloseGamepad(gcit->second);
controllers.erase(gcit); controllers.erase(gcit);
break; break;
case SDL_JOYBUTTONDOWN : case SDL_EVENT_JOYSTICK_BUTTON_DOWN :
if (joysticks.find(event.jbutton.which) != joysticks.end()) if (joysticks.find(event.jbutton.which) != joysticks.end())
joyState.buttons[event.jbutton.button] = true; joyState.buttons[event.jbutton.button] = true;
break; break;
case SDL_JOYBUTTONUP : case SDL_EVENT_JOYSTICK_BUTTON_UP :
if (joysticks.find(event.jbutton.which) != joysticks.end()) if (joysticks.find(event.jbutton.which) != joysticks.end())
joyState.buttons[event.jbutton.button] = false; joyState.buttons[event.jbutton.button] = false;
break; break;
case SDL_JOYHATMOTION : case SDL_EVENT_JOYSTICK_HAT_MOTION :
if (joysticks.find(event.jbutton.which) != joysticks.end()) if (joysticks.find(event.jbutton.which) != joysticks.end())
joyState.hats[event.jhat.hat] = event.jhat.value; joyState.hats[event.jhat.hat] = event.jhat.value;
break; break;
case SDL_JOYAXISMOTION : case SDL_EVENT_JOYSTICK_AXIS_MOTION :
if (joysticks.find(event.jbutton.which) != joysticks.end()) if (joysticks.find(event.jbutton.which) != joysticks.end())
joyState.axes[event.jaxis.axis] = event.jaxis.value; joyState.axes[event.jaxis.axis] = event.jaxis.value;
break; break;
case SDL_JOYDEVICEADDED : case SDL_EVENT_JOYSTICK_ADDED :
if (SDL_IsGameController(event.jdevice.which)) if (SDL_IsGamepad(event.jdevice.which))
break; break;
js = SDL_JoystickOpen(event.jdevice.which); js = SDL_OpenJoystick(event.jdevice.which);
joysticks[SDL_JoystickInstanceID(js)] = js; joysticks[SDL_GetJoystickID(js)] = js;
break; break;
case SDL_JOYDEVICEREMOVED : case SDL_EVENT_JOYSTICK_REMOVED :
jsit = joysticks.find(event.jdevice.which); jsit = joysticks.find(event.jdevice.which);
if (jsit != joysticks.end()) { if (jsit != joysticks.end()) {
SDL_JoystickClose(jsit->second); SDL_CloseJoystick(jsit->second);
joysticks.erase(jsit); joysticks.erase(jsit);
resetInputStates(); resetInputStates();
} }
break; break;
case SDL_MOUSEBUTTONDOWN : case SDL_EVENT_MOUSE_BUTTON_DOWN :
mouseState.buttons[event.button.button] = true; mouseState.buttons[event.button.button] = true;
break; break;
case SDL_MOUSEBUTTONUP : case SDL_EVENT_MOUSE_BUTTON_UP :
mouseState.buttons[event.button.button] = false; mouseState.buttons[event.button.button] = false;
break; break;
case SDL_MOUSEMOTION : case SDL_EVENT_MOUSE_MOTION :
mouseState.x = event.motion.x; mouseState.x = event.motion.x;
mouseState.y = event.motion.y; mouseState.y = event.motion.y;
updateCursorState(cursorInWindow, gameScreen); updateCursorState(cursorInWindow, gameScreen);
break; break;
case SDL_FINGERDOWN : case SDL_EVENT_FINGER_DOWN :
i = event.tfinger.fingerId; i = event.tfinger.fingerId;
touchState.fingers[i].down = true; touchState.fingers[i].down = true;
/* falls through */ /* falls through */
case SDL_FINGERMOTION : case SDL_EVENT_FINGER_MOTION :
i = event.tfinger.fingerId; i = event.tfinger.fingerId;
touchState.fingers[i].x = event.tfinger.x * winW; touchState.fingers[i].x = event.tfinger.x * winW;
touchState.fingers[i].y = event.tfinger.y * winH; touchState.fingers[i].y = event.tfinger.y * winH;
break; break;
case SDL_FINGERUP : case SDL_EVENT_FINGER_UP :
i = event.tfinger.fingerId; i = event.tfinger.fingerId;
memset(&touchState.fingers[i], 0, sizeof(touchState.fingers[0])); memset(&touchState.fingers[i], 0, sizeof(touchState.fingers[0]));
break; break;
@ -533,9 +534,9 @@ void EventThread::process(RGSSThreadData &rtData)
rtData.syncPoint.resumeThreads(); rtData.syncPoint.resumeThreads();
for (gcit = controllers.begin(); gcit != controllers.end(); ++gcit) for (gcit = controllers.begin(); gcit != controllers.end(); ++gcit)
SDL_GameControllerClose(gcit->second); SDL_CloseGamepad(gcit->second);
for (jsit = joysticks.begin(); jsit != joysticks.end(); ++jsit) for (jsit = joysticks.begin(); jsit != joysticks.end(); ++jsit)
SDL_JoystickClose(jsit->second); SDL_CloseJoystick(jsit->second);
delete sMenu; delete sMenu;
} }
@ -546,8 +547,8 @@ int EventThread::eventFilter(void *data, SDL_Event *event)
switch (event->type) switch (event->type)
{ {
case SDL_APP_WILLENTERBACKGROUND : case SDL_EVENT_WILL_ENTER_BACKGROUND :
Debug() << "SDL_APP_WILLENTERBACKGROUND"; Debug() << "SDL_EVENT_WILL_ENTER_BACKGROUND";
if (HAVE_ALC_DEVICE_PAUSE) if (HAVE_ALC_DEVICE_PAUSE)
alc.DevicePause(rtData.alcDev); alc.DevicePause(rtData.alcDev);
@ -556,16 +557,16 @@ int EventThread::eventFilter(void *data, SDL_Event *event)
return 0; return 0;
case SDL_APP_DIDENTERBACKGROUND : case SDL_EVENT_DID_ENTER_BACKGROUND :
Debug() << "SDL_APP_DIDENTERBACKGROUND"; Debug() << "SDL_EVENT_DID_ENTER_BACKGROUND";
return 0; return 0;
case SDL_APP_WILLENTERFOREGROUND : case SDL_EVENT_WILL_ENTER_FOREGROUND :
Debug() << "SDL_APP_WILLENTERFOREGROUND"; Debug() << "SDL_EVENT_WILL_ENTER_FOREGROUND";
return 0; return 0;
case SDL_APP_DIDENTERFOREGROUND : case SDL_EVENT_DID_ENTER_FOREGROUND :
Debug() << "SDL_APP_DIDENTERFOREGROUND"; Debug() << "SDL_EVENT_DID_ENTER_FOREGROUND";
if (HAVE_ALC_DEVICE_PAUSE) if (HAVE_ALC_DEVICE_PAUSE)
alc.DeviceResume(rtData.alcDev); alc.DeviceResume(rtData.alcDev);
@ -574,17 +575,17 @@ int EventThread::eventFilter(void *data, SDL_Event *event)
return 0; return 0;
case SDL_APP_TERMINATING : case SDL_EVENT_TERMINATING :
Debug() << "SDL_APP_TERMINATING"; Debug() << "SDL_EVENT_TERMINATING";
return 0; return 0;
case SDL_APP_LOWMEMORY : case SDL_EVENT_LOW_MEMORY :
Debug() << "SDL_APP_LOWMEMORY"; Debug() << "SDL_EVENT_LOW_MEMORY";
return 0; return 0;
/* Workaround for Windows pausing on drag */ /* Workaround for Windows pausing on drag */
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
if (event->window.event == SDL_WINDOWEVENT_MOVED) if (event->window.event == SDL_EVENT_WINDOW_MOVED)
{ {
if (shState != NULL && shState->rgssVersion > 0) if (shState != NULL && shState->rgssVersion > 0)
{ {
@ -599,8 +600,7 @@ int EventThread::eventFilter(void *data, SDL_Event *event)
return 1; return 1;
} }
void EventThread::cleanup() void EventThread::cleanup(){
{
SDL_Event event; SDL_Event event;
while (SDL_PollEvent(&event)) while (SDL_PollEvent(&event))
@ -608,8 +608,7 @@ void EventThread::cleanup()
free(event.user.data1); free(event.user.data1);
} }
void EventThread::resetInputStates() void EventThread::resetInputStates(){
{
memset(&keyStates, 0, sizeof(keyStates)); memset(&keyStates, 0, sizeof(keyStates));
memset(&gcState, 0, sizeof(gcState)); memset(&gcState, 0, sizeof(gcState));
memset(&joyState, 0, sizeof(joyState)); memset(&joyState, 0, sizeof(joyState));
@ -617,23 +616,19 @@ void EventThread::resetInputStates()
memset(&touchState, 0, sizeof(touchState)); memset(&touchState, 0, sizeof(touchState));
} }
void EventThread::setFullscreen(SDL_Window *win, bool mode) void EventThread::setFullscreen(SDL_Window *win, bool mode){
{ SDL_SetWindowFullscreen(win, mode ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
SDL_SetWindowFullscreen
(win, mode ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
fullscreen = mode; fullscreen = mode;
} }
void EventThread::updateCursorState(bool inWindow, void EventThread::updateCursorState(bool inWindow, const SDL_Rect &screen){
const SDL_Rect &screen)
{
SDL_Point pos = { mouseState.x, mouseState.y }; SDL_Point pos = { mouseState.x, mouseState.y };
bool inScreen = inWindow && SDL_PointInRect(&pos, &screen); bool inScreen = inWindow && SDL_PointInRect(&pos, &screen);
if (inScreen) if (inScreen)
SDL_ShowCursor(showCursor ? SDL_TRUE : SDL_FALSE); SDL_ShowCursor();
else else
SDL_ShowCursor(SDL_TRUE); SDL_HideCursor()
} }
void EventThread::requestTerminate() void EventThread::requestTerminate()
@ -818,9 +813,9 @@ void SyncPoint::Util::unlock(bool multi)
locked.clear(); locked.clear();
if (multi) if (multi)
SDL_CondBroadcast(cond); SDL_BroadcastCondition(cond);
else else
SDL_CondSignal(cond); SDL_SignalCondition(cond);
} }
void SyncPoint::Util::waitForUnlock() void SyncPoint::Util::waitForUnlock()