17 changed files with 254 additions and 85 deletions
-
1src/CMakeLists.txt
-
2src/citra/CMakeLists.txt
-
25src/citra/config.cpp
-
21src/citra/emu_window/emu_window_sdl2.cpp
-
6src/citra/emu_window/emu_window_sdl2.h
-
2src/citra_qt/CMakeLists.txt
-
25src/citra_qt/bootmanager.cpp
-
6src/citra_qt/bootmanager.h
-
35src/citra_qt/config.cpp
-
3src/citra_qt/config.h
-
9src/citra_qt/configure_input.cpp
-
2src/core/frontend/emu_window.h
-
15src/input_common/CMakeLists.txt
-
82src/input_common/keyboard.cpp
-
45src/input_common/keyboard.h
-
35src/input_common/main.cpp
-
25src/input_common/main.h
@ -0,0 +1,15 @@ |
|||
set(SRCS |
|||
keyboard.cpp |
|||
main.cpp |
|||
) |
|||
|
|||
set(HEADERS |
|||
keyboard.h |
|||
main.h |
|||
) |
|||
|
|||
create_directory_groups(${SRCS} ${HEADERS}) |
|||
|
|||
add_library(input_common STATIC ${SRCS} ${HEADERS}) |
|||
target_link_libraries(input_common common core) |
|||
|
|||
@ -0,0 +1,82 @@ |
|||
// Copyright 2017 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <atomic>
|
|||
#include <list>
|
|||
#include <mutex>
|
|||
#include "input_common/keyboard.h"
|
|||
|
|||
namespace InputCommon { |
|||
|
|||
class KeyButton final : public Input::ButtonDevice { |
|||
public: |
|||
explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_) |
|||
: key_button_list(key_button_list_) {} |
|||
|
|||
~KeyButton(); |
|||
|
|||
bool GetStatus() const override { |
|||
return status.load(); |
|||
} |
|||
|
|||
friend class KeyButtonList; |
|||
|
|||
private: |
|||
std::shared_ptr<KeyButtonList> key_button_list; |
|||
std::atomic<bool> status{false}; |
|||
}; |
|||
|
|||
struct KeyButtonPair { |
|||
int key_code; |
|||
KeyButton* key_button; |
|||
}; |
|||
|
|||
class KeyButtonList { |
|||
public: |
|||
void AddKeyButton(int key_code, KeyButton* key_button) { |
|||
std::lock_guard<std::mutex> guard(mutex); |
|||
list.push_back(KeyButtonPair{key_code, key_button}); |
|||
} |
|||
|
|||
void RemoveKeyButton(const KeyButton* key_button) { |
|||
std::lock_guard<std::mutex> guard(mutex); |
|||
list.remove_if( |
|||
[key_button](const KeyButtonPair& pair) { return pair.key_button == key_button; }); |
|||
} |
|||
|
|||
void ChangeKeyStatus(int key_code, bool pressed) { |
|||
std::lock_guard<std::mutex> guard(mutex); |
|||
for (const KeyButtonPair& pair : list) { |
|||
if (pair.key_code == key_code) |
|||
pair.key_button->status.store(pressed); |
|||
} |
|||
} |
|||
|
|||
private: |
|||
std::mutex mutex; |
|||
std::list<KeyButtonPair> list; |
|||
}; |
|||
|
|||
Keyboard::Keyboard() : key_button_list{std::make_shared<KeyButtonList>()} {} |
|||
|
|||
KeyButton::~KeyButton() { |
|||
key_button_list->RemoveKeyButton(this); |
|||
} |
|||
|
|||
std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage& params) { |
|||
int key_code = params.Get("code", 0); |
|||
std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list); |
|||
key_button_list->AddKeyButton(key_code, button.get()); |
|||
return std::move(button); |
|||
} |
|||
|
|||
void Keyboard::PressKey(int key_code) { |
|||
key_button_list->ChangeKeyStatus(key_code, true); |
|||
} |
|||
|
|||
void Keyboard::ReleaseKey(int key_code) { |
|||
key_button_list->ChangeKeyStatus(key_code, false); |
|||
} |
|||
|
|||
} // namespace InputCommon
|
|||
@ -0,0 +1,45 @@ |
|||
// Copyright 2017 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <memory> |
|||
#include "core/frontend/input.h" |
|||
|
|||
namespace InputCommon { |
|||
|
|||
class KeyButtonList; |
|||
|
|||
/** |
|||
* A button device factory representing a keyboard. It receives keyboard events and forward them |
|||
* to all button devices it created. |
|||
*/ |
|||
class Keyboard final : public Input::Factory<Input::ButtonDevice> { |
|||
public: |
|||
Keyboard(); |
|||
|
|||
/** |
|||
* Creates a button device from a keyboard key |
|||
* @param params contains parameters for creating the device: |
|||
* - "code": the code of the key to bind with the button |
|||
*/ |
|||
std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override; |
|||
|
|||
/** |
|||
* Sets the status of all buttons bound with the key to pressed |
|||
* @param key_code the code of the key to press |
|||
*/ |
|||
void PressKey(int key_code); |
|||
|
|||
/** |
|||
* Sets the status of all buttons bound with the key to released |
|||
* @param key_code the code of the key to release |
|||
*/ |
|||
void ReleaseKey(int key_code); |
|||
|
|||
private: |
|||
std::shared_ptr<KeyButtonList> key_button_list; |
|||
}; |
|||
|
|||
} // namespace InputCommon |
|||
@ -0,0 +1,35 @@ |
|||
// Copyright 2017 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <memory>
|
|||
#include "common/param_package.h"
|
|||
#include "input_common/keyboard.h"
|
|||
#include "input_common/main.h"
|
|||
|
|||
namespace InputCommon { |
|||
|
|||
static std::shared_ptr<Keyboard> keyboard; |
|||
|
|||
void Init() { |
|||
keyboard = std::make_shared<InputCommon::Keyboard>(); |
|||
Input::RegisterFactory<Input::ButtonDevice>("keyboard", keyboard); |
|||
} |
|||
|
|||
void Shutdown() { |
|||
Input::UnregisterFactory<Input::ButtonDevice>("keyboard"); |
|||
keyboard.reset(); |
|||
} |
|||
|
|||
Keyboard* GetKeyboard() { |
|||
return keyboard.get(); |
|||
} |
|||
|
|||
std::string GenerateKeyboardParam(int key_code) { |
|||
Common::ParamPackage param{ |
|||
{"engine", "keyboard"}, {"code", std::to_string(key_code)}, |
|||
}; |
|||
return param.Serialize(); |
|||
} |
|||
|
|||
} // namespace InputCommon
|
|||
@ -0,0 +1,25 @@ |
|||
// Copyright 2017 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <string> |
|||
|
|||
namespace InputCommon { |
|||
|
|||
/// Initializes and registers all built-in input device factories. |
|||
void Init(); |
|||
|
|||
/// Unresisters all build-in input device factories and shut them down. |
|||
void Shutdown(); |
|||
|
|||
class Keyboard; |
|||
|
|||
/// Gets the keyboard button device factory. |
|||
Keyboard* GetKeyboard(); |
|||
|
|||
/// Generates a serialized param package for creating a keyboard button device |
|||
std::string GenerateKeyboardParam(int key_code); |
|||
|
|||
} // namespace InputCommon |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue