Add option to disable high resolution scroll events
This commit is contained in:
@@ -273,6 +273,22 @@ always_send_scancodes
|
|||||||
|
|
||||||
always_send_scancodes = enabled
|
always_send_scancodes = enabled
|
||||||
|
|
||||||
|
high_resolution_scrolling
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
**Description**
|
||||||
|
When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients.
|
||||||
|
|
||||||
|
This can be useful to disable for older applications that scroll too fast with high resolution scroll events.
|
||||||
|
|
||||||
|
**Default**
|
||||||
|
``enabled``
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
high_resolution_scrolling = enabled
|
||||||
|
|
||||||
keybindings
|
keybindings
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
|||||||
@@ -427,6 +427,7 @@ namespace config {
|
|||||||
true, // mouse enabled
|
true, // mouse enabled
|
||||||
true, // controller enabled
|
true, // controller enabled
|
||||||
true, // always send scancodes
|
true, // always send scancodes
|
||||||
|
true, // high resolution scrolling
|
||||||
};
|
};
|
||||||
|
|
||||||
sunshine_t sunshine {
|
sunshine_t sunshine {
|
||||||
@@ -1059,6 +1060,7 @@ namespace config {
|
|||||||
|
|
||||||
bool_f(vars, "always_send_scancodes", input.always_send_scancodes);
|
bool_f(vars, "always_send_scancodes", input.always_send_scancodes);
|
||||||
|
|
||||||
|
bool_f(vars, "high_resolution_scrolling", input.high_resolution_scrolling);
|
||||||
int port = sunshine.port;
|
int port = sunshine.port;
|
||||||
int_between_f(vars, "port"s, port, { 1024 + nvhttp::PORT_HTTPS, 65535 - rtsp_stream::RTSP_SETUP_PORT });
|
int_between_f(vars, "port"s, port, { 1024 + nvhttp::PORT_HTTPS, 65535 - rtsp_stream::RTSP_SETUP_PORT });
|
||||||
sunshine.port = (std::uint16_t) port;
|
sunshine.port = (std::uint16_t) port;
|
||||||
|
|||||||
@@ -121,6 +121,8 @@ namespace config {
|
|||||||
bool controller;
|
bool controller;
|
||||||
|
|
||||||
bool always_send_scancodes;
|
bool always_send_scancodes;
|
||||||
|
|
||||||
|
bool high_resolution_scrolling;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace flag {
|
namespace flag {
|
||||||
|
|||||||
@@ -25,6 +25,11 @@ extern "C" {
|
|||||||
|
|
||||||
#include <boost/endian/buffers.hpp>
|
#include <boost/endian/buffers.hpp>
|
||||||
|
|
||||||
|
// Win32 WHEEL_DELTA constant
|
||||||
|
#ifndef WHEEL_DELTA
|
||||||
|
#define WHEEL_DELTA 120
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std::literals;
|
using namespace std::literals;
|
||||||
namespace input {
|
namespace input {
|
||||||
|
|
||||||
@@ -160,7 +165,9 @@ namespace input {
|
|||||||
touch_port_event { std::move(touch_port_event) },
|
touch_port_event { std::move(touch_port_event) },
|
||||||
feedback_queue { std::move(feedback_queue) },
|
feedback_queue { std::move(feedback_queue) },
|
||||||
mouse_left_button_timeout {},
|
mouse_left_button_timeout {},
|
||||||
touch_port { { 0, 0, 0, 0 }, 0, 0, 1.0f } {}
|
touch_port { { 0, 0, 0, 0 }, 0, 0, 1.0f },
|
||||||
|
accumulated_vscroll_delta {},
|
||||||
|
accumulated_hscroll_delta {} {}
|
||||||
|
|
||||||
// Keep track of alt+ctrl+shift key combo
|
// Keep track of alt+ctrl+shift key combo
|
||||||
int shortcutFlags;
|
int shortcutFlags;
|
||||||
@@ -177,6 +184,9 @@ namespace input {
|
|||||||
thread_pool_util::ThreadPool::task_id_t mouse_left_button_timeout;
|
thread_pool_util::ThreadPool::task_id_t mouse_left_button_timeout;
|
||||||
|
|
||||||
input::touch_port_t touch_port;
|
input::touch_port_t touch_port;
|
||||||
|
|
||||||
|
int32_t accumulated_vscroll_delta;
|
||||||
|
int32_t accumulated_hscroll_delta;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -790,22 +800,54 @@ namespace input {
|
|||||||
update_shortcutFlags(&input->shortcutFlags, map_keycode(keyCode), release);
|
update_shortcutFlags(&input->shortcutFlags, map_keycode(keyCode), release);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called to pass a vertical scroll message the platform backend.
|
||||||
|
* @param input The input context pointer.
|
||||||
|
* @param packet The scroll packet.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
passthrough(PNV_SCROLL_PACKET packet) {
|
passthrough(std::shared_ptr<input_t> &input, PNV_SCROLL_PACKET packet) {
|
||||||
if (!config::input.mouse) {
|
if (!config::input.mouse) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
platf::scroll(platf_input, util::endian::big(packet->scrollAmt1));
|
if (config::input.high_resolution_scrolling) {
|
||||||
|
platf::scroll(platf_input, util::endian::big(packet->scrollAmt1));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
input->accumulated_vscroll_delta += util::endian::big(packet->scrollAmt1);
|
||||||
|
auto full_ticks = input->accumulated_vscroll_delta / WHEEL_DELTA;
|
||||||
|
if (full_ticks) {
|
||||||
|
// Send any full ticks that have accumulated and store the rest
|
||||||
|
platf::scroll(platf_input, full_ticks * WHEEL_DELTA);
|
||||||
|
input->accumulated_vscroll_delta -= full_ticks * WHEEL_DELTA;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Called to pass a horizontal scroll message the platform backend.
|
||||||
|
* @param input The input context pointer.
|
||||||
|
* @param packet The scroll packet.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
passthrough(PSS_HSCROLL_PACKET packet) {
|
passthrough(std::shared_ptr<input_t> &input, PSS_HSCROLL_PACKET packet) {
|
||||||
if (!config::input.mouse) {
|
if (!config::input.mouse) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
platf::hscroll(platf_input, util::endian::big(packet->scrollAmount));
|
if (config::input.high_resolution_scrolling) {
|
||||||
|
platf::hscroll(platf_input, util::endian::big(packet->scrollAmount));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
input->accumulated_hscroll_delta += util::endian::big(packet->scrollAmount);
|
||||||
|
auto full_ticks = input->accumulated_hscroll_delta / WHEEL_DELTA;
|
||||||
|
if (full_ticks) {
|
||||||
|
// Send any full ticks that have accumulated and store the rest
|
||||||
|
platf::hscroll(platf_input, full_ticks * WHEEL_DELTA);
|
||||||
|
input->accumulated_hscroll_delta -= full_ticks * WHEEL_DELTA;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1540,10 +1582,10 @@ namespace input {
|
|||||||
passthrough(input, (PNV_MOUSE_BUTTON_PACKET) payload);
|
passthrough(input, (PNV_MOUSE_BUTTON_PACKET) payload);
|
||||||
break;
|
break;
|
||||||
case SCROLL_MAGIC_GEN5:
|
case SCROLL_MAGIC_GEN5:
|
||||||
passthrough((PNV_SCROLL_PACKET) payload);
|
passthrough(input, (PNV_SCROLL_PACKET) payload);
|
||||||
break;
|
break;
|
||||||
case SS_HSCROLL_MAGIC:
|
case SS_HSCROLL_MAGIC:
|
||||||
passthrough((PSS_HSCROLL_PACKET) payload);
|
passthrough(input, (PSS_HSCROLL_PACKET) payload);
|
||||||
break;
|
break;
|
||||||
case KEY_DOWN_EVENT_MAGIC:
|
case KEY_DOWN_EVENT_MAGIC:
|
||||||
case KEY_UP_EVENT_MAGIC:
|
case KEY_UP_EVENT_MAGIC:
|
||||||
|
|||||||
@@ -392,6 +392,18 @@
|
|||||||
In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key
|
In those cases it may be useful to make Sunshine think the Right Alt key is the Windows key
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- High resolution scrolling support -->
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="high_resolution_scrolling" class="form-label">High Resolution Scrolling Support</label>
|
||||||
|
<select id="high_resolution_scrolling" class="form-select" v-model="config.high_resolution_scrolling">
|
||||||
|
<option value="disabled">Disabled</option>
|
||||||
|
<option value="enabled">Enabled</option>
|
||||||
|
</select>
|
||||||
|
<div class="form-text">
|
||||||
|
When enabled, Sunshine will pass through high resolution scroll events from Moonlight clients.<br />
|
||||||
|
This can be useful to disable for older applications that scroll too fast with high resolution scroll events.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!--Files Tab-->
|
<!--Files Tab-->
|
||||||
<div v-if="currentTab === 'av'" class="config-page">
|
<div v-if="currentTab === 'av'" class="config-page">
|
||||||
@@ -851,6 +863,7 @@
|
|||||||
"amd_vbaq": "enabled",
|
"amd_vbaq": "enabled",
|
||||||
"capture": "",
|
"capture": "",
|
||||||
"controller": "enabled",
|
"controller": "enabled",
|
||||||
|
"high_resolution_scrolling": "enabled",
|
||||||
"install_steam_audio_drivers": "enabled",
|
"install_steam_audio_drivers": "enabled",
|
||||||
"ds4_back_as_touchpad_click": "enabled",
|
"ds4_back_as_touchpad_click": "enabled",
|
||||||
"dwmflush": "enabled",
|
"dwmflush": "enabled",
|
||||||
|
|||||||
Reference in New Issue
Block a user