1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-15 01:24:45 +02:00

Spaces -> tabs

This commit is contained in:
Ivan Savenko
2024-04-30 11:38:13 +03:00
parent 62bb9fe4b7
commit 0d8d75afd4
18 changed files with 501 additions and 504 deletions

View File

@ -17,196 +17,196 @@
GameControllerConfig::GameControllerConfig(): leftAxisType(AxisType::NONE), rightAxisType(AxisType::NONE) GameControllerConfig::GameControllerConfig(): leftAxisType(AxisType::NONE), rightAxisType(AxisType::NONE)
{ {
load(); load();
} }
void GameControllerConfig::load() void GameControllerConfig::load()
{ {
const JsonNode config = JsonUtils::assembleFromFiles("config/shortcutsConfig"); const JsonNode config = JsonUtils::assembleFromFiles("config/shortcutsConfig");
for(auto const & entry : config["joystick"].Struct()) for(auto const & entry : config["joystick"].Struct())
{ {
std::string configName = entry.first; std::string configName = entry.first;
if(configName == "leftaxis") if(configName == "leftaxis")
leftAxisType = parseAxis(entry.first, entry.second); leftAxisType = parseAxis(entry.first, entry.second);
else if (configName == "rightaxis") else if (configName == "rightaxis")
rightAxisType = parseAxis(entry.first, entry.second); rightAxisType = parseAxis(entry.first, entry.second);
else if (configName == "lefttrigger" || configName == "righttrigger") else if (configName == "lefttrigger" || configName == "righttrigger")
parseTrigger(entry.first, entry.second); parseTrigger(entry.first, entry.second);
else else
parseButton(entry.first, entry.second); parseButton(entry.first, entry.second);
} }
} }
AxisType GameControllerConfig::parseAxis(const std::string & key, const JsonNode & value) AxisType GameControllerConfig::parseAxis(const std::string & key, const JsonNode & value)
{ {
if(!value.isString()) if(!value.isString())
{ {
logGlobal->error("The value of joystick config key %s should be a string!", key); logGlobal->error("The value of joystick config key %s should be a string!", key);
return AxisType::NONE; return AxisType::NONE;
} }
std::string featureName = value.String(); std::string featureName = value.String();
if(featureName == "cursorMotion") if(featureName == "cursorMotion")
return AxisType::CURSOR_MOTION; return AxisType::CURSOR_MOTION;
else if(featureName == "mapScroll") else if(featureName == "mapScroll")
return AxisType::MAP_SCROLL; return AxisType::MAP_SCROLL;
else if(featureName != "") else if(featureName != "")
logGlobal->error("Unknown value %s of joystick config key %s!", featureName, key); logGlobal->error("Unknown value %s of joystick config key %s!", featureName, key);
return AxisType::NONE; return AxisType::NONE;
} }
void GameControllerConfig::parseTrigger(const std::string & key, const JsonNode & value) void GameControllerConfig::parseTrigger(const std::string & key, const JsonNode & value)
{ {
std::vector<std::string> operations = getOperations(key, value); std::vector<std::string> operations = getOperations(key, value);
SDL_GameControllerAxis triggerAxis = key == "lefttrigger" ? SDL_GameControllerAxis triggerAxis = key == "lefttrigger" ?
SDL_CONTROLLER_AXIS_TRIGGERLEFT : SDL_CONTROLLER_AXIS_TRIGGERRIGHT; SDL_CONTROLLER_AXIS_TRIGGERLEFT : SDL_CONTROLLER_AXIS_TRIGGERRIGHT;
std::vector<EShortcut> shortcuts; std::vector<EShortcut> shortcuts;
for(const auto & operation : operations) for(const auto & operation : operations)
{ {
if(operation == "mouseLeftClick") if(operation == "mouseLeftClick")
{ {
leftClickTriggerSet.insert(triggerAxis); leftClickTriggerSet.insert(triggerAxis);
} }
else if(operation == "mouseRightClick") else if(operation == "mouseRightClick")
{ {
rightClickTriggerSet.insert(triggerAxis); rightClickTriggerSet.insert(triggerAxis);
} }
else else
{ {
EShortcut shortcut = GH.shortcuts().findShortcut(operation); EShortcut shortcut = GH.shortcuts().findShortcut(operation);
if(shortcut == EShortcut::NONE) if(shortcut == EShortcut::NONE)
logGlobal->error("Shortcut %s in joystick config key %s is invalid.", operation, key); logGlobal->error("Shortcut %s in joystick config key %s is invalid.", operation, key);
else else
shortcuts.push_back(shortcut); shortcuts.push_back(shortcut);
} }
} }
if(!shortcuts.empty()) if(!shortcuts.empty())
triggerShortcutsMap.emplace(triggerAxis, std::move(shortcuts)); triggerShortcutsMap.emplace(triggerAxis, std::move(shortcuts));
} }
void GameControllerConfig::parseButton(const std::string & key, const JsonNode & value) void GameControllerConfig::parseButton(const std::string & key, const JsonNode & value)
{ {
std::vector<std::string> operations = getOperations(key, value); std::vector<std::string> operations = getOperations(key, value);
SDL_GameControllerButton button = SDL_GameControllerGetButtonFromString(key.c_str()); SDL_GameControllerButton button = SDL_GameControllerGetButtonFromString(key.c_str());
if(button == SDL_CONTROLLER_BUTTON_INVALID) if(button == SDL_CONTROLLER_BUTTON_INVALID)
{ {
logGlobal->error("Joystick config key %s is invalid.", key); logGlobal->error("Joystick config key %s is invalid.", key);
return; return;
} }
std::vector<EShortcut> shortcuts; std::vector<EShortcut> shortcuts;
for(const auto & operation : operations) for(const auto & operation : operations)
{ {
if(operation == "mouseLeftClick") if(operation == "mouseLeftClick")
{ {
leftClickButtonSet.insert(button); leftClickButtonSet.insert(button);
} }
else if(operation == "mouseRightClick") else if(operation == "mouseRightClick")
{ {
rightClickButtonSet.insert(button); rightClickButtonSet.insert(button);
} }
else else
{ {
EShortcut shortcut = GH.shortcuts().findShortcut(operation); EShortcut shortcut = GH.shortcuts().findShortcut(operation);
if(shortcut == EShortcut::NONE) if(shortcut == EShortcut::NONE)
logGlobal->error("Shortcut %s in joystick config key %s is invalid.", operation, key); logGlobal->error("Shortcut %s in joystick config key %s is invalid.", operation, key);
else else
shortcuts.push_back(shortcut); shortcuts.push_back(shortcut);
} }
} }
if(!shortcuts.empty()) if(!shortcuts.empty())
buttonShortcutsMap.emplace(button, std::move(shortcuts)); buttonShortcutsMap.emplace(button, std::move(shortcuts));
} }
const AxisType & GameControllerConfig::getLeftAxisType() const AxisType & GameControllerConfig::getLeftAxisType()
{ {
return leftAxisType; return leftAxisType;
} }
const AxisType & GameControllerConfig::getRightAxisType() const AxisType & GameControllerConfig::getRightAxisType()
{ {
return rightAxisType; return rightAxisType;
} }
std::vector<std::string> GameControllerConfig::getOperations(const std::string & key, const JsonNode & value) std::vector<std::string> GameControllerConfig::getOperations(const std::string & key, const JsonNode & value)
{ {
std::vector<std::string> operations; std::vector<std::string> operations;
if(value.isString()) if(value.isString())
{ {
operations.push_back(value.String()); operations.push_back(value.String());
} }
else if(value.isVector()) else if(value.isVector())
{ {
for(auto const & entryVector : value.Vector()) for(auto const & entryVector : value.Vector())
{ {
if(!entryVector.isString()) if(!entryVector.isString())
logGlobal->error("The vector of joystick config key %s can not contain non-string element.", key); logGlobal->error("The vector of joystick config key %s can not contain non-string element.", key);
else else
operations.push_back(entryVector.String()); operations.push_back(entryVector.String());
} }
} }
else else
{ {
logGlobal->error("The value of joystick config key %s should be string or string vector.", key); logGlobal->error("The value of joystick config key %s should be string or string vector.", key);
} }
return operations; return operations;
} }
bool GameControllerConfig::isLeftClickButton(int buttonValue) bool GameControllerConfig::isLeftClickButton(int buttonValue)
{ {
SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue); SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue);
return leftClickButtonSet.find(button) != leftClickButtonSet.end(); return leftClickButtonSet.find(button) != leftClickButtonSet.end();
} }
bool GameControllerConfig::isRightClickButton(int buttonValue) bool GameControllerConfig::isRightClickButton(int buttonValue)
{ {
SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue); SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue);
return rightClickButtonSet.find(button) != rightClickButtonSet.end(); return rightClickButtonSet.find(button) != rightClickButtonSet.end();
} }
bool GameControllerConfig::isShortcutsButton(int buttonValue) bool GameControllerConfig::isShortcutsButton(int buttonValue)
{ {
SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue); SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue);
return buttonShortcutsMap.find(button) != buttonShortcutsMap.end(); return buttonShortcutsMap.find(button) != buttonShortcutsMap.end();
} }
const std::vector<EShortcut> & GameControllerConfig::getButtonShortcuts(int buttonValue) const std::vector<EShortcut> & GameControllerConfig::getButtonShortcuts(int buttonValue)
{ {
SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue); SDL_GameControllerButton button = static_cast<SDL_GameControllerButton>(buttonValue);
auto it = buttonShortcutsMap.find(button); auto it = buttonShortcutsMap.find(button);
if(it != buttonShortcutsMap.end()) if(it != buttonShortcutsMap.end())
return it->second; return it->second;
static std::vector<EShortcut> emptyVec; static std::vector<EShortcut> emptyVec;
return emptyVec; return emptyVec;
} }
bool GameControllerConfig::isLeftClickTrigger(int axisValue) bool GameControllerConfig::isLeftClickTrigger(int axisValue)
{ {
SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue); SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue);
return leftClickTriggerSet.find(axis) != leftClickTriggerSet.end(); return leftClickTriggerSet.find(axis) != leftClickTriggerSet.end();
} }
bool GameControllerConfig::isRightClickTrigger(int axisValue) bool GameControllerConfig::isRightClickTrigger(int axisValue)
{ {
SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue); SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue);
return rightClickTriggerSet.find(axis) != rightClickTriggerSet.end(); return rightClickTriggerSet.find(axis) != rightClickTriggerSet.end();
} }
bool GameControllerConfig::isShortcutsTrigger(int axisValue) bool GameControllerConfig::isShortcutsTrigger(int axisValue)
{ {
SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue); SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue);
return triggerShortcutsMap.find(axis) != triggerShortcutsMap.end(); return triggerShortcutsMap.find(axis) != triggerShortcutsMap.end();
} }
const std::vector<EShortcut> & GameControllerConfig::getTriggerShortcuts(int axisValue) const std::vector<EShortcut> & GameControllerConfig::getTriggerShortcuts(int axisValue)
{ {
SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue); SDL_GameControllerAxis axis = static_cast<SDL_GameControllerAxis>(axisValue);
auto it = triggerShortcutsMap.find(axis); auto it = triggerShortcutsMap.find(axis);
if(it != triggerShortcutsMap.end()) if(it != triggerShortcutsMap.end())
return it->second; return it->second;
static std::vector<EShortcut> emptyVec; static std::vector<EShortcut> emptyVec;
return emptyVec; return emptyVec;
} }

