diff --git a/src/sdl_window.cpp b/src/sdl_window.cpp index 03b6431e5..a07dab018 100644 --- a/src/sdl_window.cpp +++ b/src/sdl_window.cpp @@ -137,75 +137,45 @@ std::map string_to_axis_map = { {"axis_right_y_minus", {Input::Axis::RightY, -127}}, }; std::map string_to_keyboard_key_map = { - {"a", SDLK_A}, - {"b", SDLK_B}, - {"c", SDLK_C}, - {"d", SDLK_D}, - {"e", SDLK_E}, - {"f", SDLK_F}, - {"g", SDLK_G}, - {"h", SDLK_H}, - {"i", SDLK_I}, - {"j", SDLK_J}, - {"k", SDLK_K}, - {"l", SDLK_L}, - {"m", SDLK_M}, - {"n", SDLK_N}, - {"o", SDLK_O}, - {"p", SDLK_P}, - {"q", SDLK_Q}, - {"r", SDLK_R}, - {"s", SDLK_S}, - {"t", SDLK_T}, - {"u", SDLK_U}, - {"v", SDLK_V}, - {"w", SDLK_W}, - {"x", SDLK_X}, - {"y", SDLK_Y}, - {"z", SDLK_Z}, - {"0", SDLK_0}, - {"1", SDLK_1}, - {"2", SDLK_2}, - {"3", SDLK_3}, - {"4", SDLK_4}, - {"5", SDLK_5}, - {"6", SDLK_6}, - {"7", SDLK_7}, - {"8", SDLK_8}, - {"9", SDLK_9}, - {"comma", SDLK_COMMA}, - {"period", SDLK_PERIOD}, - {"question", SDLK_QUESTION}, - {"semicolon", SDLK_SEMICOLON}, - {"minus", SDLK_MINUS}, - {"underscore", SDLK_UNDERSCORE}, - {"lparenthesis", SDLK_LEFTPAREN}, - {"rparenthesis", SDLK_RIGHTPAREN}, - {"lbracket", SDLK_LEFTBRACKET}, - {"rbracket", SDLK_RIGHTBRACKET}, - {"lbrace", SDLK_LEFTBRACE}, - {"rbrace", SDLK_RIGHTBRACE}, - {"backslash", SDLK_BACKSLASH}, - {"dash", SDLK_SLASH}, + {"a", SDLK_A}, {"b", SDLK_B}, {"c", SDLK_C}, {"d", SDLK_D}, + {"e", SDLK_E}, {"f", SDLK_F}, {"g", SDLK_G}, {"h", SDLK_H}, + {"i", SDLK_I}, {"j", SDLK_J}, {"k", SDLK_K}, {"l", SDLK_L}, + {"m", SDLK_M}, {"n", SDLK_N}, {"o", SDLK_O}, {"p", SDLK_P}, + {"q", SDLK_Q}, {"r", SDLK_R}, {"s", SDLK_S}, {"t", SDLK_T}, + {"u", SDLK_U}, {"v", SDLK_V}, {"w", SDLK_W}, {"x", SDLK_X}, + {"y", SDLK_Y}, {"z", SDLK_Z}, + {"0", SDLK_0}, {"1", SDLK_1}, {"2", SDLK_2}, {"3", SDLK_3}, + {"4", SDLK_4}, {"5", SDLK_5}, {"6", SDLK_6}, {"7", SDLK_7}, + {"8", SDLK_8}, {"9", SDLK_9}, + {"kp0", SDLK_KP_0}, {"kp1", SDLK_KP_1}, {"kp2", SDLK_KP_2}, {"kp3", SDLK_KP_3}, + {"kp4", SDLK_KP_4}, {"kp5", SDLK_KP_5}, {"kp6", SDLK_KP_6}, {"kp7", SDLK_KP_7}, + {"kp8", SDLK_KP_8}, {"kp9", SDLK_KP_9}, + {",", SDLK_COMMA}, + {".", SDLK_PERIOD}, + {"?", SDLK_QUESTION}, + {";", SDLK_SEMICOLON}, + {"-", SDLK_MINUS}, + {"_", SDLK_UNDERSCORE}, + {"(", SDLK_LEFTPAREN}, + {")", SDLK_RIGHTPAREN}, + {"[", SDLK_LEFTBRACKET}, + {"]", SDLK_RIGHTBRACKET}, + {"{", SDLK_LEFTBRACE}, + {"}", SDLK_RIGHTBRACE}, + {"\\", SDLK_BACKSLASH}, + {"/", SDLK_SLASH}, {"enter", SDLK_RETURN}, {"space", SDLK_SPACE}, {"tab", SDLK_TAB}, {"backspace", SDLK_BACKSPACE}, {"escape", SDLK_ESCAPE}, - {"left", SDLK_LEFT}, - {"right", SDLK_RIGHT}, - {"up", SDLK_UP}, - {"down", SDLK_DOWN}, - {"lctrl", SDLK_LCTRL}, - {"rctrl", SDLK_RCTRL}, - {"lshift", SDLK_LSHIFT}, - {"rshift", SDLK_RSHIFT}, - {"lalt", SDLK_LALT}, - {"ralt", SDLK_RALT}, - {"lmeta", SDLK_LGUI}, - {"rmeta", SDLK_RGUI}, - {"lwin", SDLK_LGUI}, - {"rwin", SDLK_RGUI}, + {"left", SDLK_LEFT}, {"right", SDLK_RIGHT}, + {"up", SDLK_UP}, {"down", SDLK_DOWN}, + {"lctrl", SDLK_LCTRL}, {"rctrl", SDLK_RCTRL}, + {"lshift", SDLK_LSHIFT}, {"rshift", SDLK_RSHIFT}, + {"lalt", SDLK_LALT}, {"ralt", SDLK_RALT}, + {"lmeta", SDLK_LGUI}, {"rmeta", SDLK_RGUI}, + {"lwin", SDLK_LGUI}, {"rwin", SDLK_RGUI}, {"leftbutton", SDL_BUTTON_LEFT}, {"rightbutton", SDL_BUTTON_RIGHT}, {"middlebutton", SDL_BUTTON_MIDDLE}, @@ -213,24 +183,10 @@ std::map string_to_keyboard_key_map = { {"mousewheeldown", SDL_EVENT_MOUSE_WHEEL_DOWN}, {"mousewheelleft", SDL_EVENT_MOUSE_WHEEL_LEFT}, {"mousewheelright", SDL_EVENT_MOUSE_WHEEL_RIGHT}, - {"kp0", SDLK_KP_0}, - {"kp1", SDLK_KP_1}, - {"kp2", SDLK_KP_2}, - {"kp3", SDLK_KP_3}, - {"kp4", SDLK_KP_4}, - {"kp5", SDLK_KP_5}, - {"kp6", SDLK_KP_6}, - {"kp7", SDLK_KP_7}, - {"kp8", SDLK_KP_8}, - {"kp9", SDLK_KP_9}, - {"kpperiod", SDLK_KP_PERIOD}, - {"kpdivide", SDLK_KP_DIVIDE}, - {"kpmultiply", SDLK_KP_MULTIPLY}, - {"kpminus", SDLK_KP_MINUS}, - {"kpplus", SDLK_KP_PLUS}, - {"kpenter", SDLK_KP_ENTER}, - {"kpequals", SDLK_KP_EQUALS}, - {"kpcomma", SDLK_KP_COMMA}, + {"kpperiod", SDLK_KP_PERIOD}, {"kpcomma", SDLK_KP_COMMA}, + {"kpdivide", SDLK_KP_DIVIDE}, {"kpmultiply", SDLK_KP_MULTIPLY}, + {"kpminus", SDLK_KP_MINUS}, {"kpplus", SDLK_KP_PLUS}, + {"kpenter", SDLK_KP_ENTER}, {"kpequals", SDLK_KP_EQUALS}, }; std::map string_to_keyboard_mod_key_map = { {"lshift", SDL_KMOD_LSHIFT}, {"rshift", SDL_KMOD_RSHIFT}, {"lctrl", SDL_KMOD_LCTRL}, @@ -245,13 +201,14 @@ std::map string_to_keyboard_mod_key_map = { std::map button_map = {}; std::map axis_map = {}; -// Flags for varying purposes +// Flags and values for varying purposes int mouse_joystick_binding = 0; +float mouse_deadzone_offset = 0.5, mouse_speed = 1, mouse_speed_offset = 0.125; Uint32 mouse_polling_id = 0; bool mouse_enabled = false, leftjoystick_halfmode = false, rightjoystick_halfmode = false; // i wrapped it in a function so I can collapse it -std::string getDefaultConfig() { +std::string getDefaultKeyboardConfig() { std::string default_config = R"(## SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project ## SPDX-License-Identifier: GPL-2.0-or-later @@ -318,7 +275,6 @@ axis_left_y_plus = s; } void WindowSDL::parseInputConfig(const std::string& filename) { - // Read configuration file. const auto config_file = Common::FS::GetUserPath(Common::FS::PathType::UserDir) / filename; if (!std::filesystem::exists(config_file)) { @@ -326,7 +282,7 @@ void WindowSDL::parseInputConfig(const std::string& filename) { std::ofstream file; file.open(config_file, std::ios::out); if (file.is_open()) { - file << getDefaultConfig(); + file << getDefaultKeyboardConfig(); file.close(); std::cout << "Config file generated.\n"; } else { @@ -338,7 +294,10 @@ void WindowSDL::parseInputConfig(const std::string& filename) { std::cerr << "Error opening file: " << filename << std::endl; return; } - + // we reset this here so in case the user fucks up we can fall back to default + mouse_deadzone_offset = 0.5; + mouse_speed = 1; + mouse_speed_offset = 0.125; button_map.clear(); axis_map.clear(); int lineCount = 0; @@ -391,6 +350,26 @@ void WindowSDL::parseInputConfig(const std::string& filename) { mod_it != string_to_keyboard_mod_key_map.end()) { binding.key = key_it->second; binding.modifier = mod_it->second; + } else if (controller_input == "mouse_movement_params") { + // handle mouse movement params + float p1 = 0.5, p2 = 1, p3 = 0.125; + std::size_t second_comma_pos = kbm_input.find(','); + try{ + p1 = std::stof(key); + p2 = std::stof(mod.substr(0, second_comma_pos)); + p3 = std::stof(mod.substr(second_comma_pos + 1)); + mouse_deadzone_offset = p1; + mouse_speed = p2; + mouse_speed_offset = p3; + } catch (...) { + // fallback to default values + mouse_deadzone_offset = 0.5; + mouse_speed = 1; + mouse_speed_offset = 0.125; + std::cerr << "Parsing error while parsing kbm inputs at line " << lineCount + << " line data: " << line << "\n"; + } + continue; } else { std::cerr << "Syntax error while parsing kbm inputs at line " << lineCount << " line data: " << line << "\n"; @@ -470,8 +449,11 @@ void WindowSDL::updateMouse() { float d_x = 0, d_y = 0; SDL_GetRelativeMouseState(&d_x, &d_y); + float output_speed = SDL_clamp((sqrt(d_x*d_x + d_y*d_y) + mouse_speed_offset * 128) * mouse_speed, mouse_deadzone_offset * 128, 128.0); + //std::cout << "speed: " << mouse_speed << "\n"; + float angle = atan2(d_y, d_x); - float a_x = cos(angle) * 128.0, a_y = sin(angle) * 128.0; + float a_x = cos(angle) * output_speed, a_y = sin(angle) * output_speed; if (d_x != 0 && d_y != 0) { controller->Axis(0, axis_x, Input::GetAxis(-0x80, 0x80, a_x)); @@ -534,6 +516,10 @@ WindowSDL::WindowSDL(s32 width_, s32 height_, Input::GameController* controller_ #endif // initialize kbm controls parseInputConfig("keyboardInputConfig.ini"); + // Start polling the mouse + if (mouse_polling_id == 0) { + mouse_polling_id = SDL_AddTimer(33, mousePolling, (void*)this); + } } WindowSDL::~WindowSDL() = default; @@ -541,14 +527,12 @@ WindowSDL::~WindowSDL() = default; void WindowSDL::waitEvent() { // Called on main thread SDL_Event event{}; - if (mouse_polling_id == 0) { - mouse_polling_id = SDL_AddTimer(33, mousePolling, (void*)this); - } + + if (!SDL_WaitEvent(&event)) { return; } - if (ImGui::Core::ProcessEvent(&event)) { return; }