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