View File

@ -17,43 +17,43 @@
enum AxisType enum AxisType
{ {
CURSOR_MOTION, CURSOR_MOTION,
MAP_SCROLL, MAP_SCROLL,
NONE NONE
}; };
class GameControllerConfig { class GameControllerConfig {
using ButtonShortcutsMap = std::map<SDL_GameControllerButton, std::vector<EShortcut> >; using ButtonShortcutsMap = std::map<SDL_GameControllerButton, std::vector<EShortcut> >;
using TriggerShortcutsMap = std::map<SDL_GameControllerAxis, std::vector<EShortcut> >; using TriggerShortcutsMap = std::map<SDL_GameControllerAxis, std::vector<EShortcut> >;
ButtonShortcutsMap buttonShortcutsMap; ButtonShortcutsMap buttonShortcutsMap;
TriggerShortcutsMap triggerShortcutsMap; TriggerShortcutsMap triggerShortcutsMap;
std::set<SDL_GameControllerButton> leftClickButtonSet; std::set<SDL_GameControllerButton> leftClickButtonSet;
std::set<SDL_GameControllerButton> rightClickButtonSet; std::set<SDL_GameControllerButton> rightClickButtonSet;
std::set<SDL_GameControllerAxis> leftClickTriggerSet; std::set<SDL_GameControllerAxis> leftClickTriggerSet;
std::set<SDL_GameControllerAxis> rightClickTriggerSet; std::set<SDL_GameControllerAxis> rightClickTriggerSet;
AxisType leftAxisType; AxisType leftAxisType;
AxisType rightAxisType; AxisType rightAxisType;
void load(); void load();
std::vector<std::string> getOperations(const std::string & key, const JsonNode & value); std::vector<std::string> getOperations(const std::string & key, const JsonNode & value);
AxisType parseAxis(const std::string & key, const JsonNode & value); AxisType parseAxis(const std::string & key, const JsonNode & value);
void parseTrigger(const std::string & key, const JsonNode & value); void parseTrigger(const std::string & key, const JsonNode & value);
void parseButton(const std::string & key, const JsonNode & value); void parseButton(const std::string & key, const JsonNode & value);
public: public:
GameControllerConfig(); GameControllerConfig();
~GameControllerConfig() = default; ~GameControllerConfig() = default;
const AxisType & getLeftAxisType(); const AxisType & getLeftAxisType();
const AxisType & getRightAxisType(); const AxisType & getRightAxisType();
bool isLeftClickButton(int buttonValue); bool isLeftClickButton(int buttonValue);
bool isRightClickButton(int buttonValue); bool isRightClickButton(int buttonValue);
bool isShortcutsButton(int buttonValue); bool isShortcutsButton(int buttonValue);
const std::vector<EShortcut> & getButtonShortcuts(int buttonValue); const std::vector<EShortcut> & getButtonShortcuts(int buttonValue);
bool isLeftClickTrigger(int axisValue); bool isLeftClickTrigger(int axisValue);
bool isRightClickTrigger(int axisValue); bool isRightClickTrigger(int axisValue);
bool isShortcutsTrigger(int axisValue); bool isShortcutsTrigger(int axisValue);
const std::vector<EShortcut> & getTriggerShortcuts(int axisValue); const std::vector<EShortcut> & getTriggerShortcuts(int axisValue);
}; };

