From 4a94ec934ab1a2216f94e3fcc46f5dde1d6e2f02 Mon Sep 17 00:00:00 2001 From: Kevin Hartman Date: Wed, 3 Sep 2014 18:12:58 -0700 Subject: Initial HID PAD work, with GLFW only. --- src/common/CMakeLists.txt | 2 ++ src/common/emu_window.h | 19 +++++++++++++++++++ src/common/key_map.cpp | 21 +++++++++++++++++++++ src/common/key_map.h | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 src/common/key_map.cpp create mode 100644 src/common/key_map.h (limited to 'src/common') diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 3a82f5b80..4ae34bea9 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -8,6 +8,7 @@ set(SRCS file_search.cpp file_util.cpp hash.cpp + key_map.cpp log_manager.cpp math_util.cpp mem_arena.cpp @@ -39,6 +40,7 @@ set(HEADERS file_search.h file_util.h hash.h + key_map.h linear_disk_cache.h log.h log_manager.h diff --git a/src/common/emu_window.h b/src/common/emu_window.h index 5e2c33d7a..90fbd9335 100644 --- a/src/common/emu_window.h +++ b/src/common/emu_window.h @@ -7,6 +7,9 @@ #include "common/common.h" #include "common/scm_rev.h" +#include "common/key_map.h" +#include "core/hle/service/hid.h" + // Abstraction class used to provide an interface between emulation code and the frontend (e.g. SDL, // QGLWidget, GLFW, etc...) class EmuWindow @@ -32,6 +35,22 @@ public: /// Releases (dunno if this is the "right" word) the GLFW context from the caller thread virtual void DoneCurrent() = 0; + static void KeyPressed(KeyMap::CitraKey key) { + HID_User::PADState mapped_key = KeyMap::Get3DSKey(key); + + if (mapped_key.hex != HID_User::PAD_NONE.hex) { + HID_User::PADButtonPress(mapped_key); + } + } + + static void KeyReleased(KeyMap::CitraKey key) { + HID_User::PADState mapped_key = KeyMap::Get3DSKey(key); + + if (mapped_key.hex != HID_User::PAD_NONE.hex) { + HID_User::PADButtonRelease(mapped_key); + } + } + Config GetConfig() const { return m_config; } diff --git a/src/common/key_map.cpp b/src/common/key_map.cpp new file mode 100644 index 000000000..5941a105b --- /dev/null +++ b/src/common/key_map.cpp @@ -0,0 +1,21 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "key_map.h" +#include + + +namespace KeyMap { + +std::map g_key_map; + +void SetKeyMapping(CitraKey key, HID_User::PADState padState) { + g_key_map[key].hex = padState.hex; +} + +HID_User::PADState Get3DSKey(CitraKey key) { + return g_key_map[key]; +} + +} diff --git a/src/common/key_map.h b/src/common/key_map.h new file mode 100644 index 000000000..7e94df618 --- /dev/null +++ b/src/common/key_map.h @@ -0,0 +1,35 @@ +// Copyright 2013 Dolphin Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#pragma once + +#include "core/hle/service/hid.h" + +namespace KeyMap { + +class CitraKey { +public: + CitraKey() : keyCode(0) {} + CitraKey(int code) : keyCode(code) {} + + int keyCode; + + bool operator < (const CitraKey &other) const { + return keyCode < other.keyCode; + } + + bool operator == (const CitraKey &other) const { + return keyCode == other.keyCode; + } +}; + +struct DefaultKeyMapping { + KeyMap::CitraKey key; + HID_User::PADState state; +}; + +void SetKeyMapping(CitraKey key, HID_User::PADState padState); +HID_User::PADState Get3DSKey(CitraKey key); + +} -- cgit v1.2.3 From 02fd19b2f60f4db8a683734e4300d7498c861309 Mon Sep 17 00:00:00 2001 From: Kevin Hartman Date: Mon, 8 Sep 2014 21:46:02 -0700 Subject: Added support for multiple input device types for KeyMap and connected Qt. --- src/common/CMakeLists.txt | 1 + src/common/emu_window.cpp | 17 +++++++++++++++++ src/common/emu_window.h | 19 ++++--------------- src/common/key_map.cpp | 18 +++++++++++------- src/common/key_map.h | 46 ++++++++++++++++++++++++++++------------------ 5 files changed, 61 insertions(+), 40 deletions(-) create mode 100644 src/common/emu_window.cpp (limited to 'src/common') diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 4ae34bea9..9d5a90762 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -4,6 +4,7 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scm_rev.cpp.in" "${CMAKE_CURRENT_SOU set(SRCS break_points.cpp console_listener.cpp + emu_window.cpp extended_trace.cpp file_search.cpp file_util.cpp diff --git a/src/common/emu_window.cpp b/src/common/emu_window.cpp new file mode 100644 index 000000000..7a2c50ac8 --- /dev/null +++ b/src/common/emu_window.cpp @@ -0,0 +1,17 @@ +// Copyright 2014 Citra Emulator Project +// Licensed under GPLv2 +// Refer to the license.txt file included. + +#include "emu_window.h" + +void EmuWindow::KeyPressed(KeyMap::HostDeviceKey key) { + HID_User::PadState mapped_key = KeyMap::GetPadKey(key); + + HID_User::PadButtonPress(mapped_key); +} + +void EmuWindow::KeyReleased(KeyMap::HostDeviceKey key) { + HID_User::PadState mapped_key = KeyMap::GetPadKey(key); + + HID_User::PadButtonRelease(mapped_key); +} diff --git a/src/common/emu_window.h b/src/common/emu_window.h index 90fbd9335..23f178fdf 100644 --- a/src/common/emu_window.h +++ b/src/common/emu_window.h @@ -8,7 +8,6 @@ #include "common/scm_rev.h" #include "common/key_map.h" -#include "core/hle/service/hid.h" // Abstraction class used to provide an interface between emulation code and the frontend (e.g. SDL, // QGLWidget, GLFW, etc...) @@ -35,21 +34,11 @@ public: /// Releases (dunno if this is the "right" word) the GLFW context from the caller thread virtual void DoneCurrent() = 0; - static void KeyPressed(KeyMap::CitraKey key) { - HID_User::PADState mapped_key = KeyMap::Get3DSKey(key); + /// Signals a key press action to the HID module + static void KeyPressed(KeyMap::HostDeviceKey key); - if (mapped_key.hex != HID_User::PAD_NONE.hex) { - HID_User::PADButtonPress(mapped_key); - } - } - - static void KeyReleased(KeyMap::CitraKey key) { - HID_User::PADState mapped_key = KeyMap::Get3DSKey(key); - - if (mapped_key.hex != HID_User::PAD_NONE.hex) { - HID_User::PADButtonRelease(mapped_key); - } - } + /// Signals a key release action to the HID module + static void KeyReleased(KeyMap::HostDeviceKey key); Config GetConfig() const { return m_config; diff --git a/src/common/key_map.cpp b/src/common/key_map.cpp index 5941a105b..309caab98 100644 --- a/src/common/key_map.cpp +++ b/src/common/key_map.cpp @@ -1,21 +1,25 @@ -// Copyright 2013 Dolphin Emulator Project +// Copyright 2014 Citra Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. #include "key_map.h" #include - namespace KeyMap { -std::map g_key_map; +static std::map key_map; +static int next_device_id = 0; + +int NewDeviceId() { + return next_device_id++; +} -void SetKeyMapping(CitraKey key, HID_User::PADState padState) { - g_key_map[key].hex = padState.hex; +void SetKeyMapping(HostDeviceKey key, HID_User::PadState padState) { + key_map[key].hex = padState.hex; } -HID_User::PADState Get3DSKey(CitraKey key) { - return g_key_map[key]; +HID_User::PadState GetPadKey(HostDeviceKey key) { + return key_map[key]; } } diff --git a/src/common/key_map.h b/src/common/key_map.h index 7e94df618..b5acfbab0 100644 --- a/src/common/key_map.h +++ b/src/common/key_map.h @@ -1,4 +1,4 @@ -// Copyright 2013 Dolphin Emulator Project +// Copyright 2014 Citra Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. @@ -8,28 +8,38 @@ namespace KeyMap { -class CitraKey { -public: - CitraKey() : keyCode(0) {} - CitraKey(int code) : keyCode(code) {} - - int keyCode; - - bool operator < (const CitraKey &other) const { - return keyCode < other.keyCode; +/** + * Represents a key for a specific host device. + */ +struct HostDeviceKey { + int key_code; + int device_id; ///< Uniquely identifies a host device + + bool operator < (const HostDeviceKey &other) const { + if (device_id == other.device_id) { + return key_code < other.key_code; + } + return device_id < other.device_id; } - bool operator == (const CitraKey &other) const { - return keyCode == other.keyCode; + bool operator == (const HostDeviceKey &other) const { + return device_id == other.device_id && key_code == other.key_code; } }; -struct DefaultKeyMapping { - KeyMap::CitraKey key; - HID_User::PADState state; -}; +/** + * Generates a new device id, which uniquely identifies a host device within KeyMap. + */ +int NewDeviceId(); + +/** + * Maps a device-specific key to a PadState. + */ +void SetKeyMapping(HostDeviceKey key, HID_User::PadState padState); -void SetKeyMapping(CitraKey key, HID_User::PADState padState); -HID_User::PADState Get3DSKey(CitraKey key); +/** + * Gets the PadState that's mapped to the provided device-specific key. + */ +HID_User::PadState GetPadKey(HostDeviceKey key); } -- cgit v1.2.3