1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-26 14:38:30 +02:00
VVVVVV/desktop_version/src/KeyPoll.cpp
Misa e23682615d Allow using F11 and (on macOS) RCmd+Enter/F to toggle fullscreen
This patch allows the use of pressing F11 to toggle fullscreen, as well as
allowing the use of Right Command when using the Command+Enter/F shortcut on
macOS. Apparently Alt+Enter isn't the only shortcut to toggle fullscreen,
Alt+F also works, which I didn't know before.

I'm adding F11 as a shortcut because it's a far more natural shortcut to
toggle fullscreen than this Alt+Enter or Alt+F business, which seems to be a
relic mimicking some other games and some Microsoft stuff?

I'm also adding RCommand+Enter/F because I see no reason not to. If you can
use RAlt on non-macOS, why can't you use RCommand on macOS, too?

I also cleaned up the formatting relating to the shortcut code, and made sure
the closing parenthesis was outside the ifdef so my text editor wouldn't
highlight the parenthesis inside the non-macOS ifdef-branch as a dangling
closing parenthesis, because it assumes the one in the branch above is the
actual closing parenthesis and doesn't parse macros.
2020-03-12 21:20:25 -04:00

346 lines
6.9 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;
}
else if (((evt.key.keysym.sym == SDLK_RETURN || evt.key.keysym.sym == SDLK_f) &&
#ifdef __APPLE__ /* OSX prefers the command keys over the alt keys. -flibit */
(keymap[SDLK_LGUI] || keymap[SDLK_RGUI])
#else
(keymap[SDLK_LALT] || keymap[SDLK_RALT])
#endif
) || evt.key.keysym.sym == SDLK_F11)
{
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 ) ) );
}