View File

@ -37,7 +37,7 @@ InputHandler::InputHandler()
, keyboardHandler(std::make_unique<InputSourceKeyboard>()) , keyboardHandler(std::make_unique<InputSourceKeyboard>())
, fingerHandler(std::make_unique<InputSourceTouch>()) , fingerHandler(std::make_unique<InputSourceTouch>())
, textHandler(std::make_unique<InputSourceText>()) , textHandler(std::make_unique<InputSourceText>())
, gameControllerHandler(std::make_unique<InputSourceGameController>()) , gameControllerHandler(std::make_unique<InputSourceGameController>())
{ {
} }
@ -71,12 +71,12 @@ void InputHandler::handleCurrentEvent(const SDL_Event & current)
return fingerHandler->handleEventFingerDown(current.tfinger); return fingerHandler->handleEventFingerDown(current.tfinger);
case SDL_FINGERUP: case SDL_FINGERUP:
return fingerHandler->handleEventFingerUp(current.tfinger); return fingerHandler->handleEventFingerUp(current.tfinger);
case SDL_CONTROLLERAXISMOTION: case SDL_CONTROLLERAXISMOTION:
return gameControllerHandler->handleEventAxisMotion(current.caxis); return gameControllerHandler->handleEventAxisMotion(current.caxis);
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONDOWN:
return gameControllerHandler->handleEventButtonDown(current.cbutton); return gameControllerHandler->handleEventButtonDown(current.cbutton);
case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONUP:
return gameControllerHandler->handleEventButtonUp(current.cbutton); return gameControllerHandler->handleEventButtonUp(current.cbutton);
} }
} }
@ -96,7 +96,7 @@ void InputHandler::processEvents()
for(const auto & currentEvent : eventsToProcess) for(const auto & currentEvent : eventsToProcess)
handleCurrentEvent(currentEvent); handleCurrentEvent(currentEvent);
gameControllerHandler->handleUpdate(); gameControllerHandler->handleUpdate();
fingerHandler->handleUpdate(); fingerHandler->handleUpdate();
} }
@ -112,7 +112,7 @@ bool InputHandler::ignoreEventsUntilInput()
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
case SDL_FINGERDOWN: case SDL_FINGERDOWN:
case SDL_KEYDOWN: case SDL_KEYDOWN:
case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONDOWN:
inputFound = true; inputFound = true;
} }
} }
@ -169,15 +169,15 @@ void InputHandler::preprocessEvent(const SDL_Event & ev)
else if(ev.type == SDL_WINDOWEVENT) else if(ev.type == SDL_WINDOWEVENT)
{ {
switch (ev.window.event) { switch (ev.window.event) {
case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_RESTORED:
#ifndef VCMI_IOS #ifndef VCMI_IOS
{ {
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex); boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
GH.onScreenResize(false); GH.onScreenResize(false);
} }
#endif #endif
break; break;
case SDL_WINDOWEVENT_FOCUS_GAINED: case SDL_WINDOWEVENT_FOCUS_GAINED:
{ {
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex); boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
if(settings["general"]["audioMuteFocus"].Bool()) { if(settings["general"]["audioMuteFocus"].Bool()) {
@ -185,8 +185,8 @@ void InputHandler::preprocessEvent(const SDL_Event & ev)
CCS->soundh->setVolume(settings["general"]["sound"].Integer()); CCS->soundh->setVolume(settings["general"]["sound"].Integer());
} }
} }
break; break;
case SDL_WINDOWEVENT_FOCUS_LOST: case SDL_WINDOWEVENT_FOCUS_LOST:
{ {
boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex); boost::mutex::scoped_lock interfaceLock(GH.interfaceMutex);
if(settings["general"]["audioMuteFocus"].Bool()) { if(settings["general"]["audioMuteFocus"].Bool()) {
@ -194,7 +194,7 @@ void InputHandler::preprocessEvent(const SDL_Event & ev)
CCS->soundh->setVolume(0); CCS->soundh->setVolume(0);
} }
} }
break; break;
} }
return; return;
} }
@ -206,21 +206,21 @@ void InputHandler::preprocessEvent(const SDL_Event & ev)
NotificationHandler::handleSdlEvent(ev); NotificationHandler::handleSdlEvent(ev);
} }
} }
else if(ev.type == SDL_CONTROLLERDEVICEADDED) else if(ev.type == SDL_CONTROLLERDEVICEADDED)
{ {
gameControllerHandler->handleEventDeviceAdded(ev.cdevice); gameControllerHandler->handleEventDeviceAdded(ev.cdevice);
return; return;
} }
else if(ev.type == SDL_CONTROLLERDEVICEREMOVED) else if(ev.type == SDL_CONTROLLERDEVICEREMOVED)
{ {
gameControllerHandler->handleEventDeviceRemoved(ev.cdevice); gameControllerHandler->handleEventDeviceRemoved(ev.cdevice);
return; return;
} }
else if(ev.type == SDL_CONTROLLERDEVICEREMAPPED) else if(ev.type == SDL_CONTROLLERDEVICEREMAPPED)
{ {
gameControllerHandler->handleEventDeviceRemapped(ev.cdevice); gameControllerHandler->handleEventDeviceRemapped(ev.cdevice);
return; return;
} }
//preprocessing //preprocessing
if(ev.type == SDL_MOUSEMOTION) if(ev.type == SDL_MOUSEMOTION)

View File

@ -40,7 +40,7 @@ class InputHandler
std::unique_ptr<InputSourceKeyboard> keyboardHandler; std::unique_ptr<InputSourceKeyboard> keyboardHandler;
std::unique_ptr<InputSourceTouch> fingerHandler; std::unique_ptr<InputSourceTouch> fingerHandler;
std::unique_ptr<InputSourceText> textHandler; std::unique_ptr<InputSourceText> textHandler;
std::unique_ptr<InputSourceGameController> gameControllerHandler; std::unique_ptr<InputSourceGameController> gameControllerHandler;
public: public:
InputHandler(); InputHandler();
@ -86,5 +86,4 @@ public:
bool isKeyboardAltDown() const; bool isKeyboardAltDown() const;
bool isKeyboardCtrlDown() const; bool isKeyboardCtrlDown() const;
bool isKeyboardShiftDown() const; bool isKeyboardShiftDown() const;
}; };

View File

