Ungrab and fullscreen actions in SDL

This commit is contained in:
Iwan Timmer
2015-08-10 16:07:48 +02:00
parent 22a1238f7d
commit f1926b9980
4 changed files with 42 additions and 14 deletions
+14 -8
View File
@@ -20,11 +20,13 @@
#ifdef HAVE_SDL #ifdef HAVE_SDL
#include "sdlinput.h" #include "sdlinput.h"
#include "../sdl.h"
#include "limelight-common/Limelight.h" #include "limelight-common/Limelight.h"
#define QUIT_MODIFIERS (MODIFIER_SHIFT|MODIFIER_ALT|MODIFIER_CTRL) #define ACTION_MODIFIERS (MODIFIER_SHIFT|MODIFIER_ALT|MODIFIER_CTRL)
#define QUIT_KEY SDLK_q #define QUIT_KEY SDLK_q
#define FULLSCREEN_KEY SDLK_f
typedef struct _GAMEPAD_STATE { typedef struct _GAMEPAD_STATE {
char leftTrigger, rightTrigger; char leftTrigger, rightTrigger;
@@ -69,7 +71,7 @@ static PGAMEPAD_STATE get_gamepad(SDL_JoystickID sdl_id) {
return &gamepads[0]; return &gamepads[0];
} }
bool sdlinput_handle_event(SDL_Event* event) { int sdlinput_handle_event(SDL_Event* event) {
int button = 0; int button = 0;
PGAMEPAD_STATE gamepad; PGAMEPAD_STATE gamepad;
switch (event->type) { switch (event->type) {
@@ -96,7 +98,7 @@ bool sdlinput_handle_event(SDL_Event* event) {
if (button != 0) if (button != 0)
LiSendMouseButtonEvent(event->type==SDL_MOUSEBUTTONDOWN?BUTTON_ACTION_PRESS:BUTTON_ACTION_RELEASE, button); LiSendMouseButtonEvent(event->type==SDL_MOUSEBUTTONDOWN?BUTTON_ACTION_PRESS:BUTTON_ACTION_RELEASE, button);
break; return SDL_MOUSE_GRAB;
case SDL_KEYDOWN: case SDL_KEYDOWN:
case SDL_KEYUP: case SDL_KEYUP:
button = event->key.keysym.sym; button = event->key.keysym.sym;
@@ -129,8 +131,12 @@ bool sdlinput_handle_event(SDL_Event* event) {
} }
// Quit the stream if all the required quit keys are down // Quit the stream if all the required quit keys are down
if ((keyboard_modifiers & QUIT_MODIFIERS) == QUIT_MODIFIERS && event->key.keysym.sym == QUIT_KEY && event->type==SDL_KEYUP) if ((keyboard_modifiers & ACTION_MODIFIERS) == ACTION_MODIFIERS && event->key.keysym.sym == QUIT_KEY && event->type==SDL_KEYUP)
return false; 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)
return SDL_MOUSE_UNGRAB;
LiSendKeyboardEvent(0x80 << 8 | button, event->type==SDL_KEYDOWN?KEY_ACTION_DOWN:KEY_ACTION_UP, keyboard_modifiers); LiSendKeyboardEvent(0x80 << 8 | button, event->type==SDL_KEYDOWN?KEY_ACTION_DOWN:KEY_ACTION_UP, keyboard_modifiers);
break; break;
@@ -156,7 +162,7 @@ bool sdlinput_handle_event(SDL_Event* event) {
gamepad->rightTrigger = (event->caxis.value >> 8) + 127; gamepad->rightTrigger = (event->caxis.value >> 8) + 127;
break; break;
default: default:
return true; return SDL_NOTHING;
} }
LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY); LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY);
break; break;
@@ -210,7 +216,7 @@ bool sdlinput_handle_event(SDL_Event* event) {
button = RB_FLAG; button = RB_FLAG;
break; break;
default: default:
return true; return SDL_NOTHING;
} }
if (event->type == SDL_CONTROLLERBUTTONDOWN) if (event->type == SDL_CONTROLLERBUTTONDOWN)
gamepad->buttons |= button; gamepad->buttons |= button;
@@ -220,7 +226,7 @@ bool sdlinput_handle_event(SDL_Event* event) {
LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY); LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY);
break; break;
} }
return true; return SDL_NOTHING;
} }
#endif /* HAVE_SDL */ #endif /* HAVE_SDL */
+1 -1
View File
@@ -52,6 +52,6 @@ static const short keyCodes[] = {
}; };
void sdlinput_init(); void sdlinput_init();
bool sdlinput_handle_event(SDL_Event* event); int sdlinput_handle_event(SDL_Event* event);
#endif /* HAVE_SDL */ #endif /* HAVE_SDL */
+21 -5
View File
@@ -27,6 +27,7 @@
#include <stdbool.h> #include <stdbool.h>
static bool done; static bool done;
static int fullscreen_flags;
SDL_Window *sdl_window; SDL_Window *sdl_window;
@@ -41,19 +42,34 @@ void sdl_init(int width, int height) {
fprintf(stderr, "SDL: could not create window - exiting\n"); fprintf(stderr, "SDL: could not create window - exiting\n");
exit(1); exit(1);
} }
SDL_ShowCursor(SDL_DISABLE); SDL_SetRelativeMouseMode(SDL_TRUE);
//SDL_SetRelativeMouseMode(SDL_TRUE);
sdlinput_init(); sdlinput_init();
} }
void sdl_loop() { void sdl_loop() {
SDL_Event event; SDL_Event event;
while(!done && SDL_WaitEvent(&event)) { while(!done && SDL_WaitEvent(&event)) {
if (!sdlinput_handle_event(&event)) switch (sdlinput_handle_event(&event)) {
done = true; case SDL_QUIT_APPLICATION:
else if (event.type == SDL_QUIT)
done = true; done = true;
break;
case SDL_TOGGLE_FULLSCREEN:
fullscreen_flags ^= SDL_WINDOW_FULLSCREEN;
SDL_SetWindowFullscreen(sdl_window, fullscreen_flags);
case SDL_MOUSE_GRAB:
SDL_SetRelativeMouseMode(SDL_TRUE);
break;
case SDL_MOUSE_UNGRAB:
SDL_SetRelativeMouseMode(SDL_FALSE);
break;
default:
if (event.type == SDL_QUIT)
done = true;
}
} }
SDL_DestroyWindow(sdl_window);
SDL_Quit();
} }
#endif /* HAVE_SDL */ #endif /* HAVE_SDL */
+6
View File
@@ -21,6 +21,12 @@
#include <SDL.h> #include <SDL.h>
#define SDL_NOTHING 0
#define SDL_QUIT_APPLICATION 1
#define SDL_MOUSE_GRAB 2
#define SDL_MOUSE_UNGRAB 3
#define SDL_TOGGLE_FULLSCREEN 4
SDL_Window *sdl_window; SDL_Window *sdl_window;
void sdl_init(int width, int height); void sdl_init(int width, int height);