Added configuration file system.
Uses QSettings on citra-qt, and inih on citra-cli.
This commit is contained in:
		
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | [submodule "externals/inih/inih"] | ||||||
|  | 	path = externals/inih/inih | ||||||
|  | 	url = https://github.com/svn2github/inih | ||||||
| @@ -127,6 +127,10 @@ get_git_head_revision(GIT_REF_SPEC GIT_REV) | |||||||
| git_describe(GIT_DESC --always --long --dirty) | git_describe(GIT_DESC --always --long --dirty) | ||||||
| git_branch_name(GIT_BRANCH) | git_branch_name(GIT_BRANCH) | ||||||
|  |  | ||||||
|  | set(INI_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/externals/inih") | ||||||
|  | include_directories(${INI_PREFIX}) | ||||||
|  | add_subdirectory(${INI_PREFIX}) | ||||||
|  |  | ||||||
| # process subdirectories | # process subdirectories | ||||||
| if(ENABLE_QT) | if(ENABLE_QT) | ||||||
|     include_directories(externals/qhexedit) |     include_directories(externals/qhexedit) | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								externals/inih/CMakeLists.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								externals/inih/CMakeLists.txt
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | set(SRCS | ||||||
|  |             inih/ini.c | ||||||
|  |             inih/cpp/INIReader.cpp | ||||||
|  |             ) | ||||||
|  | set(HEADERS | ||||||
|  |             inih/ini.h | ||||||
|  |             inih/cpp/INIReader.h | ||||||
|  |             ) | ||||||
|  |  | ||||||
|  | create_directory_groups(${SRCS} ${HEADERS}) | ||||||
|  | add_library(inih ${SRCS} ${HEADERS}) | ||||||
							
								
								
									
										1
									
								
								externals/inih/inih
									
									
									
									
										vendored
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								externals/inih/inih
									
									
									
									
										vendored
									
									
										Submodule
									
								
							 Submodule externals/inih/inih added at 603729dec8
									
								
							| @@ -1,9 +1,12 @@ | |||||||
| set(SRCS | set(SRCS | ||||||
|             emu_window/emu_window_glfw.cpp |             emu_window/emu_window_glfw.cpp | ||||||
|             citra.cpp |             citra.cpp | ||||||
|  |             config.cpp | ||||||
|             ) |             ) | ||||||
| set(HEADERS | set(HEADERS | ||||||
|             emu_window/emu_window_glfw.h |             emu_window/emu_window_glfw.h | ||||||
|  |             config.h | ||||||
|  |             default_ini.h | ||||||
|             resource.h |             resource.h | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
| @@ -16,7 +19,7 @@ endif() | |||||||
|  |  | ||||||
| add_executable(citra ${SRCS} ${HEADERS}) | add_executable(citra ${SRCS} ${HEADERS}) | ||||||
| target_link_libraries(citra core common video_core) | target_link_libraries(citra core common video_core) | ||||||
| target_link_libraries(citra ${OPENGL_gl_LIBRARY} ${GLFW_LIBRARIES}) | target_link_libraries(citra ${OPENGL_gl_LIBRARY} ${GLFW_LIBRARIES} inih) | ||||||
|  |  | ||||||
| if (APPLE) | if (APPLE) | ||||||
|     target_link_libraries(citra iconv pthread ${COREFOUNDATION_LIBRARY}) |     target_link_libraries(citra iconv pthread ${COREFOUNDATION_LIBRARY}) | ||||||
|   | |||||||
| @@ -4,12 +4,12 @@ | |||||||
|  |  | ||||||
| #include "common/common.h" | #include "common/common.h" | ||||||
| #include "common/log_manager.h" | #include "common/log_manager.h" | ||||||
| #include "common/file_util.h" |  | ||||||
|  |  | ||||||
| #include "core/system.h" | #include "core/system.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/loader/loader.h" | #include "core/loader/loader.h" | ||||||
|  |  | ||||||
|  | #include "citra/config.h" | ||||||
| #include "citra/emu_window/emu_window_glfw.h" | #include "citra/emu_window/emu_window_glfw.h" | ||||||
|  |  | ||||||
| /// Application entry point | /// Application entry point | ||||||
| @@ -21,13 +21,16 @@ int __cdecl main(int argc, char **argv) { | |||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     Config config; | ||||||
|  |  | ||||||
|     std::string boot_filename = argv[1]; |     std::string boot_filename = argv[1]; | ||||||
|     EmuWindow_GLFW* emu_window = new EmuWindow_GLFW; |     EmuWindow_GLFW* emu_window = new EmuWindow_GLFW; | ||||||
|  |  | ||||||
|     System::Init(emu_window); |     System::Init(emu_window); | ||||||
|  |  | ||||||
|     if (Loader::ResultStatus::Success != Loader::LoadFile(boot_filename)) { |     Loader::ResultStatus load_result = Loader::LoadFile(boot_filename); | ||||||
|         ERROR_LOG(BOOT, "Failed to load ROM!"); |     if (Loader::ResultStatus::Success != load_result) { | ||||||
|  |         ERROR_LOG(BOOT, "Failed to load ROM (Error %i)!", load_result); | ||||||
|         return -1; |         return -1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										65
									
								
								src/citra/config.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/citra/config.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include <GLFW/glfw3.h> | ||||||
|  |  | ||||||
|  | #include "citra/default_ini.h" | ||||||
|  | #include "common/file_util.h" | ||||||
|  | #include "core/settings.h" | ||||||
|  |  | ||||||
|  | #include "config.h" | ||||||
|  |  | ||||||
|  | Config::Config() { | ||||||
|  |     // TODO: Don't hardcode the path; let the frontend decide where to put the config files. | ||||||
|  |     glfw_config_loc = FileUtil::GetUserPath(D_CONFIG_IDX) + "glfw-config.ini"; | ||||||
|  |     glfw_config = new INIReader(glfw_config_loc); | ||||||
|  |  | ||||||
|  |     Reload(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | bool Config::LoadINI(INIReader* config, const char* location, const std::string& default_contents, bool retry) { | ||||||
|  |     if (config->ParseError() < 0) { | ||||||
|  |         if (retry) { | ||||||
|  |             ERROR_LOG(CONFIG, "Failed to load %s. Creating file from defaults...", location); | ||||||
|  |             FileUtil::CreateFullPath(location); | ||||||
|  |             FileUtil::WriteStringToFile(true, default_contents, location); | ||||||
|  |             *config = INIReader(location); // Reopen file | ||||||
|  |  | ||||||
|  |             return LoadINI(config, location, default_contents, false); | ||||||
|  |         } | ||||||
|  |         ERROR_LOG(CONFIG, "Failed."); | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  |     INFO_LOG(CONFIG, "Successfully loaded %s", location); | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Config::ReadControls() { | ||||||
|  |     Settings::values.pad_a_key = glfw_config->GetInteger("Controls", "pad_a", GLFW_KEY_A); | ||||||
|  |     Settings::values.pad_b_key = glfw_config->GetInteger("Controls", "pad_b", GLFW_KEY_S); | ||||||
|  |     Settings::values.pad_x_key = glfw_config->GetInteger("Controls", "pad_x", GLFW_KEY_Z); | ||||||
|  |     Settings::values.pad_y_key = glfw_config->GetInteger("Controls", "pad_y", GLFW_KEY_X); | ||||||
|  |     Settings::values.pad_l_key = glfw_config->GetInteger("Controls", "pad_l", GLFW_KEY_Q); | ||||||
|  |     Settings::values.pad_r_key = glfw_config->GetInteger("Controls", "pad_r", GLFW_KEY_W); | ||||||
|  |     Settings::values.pad_start_key  = glfw_config->GetInteger("Controls", "pad_start",  GLFW_KEY_M); | ||||||
|  |     Settings::values.pad_select_key = glfw_config->GetInteger("Controls", "pad_select", GLFW_KEY_N); | ||||||
|  |     Settings::values.pad_home_key   = glfw_config->GetInteger("Controls", "pad_home",   GLFW_KEY_B); | ||||||
|  |     Settings::values.pad_dup_key    = glfw_config->GetInteger("Controls", "pad_dup",    GLFW_KEY_T); | ||||||
|  |     Settings::values.pad_ddown_key  = glfw_config->GetInteger("Controls", "pad_ddown",  GLFW_KEY_G); | ||||||
|  |     Settings::values.pad_dleft_key  = glfw_config->GetInteger("Controls", "pad_dleft",  GLFW_KEY_F); | ||||||
|  |     Settings::values.pad_dright_key = glfw_config->GetInteger("Controls", "pad_dright", GLFW_KEY_H); | ||||||
|  |     Settings::values.pad_sup_key    = glfw_config->GetInteger("Controls", "pad_sup",    GLFW_KEY_UP); | ||||||
|  |     Settings::values.pad_sdown_key  = glfw_config->GetInteger("Controls", "pad_sdown",  GLFW_KEY_DOWN); | ||||||
|  |     Settings::values.pad_sleft_key  = glfw_config->GetInteger("Controls", "pad_sleft",  GLFW_KEY_LEFT); | ||||||
|  |     Settings::values.pad_sright_key = glfw_config->GetInteger("Controls", "pad_sright", GLFW_KEY_RIGHT); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Config::Reload() { | ||||||
|  |     LoadINI(glfw_config, glfw_config_loc.c_str(), DefaultINI::glfw_config_file); | ||||||
|  |     ReadControls(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Config::~Config() { | ||||||
|  |     delete glfw_config; | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								src/citra/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/citra/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <map> | ||||||
|  |  | ||||||
|  | #include <inih/cpp/INIReader.h> | ||||||
|  |  | ||||||
|  | #include "common/common_types.h" | ||||||
|  |  | ||||||
|  | class Config { | ||||||
|  |     INIReader* glfw_config; | ||||||
|  |     std::string glfw_config_loc; | ||||||
|  |  | ||||||
|  |     bool LoadINI(INIReader* config, const char* location, const std::string& default_contents="", bool retry=true); | ||||||
|  |     void ReadControls(); | ||||||
|  | public: | ||||||
|  |     Config(); | ||||||
|  |     ~Config(); | ||||||
|  |  | ||||||
|  |     void Reload(); | ||||||
|  | }; | ||||||
							
								
								
									
										30
									
								
								src/citra/default_ini.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/citra/default_ini.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | namespace DefaultINI { | ||||||
|  |  | ||||||
|  | const char* glfw_config_file = R"( | ||||||
|  | [Controls] | ||||||
|  | pad_start = | ||||||
|  | pad_select = | ||||||
|  | pad_home = | ||||||
|  | pad_dup = | ||||||
|  | pad_ddown = | ||||||
|  | pad_dleft = | ||||||
|  | pad_dright = | ||||||
|  | pad_a = | ||||||
|  | pad_b = | ||||||
|  | pad_x = | ||||||
|  | pad_y = | ||||||
|  | pad_r = | ||||||
|  | pad_l = | ||||||
|  | pad_sup = | ||||||
|  | pad_sdown = | ||||||
|  | pad_sleft = | ||||||
|  | pad_sright = | ||||||
|  | )"; | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -6,26 +6,9 @@ | |||||||
|  |  | ||||||
| #include "video_core/video_core.h" | #include "video_core/video_core.h" | ||||||
|  |  | ||||||
| #include "citra/emu_window/emu_window_glfw.h" | #include "core/settings.h" | ||||||
|  |  | ||||||
| static const std::pair<int, HID_User::PadState> default_key_map[] = { | #include "citra/emu_window/emu_window_glfw.h" | ||||||
|     { GLFW_KEY_A, HID_User::PAD_A }, |  | ||||||
|     { GLFW_KEY_B, HID_User::PAD_B }, |  | ||||||
|     { GLFW_KEY_BACKSLASH, HID_User::PAD_SELECT }, |  | ||||||
|     { GLFW_KEY_ENTER, HID_User::PAD_START }, |  | ||||||
|     { GLFW_KEY_RIGHT, HID_User::PAD_RIGHT }, |  | ||||||
|     { GLFW_KEY_LEFT, HID_User::PAD_LEFT }, |  | ||||||
|     { GLFW_KEY_UP, HID_User::PAD_UP }, |  | ||||||
|     { GLFW_KEY_DOWN, HID_User::PAD_DOWN }, |  | ||||||
|     { GLFW_KEY_R, HID_User::PAD_R }, |  | ||||||
|     { GLFW_KEY_L, HID_User::PAD_L }, |  | ||||||
|     { GLFW_KEY_X, HID_User::PAD_X }, |  | ||||||
|     { GLFW_KEY_Y, HID_User::PAD_Y }, |  | ||||||
|     { GLFW_KEY_H, HID_User::PAD_CIRCLE_RIGHT }, |  | ||||||
|     { GLFW_KEY_F, HID_User::PAD_CIRCLE_LEFT }, |  | ||||||
|     { GLFW_KEY_T, HID_User::PAD_CIRCLE_UP }, |  | ||||||
|     { GLFW_KEY_G, HID_User::PAD_CIRCLE_DOWN }, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// Called by GLFW when a key event occurs | /// Called by GLFW when a key event occurs | ||||||
| void EmuWindow_GLFW::OnKeyEvent(GLFWwindow* win, int key, int scancode, int action, int mods) { | void EmuWindow_GLFW::OnKeyEvent(GLFWwindow* win, int key, int scancode, int action, int mods) { | ||||||
| @@ -48,14 +31,9 @@ void EmuWindow_GLFW::OnKeyEvent(GLFWwindow* win, int key, int scancode, int acti | |||||||
|  |  | ||||||
| /// EmuWindow_GLFW constructor | /// EmuWindow_GLFW constructor | ||||||
| EmuWindow_GLFW::EmuWindow_GLFW() { | EmuWindow_GLFW::EmuWindow_GLFW() { | ||||||
|  |  | ||||||
|     // Register a new ID for the default keyboard |  | ||||||
|     keyboard_id = KeyMap::NewDeviceId(); |     keyboard_id = KeyMap::NewDeviceId(); | ||||||
|  |  | ||||||
|     // Set default key mappings for keyboard |     ReloadSetKeymaps(); | ||||||
|     for (auto mapping : default_key_map) { |  | ||||||
|         KeyMap::SetKeyMapping({mapping.first, keyboard_id}, mapping.second); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // Initialize the window |     // Initialize the window | ||||||
|     if(glfwInit() != GL_TRUE) { |     if(glfwInit() != GL_TRUE) { | ||||||
| @@ -111,3 +89,22 @@ void EmuWindow_GLFW::MakeCurrent() { | |||||||
| void EmuWindow_GLFW::DoneCurrent() { | void EmuWindow_GLFW::DoneCurrent() { | ||||||
|     glfwMakeContextCurrent(NULL); |     glfwMakeContextCurrent(NULL); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void EmuWindow_GLFW::ReloadSetKeymaps() { | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_a_key,      keyboard_id}, HID_User::PAD_A); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_b_key,      keyboard_id}, HID_User::PAD_B); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_select_key, keyboard_id}, HID_User::PAD_SELECT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_start_key,  keyboard_id}, HID_User::PAD_START); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_dright_key, keyboard_id}, HID_User::PAD_RIGHT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_dleft_key,  keyboard_id}, HID_User::PAD_LEFT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_dup_key,    keyboard_id}, HID_User::PAD_UP); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_ddown_key,  keyboard_id}, HID_User::PAD_DOWN); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_r_key,      keyboard_id}, HID_User::PAD_R); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_l_key,      keyboard_id}, HID_User::PAD_L); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_x_key,      keyboard_id}, HID_User::PAD_X); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_y_key,      keyboard_id}, HID_User::PAD_Y); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sright_key, keyboard_id}, HID_User::PAD_CIRCLE_RIGHT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sleft_key,  keyboard_id}, HID_User::PAD_CIRCLE_LEFT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sup_key,    keyboard_id}, HID_User::PAD_CIRCLE_UP); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sdown_key,  keyboard_id}, HID_User::PAD_CIRCLE_DOWN); | ||||||
|  | } | ||||||
|   | |||||||
| @@ -27,7 +27,11 @@ public: | |||||||
|  |  | ||||||
|     static void OnKeyEvent(GLFWwindow* win, int key, int scancode, int action, int mods); |     static void OnKeyEvent(GLFWwindow* win, int key, int scancode, int action, int mods); | ||||||
|  |  | ||||||
|  |     void ReloadSetKeymaps() override; | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     GLFWwindow* m_render_window; ///< Internal GLFW render window |     GLFWwindow* m_render_window; ///< Internal GLFW render window | ||||||
|     int keyboard_id;             ///< Device id of keyboard for use with KeyMap |  | ||||||
|  |     /// Device id of keyboard for use with KeyMap | ||||||
|  |     int keyboard_id; | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) | |||||||
| set(SRCS | set(SRCS | ||||||
|             config/controller_config.cpp |             config/controller_config.cpp | ||||||
|             config/controller_config_util.cpp |             config/controller_config_util.cpp | ||||||
|  |             config.cpp | ||||||
|             debugger/callstack.cpp |             debugger/callstack.cpp | ||||||
|             debugger/disassembler.cpp |             debugger/disassembler.cpp | ||||||
|             debugger/graphics.cpp |             debugger/graphics.cpp | ||||||
| @@ -18,6 +19,7 @@ set(SRCS | |||||||
| set(HEADERS | set(HEADERS | ||||||
|             config/controller_config.hxx |             config/controller_config.hxx | ||||||
|             config/controller_config_util.hxx |             config/controller_config_util.hxx | ||||||
|  |             config.h | ||||||
|             debugger/callstack.hxx |             debugger/callstack.hxx | ||||||
|             debugger/disassembler.hxx |             debugger/disassembler.hxx | ||||||
|             debugger/graphics.hxx |             debugger/graphics.hxx | ||||||
|   | |||||||
| @@ -6,12 +6,11 @@ | |||||||
| #include "bootmanager.hxx" | #include "bootmanager.hxx" | ||||||
|  |  | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/loader/loader.h" | #include "core/settings.h" | ||||||
| #include "core/hw/hw.h" |  | ||||||
|  |  | ||||||
| #include "video_core/video_core.h" | #include "video_core/video_core.h" | ||||||
|  |  | ||||||
| #include "version.h" | #include "citra_qt/version.h" | ||||||
|  |  | ||||||
| #define APP_NAME        "citra" | #define APP_NAME        "citra" | ||||||
| #define APP_VERSION     "0.1-" VERSION | #define APP_VERSION     "0.1-" VERSION | ||||||
| @@ -102,40 +101,15 @@ private: | |||||||
|     GRenderWindow* parent_; |     GRenderWindow* parent_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
| EmuThread& GRenderWindow::GetEmuThread() | EmuThread& GRenderWindow::GetEmuThread() | ||||||
| { | { | ||||||
|     return emu_thread; |     return emu_thread; | ||||||
| } | } | ||||||
|  |  | ||||||
| static const std::pair<int, HID_User::PadState> default_key_map[] = { | GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this), keyboard_id(0) | ||||||
|     { Qt::Key_A, HID_User::PAD_A }, |  | ||||||
|     { Qt::Key_B, HID_User::PAD_B }, |  | ||||||
|     { Qt::Key_Backslash, HID_User::PAD_SELECT }, |  | ||||||
|     { Qt::Key_Enter, HID_User::PAD_START }, |  | ||||||
|     { Qt::Key_Right, HID_User::PAD_RIGHT }, |  | ||||||
|     { Qt::Key_Left, HID_User::PAD_LEFT }, |  | ||||||
|     { Qt::Key_Up, HID_User::PAD_UP }, |  | ||||||
|     { Qt::Key_Down, HID_User::PAD_DOWN }, |  | ||||||
|     { Qt::Key_R, HID_User::PAD_R }, |  | ||||||
|     { Qt::Key_L, HID_User::PAD_L }, |  | ||||||
|     { Qt::Key_X, HID_User::PAD_X }, |  | ||||||
|     { Qt::Key_Y, HID_User::PAD_Y }, |  | ||||||
|     { Qt::Key_H, HID_User::PAD_CIRCLE_RIGHT }, |  | ||||||
|     { Qt::Key_F, HID_User::PAD_CIRCLE_LEFT }, |  | ||||||
|     { Qt::Key_T, HID_User::PAD_CIRCLE_UP }, |  | ||||||
|     { Qt::Key_G, HID_User::PAD_CIRCLE_DOWN }, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| GRenderWindow::GRenderWindow(QWidget* parent) : QWidget(parent), emu_thread(this) |  | ||||||
| { | { | ||||||
|     // Register a new ID for the default keyboard |  | ||||||
|     keyboard_id = KeyMap::NewDeviceId(); |     keyboard_id = KeyMap::NewDeviceId(); | ||||||
|  |     ReloadSetKeymaps(); | ||||||
|     // Set default key mappings for keyboard |  | ||||||
|     for (auto mapping : default_key_map) { |  | ||||||
|         KeyMap::SetKeyMapping({mapping.first, keyboard_id}, mapping.second); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, WA_DontShowOnScreen, WA_DeleteOnClose |     // TODO: One of these flags might be interesting: WA_OpaquePaintEvent, WA_NoBackground, WA_DontShowOnScreen, WA_DeleteOnClose | ||||||
|     QGLFormat fmt; |     QGLFormat fmt; | ||||||
| @@ -245,3 +219,23 @@ void GRenderWindow::keyReleaseEvent(QKeyEvent* event) | |||||||
|     HID_User::PadUpdateComplete(); |     HID_User::PadUpdateComplete(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void GRenderWindow::ReloadSetKeymaps() | ||||||
|  | { | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_a_key,      keyboard_id}, HID_User::PAD_A); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_b_key,      keyboard_id}, HID_User::PAD_B); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_select_key, keyboard_id}, HID_User::PAD_SELECT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_start_key,  keyboard_id}, HID_User::PAD_START); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_dright_key, keyboard_id}, HID_User::PAD_RIGHT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_dleft_key,  keyboard_id}, HID_User::PAD_LEFT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_dup_key,    keyboard_id}, HID_User::PAD_UP); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_ddown_key,  keyboard_id}, HID_User::PAD_DOWN); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_r_key,      keyboard_id}, HID_User::PAD_R); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_l_key,      keyboard_id}, HID_User::PAD_L); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_x_key,      keyboard_id}, HID_User::PAD_X); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_y_key,      keyboard_id}, HID_User::PAD_Y); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sright_key, keyboard_id}, HID_User::PAD_CIRCLE_RIGHT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sleft_key,  keyboard_id}, HID_User::PAD_CIRCLE_LEFT); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sup_key,    keyboard_id}, HID_User::PAD_CIRCLE_UP); | ||||||
|  |     KeyMap::SetKeyMapping({Settings::values.pad_sdown_key,  keyboard_id}, HID_User::PAD_CIRCLE_DOWN); | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -107,6 +107,8 @@ public: | |||||||
|     void keyPressEvent(QKeyEvent* event); |     void keyPressEvent(QKeyEvent* event); | ||||||
|     void keyReleaseEvent(QKeyEvent* event); |     void keyReleaseEvent(QKeyEvent* event); | ||||||
|  |  | ||||||
|  |     void ReloadSetKeymaps() override; | ||||||
|  |  | ||||||
| public slots: | public slots: | ||||||
|     void moveContext(); |     void moveContext(); | ||||||
|  |  | ||||||
| @@ -117,5 +119,6 @@ private: | |||||||
|  |  | ||||||
|     QByteArray geometry; |     QByteArray geometry; | ||||||
|  |  | ||||||
|  |     /// Device id of keyboard for use with KeyMap | ||||||
|     int keyboard_id; |     int keyboard_id; | ||||||
| }; | }; | ||||||
|   | |||||||
							
								
								
									
										79
									
								
								src/citra_qt/config.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/citra_qt/config.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include <QString> | ||||||