@ -22,333 +22,333 @@
void InputSourceGameController::gameControllerDeleter(SDL_GameController * gameController) void InputSourceGameController::gameControllerDeleter(SDL_GameController * gameController)
{ {
if(gameController) if(gameController)
SDL_GameControllerClose(gameController); SDL_GameControllerClose(gameController);
} }
InputSourceGameController::InputSourceGameController(): InputSourceGameController::InputSourceGameController():
lastCheckTime(0), lastCheckTime(0),
cursorAxisValueX(0), cursorAxisValueX(0),
cursorAxisValueY(0), cursorAxisValueY(0),
cursorPlanDisX(0.0), cursorPlanDisX(0.0),
cursorPlanDisY(0.0), cursorPlanDisY(0.0),
scrollAxisMoved(false), scrollAxisMoved(false),
scrollStart(Point(0,0)), scrollStart(Point(0,0)),
scrollCurrent(Point(0,0)), scrollCurrent(Point(0,0)),
scrollAxisValueX(0), scrollAxisValueX(0),
scrollAxisValueY(0), scrollAxisValueY(0),
scrollPlanDisX(0.0), scrollPlanDisX(0.0),
scrollPlanDisY(0.0) scrollPlanDisY(0.0)
{ {
tryOpenAllGameControllers(); tryOpenAllGameControllers();
} }
void InputSourceGameController::tryOpenAllGameControllers() void InputSourceGameController::tryOpenAllGameControllers()
{ {
for(int i = 0; i < SDL_NumJoysticks(); ++i) for(int i = 0; i < SDL_NumJoysticks(); ++i)
if(SDL_IsGameController(i)) if(SDL_IsGameController(i))
openGameController(i); openGameController(i);
else else
logGlobal->warn("Joystick %d is an unsupported game controller!", i); logGlobal->warn("Joystick %d is an unsupported game controller!", i);
} }
void InputSourceGameController::openGameController(int index) void InputSourceGameController::openGameController(int index)
{ {
SDL_GameController * controller = SDL_GameControllerOpen(index); SDL_GameController * controller = SDL_GameControllerOpen(index);
if(!controller) if(!controller)
{ {
logGlobal->error("Fail to open game controller %d!", index); logGlobal->error("Fail to open game controller %d!", index);
return; return;
} }
GameControllerPtr controllerPtr(controller, gameControllerDeleter); GameControllerPtr controllerPtr(controller, gameControllerDeleter);
// Need to save joystick index for event. Joystick index may not be equal to index sometimes. // Need to save joystick index for event. Joystick index may not be equal to index sometimes.
int joystickIndex = getJoystickIndex(controllerPtr.get()); int joystickIndex = getJoystickIndex(controllerPtr.get());
if(joystickIndex < 0) if(joystickIndex < 0)
{ {
logGlobal->error("Fail to get joystick index of game controller %d!", index); logGlobal->error("Fail to get joystick index of game controller %d!", index);
return; return;
} }
if(gameControllerMap.find(joystickIndex) != gameControllerMap.end()) if(gameControllerMap.find(joystickIndex) != gameControllerMap.end())
{ {
logGlobal->warn("Game controller with joystick index %d is already opened.", joystickIndex); logGlobal->warn("Game controller with joystick index %d is already opened.", joystickIndex);
return; return;
} }
gameControllerMap.emplace(joystickIndex, std::move(controllerPtr)); gameControllerMap.emplace(joystickIndex, std::move(controllerPtr));
} }
int InputSourceGameController::getJoystickIndex(SDL_GameController * controller) int InputSourceGameController::getJoystickIndex(SDL_GameController * controller)
{ {
SDL_Joystick* joystick = SDL_GameControllerGetJoystick(controller); SDL_Joystick* joystick = SDL_GameControllerGetJoystick(controller);
if(!joystick) if(!joystick)
return -1; return -1;
SDL_JoystickID instanceID = SDL_JoystickInstanceID(joystick); SDL_JoystickID instanceID = SDL_JoystickInstanceID(joystick);
if(instanceID < 0) if(instanceID < 0)
return -1; return -1;
return (int)instanceID; return (int)instanceID;
} }
void InputSourceGameController::handleEventDeviceAdded(const SDL_ControllerDeviceEvent & device) void InputSourceGameController::handleEventDeviceAdded(const SDL_ControllerDeviceEvent & device)
{ {
if(gameControllerMap.find(device.which) != gameControllerMap.end()) if(gameControllerMap.find(device.which) != gameControllerMap.end())
{ {
logGlobal->warn("Game controller %d is already opened.", device.which); logGlobal->warn("Game controller %d is already opened.", device.which);
return; return;
} }
openGameController(device.which); openGameController(device.which);
} }
void InputSourceGameController::handleEventDeviceRemoved(const SDL_ControllerDeviceEvent & device) void InputSourceGameController::handleEventDeviceRemoved(const SDL_ControllerDeviceEvent & device)
{ {
if(gameControllerMap.find(device.which) == gameControllerMap.end()) if(gameControllerMap.find(device.which) == gameControllerMap.end())
{ {
logGlobal->warn("Game controller %d is not opened before.", device.which); logGlobal->warn("Game controller %d is not opened before.", device.which);
return; return;
} }
gameControllerMap.erase(device.which); gameControllerMap.erase(device.which);
} }
void InputSourceGameController::handleEventDeviceRemapped(const SDL_ControllerDeviceEvent & device) void InputSourceGameController::handleEventDeviceRemapped(const SDL_ControllerDeviceEvent & device)
{ {
if(gameControllerMap.find(device.which) == gameControllerMap.end()) if(gameControllerMap.find(device.which) == gameControllerMap.end())
{ {
logGlobal->warn("Game controller %d is not opened.", device.which); logGlobal->warn("Game controller %d is not opened.", device.which);
return; return;
} }
gameControllerMap.erase(device.which); gameControllerMap.erase(device.which);
openGameController(device.which); openGameController(device.which);
} }
int InputSourceGameController::getRealAxisValue(int value) int InputSourceGameController::getRealAxisValue(int value)
{ {
if(value < AXIS_DEAD_ZOOM && value > -AXIS_DEAD_ZOOM) if(value < AXIS_DEAD_ZOOM && value > -AXIS_DEAD_ZOOM)
return 0; return 0;
if(value > AXIS_MAX_ZOOM) if(value > AXIS_MAX_ZOOM)
return AXIS_MAX_ZOOM; return AXIS_MAX_ZOOM;
if(value < -AXIS_MAX_ZOOM) if(value < -AXIS_MAX_ZOOM)
return -AXIS_MAX_ZOOM; return -AXIS_MAX_ZOOM;
int base = value > 0 ? AXIS_DEAD_ZOOM: -AXIS_DEAD_ZOOM; int base = value > 0 ? AXIS_DEAD_ZOOM: -AXIS_DEAD_ZOOM;
return (value - base) * AXIS_MAX_ZOOM / (AXIS_MAX_ZOOM - AXIS_DEAD_ZOOM); return (value - base) * AXIS_MAX_ZOOM / (AXIS_MAX_ZOOM - AXIS_DEAD_ZOOM);
} }
void InputSourceGameController::dispatchTriggerShortcuts(const std::vector<EShortcut> & shortcutsVector, int axisValue) void InputSourceGameController::dispatchTriggerShortcuts(const std::vector<EShortcut> & shortcutsVector, int axisValue)
{ {
if(axisValue >= TRIGGER_PRESS_THRESHOLD) if(axisValue >= TRIGGER_PRESS_THRESHOLD)
GH.events().dispatchShortcutPressed(shortcutsVector); GH.events().dispatchShortcutPressed(shortcutsVector);
else else
GH.events().dispatchShortcutReleased(shortcutsVector); GH.events().dispatchShortcutReleased(shortcutsVector);
} }
void InputSourceGameController::dispatchTriggerLeftClick(int axisValue) void InputSourceGameController::dispatchTriggerLeftClick(int axisValue)
{ {
const Point & position = GH.input().getCursorPosition(); const Point & position = GH.input().getCursorPosition();
if(axisValue >= TRIGGER_PRESS_THRESHOLD) if(axisValue >= TRIGGER_PRESS_THRESHOLD)
GH.events().dispatchMouseLeftButtonPressed(position, 0); GH.events().dispatchMouseLeftButtonPressed(position, 0);
else else
GH.events().dispatchMouseLeftButtonReleased(position, 0); GH.events().dispatchMouseLeftButtonReleased(position, 0);
} }
void InputSourceGameController::dispatchTriggerRightClick(int axisValue) void InputSourceGameController::dispatchTriggerRightClick(int axisValue)
{ {
const Point & position = GH.input().getCursorPosition(); const Point & position = GH.input().getCursorPosition();
if(axisValue >= TRIGGER_PRESS_THRESHOLD) if(axisValue >= TRIGGER_PRESS_THRESHOLD)
GH.events().dispatchShowPopup(position, 0); GH.events().dispatchShowPopup(position, 0);
else else
GH.events().dispatchClosePopup(position); GH.events().dispatchClosePopup(position);
} }
void InputSourceGameController::handleEventAxisMotion(const SDL_ControllerAxisEvent & axis) void InputSourceGameController::handleEventAxisMotion(const SDL_ControllerAxisEvent & axis)
{ {
tryToConvertCursor(); tryToConvertCursor();
if(axis.axis == SDL_CONTROLLER_AXIS_LEFTX) if(axis.axis == SDL_CONTROLLER_AXIS_LEFTX)
{ {
if(config.getLeftAxisType() == AxisType::CURSOR_MOTION) if(config.getLeftAxisType() == AxisType::CURSOR_MOTION)
cursorAxisValueX = getRealAxisValue(axis.value); cursorAxisValueX = getRealAxisValue(axis.value);
else if(config.getLeftAxisType() == AxisType::MAP_SCROLL) else if(config.getLeftAxisType() == AxisType::MAP_SCROLL)
scrollAxisValueX = getRealAxisValue(axis.value); scrollAxisValueX = getRealAxisValue(axis.value);
} }
else if(axis.axis == SDL_CONTROLLER_AXIS_LEFTY) else if(axis.axis == SDL_CONTROLLER_AXIS_LEFTY)
{ {
if(config.getLeftAxisType() == AxisType::CURSOR_MOTION) if(config.getLeftAxisType() == AxisType::CURSOR_MOTION)
cursorAxisValueY = getRealAxisValue(axis.value); cursorAxisValueY = getRealAxisValue(axis.value);
else if(config.getLeftAxisType() == AxisType::MAP_SCROLL) else if(config.getLeftAxisType() == AxisType::MAP_SCROLL)
scrollAxisValueY = getRealAxisValue(axis.value); scrollAxisValueY = getRealAxisValue(axis.value);
} }
if(axis.axis == SDL_CONTROLLER_AXIS_RIGHTX) if(axis.axis == SDL_CONTROLLER_AXIS_RIGHTX)
{ {
if(config.getRightAxisType() == AxisType::CURSOR_MOTION) if(config.getRightAxisType() == AxisType::CURSOR_MOTION)
cursorAxisValueX = getRealAxisValue(axis.value); cursorAxisValueX = getRealAxisValue(axis.value);
else if(config.getRightAxisType() == AxisType::MAP_SCROLL) else if(config.getRightAxisType() == AxisType::MAP_SCROLL)
scrollAxisValueX = getRealAxisValue(axis.value); scrollAxisValueX = getRealAxisValue(axis.value);
} }
else if(axis.axis == SDL_CONTROLLER_AXIS_RIGHTY) else if(axis.axis == SDL_CONTROLLER_AXIS_RIGHTY)
{ {
if(config.getRightAxisType() == AxisType::CURSOR_MOTION) if(config.getRightAxisType() == AxisType::CURSOR_MOTION)
cursorAxisValueY = getRealAxisValue(axis.value); cursorAxisValueY = getRealAxisValue(axis.value);
else if(config.getRightAxisType() == AxisType::MAP_SCROLL) else if(config.getRightAxisType() == AxisType::MAP_SCROLL)
scrollAxisValueY = getRealAxisValue(axis.value); scrollAxisValueY = getRealAxisValue(axis.value);
} }
else if(config.isLeftClickTrigger(axis.axis)) else if(config.isLeftClickTrigger(axis.axis))
{ {
dispatchTriggerLeftClick(axis.value); dispatchTriggerLeftClick(axis.value);
} }
else if(config.isRightClickTrigger(axis.axis)) else if(config.isRightClickTrigger(axis.axis))
{ {
dispatchTriggerRightClick(axis.value); dispatchTriggerRightClick(axis.value);
} }
else if(config.isShortcutsTrigger(axis.axis)) else if(config.isShortcutsTrigger(axis.axis))
{ {
const auto & shortcutsVector = config.getTriggerShortcuts(axis.axis); const auto & shortcutsVector = config.getTriggerShortcuts(axis.axis);
dispatchTriggerShortcuts(shortcutsVector, axis.value); dispatchTriggerShortcuts(shortcutsVector, axis.value);
} }
} }
void InputSourceGameController::tryToConvertCursor() void InputSourceGameController::tryToConvertCursor()
{ {
if(CCS && CCS->curh && CCS->curh->getShowType() == Cursor::ShowType::HARDWARE) if(CCS && CCS->curh && CCS->curh->getShowType() == Cursor::ShowType::HARDWARE)
{ {
const Point & cursorPosition = CCS->curh->getCursorPosition(); const Point & cursorPosition = CCS->curh->getCursorPosition();
CCS->curh->ChangeCursor(Cursor::ShowType::SOFTWARE); CCS->curh->ChangeCursor(Cursor::ShowType::SOFTWARE);
CCS->curh->cursorMove(cursorPosition.x, cursorPosition.y); CCS->curh->cursorMove(cursorPosition.x, cursorPosition.y);
GH.input().setCursorPosition(cursorPosition); GH.input().setCursorPosition(cursorPosition);
} }
} }
void InputSourceGameController::handleEventButtonDown(const SDL_ControllerButtonEvent & button) void InputSourceGameController::handleEventButtonDown(const SDL_ControllerButtonEvent & button)
{ {
const Point & position = GH.input().getCursorPosition(); const Point & position = GH.input().getCursorPosition();
if(config.isLeftClickButton(button.button)) if(config.isLeftClickButton(button.button))
{ {
GH.events().dispatchMouseLeftButtonPressed(position, 0); GH.events().dispatchMouseLeftButtonPressed(position, 0);
} }
if(config.isRightClickButton(button.button)) if(config.isRightClickButton(button.button))
{ {
GH.events().dispatchShowPopup(position, 0); GH.events().dispatchShowPopup(position, 0);
} }
if(config.isShortcutsButton(button.button)) if(config.isShortcutsButton(button.button))
{ {
const auto & shortcutsVector = config.getButtonShortcuts(button.button); const auto & shortcutsVector = config.getButtonShortcuts(button.button);
GH.events().dispatchShortcutPressed(shortcutsVector); GH.events().dispatchShortcutPressed(shortcutsVector);
} }
} }
void InputSourceGameController::handleEventButtonUp(const SDL_ControllerButtonEvent & button) void InputSourceGameController::handleEventButtonUp(const SDL_ControllerButtonEvent & button)
{ {
const Point & position = GH.input().getCursorPosition(); const Point & position = GH.input().getCursorPosition();
if(config.isLeftClickButton(button.button)) if(config.isLeftClickButton(button.button))
{ {
GH.events().dispatchMouseLeftButtonReleased(position, 0); GH.events().dispatchMouseLeftButtonReleased(position, 0);
} }
if(config.isRightClickButton(button.button)) if(config.isRightClickButton(button.button))
{ {
GH.events().dispatchClosePopup(position); GH.events().dispatchClosePopup(position);
} }
if(config.isShortcutsButton(button.button)) if(config.isShortcutsButton(button.button))
{ {
const auto & shortcutsVector = config.getButtonShortcuts(button.button); const auto & shortcutsVector = config.getButtonShortcuts(button.button);
GH.events().dispatchShortcutReleased(shortcutsVector); GH.events().dispatchShortcutReleased(shortcutsVector);
} }
} }
void InputSourceGameController::doCursorMove(int deltaX, int deltaY) void InputSourceGameController::doCursorMove(int deltaX, int deltaY)
{ {
if(deltaX == 0 && deltaY == 0) if(deltaX == 0 && deltaY == 0)
return; return;
const Point & screenSize = GH.screenDimensions(); const Point & screenSize = GH.screenDimensions();
const Point & cursorPosition = GH.getCursorPosition(); const Point & cursorPosition = GH.getCursorPosition();
int newX = std::min(std::max(cursorPosition.x + deltaX, 0), screenSize.x); int newX = std::min(std::max(cursorPosition.x + deltaX, 0), screenSize.x);
int newY = std::min(std::max(cursorPosition.y + deltaY, 0), screenSize.y); int newY = std::min(std::max(cursorPosition.y + deltaY, 0), screenSize.y);
Point targetPosition{newX, newY}; Point targetPosition{newX, newY};
GH.input().setCursorPosition(targetPosition); GH.input().setCursorPosition(targetPosition);
if(CCS && CCS->curh) if(CCS && CCS->curh)
CCS->curh->cursorMove(GH.getCursorPosition().x, GH.getCursorPosition().y); CCS->curh->cursorMove(GH.getCursorPosition().x, GH.getCursorPosition().y);
} }
int InputSourceGameController::getMoveDis(float planDis) int InputSourceGameController::getMoveDis(float planDis)
{ {
if(planDis >= 0) if(planDis >= 0)
return std::floor(planDis); return std::floor(planDis);
else else
return std::ceil(planDis); return std::ceil(planDis);
} }
void InputSourceGameController::handleUpdate() void InputSourceGameController::handleUpdate()
{ {
auto now = std::chrono::high_resolution_clock::now(); auto now = std::chrono::high_resolution_clock::now();
auto nowMs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count(); auto nowMs = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
if (lastCheckTime == 0) { if (lastCheckTime == 0) {
lastCheckTime = nowMs; lastCheckTime = nowMs;
return; return;
} }
long long deltaTime = nowMs - lastCheckTime; long long deltaTime = nowMs - lastCheckTime;
handleCursorUpdate(deltaTime); handleCursorUpdate(deltaTime);
handleScrollUpdate(deltaTime); handleScrollUpdate(deltaTime);
lastCheckTime = nowMs; lastCheckTime = nowMs;
} }
void InputSourceGameController::handleCursorUpdate(long long deltaTime) void InputSourceGameController::handleCursorUpdate(long long deltaTime)
{ {
if(cursorAxisValueX == 0) if(cursorAxisValueX == 0)
cursorPlanDisX = 0; cursorPlanDisX = 0;
else else
cursorPlanDisX += ((float)deltaTime / 1000) * ((float)cursorAxisValueX / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED; cursorPlanDisX += ((float)deltaTime / 1000) * ((float)cursorAxisValueX / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED;
if(cursorAxisValueY == 0) if(cursorAxisValueY == 0)
cursorPlanDisY = 0; cursorPlanDisY = 0;
else else
cursorPlanDisY += ((float)deltaTime / 1000) * ((float)cursorAxisValueY / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED; cursorPlanDisY += ((float)deltaTime / 1000) * ((float)cursorAxisValueY / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED;
int moveDisX = getMoveDis(cursorPlanDisX); int moveDisX = getMoveDis(cursorPlanDisX);
int moveDisY = getMoveDis(cursorPlanDisY); int moveDisY = getMoveDis(cursorPlanDisY);
cursorPlanDisX -= moveDisX; cursorPlanDisX -= moveDisX;
cursorPlanDisY -= moveDisY; cursorPlanDisY -= moveDisY;
doCursorMove(moveDisX, moveDisY); doCursorMove(moveDisX, moveDisY);
} }
void InputSourceGameController::handleScrollUpdate(long long deltaTime) void InputSourceGameController::handleScrollUpdate(long long deltaTime)
{ {
if(!scrollAxisMoved && isScrollAxisReleased()) if(!scrollAxisMoved && isScrollAxisReleased())
{ {
return; return;
} }
else if(!scrollAxisMoved && !isScrollAxisReleased()) else if(!scrollAxisMoved && !isScrollAxisReleased())
{ {
scrollAxisMoved = true; scrollAxisMoved = true;
scrollCurrent = scrollStart = GH.input().getCursorPosition(); scrollCurrent = scrollStart = GH.input().getCursorPosition();
GH.events().dispatchGesturePanningStarted(scrollStart); GH.events().dispatchGesturePanningStarted(scrollStart);
} }
else if(scrollAxisMoved && isScrollAxisReleased()) else if(scrollAxisMoved && isScrollAxisReleased())
{ {
GH.events().dispatchGesturePanningEnded(scrollStart, scrollCurrent); GH.events().dispatchGesturePanningEnded(scrollStart, scrollCurrent);
scrollAxisMoved = false; scrollAxisMoved = false;
scrollPlanDisX = scrollPlanDisY = 0; scrollPlanDisX = scrollPlanDisY = 0;
return; return;
} }
scrollPlanDisX += ((float)deltaTime / 1000) * ((float)scrollAxisValueX / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED; scrollPlanDisX += ((float)deltaTime / 1000) * ((float)scrollAxisValueX / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED;
scrollPlanDisY += ((float)deltaTime / 1000) * ((float)scrollAxisValueY / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED; scrollPlanDisY += ((float)deltaTime / 1000) * ((float)scrollAxisValueY / AXIS_MAX_ZOOM) * AXIS_MOVE_SPEED;
int moveDisX = getMoveDis(scrollPlanDisX); int moveDisX = getMoveDis(scrollPlanDisX);
int moveDisY = getMoveDis(scrollPlanDisY); int moveDisY = getMoveDis(scrollPlanDisY);
if(moveDisX != 0 || moveDisY != 0) if(moveDisX != 0 || moveDisY != 0)
{ {
scrollPlanDisX -= moveDisX; scrollPlanDisX -= moveDisX;
scrollPlanDisY -= moveDisY; scrollPlanDisY -= moveDisY;
scrollCurrent.x += moveDisX; scrollCurrent.x += moveDisX;
scrollCurrent.y += moveDisY; scrollCurrent.y += moveDisY;
Point distance(moveDisX, moveDisY); Point distance(moveDisX, moveDisY);
GH.events().dispatchGesturePanning(scrollStart, scrollCurrent, distance); GH.events().dispatchGesturePanning(scrollStart, scrollCurrent, distance);
} }
} }
bool InputSourceGameController::isScrollAxisReleased() bool InputSourceGameController::isScrollAxisReleased()
{ {
return scrollAxisValueX == 0 && scrollAxisValueY == 0; return scrollAxisValueX == 0 && scrollAxisValueY == 0;
} }

View File

@ -27,46 +27,46 @@ const int TRIGGER_PRESS_THRESHOLD = 8000;
/// Class that handles game controller input from SDL events /// Class that handles game controller input from SDL events
class InputSourceGameController class InputSourceGameController
{ {
static void gameControllerDeleter(SDL_GameController * gameController); static void gameControllerDeleter(SDL_GameController * gameController);
using GameControllerPtr = std::unique_ptr<SDL_GameController, decltype(&gameControllerDeleter)>; using GameControllerPtr = std::unique_ptr<SDL_GameController, decltype(&gameControllerDeleter)>;
std::map<int, GameControllerPtr> gameControllerMap; std::map<int, GameControllerPtr> gameControllerMap;
GameControllerConfig config; GameControllerConfig config;
long long lastCheckTime; long long lastCheckTime;
int cursorAxisValueX; int cursorAxisValueX;
int cursorAxisValueY; int cursorAxisValueY;
float cursorPlanDisX; float cursorPlanDisX;
float cursorPlanDisY; float cursorPlanDisY;
bool scrollAxisMoved; bool scrollAxisMoved;
Point scrollStart; Point scrollStart;
Point scrollCurrent; Point scrollCurrent;
int scrollAxisValueX; int scrollAxisValueX;
int scrollAxisValueY; int scrollAxisValueY;
float scrollPlanDisX; float scrollPlanDisX;
float scrollPlanDisY; float scrollPlanDisY;
void openGameController(int index); void openGameController(int index);
int getJoystickIndex(SDL_GameController * controller); int getJoystickIndex(SDL_GameController * controller);
int getRealAxisValue(int value); int getRealAxisValue(int value);
void dispatchTriggerShortcuts(const std::vector<EShortcut> & shortcutsVector, int axisValue); void dispatchTriggerShortcuts(const std::vector<EShortcut> & shortcutsVector, int axisValue);
void dispatchTriggerLeftClick(int axisValue); void dispatchTriggerLeftClick(int axisValue);
void dispatchTriggerRightClick(int axisValue); void dispatchTriggerRightClick(int axisValue);
void tryToConvertCursor(); void tryToConvertCursor();
void doCursorMove(int deltaX, int deltaY); void doCursorMove(int deltaX, int deltaY);
int getMoveDis(float planDis); int getMoveDis(float planDis);
void handleCursorUpdate(long long deltaTime); void handleCursorUpdate(long long deltaTime);
void handleScrollUpdate(long long deltaTime); void handleScrollUpdate(long long deltaTime);
bool isScrollAxisReleased(); bool isScrollAxisReleased();
public: public:
InputSourceGameController(); InputSourceGameController();
void tryOpenAllGameControllers(); void tryOpenAllGameControllers();
void handleEventDeviceAdded(const SDL_ControllerDeviceEvent & device); void handleEventDeviceAdded(const SDL_ControllerDeviceEvent & device);
void handleEventDeviceRemoved(const SDL_ControllerDeviceEvent & device); void handleEventDeviceRemoved(const SDL_ControllerDeviceEvent & device);
void handleEventDeviceRemapped(const SDL_ControllerDeviceEvent & device); void handleEventDeviceRemapped(const SDL_ControllerDeviceEvent & device);
void handleEventAxisMotion(const SDL_ControllerAxisEvent & axis); void handleEventAxisMotion(const SDL_ControllerAxisEvent & axis);
void handleEventButtonDown(const SDL_ControllerButtonEvent & button); void handleEventButtonDown(const SDL_ControllerButtonEvent & button);
void handleEventButtonUp(const SDL_ControllerButtonEvent & button); void handleEventButtonUp(const SDL_ControllerButtonEvent & button);
void handleUpdate(); void handleUpdate();
}; };

View File

@ -57,7 +57,7 @@ CursorHandler::CursorHandler()
cursor->preload(); cursor->preload();
set(Cursor::Map::POINTER); set(Cursor::Map::POINTER);
showType = dynamic_cast<CursorSoftware *>(cursor.get()) ? Cursor::ShowType::SOFTWARE : Cursor::ShowType::HARDWARE; showType = dynamic_cast<CursorSoftware *>(cursor.get()) ? Cursor::ShowType::SOFTWARE : Cursor::ShowType::HARDWARE;
} }
CursorHandler::~CursorHandler() = default; CursorHandler::~CursorHandler() = default;
@ -293,30 +293,30 @@ void CursorHandler::show()
Cursor::ShowType CursorHandler::getShowType() Cursor::ShowType CursorHandler::getShowType()
{ {
return showType; return showType;
} }
void CursorHandler::ChangeCursor(Cursor::ShowType showType) void CursorHandler::ChangeCursor(Cursor::ShowType showType)
{ {
if(this->showType == showType) if(this->showType == showType)
return; return;
switch(showType) switch(showType)
{ {
case Cursor::ShowType::SOFTWARE: case Cursor::ShowType::SOFTWARE:
cursor.reset(new CursorSoftware()); cursor.reset(new CursorSoftware());
showType = Cursor::ShowType::SOFTWARE; showType = Cursor::ShowType::SOFTWARE;
cursor->setImage(getCurrentImage(), getPivotOffset()); cursor->setImage(getCurrentImage(), getPivotOffset());
break; break;
case Cursor::ShowType::HARDWARE: case Cursor::ShowType::HARDWARE:
cursor.reset(new CursorHardware()); cursor.reset(new CursorHardware());
showType = Cursor::ShowType::HARDWARE; showType = Cursor::ShowType::HARDWARE;
cursor->setImage(getCurrentImage(), getPivotOffset()); cursor->setImage(getCurrentImage(), getPivotOffset());
break; break;
} }
} }
const Point & CursorHandler::getCursorPosition() const Point & CursorHandler::getCursorPosition()
{ {
return cursor->getCursorPosition(); return cursor->getCursorPosition();
} }

View File

@ -25,10 +25,10 @@ namespace Cursor
SPELLBOOK // animated cursor for spellcasting SPELLBOOK // animated cursor for spellcasting
}; };
enum class ShowType { enum class ShowType {
SOFTWARE, SOFTWARE,
HARDWARE HARDWARE
}; };
enum class Default { enum class Default {
POINTER = 0, POINTER = 0,
@ -125,7 +125,7 @@ class CursorHandler final
/// Current cursor /// Current cursor
Cursor::Type type; Cursor::Type type;
Cursor::ShowType showType; Cursor::ShowType showType;
size_t frame; size_t frame;
float frameTime; float frameTime;
Point pos; Point pos;

View File

@ -153,7 +153,7 @@ EShortcut ShortcutHandler::findShortcut(const std::string & identifier ) const
{"adventureZoomIn", EShortcut::ADVENTURE_ZOOM_IN }, {"adventureZoomIn", EShortcut::ADVENTURE_ZOOM_IN },
{"adventureZoomOut", EShortcut::ADVENTURE_ZOOM_OUT }, {"adventureZoomOut", EShortcut::ADVENTURE_ZOOM_OUT },
{"adventureZoomReset", EShortcut::ADVENTURE_ZOOM_RESET }, {"adventureZoomReset", EShortcut::ADVENTURE_ZOOM_RESET },
{"battleToggleHeroesStats", EShortcut::BATTLE_TOGGLE_HEROES_STATS}, {"battleToggleHeroesStats", EShortcut::BATTLE_TOGGLE_HEROES_STATS},
{"battleToggleQueue", EShortcut::BATTLE_TOGGLE_QUEUE }, {"battleToggleQueue", EShortcut::BATTLE_TOGGLE_QUEUE },
{"battleUseCreatureSpell", EShortcut::BATTLE_USE_CREATURE_SPELL }, {"battleUseCreatureSpell", EShortcut::BATTLE_USE_CREATURE_SPELL },
{"battleSurrender", EShortcut::BATTLE_SURRENDER }, {"battleSurrender", EShortcut::BATTLE_SURRENDER },

View File

@ -24,6 +24,6 @@ public:
virtual void setCursorPosition( const Point & newPos ) = 0; virtual void setCursorPosition( const Point & newPos ) = 0;
virtual void render() = 0; virtual void render() = 0;
virtual void setVisible( bool on) = 0; virtual void setVisible( bool on) = 0;
virtual const Point & getCursorPosition() = 0; virtual const Point & getCursorPosition() = 0;
}; };

View File

@ -44,6 +44,6 @@ public:
/// Window has focus /// Window has focus
virtual bool hasFocus() = 0; virtual bool hasFocus() = 0;
/// Get the scale value of screen /// Get the scale value of screen
virtual void getRenderScale(float & scaleX, float & scaleY) = 0; virtual void getRenderScale(float & scaleX, float & scaleY) = 0;
}; };

View File

@ -69,13 +69,13 @@ void CursorHardware::setImage(std::shared_ptr<IImage> image, const Point & pivot
const Point & CursorHardware::getCursorPosition() const Point & CursorHardware::getCursorPosition()
{ {
int mouseX, mouseY; int mouseX, mouseY;
SDL_GetMouseState(&mouseX, &mouseY); SDL_GetMouseState(&mouseX, &mouseY);
float scaleX, scaleY; float scaleX, scaleY;
GH.screenHandler().getRenderScale(scaleX, scaleY); GH.screenHandler().getRenderScale(scaleX, scaleY);
pos.x = int(mouseX / scaleX); pos.x = int(mouseX / scaleX);
pos.y = int(mouseY / scaleY); pos.y = int(mouseY / scaleY);
return pos; return pos;
} }
void CursorHardware::setCursorPosition( const Point & newPos ) void CursorHardware::setCursorPosition( const Point & newPos )

View File

@ -33,6 +33,6 @@ public:
void setCursorPosition( const Point & newPos ) override; void setCursorPosition( const Point & newPos ) override;
void render() override; void render() override;
void setVisible( bool on) override; void setVisible( bool on) override;
const Point & getCursorPosition() override; const Point & getCursorPosition() override;
}; };

