1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-25 22:18:30 +02:00
VVVVVV/desktop_version/src/KeyPoll.cpp
Misa 8fa916c55d Make the toggle fullscreen conditional more readable
Each check has been put in its own variable, so the final conditional is
more readable, and the ifdef is no longer right smack in the middle of
an if-statement.

Also the control flow has been changed (the "else" has been removed from
the shortcut-checking conditional) so I could put the variables closer
to the actual conditional itself. I don't think it affects anything,
though.
2020-03-12 21:20:25 -04:00

350 lines
7.1 KiB
C++

#include "KeyPoll.h"
#include <stdio.h>
#include <string.h>
#include <utf8/unchecked.h>
void KeyPoll::setSensitivity(int _value)
{
switch (_value)
{
case 0:
sensitivity = 28000;
break;
case 1:
sensitivity = 16000;
break;
case 2:
sensitivity = 8000;
break;
case 3:
sensitivity = 4000;
break;
case 4:
sensitivity = 2000;
break;
}
}
KeyPoll::KeyPoll()
{
xVel = 0;
yVel = 0;
setSensitivity(2);
quitProgram = 0;
textentrymode=true;
keybuffer="";
leftbutton=0; rightbutton=0; middlebutton=0;
mx=0; my=0;
resetWindow = 0;
toggleFullscreen = false;
pressedbackspace=false;
useFullscreenSpaces = false;
if (strcmp(SDL_GetPlatform(), "Mac OS X") == 0)
{
useFullscreenSpaces = true;
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES);
if (hint != NULL)
{
useFullscreenSpaces = (strcmp(hint, "1") == 0);
}
}
linealreadyemptykludge = false;
}
void KeyPoll::enabletextentry()
{
keybuffer="";
textentrymode = true;
SDL_StartTextInput();
}
void KeyPoll::disabletextentry()
{
textentrymode = false;
SDL_StopTextInput();
}
void KeyPoll::Poll()
{
SDL_Event evt;
while (SDL_PollEvent(&evt))
{
/* Keyboard Input */
if (evt.type == SDL_KEYDOWN)
{
keymap[evt.key.keysym.sym] = true;
if (evt.key.keysym.sym == SDLK_BACKSPACE)
{
pressedbackspace = true;
}
#ifdef __APPLE__ /* OSX prefers the command keys over the alt keys. -flibit */
bool altpressed = keymap[SDLK_LGUI] || keymap[SDLK_RGUI];
#else
bool altpressed = keymap[SDLK_LALT] || keymap[SDLK_RALT];
#endif
bool returnpressed = evt.key.keysym.sym == SDLK_RETURN;
bool fpressed = evt.key.keysym.sym == SDLK_f;
bool f11pressed = evt.key.keysym.sym == SDLK_F11;
if ((altpressed && (returnpressed || fpressed)) || f11pressed)
{
toggleFullscreen = true;
}
if (textentrymode)
{
if (evt.key.keysym.sym == SDLK_BACKSPACE && !keybuffer.empty())
{
std::string::iterator iter = keybuffer.end();
utf8::unchecked::prior(iter);
keybuffer = keybuffer.substr(0, iter - keybuffer.begin());
if (keybuffer.empty())
{
linealreadyemptykludge = true;
}
}
else if ( evt.key.keysym.sym == SDLK_v &&
keymap[SDLK_LCTRL] )
{
keybuffer += SDL_GetClipboardText();
}
}
}
else if (evt.type == SDL_KEYUP)
{
keymap[evt.key.keysym.sym] = false;
if (evt.key.keysym.sym == SDLK_BACKSPACE)
{
pressedbackspace = false;
}
}
else if (evt.type == SDL_TEXTINPUT)
{
keybuffer += evt.text.text;
}
/* Mouse Input */
else if (evt.type == SDL_MOUSEMOTION)
{
mx = evt.motion.x;
my = evt.motion.y;
}
else if (evt.type == SDL_MOUSEBUTTONDOWN)
{
if (evt.button.button == SDL_BUTTON_LEFT)
{
mx = evt.button.x;
my = evt.button.y;
leftbutton = 1;
}
else if (evt.button.button == SDL_BUTTON_RIGHT)
{
mx = evt.button.x;
my = evt.button.y;
rightbutton = 1;
}
else if (evt.button.button == SDL_BUTTON_MIDDLE)
{
mx = evt.button.x;
my = evt.button.y;
middlebutton = 1;
}
}
else if (evt.type == SDL_MOUSEBUTTONUP)
{
if (evt.button.button == SDL_BUTTON_LEFT)
{
mx = evt.button.x;
my = evt.button.y;
leftbutton=0;
}
else if (evt.button.button == SDL_BUTTON_RIGHT)
{
mx = evt.button.x;
my = evt.button.y;
rightbutton=0;
}
else if (evt.button.button == SDL_BUTTON_MIDDLE)
{
mx = evt.button.x;
my = evt.button.y;
middlebutton=0;
}
}
/* Controller Input */
else if (evt.type == SDL_CONTROLLERBUTTONDOWN)
{
buttonmap[(SDL_GameControllerButton) evt.cbutton.button] = true;
}
else if (evt.type == SDL_CONTROLLERBUTTONUP)
{
buttonmap[(SDL_GameControllerButton) evt.cbutton.button] = false;
}
else if (evt.type == SDL_CONTROLLERAXISMOTION)
{
if (evt.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX)
{
if ( evt.caxis.value > -sensitivity &&
evt.caxis.value < sensitivity )
{
xVel = 0;
}
else
{
xVel = (evt.caxis.value > 0) ? 1 : -1;
}
}
if (evt.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY)
{
if ( evt.caxis.value > -sensitivity &&
evt.caxis.value < sensitivity )
{
yVel = 0;
}
else
{
yVel = (evt.caxis.value > 0) ? 1 : -1;
}
}
}
else if (evt.type == SDL_CONTROLLERDEVICEADDED)
{
SDL_GameController *toOpen = SDL_GameControllerOpen(evt.cdevice.which);
printf(
"Opened SDL_GameController ID #%i, %s\n",
evt.cdevice.which,
SDL_GameControllerName(toOpen)
);
controllers[SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(toOpen))] = toOpen;
}
else if (evt.type == SDL_CONTROLLERDEVICEREMOVED)
{
SDL_GameController *toClose = controllers[evt.cdevice.which];
controllers.erase(evt.cdevice.which);
printf("Closing %s\n", SDL_GameControllerName(toClose));
SDL_GameControllerClose(toClose);
}
/* Window Events */
else if (evt.type == SDL_WINDOWEVENT)
{
/* Window Resize */
if (evt.window.event == SDL_WINDOWEVENT_RESIZED)
{
resetWindow = true;
}
/* Window Focus */
else if (evt.window.event == SDL_WINDOWEVENT_FOCUS_GAINED)
{
isActive = true;
if (!useFullscreenSpaces)
{
SDL_Window *window = SDL_GetWindowFromID(evt.window.windowID);
wasFullscreen = SDL_GetWindowFlags(window);
SDL_SetWindowFullscreen(window, 0);
}
SDL_DisableScreenSaver();
resetWindow = true;
}
else if (evt.window.event == SDL_WINDOWEVENT_FOCUS_LOST)
{
isActive = false;
if (!useFullscreenSpaces)
{
SDL_SetWindowFullscreen(
SDL_GetWindowFromID(evt.window.windowID),
wasFullscreen
);
}
SDL_EnableScreenSaver();
resetWindow = true;
}
/* Mouse Focus */
else if (evt.window.event == SDL_WINDOWEVENT_ENTER)
{
SDL_DisableScreenSaver();
resetWindow = true;
}
else if (evt.window.event == SDL_WINDOWEVENT_LEAVE)
{
SDL_EnableScreenSaver();
resetWindow = true;
}
}
/* Quit Event */
else if (evt.type == SDL_QUIT)
{
quitProgram = true;
}
}
}
bool KeyPoll::isDown(SDL_Keycode key)
{
return keymap[key];
}
bool KeyPoll::isUp(SDL_Keycode key)
{
return !keymap[key];
}
bool KeyPoll::isDown(std::vector<SDL_GameControllerButton> buttons)
{
for (size_t i = 0; i < buttons.size(); i += 1)
{
if (buttonmap[buttons[i]])
{
return true;
}
}
return false;
}
bool KeyPoll::isDown(SDL_GameControllerButton button)
{
return buttonmap[button];
}
bool KeyPoll::controllerButtonDown()
{
for (
SDL_GameControllerButton button = SDL_CONTROLLER_BUTTON_A;
button < SDL_CONTROLLER_BUTTON_DPAD_UP;
button = (SDL_GameControllerButton) (button + 1)
) {
if (isDown(button))
{
return true;
}
}
return false;
}
bool KeyPoll::controllerWantsLeft(bool includeVert)
{
return ( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_LEFT] ||
xVel < 0 ||
( includeVert &&
( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_UP] ||
yVel < 0 ) ) );
}
bool KeyPoll::controllerWantsRight(bool includeVert)
{
return ( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_RIGHT] ||
xVel > 0 ||
( includeVert &&
( buttonmap[SDL_CONTROLLER_BUTTON_DPAD_DOWN] ||
yVel > 0 ) ) );
}