|  | #include <QStringList> | ||||||
|  |  | ||||||
|  | #include "core/settings.h" | ||||||
|  | #include "common/file_util.h" | ||||||
|  |  | ||||||
|  | #include "config.h" | ||||||
|  |  | ||||||
|  | Config::Config() { | ||||||
|  |  | ||||||
|  |     // TODO: Don't hardcode the path; let the frontend decide where to put the config files. | ||||||
|  |     qt_config_loc = FileUtil::GetUserPath(D_CONFIG_IDX) + "qt-config.ini"; | ||||||
|  |     FileUtil::CreateFullPath(qt_config_loc); | ||||||
|  |     qt_config = new QSettings(QString::fromStdString(qt_config_loc), QSettings::IniFormat); | ||||||
|  |  | ||||||
|  |     Reload(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Config::ReadControls() { | ||||||
|  |     qt_config->beginGroup("Controls"); | ||||||
|  |     Settings::values.pad_a_key = qt_config->value("pad_a", Qt::Key_A).toInt(); | ||||||
|  |     Settings::values.pad_b_key = qt_config->value("pad_b", Qt::Key_S).toInt(); | ||||||
|  |     Settings::values.pad_x_key = qt_config->value("pad_x", Qt::Key_Z).toInt(); | ||||||
|  |     Settings::values.pad_y_key = qt_config->value("pad_y", Qt::Key_X).toInt(); | ||||||
|  |     Settings::values.pad_l_key = qt_config->value("pad_l", Qt::Key_Q).toInt(); | ||||||
|  |     Settings::values.pad_r_key = qt_config->value("pad_r", Qt::Key_W).toInt(); | ||||||
|  |     Settings::values.pad_start_key  = qt_config->value("pad_start",  Qt::Key_M).toInt(); | ||||||
|  |     Settings::values.pad_select_key = qt_config->value("pad_select", Qt::Key_N).toInt(); | ||||||
|  |     Settings::values.pad_home_key   = qt_config->value("pad_home",   Qt::Key_B).toInt(); | ||||||
|  |     Settings::values.pad_dup_key    = qt_config->value("pad_dup",    Qt::Key_T).toInt(); | ||||||
|  |     Settings::values.pad_ddown_key  = qt_config->value("pad_ddown",  Qt::Key_G).toInt(); | ||||||
|  |     Settings::values.pad_dleft_key  = qt_config->value("pad_dleft",  Qt::Key_F).toInt(); | ||||||
|  |     Settings::values.pad_dright_key = qt_config->value("pad_dright", Qt::Key_H).toInt(); | ||||||
|  |     Settings::values.pad_sup_key    = qt_config->value("pad_sup",    Qt::Key_Up).toInt(); | ||||||
|  |     Settings::values.pad_sdown_key  = qt_config->value("pad_sdown",  Qt::Key_Down).toInt(); | ||||||
|  |     Settings::values.pad_sleft_key  = qt_config->value("pad_sleft",  Qt::Key_Left).toInt(); | ||||||
|  |     Settings::values.pad_sright_key = qt_config->value("pad_sright", Qt::Key_Right).toInt(); | ||||||
|  |     qt_config->endGroup(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Config::SaveControls() { | ||||||
|  |     qt_config->beginGroup("Controls"); | ||||||
|  |     qt_config->setValue("pad_a", Settings::values.pad_a_key); | ||||||
|  |     qt_config->setValue("pad_b", Settings::values.pad_b_key); | ||||||
|  |     qt_config->setValue("pad_x", Settings::values.pad_x_key); | ||||||
|  |     qt_config->setValue("pad_y", Settings::values.pad_y_key); | ||||||
|  |     qt_config->setValue("pad_l", Settings::values.pad_l_key); | ||||||
|  |     qt_config->setValue("pad_r", Settings::values.pad_r_key); | ||||||
|  |     qt_config->setValue("pad_start",  Settings::values.pad_start_key); | ||||||
|  |     qt_config->setValue("pad_select", Settings::values.pad_select_key); | ||||||
|  |     qt_config->setValue("pad_home",   Settings::values.pad_home_key); | ||||||
|  |     qt_config->setValue("pad_dup",    Settings::values.pad_dup_key); | ||||||
|  |     qt_config->setValue("pad_ddown",  Settings::values.pad_ddown_key); | ||||||
|  |     qt_config->setValue("pad_dleft",  Settings::values.pad_dleft_key); | ||||||
|  |     qt_config->setValue("pad_dright", Settings::values.pad_dright_key); | ||||||
|  |     qt_config->setValue("pad_sup",    Settings::values.pad_sup_key); | ||||||
|  |     qt_config->setValue("pad_sdown",  Settings::values.pad_sdown_key); | ||||||
|  |     qt_config->setValue("pad_sleft",  Settings::values.pad_sleft_key); | ||||||
|  |     qt_config->setValue("pad_sright", Settings::values.pad_sright_key); | ||||||
|  |     qt_config->endGroup(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Config::Reload() { | ||||||
|  |     ReadControls(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Config::Save() { | ||||||
|  |     SaveControls(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | Config::~Config() { | ||||||
|  |     Save(); | ||||||
|  |  | ||||||
|  |     delete qt_config; | ||||||
|  | } | ||||||
							
								
								
									
										23
									
								
								src/citra_qt/config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/citra_qt/config.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include <QSettings> | ||||||
|  |  | ||||||
|  | #include "common/common_types.h" | ||||||
|  |  | ||||||
|  | class Config { | ||||||
|  |     QSettings* qt_config; | ||||||
|  |     std::string qt_config_loc; | ||||||
|  |  | ||||||
|  |     void ReadControls(); | ||||||
|  |     void SaveControls(); | ||||||
|  | public: | ||||||
|  |     Config(); | ||||||
|  |     ~Config(); | ||||||
|  |  | ||||||
|  |     void Reload(); | ||||||
|  |     void Save(); | ||||||
|  | }; | ||||||
| @@ -26,12 +26,16 @@ | |||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/loader/loader.h" | #include "core/loader/loader.h" | ||||||
| #include "core/arm/disassembler/load_symbol_map.h" | #include "core/arm/disassembler/load_symbol_map.h" | ||||||
|  | #include "citra_qt/config.h" | ||||||
|  |  | ||||||
| #include "version.h" | #include "version.h" | ||||||
|  |  | ||||||
|  |  | ||||||
| GMainWindow::GMainWindow() | GMainWindow::GMainWindow() | ||||||
| { | { | ||||||
|  |     LogManager::Init(); | ||||||
|  |     Config config; | ||||||
|  |  | ||||||
|     ui.setupUi(this); |     ui.setupUi(this); | ||||||
|     statusBar()->hide(); |     statusBar()->hide(); | ||||||
|  |  | ||||||
| @@ -112,7 +116,6 @@ GMainWindow::GMainWindow() | |||||||
|  |  | ||||||
|     show(); |     show(); | ||||||
|  |  | ||||||
|     LogManager::Init(); |  | ||||||
|     System::Init(render_window); |     System::Init(render_window); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| // Make sure we pick up USER_DIR if set in config.h | // Make sure we pick up USER_DIR if set in config.h | ||||||
| #include "common/common.h" | #include "common/common.h" | ||||||
|  |  | ||||||
| // Directory seperators, do we need this? | // Directory separators, do we need this? | ||||||
| #define DIR_SEP "/" | #define DIR_SEP "/" | ||||||
| #define DIR_SEP_CHR '/' | #define DIR_SEP_CHR '/' | ||||||
|  |  | ||||||
| @@ -19,13 +19,13 @@ | |||||||
| #define ROOT_DIR "." | #define ROOT_DIR "." | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
|     #define USERDATA_DIR "user" |     #define USERDATA_DIR "user" | ||||||
|     #define EMU_DATA_DIR "emu" |     #define EMU_DATA_DIR "Citra Emulator" | ||||||
| #else | #else | ||||||
|     #define USERDATA_DIR "user" |     #define USERDATA_DIR "user" | ||||||
|     #ifdef USER_DIR |     #ifdef USER_DIR | ||||||
|         #define EMU_DATA_DIR USER_DIR |         #define EMU_DATA_DIR USER_DIR | ||||||
|     #else |     #else | ||||||
|         #define EMU_DATA_DIR ".emu" |         #define EMU_DATA_DIR ".citra-emu" | ||||||
|     #endif |     #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ class EmuWindow | |||||||
|  |  | ||||||
| public: | public: | ||||||
|     /// Data structure to store an emuwindow configuration |     /// Data structure to store an emuwindow configuration | ||||||
|     struct Config{ |     struct WindowConfig { | ||||||
|         bool    fullscreen; |         bool    fullscreen; | ||||||
|         int     res_width; |         int     res_width; | ||||||
|         int     res_height; |         int     res_height; | ||||||
| @@ -34,17 +34,19 @@ public: | |||||||
|     /// Releases (dunno if this is the "right" word) the GLFW context from the caller thread |     /// Releases (dunno if this is the "right" word) the GLFW context from the caller thread | ||||||
|     virtual void DoneCurrent() = 0; |     virtual void DoneCurrent() = 0; | ||||||
|  |  | ||||||
|  |     virtual void ReloadSetKeymaps() = 0; | ||||||
|  |  | ||||||
|     /// Signals a key press action to the HID module |     /// Signals a key press action to the HID module | ||||||
|     static void KeyPressed(KeyMap::HostDeviceKey key); |     static void KeyPressed(KeyMap::HostDeviceKey key); | ||||||
|  |  | ||||||
|     /// Signals a key release action to the HID module |     /// Signals a key release action to the HID module | ||||||
|     static void KeyReleased(KeyMap::HostDeviceKey key); |     static void KeyReleased(KeyMap::HostDeviceKey key); | ||||||
|  |  | ||||||
|     Config GetConfig() const {  |     WindowConfig GetConfig() const { | ||||||
|         return m_config; |         return m_config; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     void SetConfig(const Config& val) { |     void SetConfig(const WindowConfig& val) { | ||||||
|         m_config = val; |         m_config = val; | ||||||
|     } |     } | ||||||
|      |      | ||||||
| @@ -86,6 +88,6 @@ protected: | |||||||
|     int m_client_area_height;       ///< Current client height, should be set by window impl. |     int m_client_area_height;       ///< Current client height, should be set by window impl. | ||||||
|  |  | ||||||
| private: | private: | ||||||
|     Config m_config;                ///< Internal configuration |     WindowConfig m_config;                ///< Internal configuration | ||||||
|  |  | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -648,7 +648,7 @@ std::string GetSysDirectory() | |||||||
|     return sysDir; |     return sysDir; | ||||||
| } | } | ||||||
|  |  | ||||||
| // Returns a string with a Dolphin data dir or file in the user's home | // Returns a string with a Citra data dir or file in the user's home | ||||||
| // directory. To be used in "multi-user" mode (that is, installed). | // directory. To be used in "multi-user" mode (that is, installed). | ||||||
| const std::string& GetUserPath(const unsigned int DirIDX, const std::string &newPath) | const std::string& GetUserPath(const unsigned int DirIDX, const std::string &newPath) | ||||||
| { | { | ||||||
|   | |||||||
| @@ -110,7 +110,7 @@ void CopyDir(const std::string &source_path, const std::string &dest_path); | |||||||
| // Set the current directory to given directory | // Set the current directory to given directory | ||||||
| bool SetCurrentDir(const std::string &directory); | bool SetCurrentDir(const std::string &directory); | ||||||
|  |  | ||||||
| // Returns a pointer to a string with a Dolphin data dir in the user's home | // Returns a pointer to a string with a Citra data dir in the user's home | ||||||
| // directory. To be used in "multi-user" mode (that is, installed). | // directory. To be used in "multi-user" mode (that is, installed). | ||||||
| const std::string& GetUserPath(const unsigned int DirIDX, const std::string &newPath=""); | const std::string& GetUserPath(const unsigned int DirIDX, const std::string &newPath=""); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ enum LOG_TYPE { | |||||||
|     COMMANDPROCESSOR, |     COMMANDPROCESSOR, | ||||||
|     COMMON, |     COMMON, | ||||||
|     CONSOLE, |     CONSOLE, | ||||||
|  |     CONFIG, | ||||||
|     DISCIO, |     DISCIO, | ||||||
|     FILEMON, |     FILEMON, | ||||||
|     DSPHLE, |     DSPHLE, | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ LogManager::LogManager() | |||||||
|     m_Log[LogTypes::MASTER_LOG]         = new LogContainer("*",                 "Master Log"); |     m_Log[LogTypes::MASTER_LOG]         = new LogContainer("*",                 "Master Log"); | ||||||
|     m_Log[LogTypes::BOOT]               = new LogContainer("BOOT",              "Boot"); |     m_Log[LogTypes::BOOT]               = new LogContainer("BOOT",              "Boot"); | ||||||
|     m_Log[LogTypes::COMMON]             = new LogContainer("COMMON",            "Common"); |     m_Log[LogTypes::COMMON]             = new LogContainer("COMMON",            "Common"); | ||||||
|  |     m_Log[LogTypes::CONFIG]             = new LogContainer("CONFIG",            "Configuration"); | ||||||
|     m_Log[LogTypes::DISCIO]             = new LogContainer("DIO",               "Disc IO"); |     m_Log[LogTypes::DISCIO]             = new LogContainer("DIO",               "Disc IO"); | ||||||
|     m_Log[LogTypes::FILEMON]            = new LogContainer("FileMon",           "File Monitor"); |     m_Log[LogTypes::FILEMON]            = new LogContainer("FileMon",           "File Monitor"); | ||||||
|     m_Log[LogTypes::PAD]                = new LogContainer("PAD",               "Pad"); |     m_Log[LogTypes::PAD]                = new LogContainer("PAD",               "Pad"); | ||||||
|   | |||||||
| @@ -56,6 +56,7 @@ set(SRCS | |||||||
|             core_timing.cpp |             core_timing.cpp | ||||||
|             mem_map.cpp |             mem_map.cpp | ||||||
|             mem_map_funcs.cpp |             mem_map_funcs.cpp | ||||||
|  |             settings.cpp | ||||||
|             system.cpp |             system.cpp | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
| @@ -117,6 +118,7 @@ set(HEADERS | |||||||
|             core.h |             core.h | ||||||
|             core_timing.h |             core_timing.h | ||||||
|             mem_map.h |             mem_map.h | ||||||
|  |             settings.h | ||||||
|             system.h |             system.h | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								src/core/settings.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/core/settings.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include "settings.h" | ||||||
|  |  | ||||||
|  | namespace Settings { | ||||||
|  |  | ||||||
|  | Values values = {}; | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								src/core/settings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/core/settings.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | // Copyright 2014 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | namespace Settings { | ||||||
|  |  | ||||||
|  | struct Values { | ||||||
|  |     int pad_a_key; | ||||||
|  |     int pad_b_key; | ||||||
|  |     int pad_x_key; | ||||||
|  |     int pad_y_key; | ||||||
|  |     int pad_l_key; | ||||||
|  |     int pad_r_key; | ||||||
|  |     int pad_start_key; | ||||||
|  |     int pad_select_key; | ||||||
|  |     int pad_home_key; | ||||||
|  |     int pad_dup_key; | ||||||
|  |     int pad_ddown_key; | ||||||
|  |     int pad_dleft_key; | ||||||
|  |     int pad_dright_key; | ||||||
|  |     int pad_sup_key; | ||||||
|  |     int pad_sdown_key; | ||||||
|  |     int pad_sleft_key; | ||||||
|  |     int pad_sright_key; | ||||||
|  | } extern values; | ||||||
|  |  | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user