From 992cce946c9804b6073be7b9104c393e42c4ff9c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 18 Jan 2020 16:08:07 -0800 Subject: [PATCH] Add support for X1/X2 mouse buttons and Super keys --- sunshine/input.cpp | 2 +- sunshine/input.h | 2 +- sunshine/platform/linux_evdev.cpp | 18 +++++++++++++----- sunshine/platform/windows.cpp | 12 +++++++++++- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/sunshine/input.cpp b/sunshine/input.cpp index cf46cc96..55a002c0 100644 --- a/sunshine/input.cpp +++ b/sunshine/input.cpp @@ -120,7 +120,7 @@ void passthrough(std::shared_ptr &input, PNV_MOUSE_BUTTON_PACKET packet display_cursor = true; auto button = util::endian::big(packet->button); - if(button > 0 && button < 4) { + if(button > 0 && button < input->mouse_press.size()) { input->mouse_press[button] = packet->action != BUTTON_RELEASED; } diff --git a/sunshine/input.h b/sunshine/input.h index c266afbc..aef29147 100644 --- a/sunshine/input.h +++ b/sunshine/input.h @@ -24,7 +24,7 @@ struct input_t { gamepad_state_t gamepad_state; std::unordered_map key_press; - std::array mouse_press; + std::array mouse_press; util::ThreadPool::task_id_t back_timeout_id; diff --git a/sunshine/platform/linux_evdev.cpp b/sunshine/platform/linux_evdev.cpp index c26622b9..6bf90b01 100644 --- a/sunshine/platform/linux_evdev.cpp +++ b/sunshine/platform/linux_evdev.cpp @@ -64,10 +64,18 @@ void button_mouse(input_t &input, int button, bool release) { btn_type = BTN_MIDDLE; scan = 90003; } - else { + else if(button == 3) { btn_type = BTN_RIGHT; scan = 90002; } + else if(button == 4) { + btn_type = BTN_SIDE; + scan = 90004; + } + else { + btn_type = BTN_EXTRA; + scan = 90005; + } auto mouse = ((input_raw_t*)input.get())->mouse_input.get(); libevdev_uinput_write_event(mouse, EV_MSC, MSC_SCAN, scan); @@ -166,6 +174,10 @@ uint16_t keysym(uint16_t modcode) { return XK_Alt_L; case 0xA5: /* return XK_Alt_R; */ return XK_Super_L; + case 0x5B: + return XK_Super_L; + case 0x5C: + return XK_Super_R; case 0xBA: return XK_semicolon; case 0xBB: @@ -188,10 +200,6 @@ uint16_t keysym(uint16_t modcode) { return XK_bracketright; case 0xDE: return XK_apostrophe; - case 0x01: //FIXME: Moonlight doesn't support Super key - return XK_Super_L; - case 0x02: - return XK_Super_R; } return modcode; diff --git a/sunshine/platform/windows.cpp b/sunshine/platform/windows.cpp index 2d4e6206..e60a52ac 100755 --- a/sunshine/platform/windows.cpp +++ b/sunshine/platform/windows.cpp @@ -47,10 +47,20 @@ void button_mouse(input_t &input, int button, bool release) { mi.dwFlags = release ? MOUSEEVENTF_MIDDLEUP : MOUSEEVENTF_MIDDLEDOWN; mouse_button = VK_MBUTTON; } - else { + else if(button == 3) { mi.dwFlags = release ? MOUSEEVENTF_RIGHTUP : MOUSEEVENTF_RIGHTDOWN; mouse_button = VK_RBUTTON; } + else if(button == 4) { + mi.dwFlags = release ? MOUSEEVENTF_XUP : MOUSEEVENTF_XDOWN; + mi.mouseData = XBUTTON1; + mouse_button = VK_XBUTTON1; + } + else { + mi.dwFlags = release ? MOUSEEVENTF_XUP : MOUSEEVENTF_XDOWN; + mi.mouseData = XBUTTON2; + mouse_button = VK_XBUTTON2; + } auto key_state = GetAsyncKeyState(mouse_button); bool key_state_down = (key_state & KEY_STATE_DOWN) != 0;