1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-09-13 07:46:00 +00:00

migrated to SDL3

This commit is contained in:
Zeno Rogue
2025-06-07 16:16:57 +02:00
parent 41ffba600f
commit a80b74dc62
25 changed files with 435 additions and 235 deletions

View File

@@ -32,7 +32,7 @@ EX int slider_x;
EX function <void(int sym, int uni)> keyhandler = [] (int sym, int uni) {};
EX function <bool(SDL_Event &ev)> joyhandler = [] (SDL_Event &ev) {return false;};
#if CAP_SDL2
#if SDLVER >= 2
EX void ignore_text(const SDL_TextInputEvent&) {}
EX function <void(const SDL_TextInputEvent&)> texthandler = ignore_text;
#endif
@@ -40,7 +40,7 @@ EX function <void(const SDL_TextInputEvent&)> texthandler = ignore_text;
EX void reset_handlers() {
keyhandler = [] (int sym, int uni) {};
joyhandler = [] (SDL_Event &ev) {return false;};
#if CAP_SDL2
#if SDLVER >= 2
texthandler = ignore_text;
#endif
}
@@ -253,10 +253,14 @@ EX void initJoysticks_async() {
EX void countJoysticks() {
DEBB(DF_INIT, ("opening joysticks"));
#if SDLVER <= 2
numsticks = SDL_NumJoysticks();
#else
SDL_GetJoysticks(&numsticks);
#endif
if(numsticks > 8) numsticks = 8;
for(int i=0; i<numsticks; i++) {
sticks[i] = SDL_JoystickOpen(i);
sticks[i] = SDL_OpenJoystick(i);
/* printf("axes = %d, balls = %d, buttons = %d, hats = %d\n",
SDL_JoystickNumAxes(sticks[i]),
SDL_JoystickNumBalls(sticks[i]),
@@ -271,7 +275,7 @@ EX void initJoysticks() {
DEBBI(DF_INIT, ("init joystick"));
DEBB(DF_INIT, ("init joystick subsystem"));
if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) == -1)
if (SDL_error_in(SDL_InitSubSystem(SDL_INIT_JOYSTICK)))
{
printf("Failed to initialize joysticks.\n");
numsticks = 0;
@@ -285,7 +289,7 @@ EX void initJoysticks() {
EX void closeJoysticks() {
DEBB(DF_INIT, ("close joysticks"));
for(int i=0; i<numsticks; i++) {
SDL_JoystickClose(sticks[i]), sticks[i] = NULL;
SDL_CloseJoystick(sticks[i]), sticks[i] = NULL;
}
numsticks = 0;
}
@@ -834,8 +838,10 @@ EX void mainloopiter() {
oldmousepan = mousepan;
#if CAP_MOUSEGRAB
if(mousepan) {
#if CAP_SDL2
SDL_SetRelativeMouseMode(SDL_TRUE);
#if SDLVER >= 3
SDL_SetWindowRelativeMouseMode(s_window, true);
#elif SDLVER >= 2
SDL_SetRelativeMouseMode(SDL23(SDL_TRUE, true));
#else
SDL_WM_GrabInput(SDL_GRAB_ON);
SDL_ShowCursor(SDL_DISABLE);
@@ -843,8 +849,10 @@ EX void mainloopiter() {
mouseaim_x = mouseaim_y = 0;
}
else {
#if CAP_SDL2
SDL_SetRelativeMouseMode(SDL_FALSE);
#if SDLVER >= 3
SDL_SetWindowRelativeMouseMode(s_window, false);
#elif SDLVER >= 2
SDL_SetRelativeMouseMode(SDL23(SDL_FALSE, false));
#else
SDL_WM_GrabInput( SDL_GRAB_OFF );
SDL_ShowCursor(SDL_ENABLE);
@@ -860,7 +868,7 @@ EX void mainloopiter() {
#endif
if(timetowait > 0) {
#if !CAP_SDL2
#if SDLVER == 1
SDL_Delay(timetowait);
#endif
}
@@ -890,10 +898,9 @@ EX void mainloopiter() {
getcshift = 1;
#if CAP_SDL2
const Uint8 *keystate = SDL_GetKeyboardState(NULL);
const sdl_keystate_type *keystate = SDL12_GetKeyState(NULL);
#if SDLVER >= 2
pandora_rightclick = keystate[SDL_SCANCODE_RCTRL];
pandora_leftclick = keystate[SDL_SCANCODE_RSHIFT];
@@ -909,9 +916,6 @@ EX void mainloopiter() {
if(keystate[SDL_SCANCODE_LALT] || keystate[SDL_SCANCODE_RALT]) getcshift *= 10;
#else
Uint8 *keystate = SDL_GetKeyState(NULL);
pandora_rightclick = keystate[SDLK_RCTRL];
pandora_leftclick = keystate[SDLK_RSHIFT];
@@ -1002,7 +1006,7 @@ EX void mainloopiter() {
ld t = (ticks - lastticks) * shiftmul / 1000.;
lastticks = ticks;
#if CAP_SDL2
#if SDLVER >= 2
if(keystate[SDL_SCANCODE_END] && GDIM == 3 && DEFAULTNOR(SDL_SCANCODE_END)) full_forward_camera(-t);
if(keystate[SDL_SCANCODE_HOME] && GDIM == 3 && DEFAULTNOR(SDL_SCANCODE_HOME)) full_forward_camera(t);
if(keystate[SDL_SCANCODE_RIGHT] && DEFAULTNOR(SDL_SCANCODE_RIGHT)) full_rotate_camera(0, -t);
@@ -1032,7 +1036,7 @@ EX void mainloopiter() {
ld t = (ticks - lastticks) * shiftmul / 1000.;
lastticks = ticks;
#if CAP_SDL2
#if SDLVER >= 2
#define dkey(x) keystate[int(x - 'a' + 4)] && DEFAULTNOR(x - 'a' + 4)
#else
#define dkey(x) keystate[int(x)] && DEFAULTNOR(x)
@@ -1073,7 +1077,7 @@ EX void mainloopiter() {
if(((SDL_GetMouseState(NULL, NULL) & SDL_BUTTON_MMASK)) && !mouseout2())
currently_scrolling = true;
#if CAP_SDL2
#if SDLVER >= 2
if(timetowait > 0) {
if(SDL_WaitEventTimeout(&ev, timetowait)) handle_event(ev);
}
@@ -1102,7 +1106,14 @@ EX void handle_event(SDL_Event& ev) {
countJoysticks();
} */
#if CAP_SDL2
#if SDLVER == 3
if(ev.type == SDL_EVENT_WINDOW_MOUSE_ENTER) outoffocus = false;
if(ev.type == SDL_EVENT_WINDOW_MOUSE_LEAVE) outoffocus = true;
if(ev.type == SDL_EVENT_WINDOW_EXPOSED) drawscreen();
if(ev.type == SDL_EVENT_WINDOW_RESIZED) resize_screen_to(ev.window.data1, ev.window.data2);
#endif
#if SDLVER == 2
if(ev.type == SDL_WINDOWEVENT) {
auto w = ev.window.event;
if(w == SDL_WINDOWEVENT_ENTER)
@@ -1114,8 +1125,9 @@ EX void handle_event(SDL_Event& ev) {
if(w == SDL_WINDOWEVENT_RESIZED)
resize_screen_to(ev.window.data1, ev.window.data2);
}
#endif
#else
#if SDLVER == 1
if(ev.type == SDL_ACTIVEEVENT) {
if(ev.active.state & SDL_APPINPUTFOCUS) {
if(ev.active.gain) {
@@ -1136,7 +1148,7 @@ EX void handle_event(SDL_Event& ev) {
#endif
#if CAP_SDLJOY
if(ev.type == SDL_JOYAXISMOTION && normal && DEFAULTCONTROL) {
if(ev.type == SDL_EVENT_JOYSTICK_AXIS_MOTION && normal && DEFAULTCONTROL) {
if(ev.jaxis.which == 0) {
if(ev.jaxis.axis == 0)
joyx = ev.jaxis.value;
@@ -1159,64 +1171,65 @@ EX void handle_event(SDL_Event& ev) {
if(joyhandler && joyhandler(ev)) ;
else if(ev.type == SDL_JOYHATMOTION && !normal) {
else if(ev.type == SDL_EVENT_JOYSTICK_HAT_MOTION && !normal) {
if(ev.jhat.value == SDL_HAT_UP) sym = SDLK_UP;
if(ev.jhat.value == SDL_HAT_DOWN) sym = SDLK_DOWN;
if(ev.jhat.value == SDL_HAT_LEFT) sym = SDLK_LEFT;
if(ev.jhat.value == SDL_HAT_RIGHT) sym = SDLK_RIGHT;
}
else if(ev.type == SDL_JOYBUTTONDOWN && normal && DEFAULTCONTROL) {
else if(ev.type == SDL_EVENT_JOYSTICK_BUTTON_DOWN && normal && DEFAULTCONTROL) {
flashMessages();
movepcto(joydir);
joy_ignore_next = true;
checkjoy();
}
else if(ev.type == SDL_JOYBUTTONDOWN && !normal) {
else if(ev.type == SDL_EVENT_JOYSTICK_BUTTON_DOWN && !normal) {
sym = uni = SDLK_RETURN;
}
#endif
if(ev.type == SDL_KEYDOWN) {
if(ev.type == SDL_EVENT_KEY_DOWN) {
flashMessages();
mousing = false;
sym = ev.key.keysym.sym;
#if CAP_SDL2
uni = ev.key.keysym.sym;
if(uni == '=' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '+';
if(uni == '1' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '!';
if(uni == '2' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '@';
if(uni == '3' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '#';
if(uni == '4' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '$';
if(uni == '5' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '%';
if(uni == '6' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '^';
if(uni == '7' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '&';
if(uni == '8' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '*';
if(uni == '9' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = '(';
if(uni == '0' && (ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT))) uni = ')';
sym = SDL23(ev.key.keysym.sym, ev.key.key);
auto mod = SDL23(ev.key.keysym.mod, ev.key.mod);
#if SDLVER >= 2
uni = SDL23(ev.key.keysym.sym, ev.key.key);
if(uni == '=' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '+';
if(uni == '1' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '!';
if(uni == '2' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '@';
if(uni == '3' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '#';
if(uni == '4' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '$';
if(uni == '5' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '%';
if(uni == '6' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '^';
if(uni == '7' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '&';
if(uni == '8' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '*';
if(uni == '9' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = '(';
if(uni == '0' && (mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT))) uni = ')';
if(uni >= 'a' && uni <= 'z') {
if(ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) uni -= 32;
else if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) uni -= 96;
if(mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT)) uni -= 32;
else if(mod & (SDL_KMOD_LCTRL | SDL_KMOD_RCTRL)) uni -= 96;
}
#else
uni = ev.key.keysym.unicode;
if(uni == 0 && (sym >= 'a' && sym <= 'z')) {
if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) uni = sym - 96;
if(ev.key.keysym.mod & (SDL_KMOD_LCTRL | SDL_KMOD_RCTRL)) uni = sym - 96;
}
if(ev.key.keysym.mod & (KMOD_LSHIFT | KMOD_RSHIFT)) shiftmul = -1;
if(ev.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) shiftmul /= 10;
if(ev.key.keysym.mod & (SDL_KMOD_LSHIFT | SDL_KMOD_RSHIFT)) shiftmul = -1;
if(ev.key.keysym.mod & (SDL_KMOD_LCTRL | SDL_KMOD_RCTRL)) shiftmul /= 10;
#endif
numlock_on = ev.key.keysym.mod & KMOD_NUM;
if(sym == SDLK_RETURN && (ev.key.keysym.mod & (KMOD_LALT | KMOD_RALT))) {
numlock_on = mod & SDL_KMOD_NUM;
if(sym == SDLK_RETURN && (mod & (SDL_KMOD_LALT | SDL_KMOD_RALT))) {
sym = 0; uni = 0;
vid.want_fullscreen = !vid.want_fullscreen;
apply_screen_settings();
}
}
#if CAP_SDL2
if(ev.type == SDL_TEXTINPUT) {
#if SDLVER >= 2
if(ev.type == SDL_EVENT_TEXT_INPUT) {
texthandler(ev.text);
}
#endif
@@ -1228,8 +1241,8 @@ EX void handle_event(SDL_Event& ev) {
bool rollchange = (cmode & sm::OVERVIEW) && getcstat >= 2000 && cheater;
if(ev.type == SDL_MOUSEBUTTONDOWN || ev.type == SDL_MOUSEBUTTONUP SDL12(, || ev.type == SDL_MOUSEWHEEL)) {
mousepressed = ev.type == SDL_MOUSEBUTTONDOWN;
if(ev.type == SDL_EVENT_MOUSE_BUTTON_DOWN || ev.type == SDL_EVENT_MOUSE_BUTTON_UP SDL12(, || ev.type == SDL_EVENT_MOUSE_WHEEL)) {
mousepressed = ev.type == SDL_EVENT_MOUSE_BUTTON_DOWN;
if(mousepressed) flashMessages();
mousing = true;
which_pointer = 0;
@@ -1237,8 +1250,8 @@ EX void handle_event(SDL_Event& ev) {
holdmouse = false;
invslider = false;
bool down = ev.type == SDL_MOUSEBUTTONDOWN SDL12(, || ev.type == SDL_MOUSEWHEEL);
bool up = ev.type == SDL_MOUSEBUTTONUP;
bool down = ev.type == SDL_EVENT_MOUSE_BUTTON_DOWN SDL12(, || ev.type == SDL_EVENT_MOUSE_WHEEL);
bool up = ev.type == SDL_EVENT_MOUSE_BUTTON_UP;
bool act = false;
@@ -1273,8 +1286,8 @@ EX void handle_event(SDL_Event& ev) {
sym = getcstat, uni = getcstat, shiftmul = getcshift;
}
else if(SDL12(ev.button.button==SDL_BUTTON_WHEELDOWN || ev.button.button == SDL_BUTTON_WHEELUP, ev.type == SDL_MOUSEWHEEL)) {
#if CAP_SDL2
else if(SDL12(ev.button.button==SDL_BUTTON_WHEELDOWN || ev.button.button == SDL_BUTTON_WHEELUP, ev.type == SDL_EVENT_MOUSE_WHEEL)) {
#if SDLVER >= 2
ld dir = ev.wheel.y * 0.25;
#else
ld dir = ev.button.button == SDL_BUTTON_WHEELUP ? 0.25 : -0.25;
@@ -1304,7 +1317,7 @@ EX void handle_event(SDL_Event& ev) {
}
}
if(ev.type == SDL_MOUSEMOTION) {
if(ev.type == SDL_EVENT_MOUSE_MOTION) {
mouseoh = mouseh;
int lmousex = mousex, lmousey = mousey;
@@ -1350,7 +1363,7 @@ EX void handle_event(SDL_Event& ev) {
}
}
if(ev.type == SDL_QUIT) {
if(ev.type == SDL_EVENT_QUIT) {
#if CAP_DAILY
if(daily::on) daily::handleQuit(3);
else
@@ -1429,7 +1442,7 @@ EX bool interpret_as_direction(int sym, int uni) {
#ifdef FAKE_SDL
return false;
#else
return (sym >= SDLK_KP0 && sym <= SDLK_KP9 && !numlock_on);
return (sym >= int(SDLK_KP0) && sym <= int(SDLK_KP9) && !numlock_on);
#endif
}