View File

@ -83,7 +83,7 @@ void CursorSoftware::setVisible(bool on)
const Point & CursorSoftware::getCursorPosition() const Point & CursorSoftware::getCursorPosition()
{ {
return pos; return pos;
} }
CursorSoftware::CursorSoftware(): CursorSoftware::CursorSoftware():

View File

@ -40,6 +40,6 @@ public:
void setCursorPosition( const Point & newPos ) override; void setCursorPosition( const Point & newPos ) override;
void render() override; void render() override;
void setVisible( bool on) override; void setVisible( bool on) override;
const Point & getCursorPosition() override; const Point & getCursorPosition() override;
}; };

View File

@ -585,5 +585,5 @@ bool ScreenHandler::hasFocus()
void ScreenHandler::getRenderScale(float & scaleX, float & scaleY) void ScreenHandler::getRenderScale(float & scaleX, float & scaleY)
{ {
SDL_RenderGetScale(mainRenderer, &scaleX, &scaleY); SDL_RenderGetScale(mainRenderer, &scaleX, &scaleY);
} }

View File

@ -89,8 +89,8 @@ public:
/// Window has focus /// Window has focus
bool hasFocus() final; bool hasFocus() final;
/// Get the scale value of screen /// Get the scale value of screen
void getRenderScale(float & scaleX, float & scaleY); void getRenderScale(float & scaleX, float & scaleY);
std::vector<Point> getSupportedResolutions() const final; std::vector<Point> getSupportedResolutions() const final;
std::vector<Point> getSupportedResolutions(int displayIndex) const; std::vector<Point> getSupportedResolutions(int displayIndex) const;

