diff --git a/sunshine/input.cpp b/sunshine/input.cpp index ab393f48..bf7e7ae3 100644 --- a/sunshine/input.cpp +++ b/sunshine/input.cpp @@ -104,7 +104,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 18204c0f..90ee2e44 100644 --- a/sunshine/input.h +++ b/sunshine/input.h @@ -14,7 +14,7 @@ struct input_t { platf::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 12f291af..061e4875 100644 --- a/sunshine/platform/linux_evdev.cpp +++ b/sunshine/platform/linux_evdev.cpp @@ -66,10 +66,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); @@ -168,6 +176,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: @@ -190,10 +202,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 d4cfe94c..24fce910 100755 --- a/sunshine/platform/windows.cpp +++ b/sunshine/platform/windows.cpp @@ -103,10 +103,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;