[UI/HID] ui::VirtualKey enum
This commit is contained in:
@@ -10,8 +10,8 @@
|
||||
#include <array>
|
||||
#include <cstring>
|
||||
#include <forward_list>
|
||||
#include <map>
|
||||
#include <tuple>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "third_party/fmt/include/fmt/format.h"
|
||||
#include "third_party/imgui/imgui.h"
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "xenia/hid/hid_flags.h"
|
||||
#include "xenia/hid/input_system.h"
|
||||
#include "xenia/ui/imgui_drawer.h"
|
||||
#include "xenia/ui/virtual_key.h"
|
||||
#include "xenia/ui/vulkan/vulkan_provider.h"
|
||||
#include "xenia/ui/window.h"
|
||||
|
||||
@@ -281,44 +282,42 @@ void DrawInputGetState() {
|
||||
ImGui::EndChild();
|
||||
}
|
||||
|
||||
static const std::map<std::underlying_type<X_INPUT_GAMEPAD_VK>::type,
|
||||
const std::string>
|
||||
vk_pretty = {
|
||||
{X_INPUT_GAMEPAD_VK_A, "A"},
|
||||
{X_INPUT_GAMEPAD_VK_B, "B"},
|
||||
{X_INPUT_GAMEPAD_VK_X, "X"},
|
||||
{X_INPUT_GAMEPAD_VK_Y, "Y"},
|
||||
{X_INPUT_GAMEPAD_VK_RSHOULDER, "R Shoulder"},
|
||||
{X_INPUT_GAMEPAD_VK_LSHOULDER, "L Shoulder"},
|
||||
{X_INPUT_GAMEPAD_VK_LTRIGGER, "L Trigger"},
|
||||
{X_INPUT_GAMEPAD_VK_RTRIGGER, "R Trigger"},
|
||||
static const std::unordered_map<ui::VirtualKey, const std::string> kVkPretty = {
|
||||
{ui::VirtualKey::kXInputPadA, "A"},
|
||||
{ui::VirtualKey::kXInputPadB, "B"},
|
||||
{ui::VirtualKey::kXInputPadX, "X"},
|
||||
{ui::VirtualKey::kXInputPadY, "Y"},
|
||||
{ui::VirtualKey::kXInputPadRShoulder, "R Shoulder"},
|
||||
{ui::VirtualKey::kXInputPadLShoulder, "L Shoulder"},
|
||||
{ui::VirtualKey::kXInputPadLTrigger, "L Trigger"},
|
||||
{ui::VirtualKey::kXInputPadRTrigger, "R Trigger"},
|
||||
|
||||
{X_INPUT_GAMEPAD_VK_DPAD_UP, "DPad up"},
|
||||
{X_INPUT_GAMEPAD_VK_DPAD_DOWN, "DPad down"},
|
||||
{X_INPUT_GAMEPAD_VK_DPAD_LEFT, "DPad left"},
|
||||
{X_INPUT_GAMEPAD_VK_DPAD_RIGHT, "DPad right"},
|
||||
{X_INPUT_GAMEPAD_VK_START, "Start"},
|
||||
{X_INPUT_GAMEPAD_VK_BACK, "Back"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_PRESS, "L Thumb press"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_PRESS, "R Thumb press"},
|
||||
{ui::VirtualKey::kXInputPadDpadUp, "DPad up"},
|
||||
{ui::VirtualKey::kXInputPadDpadDown, "DPad down"},
|
||||
{ui::VirtualKey::kXInputPadDpadLeft, "DPad left"},
|
||||
{ui::VirtualKey::kXInputPadDpadRight, "DPad right"},
|
||||
{ui::VirtualKey::kXInputPadStart, "Start"},
|
||||
{ui::VirtualKey::kXInputPadBack, "Back"},
|
||||
{ui::VirtualKey::kXInputPadLThumbPress, "L Thumb press"},
|
||||
{ui::VirtualKey::kXInputPadRThumbPress, "R Thumb press"},
|
||||
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_UP, "L Thumb up"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_DOWN, "L Thumb down"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_RIGHT, "L Thumb right"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_LEFT, "L Thumb left"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_UPLEFT, "L Thumb up & left"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_UPRIGHT, "L Thumb up & right"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_DOWNRIGHT, "L Thumb down & right"},
|
||||
{X_INPUT_GAMEPAD_VK_LTHUMB_DOWNLEFT, "L Thumb down & left"},
|
||||
{ui::VirtualKey::kXInputPadLThumbUp, "L Thumb up"},
|
||||
{ui::VirtualKey::kXInputPadLThumbDown, "L Thumb down"},
|
||||
{ui::VirtualKey::kXInputPadLThumbRight, "L Thumb right"},
|
||||
{ui::VirtualKey::kXInputPadLThumbLeft, "L Thumb left"},
|
||||
{ui::VirtualKey::kXInputPadLThumbUpLeft, "L Thumb up & left"},
|
||||
{ui::VirtualKey::kXInputPadLThumbUpRight, "L Thumb up & right"},
|
||||
{ui::VirtualKey::kXInputPadLThumbDownRight, "L Thumb down & right"},
|
||||
{ui::VirtualKey::kXInputPadLThumbDownLeft, "L Thumb down & left"},
|
||||
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_UP, "R Thumb up"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_DOWN, "R Thumb down"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_RIGHT, "R Thumb right"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_LEFT, "R Thumb left"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_UPLEFT, "R Thumb up & left"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_UPRIGHT, "R Thumb up & right"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_DOWNRIGHT, "R Thumb down & right"},
|
||||
{X_INPUT_GAMEPAD_VK_RTHUMB_DOWNLEFT, "R Thumb down & left"},
|
||||
{ui::VirtualKey::kXInputPadRThumbUp, "R Thumb up"},
|
||||
{ui::VirtualKey::kXInputPadRThumbDown, "R Thumb down"},
|
||||
{ui::VirtualKey::kXInputPadRThumbRight, "R Thumb right"},
|
||||
{ui::VirtualKey::kXInputPadRThumbLeft, "R Thumb left"},
|
||||
{ui::VirtualKey::kXInputPadRThumbUpLeft, "R Thumb up & left"},
|
||||
{ui::VirtualKey::kXInputPadRThumbUpRight, "R Thumb up & right"},
|
||||
{ui::VirtualKey::kXInputPadRThumbDownRight, "R Thumb down & right"},
|
||||
{ui::VirtualKey::kXInputPadRThumbDownLeft, "R Thumb down & left"},
|
||||
};
|
||||
|
||||
void DrawUserInputGetKeystroke(uint32_t user_index, bool poll,
|
||||
@@ -354,10 +353,12 @@ void DrawUserInputGetKeystroke(uint32_t user_index, bool poll,
|
||||
break;
|
||||
}
|
||||
|
||||
const auto key_search = vk_pretty.find(stroke.virtual_key);
|
||||
const auto key = key_search != vk_pretty.end()
|
||||
? key_search->second
|
||||
: fmt::format("0x{:04x}", stroke.virtual_key);
|
||||
ui::VirtualKey virtual_key = ui::VirtualKey(stroke.virtual_key.get());
|
||||
const auto key_search = kVkPretty.find(virtual_key);
|
||||
std::string key =
|
||||
key_search != kVkPretty.cend()
|
||||
? key_search->second
|
||||
: fmt::format("0x{:04x}", uint16_t(virtual_key));
|
||||
event_log.emplace_front(fmt::format(
|
||||
"{:>6} {:>9}ms {:<20} {} {} {}", ImGui::GetFrameCount(),
|
||||
dur, key,
|
||||
|
||||
@@ -46,43 +46,7 @@ enum X_INPUT_GAMEPAD_BUTTON {
|
||||
X_INPUT_GAMEPAD_Y = 0x8000,
|
||||
};
|
||||
|
||||
enum X_INPUT_GAMEPAD_VK {
|
||||
X_INPUT_GAMEPAD_VK_A = 0x5800,
|
||||
X_INPUT_GAMEPAD_VK_B = 0x5801,
|
||||
X_INPUT_GAMEPAD_VK_X = 0x5802,
|
||||
X_INPUT_GAMEPAD_VK_Y = 0x5803,
|
||||
X_INPUT_GAMEPAD_VK_RSHOULDER = 0x5804,
|
||||
X_INPUT_GAMEPAD_VK_LSHOULDER = 0x5805,
|
||||
X_INPUT_GAMEPAD_VK_LTRIGGER = 0x5806,
|
||||
X_INPUT_GAMEPAD_VK_RTRIGGER = 0x5807,
|
||||
|
||||
X_INPUT_GAMEPAD_VK_DPAD_UP = 0x5810,
|
||||
X_INPUT_GAMEPAD_VK_DPAD_DOWN = 0x5811,
|
||||
X_INPUT_GAMEPAD_VK_DPAD_LEFT = 0x5812,
|
||||
X_INPUT_GAMEPAD_VK_DPAD_RIGHT = 0x5813,
|
||||
X_INPUT_GAMEPAD_VK_START = 0x5814,
|
||||
X_INPUT_GAMEPAD_VK_BACK = 0x5815,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_PRESS = 0x5816,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_PRESS = 0x5817,
|
||||
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_UP = 0x5820,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_DOWN = 0x5821,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_RIGHT = 0x5822,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_LEFT = 0x5823,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_UPLEFT = 0x5824,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_UPRIGHT = 0x5825,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_DOWNRIGHT = 0x5826,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_DOWNLEFT = 0x5827,
|
||||
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_UP = 0x5830,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_DOWN = 0x5831,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_RIGHT = 0x5832,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_LEFT = 0x5833,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_UPLEFT = 0x5834,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_UPRIGHT = 0x5835,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_DOWNRIGHT = 0x5836,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_DOWNLEFT = 0x5837,
|
||||
};
|
||||
// For VK_PAD, use ui::VirtualKey.
|
||||
|
||||
enum X_INPUT_KEYSTROKE_FLAGS {
|
||||
X_INPUT_KEYSTROKE_KEYDOWN = 0x0001,
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "xenia/base/logging.h"
|
||||
#include "xenia/helper/sdl/sdl_helper.h"
|
||||
#include "xenia/hid/hid_flags.h"
|
||||
#include "xenia/ui/virtual_key.h"
|
||||
#include "xenia/ui/window.h"
|
||||
|
||||
// TODO(joellinn) make this path relative to the config folder.
|
||||
@@ -238,48 +239,46 @@ X_RESULT SDLInputDriver::GetKeystroke(uint32_t users, uint32_t flags,
|
||||
// The order of this list is also the order in which events are send if
|
||||
// multiple buttons change at once.
|
||||
static_assert(sizeof(X_INPUT_GAMEPAD::buttons) == 2);
|
||||
static constexpr std::array<std::underlying_type<X_INPUT_GAMEPAD_VK>::type,
|
||||
34>
|
||||
vk_lookup = {
|
||||
// 00 - True buttons from xinput button field
|
||||
X_INPUT_GAMEPAD_VK_DPAD_UP,
|
||||
X_INPUT_GAMEPAD_VK_DPAD_DOWN,
|
||||
X_INPUT_GAMEPAD_VK_DPAD_LEFT,
|
||||
X_INPUT_GAMEPAD_VK_DPAD_RIGHT,
|
||||
X_INPUT_GAMEPAD_VK_START,
|
||||
X_INPUT_GAMEPAD_VK_BACK,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_PRESS,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_PRESS,
|
||||
X_INPUT_GAMEPAD_VK_LSHOULDER,
|
||||
X_INPUT_GAMEPAD_VK_RSHOULDER,
|
||||
0, /* Guide has no VK */
|
||||
0, /* Unknown */
|
||||
X_INPUT_GAMEPAD_VK_A,
|
||||
X_INPUT_GAMEPAD_VK_B,
|
||||
X_INPUT_GAMEPAD_VK_X,
|
||||
X_INPUT_GAMEPAD_VK_Y,
|
||||
// 16 - Fake buttons generated from analog inputs
|
||||
X_INPUT_GAMEPAD_VK_LTRIGGER,
|
||||
X_INPUT_GAMEPAD_VK_RTRIGGER,
|
||||
// 18
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_UP,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_DOWN,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_RIGHT,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_LEFT,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_UPLEFT,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_UPRIGHT,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_DOWNRIGHT,
|
||||
X_INPUT_GAMEPAD_VK_LTHUMB_DOWNLEFT,
|
||||
// 26
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_UP,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_DOWN,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_RIGHT,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_LEFT,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_UPLEFT,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_UPRIGHT,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_DOWNRIGHT,
|
||||
X_INPUT_GAMEPAD_VK_RTHUMB_DOWNLEFT,
|
||||
};
|
||||
static constexpr std::array<ui::VirtualKey, 34> kVkLookup = {
|
||||
// 00 - True buttons from xinput button field
|
||||
ui::VirtualKey::kXInputPadDpadUp,
|
||||
ui::VirtualKey::kXInputPadDpadDown,
|
||||
ui::VirtualKey::kXInputPadDpadLeft,
|
||||
ui::VirtualKey::kXInputPadDpadRight,
|
||||
ui::VirtualKey::kXInputPadStart,
|
||||
ui::VirtualKey::kXInputPadBack,
|
||||
ui::VirtualKey::kXInputPadLThumbPress,
|
||||
ui::VirtualKey::kXInputPadRThumbPress,
|
||||
ui::VirtualKey::kXInputPadLShoulder,
|
||||
ui::VirtualKey::kXInputPadRShoulder,
|
||||
ui::VirtualKey::kNone, /* Guide has no VK */
|
||||
ui::VirtualKey::kNone, /* Unknown */
|
||||
ui::VirtualKey::kXInputPadA,
|
||||
ui::VirtualKey::kXInputPadB,
|
||||
ui::VirtualKey::kXInputPadX,
|
||||
ui::VirtualKey::kXInputPadY,
|
||||
// 16 - Fake buttons generated from analog inputs
|
||||
ui::VirtualKey::kXInputPadLTrigger,
|
||||
ui::VirtualKey::kXInputPadRTrigger,
|
||||
// 18
|
||||
ui::VirtualKey::kXInputPadLThumbUp,
|
||||
ui::VirtualKey::kXInputPadLThumbDown,
|
||||
ui::VirtualKey::kXInputPadLThumbRight,
|
||||
ui::VirtualKey::kXInputPadLThumbLeft,
|
||||
ui::VirtualKey::kXInputPadLThumbUpLeft,
|
||||
ui::VirtualKey::kXInputPadLThumbUpRight,
|
||||
ui::VirtualKey::kXInputPadLThumbDownRight,
|
||||
ui::VirtualKey::kXInputPadLThumbDownLeft,
|
||||
// 26
|
||||
ui::VirtualKey::kXInputPadRThumbUp,
|
||||
ui::VirtualKey::kXInputPadRThumbDown,
|
||||
ui::VirtualKey::kXInputPadRThumbRight,
|
||||
ui::VirtualKey::kXInputPadRThumbLeft,
|
||||
ui::VirtualKey::kXInputPadRThumbUpLeft,
|
||||
ui::VirtualKey::kXInputPadRThumbUpRight,
|
||||
ui::VirtualKey::kXInputPadRThumbDownRight,
|
||||
ui::VirtualKey::kXInputPadRThumbDownLeft,
|
||||
};
|
||||
|
||||
auto is_active = this->is_active();
|
||||
|
||||
@@ -319,9 +318,9 @@ X_RESULT SDLInputDriver::GetKeystroke(uint32_t users, uint32_t flags,
|
||||
if (last.repeat_state == RepeatState::Repeating &&
|
||||
(last.repeat_time + HID_SDL_REPEAT_RATE < guest_now)) {
|
||||
last.repeat_time = guest_now;
|
||||
auto vk = vk_lookup.at(last.repeat_butt_idx);
|
||||
assert_not_zero(vk);
|
||||
out_keystroke->virtual_key = vk;
|
||||
ui::VirtualKey vk = kVkLookup.at(last.repeat_butt_idx);
|
||||
assert_true(vk != ui::VirtualKey::kNone);
|
||||
out_keystroke->virtual_key = uint16_t(vk);
|
||||
out_keystroke->unicode = 0;
|
||||
out_keystroke->user_index = user_index;
|
||||
out_keystroke->hid_code = 0;
|
||||
@@ -340,17 +339,17 @@ X_RESULT SDLInputDriver::GetKeystroke(uint32_t users, uint32_t flags,
|
||||
// up before THUMB_LEFT is down.
|
||||
for (auto [clear_pass, i] = std::tuple{true, 0}; i < 2;
|
||||
clear_pass = false, i++) {
|
||||
for (uint8_t i = 0; i < std::size(vk_lookup); i++) {
|
||||
for (uint8_t i = 0; i < uint8_t(std::size(kVkLookup)); i++) {
|
||||
auto fbutton = uint64_t(1) << i;
|
||||
if (!(butts_changed & fbutton)) {
|
||||
continue;
|
||||
}
|
||||
auto vk = vk_lookup.at(i);
|
||||
if (!vk) {
|
||||
ui::VirtualKey vk = kVkLookup.at(last.repeat_butt_idx);
|
||||
if (vk == ui::VirtualKey::kNone) {
|
||||
continue;
|
||||
}
|
||||
|
||||
out_keystroke->virtual_key = vk;
|
||||
out_keystroke->virtual_key = uint16_t(vk);
|
||||
out_keystroke->unicode = 0;
|
||||
out_keystroke->user_index = user_index;
|
||||
out_keystroke->hid_code = 0;
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "xenia/base/platform_win.h"
|
||||
#include "xenia/hid/hid_flags.h"
|
||||
#include "xenia/hid/input_system.h"
|
||||
#include "xenia/ui/virtual_key.h"
|
||||
#include "xenia/ui/window.h"
|
||||
|
||||
namespace xe {
|
||||
@@ -29,7 +30,7 @@ WinKeyInputDriver::WinKeyInputDriver(xe::ui::Window* window)
|
||||
auto global_lock = global_critical_region_.Acquire();
|
||||
|
||||
KeyEvent key;
|
||||
key.vkey = evt->key_code();
|
||||
key.virtual_key = evt->virtual_key();
|
||||
key.transition = true;
|
||||
key.prev_state = evt->prev_state();
|
||||
key.repeat_count = evt->repeat_count();
|
||||
@@ -43,7 +44,7 @@ WinKeyInputDriver::WinKeyInputDriver(xe::ui::Window* window)
|
||||
auto global_lock = global_critical_region_.Acquire();
|
||||
|
||||
KeyEvent key;
|
||||
key.vkey = evt->key_code();
|
||||
key.virtual_key = evt->virtual_key();
|
||||
key.transition = false;
|
||||
key.prev_state = evt->prev_state();
|
||||
key.repeat_count = evt->repeat_count();
|
||||
@@ -241,7 +242,7 @@ X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,
|
||||
|
||||
X_RESULT result = X_ERROR_EMPTY;
|
||||
|
||||
uint16_t virtual_key = 0;
|
||||
ui::VirtualKey xinput_virtual_key = ui::VirtualKey::kNone;
|
||||
uint16_t unicode = 0;
|
||||
uint16_t keystroke_flags = 0;
|
||||
uint8_t hid_code = 0;
|
||||
@@ -258,100 +259,93 @@ X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,
|
||||
key_events_.pop();
|
||||
}
|
||||
|
||||
// TODO(DrChat): Some other way to toggle this...
|
||||
if (IS_KEY_TOGGLED(VK_CAPITAL)) {
|
||||
// dpad toggled
|
||||
if (evt.vkey == (0x41)) {
|
||||
// A
|
||||
virtual_key = 0x5812; // VK_PAD_DPAD_LEFT
|
||||
} else if (evt.vkey == (0x44)) {
|
||||
// D
|
||||
virtual_key = 0x5813; // VK_PAD_DPAD_RIGHT
|
||||
} else if (evt.vkey == (0x53)) {
|
||||
// S
|
||||
virtual_key = 0x5811; // VK_PAD_DPAD_DOWN
|
||||
} else if (evt.vkey == (0x57)) {
|
||||
// W
|
||||
virtual_key = 0x5810; // VK_PAD_DPAD_UP
|
||||
}
|
||||
} else {
|
||||
// left stick
|
||||
if (evt.vkey == (0x57)) {
|
||||
// W
|
||||
virtual_key = 0x5820; // VK_PAD_LTHUMB_UP
|
||||
}
|
||||
if (evt.vkey == (0x53)) {
|
||||
// S
|
||||
virtual_key = 0x5821; // VK_PAD_LTHUMB_DOWN
|
||||
}
|
||||
if (evt.vkey == (0x44)) {
|
||||
// D
|
||||
virtual_key = 0x5822; // VK_PAD_LTHUMB_RIGHT
|
||||
}
|
||||
if (evt.vkey == (0x41)) {
|
||||
// A
|
||||
virtual_key = 0x5823; // VK_PAD_LTHUMB_LEFT
|
||||
}
|
||||
switch (evt.virtual_key) {
|
||||
case ui::VirtualKey::kOem1: // ;
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadA;
|
||||
break;
|
||||
case ui::VirtualKey::kOem7: // '
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadB;
|
||||
break;
|
||||
case ui::VirtualKey::kL:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadX;
|
||||
break;
|
||||
case ui::VirtualKey::kP:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadY;
|
||||
break;
|
||||
case ui::VirtualKey::k3:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadRShoulder;
|
||||
break;
|
||||
case ui::VirtualKey::k1:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadLShoulder;
|
||||
break;
|
||||
case ui::VirtualKey::kQ:
|
||||
case ui::VirtualKey::kI:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadLTrigger;
|
||||
break;
|
||||
case ui::VirtualKey::kE:
|
||||
case ui::VirtualKey::kO:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadRTrigger;
|
||||
break;
|
||||
case ui::VirtualKey::kX:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadStart;
|
||||
break;
|
||||
case ui::VirtualKey::kZ:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadBack;
|
||||
break;
|
||||
case ui::VirtualKey::kUp:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadRThumbUp;
|
||||
break;
|
||||
case ui::VirtualKey::kDown:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadRThumbDown;
|
||||
break;
|
||||
case ui::VirtualKey::kRight:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadRThumbRight;
|
||||
break;
|
||||
case ui::VirtualKey::kLeft:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadRThumbLeft;
|
||||
break;
|
||||
default:
|
||||
// TODO(DrChat): Some other way to toggle this...
|
||||
if (IS_KEY_TOGGLED(VK_CAPITAL) || IS_KEY_DOWN(VK_SHIFT)) {
|
||||
// D-pad toggled.
|
||||
switch (evt.virtual_key) {
|
||||
case ui::VirtualKey::kW:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadDpadUp;
|
||||
break;
|
||||
case ui::VirtualKey::kS:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadDpadDown;
|
||||
break;
|
||||
case ui::VirtualKey::kA:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadDpadLeft;
|
||||
break;
|
||||
case ui::VirtualKey::kD:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadDpadRight;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// Left thumbstick.
|
||||
switch (evt.virtual_key) {
|
||||
case ui::VirtualKey::kW:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadLThumbUp;
|
||||
break;
|
||||
case ui::VirtualKey::kS:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadLThumbDown;
|
||||
break;
|
||||
case ui::VirtualKey::kA:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadLThumbLeft;
|
||||
break;
|
||||
case ui::VirtualKey::kD:
|
||||
xinput_virtual_key = ui::VirtualKey::kXInputPadLThumbRight;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Right stick
|
||||
if (evt.vkey == (0x26)) {
|
||||
// Up
|
||||
virtual_key = 0x5830;
|
||||
}
|
||||
if (evt.vkey == (0x28)) {
|
||||
// Down
|
||||
virtual_key = 0x5831;
|
||||
}
|
||||
if (evt.vkey == (0x27)) {
|
||||
// Right
|
||||
virtual_key = 0x5832;
|
||||
}
|
||||
if (evt.vkey == (0x25)) {
|
||||
// Left
|
||||
virtual_key = 0x5833;
|
||||
}
|
||||
|
||||
if (evt.vkey == (0x4C)) {
|
||||
// L
|
||||
virtual_key = 0x5802; // VK_PAD_X
|
||||
} else if (evt.vkey == (VK_OEM_7)) {
|
||||
// '
|
||||
virtual_key = 0x5801; // VK_PAD_B
|
||||
} else if (evt.vkey == (VK_OEM_1)) {
|
||||
// ;
|
||||
virtual_key = 0x5800; // VK_PAD_A
|
||||
} else if (evt.vkey == (0x50)) {
|
||||
// P
|
||||
virtual_key = 0x5803; // VK_PAD_Y
|
||||
}
|
||||
|
||||
if (evt.vkey == (0x58)) {
|
||||
// X
|
||||
virtual_key = 0x5814; // VK_PAD_START
|
||||
}
|
||||
if (evt.vkey == (0x5A)) {
|
||||
// Z
|
||||
virtual_key = 0x5815; // VK_PAD_BACK
|
||||
}
|
||||
if (evt.vkey == (0x51) || evt.vkey == (0x49)) {
|
||||
// Q / I
|
||||
virtual_key = 0x5806; // VK_PAD_LTRIGGER
|
||||
}
|
||||
if (evt.vkey == (0x45) || evt.vkey == (0x4F)) {
|
||||
// E / O
|
||||
virtual_key = 0x5807; // VK_PAD_RTRIGGER
|
||||
}
|
||||
if (evt.vkey == (0x31)) {
|
||||
// 1
|
||||
virtual_key = 0x5805; // VK_PAD_LSHOULDER
|
||||
}
|
||||
if (evt.vkey == (0x33)) {
|
||||
// 3
|
||||
virtual_key = 0x5804; // VK_PAD_RSHOULDER
|
||||
}
|
||||
|
||||
if (virtual_key != 0) {
|
||||
if (xinput_virtual_key != ui::VirtualKey::kNone) {
|
||||
if (evt.transition == true) {
|
||||
keystroke_flags |= 0x0001; // XINPUT_KEYSTROKE_KEYDOWN
|
||||
} else if (evt.transition == false) {
|
||||
@@ -365,7 +359,7 @@ X_RESULT WinKeyInputDriver::GetKeystroke(uint32_t user_index, uint32_t flags,
|
||||
result = X_ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
out_keystroke->virtual_key = virtual_key;
|
||||
out_keystroke->virtual_key = uint16_t(xinput_virtual_key);
|
||||
out_keystroke->unicode = unicode;
|
||||
out_keystroke->flags = keystroke_flags;
|
||||
out_keystroke->user_index = 0;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
#include "xenia/base/mutex.h"
|
||||
#include "xenia/hid/input_driver.h"
|
||||
#include "xenia/ui/virtual_key.h"
|
||||
|
||||
namespace xe {
|
||||
namespace hid {
|
||||
@@ -35,7 +36,7 @@ class WinKeyInputDriver : public InputDriver {
|
||||
|
||||
protected:
|
||||
struct KeyEvent {
|
||||
int vkey = 0;
|
||||
ui::VirtualKey virtual_key = ui::VirtualKey::kNone;
|
||||
int repeat_count = 0;
|
||||
bool transition = false; // going up(false) or going down(true)
|
||||
bool prev_state = false; // down(true) or up(false)
|
||||
|
||||
Reference in New Issue
Block a user