View File

@ -140,8 +140,7 @@
"joystick": { "joystick": {
"leftaxis": "cursorMotion", "leftaxis": "cursorMotion",
"rightaxis": "mapScroll", "rightaxis": "mapScroll",
"a": ["globalAccept", "globalReturn", "lobbyBeginStandardGame", "lobbyBeginCampaign", "lobbyLoadGame", "a": ["globalAccept", "globalReturn", "lobbyBeginStandardGame", "lobbyBeginCampaign", "lobbyLoadGame", "lobbySaveGame", "adventureViewSelected", "adventureExitWorldView", "battleTacticsEnd"],
"lobbySaveGame", "adventureViewSelected", "adventureExitWorldView", "battleTacticsEnd"],
"b": ["globalCancel", "globalReturn", "adventureExitWorldView"], "b": ["globalCancel", "globalReturn", "adventureExitWorldView"],
"x": "mouseLeftClick", "x": "mouseLeftClick",
"y": "mouseRightClick", "y": "mouseRightClick",
@ -151,8 +150,7 @@
"righttrigger": ["adventureCastSpell", "battleCastSpell"], "righttrigger": ["adventureCastSpell", "battleCastSpell"],
"back": ["gameEndTurn", "battleAutocombatEnd"], "back": ["gameEndTurn", "battleAutocombatEnd"],
"start": ["globalOptions", "adventureGameOptions"], "start": ["globalOptions", "adventureGameOptions"],
"dpup": ["moveUp", "adventureViewWorld", "recruitmentUpgrade", "recruitmentUpgradeAll", "dpup": ["moveUp", "adventureViewWorld", "recruitmentUpgrade", "recruitmentUpgradeAll", "battleConsoleUp", "recruitmentMax"],
"battleConsoleUp", "recruitmentMax"],
"dpdown": ["moveDown", "adventureKingdomOverview", "battleConsoleDown","recruitmentMin"], "dpdown": ["moveDown", "adventureKingdomOverview", "battleConsoleDown","recruitmentMin"],
"dpleft": ["moveLeft", "adventureViewScenario"], "dpleft": ["moveLeft", "adventureViewScenario"],
"dpright": ["moveRight", "adventureThievesGuild"], "dpright": ["moveRight", "adventureThievesGuild"],