Add absolute mouse mode support when ungrabbed

This commit is contained in:
Cameron Gutman 2022-01-09 21:09:48 -06:00
parent 23e6854a84
commit f871b663b1
3 changed files with 16 additions and 8 deletions

View File

@ -149,12 +149,18 @@ void sdlinput_init(char* mappings) {
}
}
int sdlinput_handle_event(SDL_Event* event) {
int sdlinput_handle_event(SDL_Window* window, SDL_Event* event) {
int button = 0;
PGAMEPAD_STATE gamepad;
switch (event->type) {
case SDL_MOUSEMOTION:
LiSendMouseMoveEvent(event->motion.xrel, event->motion.yrel);
if (SDL_GetRelativeMouseMode())
LiSendMouseMoveEvent(event->motion.xrel, event->motion.yrel);
else {
int w, h;
SDL_GetWindowSize(window, &w, &h);
LiSendMousePositionEvent(event->motion.x, event->motion.y, w, h);
}
break;
case SDL_MOUSEWHEEL:
#if SDL_VERSION_ATLEAST(2, 0, 18)
@ -186,7 +192,7 @@ int sdlinput_handle_event(SDL_Event* event) {
if (button != 0)
LiSendMouseButtonEvent(event->type==SDL_MOUSEBUTTONDOWN?BUTTON_ACTION_PRESS:BUTTON_ACTION_RELEASE, button);
return SDL_MOUSE_GRAB;
return 0;
case SDL_KEYDOWN:
case SDL_KEYUP:
button = event->key.keysym.sym;
@ -232,15 +238,15 @@ int sdlinput_handle_event(SDL_Event* event) {
keyboard_modifiers &= ~modifier;
}
LiSendKeyboardEvent(0x80 << 8 | button, event->type==SDL_KEYDOWN?KEY_ACTION_DOWN:KEY_ACTION_UP, keyboard_modifiers);
// Quit the stream if all the required quit keys are down
if ((keyboard_modifiers & ACTION_MODIFIERS) == ACTION_MODIFIERS && event->key.keysym.sym == QUIT_KEY && event->type==SDL_KEYUP)
return SDL_QUIT_APPLICATION;
else if ((keyboard_modifiers & ACTION_MODIFIERS) == ACTION_MODIFIERS && event->key.keysym.sym == FULLSCREEN_KEY && event->type==SDL_KEYUP)
return SDL_TOGGLE_FULLSCREEN;
else if ((keyboard_modifiers & ACTION_MODIFIERS) == ACTION_MODIFIERS && event->key.keysym.sym == UNGRAB_KEY && event->type==SDL_KEYUP)
return SDL_MOUSE_UNGRAB;
LiSendKeyboardEvent(0x80 << 8 | button, event->type==SDL_KEYDOWN?KEY_ACTION_DOWN:KEY_ACTION_UP, keyboard_modifiers);
return SDL_GetRelativeMouseMode() ? SDL_MOUSE_UNGRAB : SDL_MOUSE_GRAB;
break;
case SDL_CONTROLLERAXISMOTION:
gamepad = get_gamepad(event->caxis.which, false);

View File

@ -100,5 +100,5 @@ static const short keyCodes5[] = {
};
void sdlinput_init(char* mappings);
int sdlinput_handle_event(SDL_Event* event);
int sdlinput_handle_event(SDL_Window* window, SDL_Event* event);
void sdlinput_rumble(unsigned short controller_id, unsigned short low_freq_motor, unsigned short high_freq_motor);

View File

@ -75,7 +75,7 @@ void sdl_loop() {
SDL_SetRelativeMouseMode(SDL_TRUE);
while(!done && SDL_WaitEvent(&event)) {
switch (sdlinput_handle_event(&event)) {
switch (sdlinput_handle_event(window, &event)) {
case SDL_QUIT_APPLICATION:
done = true;
break;
@ -83,10 +83,12 @@ void sdl_loop() {
fullscreen_flags ^= SDL_WINDOW_FULLSCREEN;
SDL_SetWindowFullscreen(window, fullscreen_flags);
case SDL_MOUSE_GRAB:
SDL_ShowCursor(SDL_ENABLE);
SDL_SetRelativeMouseMode(SDL_TRUE);
break;
case SDL_MOUSE_UNGRAB:
SDL_SetRelativeMouseMode(SDL_FALSE);
SDL_ShowCursor(SDL_DISABLE);
break;
default:
if (event.type == SDL_QUIT)