From 0d9d501280ceac3d6ad40bf50d7bb55fa65923ed Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Mon, 3 Aug 2015 21:08:39 +0200 Subject: [PATCH] Split sdl loop and input code --- src/input/sdlinput.c | 196 +++++++++++++++++++++++++++++++++++++++++++ src/input/sdlinput.h | 55 ++++++++++++ src/main.c | 5 ++ src/sdl.c | 166 +----------------------------------- src/sdl.h | 28 ------- 5 files changed, 260 insertions(+), 190 deletions(-) create mode 100644 src/input/sdlinput.c create mode 100644 src/input/sdlinput.h diff --git a/src/input/sdlinput.c b/src/input/sdlinput.c new file mode 100644 index 0000000..aba65b2 --- /dev/null +++ b/src/input/sdlinput.c @@ -0,0 +1,196 @@ +/* + * This file is part of Moonlight Embedded. + * + * Copyright (C) 2015 Iwan Timmer + * + * Moonlight is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Moonlight is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moonlight; if not, see . + */ + +#ifdef HAVE_SDL + +#include "sdlinput.h" + +#include "limelight-common/Limelight.h" + +#include + +typedef struct _GAMEPAD_STATE { + char leftTrigger, rightTrigger; + short leftStickX, leftStickY; + short rightStickX, rightStickY; + int buttons; + SDL_JoystickID sdl_id; + short id; + bool initialized; +} GAMEPAD_STATE, *PGAMEPAD_STATE; + +static GAMEPAD_STATE gamepads[4]; + +void sdlinput_init() { + memset(gamepads, 0, sizeof(gamepads)); + + SDL_SetRelativeMouseMode(SDL_TRUE); + SDL_InitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); + SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); + + for (int i = 0; i < SDL_NumJoysticks(); ++i) { + if (SDL_IsGameController(i)) { + if (!SDL_GameControllerOpen(i)) { + fprintf(stderr, "Could not open gamecontroller %i: %s\n", i, SDL_GetError()); + } + } + } +} + +static PGAMEPAD_STATE get_gamepad(SDL_JoystickID sdl_id) { + for (int i = 0;i<4;i++) { + if (gamepads[i].sdl_id == sdl_id) + return &gamepads[0]; + else if (!gamepads[i].initialized) { + gamepads[i].sdl_id = sdl_id; + gamepads[i].id = i; + gamepads[i].initialized = true; + return &gamepads[0]; + } + } + return &gamepads[0]; +} + +void sdlinput_handle_event(SDL_Event* event) { + int button = 0; + PGAMEPAD_STATE gamepad; + switch (event->type) { + case SDL_MOUSEMOTION: + LiSendMouseMoveEvent(event->motion.xrel, event->motion.yrel); + break; + case SDL_MOUSEWHEEL: + LiSendScrollEvent(event->wheel.y); + break; + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + switch (event->button.button) { + case SDL_BUTTON_LEFT: + button = BUTTON_LEFT; + break; + case SDL_BUTTON_MIDDLE: + button = BUTTON_MIDDLE; + break; + case SDL_BUTTON_RIGHT: + button = BUTTON_RIGHT; + break; + } + + if (button != 0) + LiSendMouseButtonEvent(event->type==SDL_MOUSEBUTTONDOWN?BUTTON_ACTION_PRESS:BUTTON_ACTION_RELEASE, button); + + break; + case SDL_KEYDOWN: + case SDL_KEYUP: + button = event->key.keysym.sym; + if (button >= (0x40000000 + 0x39) && button < (0x40000000 + sizeof(keyCodes))) + button = keyCodes[button - 0x40000039]; + if (button >= 0x61) + button -= 0x20; + + LiSendKeyboardEvent(0x80 << 8 | button, event->type==SDL_KEYDOWN?KEY_ACTION_DOWN:KEY_ACTION_UP, 0); + break; + case SDL_CONTROLLERAXISMOTION: + gamepad = get_gamepad(event->caxis.which); + switch (event->caxis.axis) { + case SDL_CONTROLLER_AXIS_LEFTX: + gamepad->leftStickX = event->caxis.value; + break; + case SDL_CONTROLLER_AXIS_LEFTY: + gamepad->leftStickY = -event->caxis.value - 1; + break; + case SDL_CONTROLLER_AXIS_RIGHTX: + gamepad->rightStickX = event->caxis.value; + break; + case SDL_CONTROLLER_AXIS_RIGHTY: + gamepad->rightStickY = -event->caxis.value - 1; + break; + case SDL_CONTROLLER_AXIS_TRIGGERLEFT: + gamepad->leftTrigger = (event->caxis.value >> 8) + 127; + break; + case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: + gamepad->rightTrigger = (event->caxis.value >> 8) + 127; + break; + default: + return; + } + LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY); + break; + case SDL_CONTROLLERBUTTONDOWN: + case SDL_CONTROLLERBUTTONUP: + gamepad = get_gamepad(event->cbutton.which); + switch (event->cbutton.button) { + case SDL_CONTROLLER_BUTTON_A: + button = A_FLAG; + break; + case SDL_CONTROLLER_BUTTON_B: + button = B_FLAG; + break; + case SDL_CONTROLLER_BUTTON_Y: + button = Y_FLAG; + break; + case SDL_CONTROLLER_BUTTON_X: + button = X_FLAG; + break; + case SDL_CONTROLLER_BUTTON_DPAD_UP: + button = UP_FLAG; + break; + case SDL_CONTROLLER_BUTTON_DPAD_DOWN: + button = DOWN_FLAG; + break; + case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: + button = RIGHT_FLAG; + break; + case SDL_CONTROLLER_BUTTON_DPAD_LEFT: + button = LEFT_FLAG; + break; + case SDL_CONTROLLER_BUTTON_BACK: + button = BACK_FLAG; + break; + case SDL_CONTROLLER_BUTTON_START: + button = PLAY_FLAG; + break; + case SDL_CONTROLLER_BUTTON_GUIDE: + button = SPECIAL_FLAG; + break; + case SDL_CONTROLLER_BUTTON_LEFTSTICK: + button = LS_CLK_FLAG; + break; + case SDL_CONTROLLER_BUTTON_RIGHTSTICK: + button = RS_CLK_FLAG; + break; + case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: + button = LB_FLAG; + break; + case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: + button = RB_FLAG; + break; + default: + return; + } + if (event->type == SDL_CONTROLLERBUTTONDOWN) + gamepad->buttons |= button; + else + gamepad->buttons &= ~button; + + LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY); + break; + } +} + +#endif /* HAVE_SDL */ diff --git a/src/input/sdlinput.h b/src/input/sdlinput.h new file mode 100644 index 0000000..aa7f9fc --- /dev/null +++ b/src/input/sdlinput.h @@ -0,0 +1,55 @@ +/* + * This file is part of Moonlight Embedded. + * + * Copyright (C) 2015 Iwan Timmer + * + * Moonlight is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Moonlight is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Moonlight; if not, see . + */ + +#ifdef HAVE_SDL + +#include + +static const short keyCodes[] = { + 0x14, //SDLK_CAPSLOCK + 0x70, //SDLK_F1 + 0x71, //SDLK_F2 + 0x72, //SDLK_F3 + 0x73, //SDLK_F4 + 0x74, //SDLK_F5 + 0x75, //SDLK_F6 + 0x76, //SDLK_F7 + 0x77, //SDLK_F8 + 0x78, //SDLK_F9 + 0x79, //SDLK_F10 + 0x7A, //SDLK_F11 + 0x7B, //SDLK_F12 + 0, //SDLK_PRINTSCREEN + 0x91, //SDLK_SCROLLLOCK + 0x13, //SDLK_PAUSE + 0x9B, //SDLK_INSERT + 0x24, //SDLK_HOME + 0x21, //SDLK_PAGEUP + 0x23, //SDLK_END + 0x22, //SDLK_PAGEDOWN + 0x27, //SDLK_RIGHT + 0x25, //SDLK_LEFT + 0x28, //SDLK_DOWN + 0x26, //SDLK_UP +}; + +void sdlinput_init(); +void sdlinput_handle_event(SDL_Event* event); + +#endif /* HAVE_SDL */ diff --git a/src/main.c b/src/main.c index 7ba3bfc..bd5c3fa 100644 --- a/src/main.c +++ b/src/main.c @@ -30,6 +30,7 @@ #include "input/evdev.h" #include "input/udev.h" #include "input/cec.h" +#include "input/sdlinput.h" #include "limelight-common/Limelight.h" @@ -203,6 +204,10 @@ int main(int argc, char* argv[]) { cec_init(); #endif /* HAVE_LIBCEC */ } + #ifdef HAVE_SDL + else if (system == SDL) + sdlinput_init(); + #endif stream(server, &config, system); } else if (strcmp("pair", config.action) == 0) { diff --git a/src/sdl.c b/src/sdl.c index 32767bb..f6e6f52 100644 --- a/src/sdl.c +++ b/src/sdl.c @@ -20,6 +20,7 @@ #ifdef HAVE_SDL #include "sdl.h" +#include "input/sdlinput.h" #include "limelight-common/Limelight.h" @@ -28,174 +29,15 @@ static bool done; -typedef struct _GAMEPAD_STATE { - char leftTrigger, rightTrigger; - short leftStickX, leftStickY; - short rightStickX, rightStickY; - int buttons; - SDL_JoystickID sdl_id; - short id; - bool initialized; -} GAMEPAD_STATE, *PGAMEPAD_STATE; - -GAMEPAD_STATE gamepads[4]; - -PGAMEPAD_STATE get_gamepad(SDL_JoystickID sdl_id) { - for (int i = 0;i<4;i++) { - if (gamepads[i].sdl_id == sdl_id) - return &gamepads[0]; - else if (!gamepads[i].initialized) { - gamepads[i].sdl_id = sdl_id; - gamepads[i].id = i; - gamepads[i].initialized = true; - return &gamepads[0]; - } - } - return &gamepads[0]; -} - void sdl_loop() { - memset(gamepads, 0, sizeof(gamepads)); - - SDL_SetRelativeMouseMode(SDL_TRUE); - SDL_InitSubSystem(SDL_INIT_EVENTS | SDL_INIT_JOYSTICK | SDL_INIT_GAMECONTROLLER); - SDL_GameControllerAddMappingsFromFile("gamecontrollerdb.txt"); + SDL_InitSubSystem(SDL_INIT_EVENTS); SDL_ShowCursor(SDL_DISABLE); - for (int i = 0; i < SDL_NumJoysticks(); ++i) { - if (SDL_IsGameController(i)) { - if (!SDL_GameControllerOpen(i)) { - fprintf(stderr, "Could not open gamecontroller %i: %s\n", i, SDL_GetError()); - } - } - } - SDL_Event event; while(!done && SDL_WaitEvent(&event)) { - int button = 0; - PGAMEPAD_STATE gamepad; - switch (event.type) { - case SDL_MOUSEMOTION: - LiSendMouseMoveEvent(event.motion.xrel, event.motion.yrel); - break; - case SDL_MOUSEWHEEL: - LiSendScrollEvent(event.wheel.y); - break; - case SDL_MOUSEBUTTONUP: - case SDL_MOUSEBUTTONDOWN: - switch (event.button.button) { - case SDL_BUTTON_LEFT: - button = BUTTON_LEFT; - break; - case SDL_BUTTON_MIDDLE: - button = BUTTON_MIDDLE; - break; - case SDL_BUTTON_RIGHT: - button = BUTTON_RIGHT; - break; - } - - if (button != 0) - LiSendMouseButtonEvent(event.type==SDL_MOUSEBUTTONDOWN?BUTTON_ACTION_PRESS:BUTTON_ACTION_RELEASE, button); - - break; - case SDL_KEYDOWN: - case SDL_KEYUP: - button = event.key.keysym.sym; - if (button >= (0x40000000 + 0x39) && button < (0x40000000 + sizeof(keyCodes))) - button = keyCodes[button - 0x40000039]; - if (button >= 0x61) - button -= 0x20; - - LiSendKeyboardEvent(0x80 << 8 | button, event.type==SDL_KEYDOWN?KEY_ACTION_DOWN:KEY_ACTION_UP, 0); - break; - case SDL_CONTROLLERAXISMOTION: - gamepad = get_gamepad(event.caxis.which); - switch (event.caxis.axis) { - case SDL_CONTROLLER_AXIS_LEFTX: - gamepad->leftStickX = event.caxis.value; - break; - case SDL_CONTROLLER_AXIS_LEFTY: - gamepad->leftStickY = -event.caxis.value - 1; - break; - case SDL_CONTROLLER_AXIS_RIGHTX: - gamepad->rightStickX = event.caxis.value; - break; - case SDL_CONTROLLER_AXIS_RIGHTY: - gamepad->rightStickY = -event.caxis.value - 1; - break; - case SDL_CONTROLLER_AXIS_TRIGGERLEFT: - gamepad->leftTrigger = (event.caxis.value >> 8) + 127; - break; - case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: - gamepad->rightTrigger = (event.caxis.value >> 8) + 127; - break; - default: - continue; - } - LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY); - break; - case SDL_CONTROLLERBUTTONDOWN: - case SDL_CONTROLLERBUTTONUP: - gamepad = get_gamepad(event.cbutton.which); - switch (event.cbutton.button) { - case SDL_CONTROLLER_BUTTON_A: - button = A_FLAG; - break; - case SDL_CONTROLLER_BUTTON_B: - button = B_FLAG; - break; - case SDL_CONTROLLER_BUTTON_Y: - button = Y_FLAG; - break; - case SDL_CONTROLLER_BUTTON_X: - button = X_FLAG; - break; - case SDL_CONTROLLER_BUTTON_DPAD_UP: - button = UP_FLAG; - break; - case SDL_CONTROLLER_BUTTON_DPAD_DOWN: - button = DOWN_FLAG; - break; - case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: - button = RIGHT_FLAG; - break; - case SDL_CONTROLLER_BUTTON_DPAD_LEFT: - button = LEFT_FLAG; - break; - case SDL_CONTROLLER_BUTTON_BACK: - button = BACK_FLAG; - break; - case SDL_CONTROLLER_BUTTON_START: - button = PLAY_FLAG; - break; - case SDL_CONTROLLER_BUTTON_GUIDE: - button = SPECIAL_FLAG; - break; - case SDL_CONTROLLER_BUTTON_LEFTSTICK: - button = LS_CLK_FLAG; - break; - case SDL_CONTROLLER_BUTTON_RIGHTSTICK: - button = RS_CLK_FLAG; - break; - case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: - button = LB_FLAG; - break; - case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: - button = RB_FLAG; - break; - default: - continue; - } - if (event.type == SDL_CONTROLLERBUTTONDOWN) - gamepad->buttons |= button; - else - gamepad->buttons &= ~button; - - LiSendMultiControllerEvent(gamepad->id, gamepad->buttons, gamepad->leftTrigger, gamepad->rightTrigger, gamepad->leftStickX, gamepad->leftStickY, gamepad->rightStickX, gamepad->rightStickY); - break; - case SDL_QUIT: + sdlinput_handle_event(&event); + if (event.type == SDL_QUIT) { done = true; } } diff --git a/src/sdl.h b/src/sdl.h index 010a750..477bacf 100644 --- a/src/sdl.h +++ b/src/sdl.h @@ -19,34 +19,6 @@ #ifdef HAVE_SDL -static const short keyCodes[] = { - 0x14, //SDLK_CAPSLOCK - 0x70, //SDLK_F1 - 0x71, //SDLK_F2 - 0x72, //SDLK_F3 - 0x73, //SDLK_F4 - 0x74, //SDLK_F5 - 0x75, //SDLK_F6 - 0x76, //SDLK_F7 - 0x77, //SDLK_F8 - 0x78, //SDLK_F9 - 0x79, //SDLK_F10 - 0x7A, //SDLK_F11 - 0x7B, //SDLK_F12 - 0, //SDLK_PRINTSCREEN - 0x91, //SDLK_SCROLLLOCK - 0x13, //SDLK_PAUSE - 0x9B, //SDLK_INSERT - 0x24, //SDLK_HOME - 0x21, //SDLK_PAGEUP - 0x23, //SDLK_END - 0x22, //SDLK_PAGEDOWN - 0x27, //SDLK_RIGHT - 0x25, //SDLK_LEFT - 0x28, //SDLK_DOWN - 0x26, //SDLK_UP -}; - void sdl_loop(); #endif /* HAVE_SDL */