1#include "InputEvents.hpp"
2#include "RootDisplay.hpp"
6CST_Keycode key_buttons[] = { SDLK_a, SDLK_b, SDLK_x, SDLK_y, SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT, SDLK_RETURN, SDLK_l, SDLK_r, SDLK_z, SDLK_BACKSPACE, SDLK_UP, SDLK_DOWN, SDLK_q };
8SDL_GameControllerButton pad_buttons[] = { SDL_A, SDL_B, SDL_X, SDL_Y, SDL_UP, SDL_DOWN, SDL_LEFT, SDL_RIGHT, SDL_PLUS, SDL_L, SDL_R, SDL_ZL, SDL_MINUS, SDL_UP_STICK, SDL_DOWN_STICK, SDL_LEFT_STICK, SDL_RIGHT_STICK, SDL_ZR, };
10#if defined(__WIIU__) && defined(USE_KEYBOARD)
11#include "../libs/wiiu_kbd/keybdwrapper.h"
15unsigned int nintendo_buttons[] = { A_BUTTON, B_BUTTON, X_BUTTON, Y_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON, START_BUTTON, L_BUTTON, R_BUTTON, ZL_BUTTON, SELECT_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON, ZR_BUTTON };
18std::string nintendoButtonNames[] = {
"a",
"b",
"x",
"y",
"up",
"down",
"left",
"right",
"plus",
"l",
"r",
"zl",
"minus",
"up",
"down",
"left",
"right",
"zr" };
21std::string keyButtonNames[] = {
"a",
"b",
"x",
"y",
"up",
"down",
"left",
"right",
"return",
"l",
"r",
"z",
"backspace",
"up",
"down",
"left",
"right",
"q" };
25unsigned int wii_buttons[] = { A_BUTTON, B_BUTTON, L_BUTTON, R_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON, START_BUTTON, 0, 0, 0, SELECT_BUTTON, 0, 0, 0, 0, 0 };
27std::string wiiButtonNames[] = {
"a",
"b",
"1",
"2",
"up",
"down",
"left",
"right",
"plus",
"",
"",
"",
"minus",
"",
"",
"",
"",
"" };
30unsigned int nunchuk_buttons[] = { A_BUTTON, B_BUTTON, L_BUTTON, R_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON, START_BUTTON, 0, 0, X_BUTTON, SELECT_BUTTON, UP_BUTTON, DOWN_BUTTON, LEFT_BUTTON, RIGHT_BUTTON, Y_BUTTON };
32std::string nunchukButtonNames[] = {
"a",
"b",
"1",
"2",
"up",
"down",
"left",
"right",
"plus",
"",
"",
"z",
"minus",
"up",
"down",
"left",
"right",
"c" };
35bool InputEvents::bypassKeyEvents =
false;
37auto defaultKeyName =
"WiiU Gamepad";
38std::string InputEvents::lastGamepadKey = defaultKeyName;
39unsigned int* currentButtons = nintendo_buttons;
40std::string* currentButtonNames = nintendoButtonNames;
43std::map<std::string, GamepadInfo> gamepadMap = {
45 {
"Keyboard",
GamepadInfo(nintendo_buttons, keyButtonNames,
"keyboard",
"key") },
47 {
"WiiU Gamepad",
GamepadInfo(nintendo_buttons, nintendoButtonNames,
"wiiu_button",
"gamepad") },
48 {
"WiiU Pro Controller", { nintendo_buttons, nintendoButtonNames,
"wiiu_button",
"pro" } },
49 {
"Wii Remote", { wii_buttons, wiiButtonNames,
"wii_button",
"remote" } },
50 {
"Wii Remote and Nunchuk", { nunchuk_buttons, nunchukButtonNames,
"wii_button",
"nunchuk" } },
51 {
"Wii Classic Controller", { nintendo_buttons, nintendoButtonNames,
"wii_button",
"classic"} },
53 {
"Switch Controller", { nintendo_buttons, nintendoButtonNames,
"switch_button",
"pro" } },
67InputEvents::InputEvents()
69#if defined(__WIIU__) && defined(USE_KEYBOARD)
71 KBWrapper* kbdwrapper =
new KBWrapper(
true,
true);
78 if (!SDL_PollEvent(&event))
82 this->type =
event.type;
88 std::string curControllerName= lastGamepadKey;
91 if (this->type == SDL_KEYDOWN || this->type == SDL_KEYUP) {
93 lastGamepadKey =
"Keyboard";
94 }
else if (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP) {
95 SDL_Joystick* joystickId = SDL_JoystickFromInstanceID(event.jbutton.which);
96 if (joystickId != NULL) {
97 std::string controllerName = SDL_JoystickName(joystickId);
98 lastGamepadKey = defaultKeyName;
99 if (!controllerName.empty() && gamepadMap.find(controllerName) != gamepadMap.end()){
100 lastGamepadKey = controllerName;
104 if (curControllerName != lastGamepadKey) {
105 printf(
"Switched to controller profile: %s\n", lastGamepadKey.c_str());
106 GamepadInfo& gamepadInfo = gamepadMap[lastGamepadKey];
107 if (gamepadInfo.buttons !=
nullptr) {
108 currentButtons = gamepadInfo.buttons;
114 this->isScrolling =
false;
117 this->allowTouch =
false;
118 if (event.type == SDL_MOUSEWHEEL) {
119 this->wheelScroll =
event.wheel.y;
120 this->isScrolling =
true;
124 if (this->type == SDL_QUIT)
126 if (this->quitaction != NULL) this->quitaction();
129 else if (event.key.repeat == 0 && (this->type == SDL_KEYDOWN || this->type == SDL_KEYUP))
131 this->keyCode =
event.key.keysym.sym;
132 this->mod =
event.key.keysym.mod;
134 else if (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP)
136 this->keyCode =
event.jbutton.button;
138 else if (this->type == SDL_MOUSEMOTION || this->type == SDL_MOUSEBUTTONUP || this->type == SDL_MOUSEBUTTONDOWN)
140 bool isMotion = this->type == SDL_MOUSEMOTION;
142 this->yPos = isMotion ?
event.motion.y :
event.button.y;
143 this->xPos = isMotion ?
event.motion.x :
event.button.x;
145 else if (allowTouch && (this->type == SDL_FINGERMOTION || this->type == SDL_FINGERUP || this->type == SDL_FINGERDOWN))
147 this->yPos =
event.tfinger.y * SCREEN_HEIGHT;
148 this->xPos =
event.tfinger.x * SCREEN_WIDTH;
151 if (this->type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) {
152 printf(
"Window resized to %dx%d\n", event.window.data1, event.window.data2);
153 RootDisplay::mainDisplay->setScreenResolution(
154 event.window.data1 * RootDisplay::dpiScale,
155 event.window.data2 * RootDisplay::dpiScale
159 if (RootDisplay::mainDisplay->windowResizeCallback)
160 RootDisplay::mainDisplay->windowResizeCallback();
166 this->xPos = (int)(this->xPos * RootDisplay::dpiScale);
167 this->yPos = (int)(this->yPos * RootDisplay::dpiScale);
174bool InputEvents::update()
184void InputEvents::toggleHeldButtons()
186 int directionCode = directionForKeycode();
188 if (directionCode >= 0)
193 if (!held_directions[directionCode])
196 held_directions[directionCode] =
true;
197 held_type = this->type;
208 held_directions[directionCode] =
false;
214bool InputEvents::processDirectionalButtons()
221 if (curFrame > 0 && curFrame % rapidFireRate == 0)
223 for (
int x = 0; x < 4; x++)
225 if (!held_directions[x])
229 this->type = held_type;
230 bool isGamepad = (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP);
231 this->keyCode = isGamepad ? pad_buttons[4 + x] : key_buttons[4 + x];
241int InputEvents::directionForKeycode()
244 if (this->type == SDL_KEYDOWN && this->keyCode == SDLK_RETURN)
248 switch (this->keyCode)
262 case SDL_RIGHT_STICK:
275 if ((this->type == SDL_KEYDOWN || this->type == SDL_KEYUP) && !InputEvents::bypassKeyEvents)
277 for (
int x = 0; x < TOTAL_BUTTONS; x++)
278 if (key_buttons[x] == keyCode && (buttons & currentButtons[x]))
283 else if (this->type == SDL_JOYBUTTONDOWN || this->type == SDL_JOYBUTTONUP)
285 for (
int x = 0; x < TOTAL_BUTTONS; x++)
286 if (pad_buttons[x] == keyCode && (buttons & currentButtons[x]))
293bool InputEvents::pressed(
int buttons)
295 return isKeyDown() &&
held(buttons);
298bool InputEvents::released(
int buttons)
300 return isKeyUp() &&
held(buttons);
305 return (this->xPos >= x && this->xPos <= x + width && this->yPos >= y && this->yPos <= y + height);
308bool InputEvents::isTouchDown()
310 return this->type == SDL_MOUSEBUTTONDOWN || (allowTouch && this->type == SDL_FINGERDOWN);
313bool InputEvents::isTouchDrag()
315 return this->type == SDL_MOUSEMOTION || (allowTouch && this->type == SDL_FINGERMOTION);
318bool InputEvents::isTouchUp()
320 return this->type == SDL_MOUSEBUTTONUP || (allowTouch && this->type == SDL_FINGERUP);
323bool InputEvents::isTouch()
325 return isTouchDown() || isTouchDrag() || isTouchUp();
328bool InputEvents::isScroll()
330 return this->isScrolling;
333bool InputEvents::isKeyDown()
335 return this->type == SDL_KEYDOWN || this->type == SDL_JOYBUTTONDOWN;
338bool InputEvents::isKeyUp()
340 return this->type == SDL_KEYUP || this->type == SDL_JOYBUTTONUP;
348 case SDL_JOYDEVICEADDED:
349 j = SDL_JoystickOpen(event->jdevice.which);
351 printf(
"Added joystick device: %s, with ID %d\n", SDL_JoystickName(j), SDL_JoystickInstanceID(j));
353 case SDL_JOYDEVICEREMOVED:
354 j = SDL_JoystickFromInstanceID(event->jdevice.which);
355 if (j && SDL_JoystickGetAttached(j))
357 printf(
"Removed joystick device: %s\n", SDL_JoystickName(j));
358 SDL_JoystickClose(j);
368 return gamepadMap[lastGamepadKey];
bool needsRedraw
whether or not this element needs the screen redrawn next time it's processed