[client] added new feature input:rawMouse for RAW mouse input

This option allows those that want it (gamers) to bypass all X11 mouse
acceleration and smoothing giving true 1:1 input to the guest while in
capture mode. Note: only supported for X11!
This commit is contained in:
Geoffrey McRae 2021-01-08 03:12:42 +11:00
parent c99561c2ac
commit 526572c9c9
3 changed files with 26 additions and 19 deletions

View File

@ -282,6 +282,13 @@ static struct Option options[] =
.type = OPTION_TYPE_INT, .type = OPTION_TYPE_INT,
.value.x_int = 0, .value.x_int = 0,
}, },
{
.module = "input",
.name = "rawMouse",
.description = "Use RAW mouse input when in capture mode (good for gaming)",
.type = OPTION_TYPE_BOOL,
.value.x_bool = false,
},
{ {
.module = "input", .module = "input",
.name = "mouseRedraw", .name = "mouseRedraw",
@ -447,13 +454,14 @@ bool config_load(int argc, char * argv[])
params.showAlerts = option_get_bool ("win", "alerts" ); params.showAlerts = option_get_bool ("win", "alerts" );
params.quickSplash = option_get_bool ("win", "quickSplash" ); params.quickSplash = option_get_bool ("win", "quickSplash" );
params.grabKeyboard = option_get_bool ("input", "grabKeyboard" ); params.grabKeyboard = option_get_bool("input", "grabKeyboard" );
params.grabKeyboardOnFocus = option_get_bool ("input", "grabKeyboardOnFocus"); params.grabKeyboardOnFocus = option_get_bool("input", "grabKeyboardOnFocus");
params.escapeKey = option_get_int ("input", "escapeKey" ); params.escapeKey = option_get_int ("input", "escapeKey" );
params.ignoreWindowsKeys = option_get_bool ("input", "ignoreWindowsKeys" ); params.ignoreWindowsKeys = option_get_bool("input", "ignoreWindowsKeys" );
params.hideMouse = option_get_bool ("input", "hideCursor" ); params.hideMouse = option_get_bool("input", "hideCursor" );
params.mouseSens = option_get_int ("input", "mouseSens" ); params.mouseSens = option_get_int ("input", "mouseSens" );
params.mouseRedraw = option_get_bool ("input", "mouseRedraw" ); params.rawMouse = option_get_bool("input", "rawMouse" );
params.mouseRedraw = option_get_bool("input", "mouseRedraw" );
params.minimizeOnFocusLoss = option_get_bool("win", "minimizeOnFocusLoss"); params.minimizeOnFocusLoss = option_get_bool("win", "minimizeOnFocusLoss");

View File

@ -1254,24 +1254,21 @@ int eventFilter(void * userdata, SDL_Event * event)
break; break;
XIRawEvent *raw = cookie->data; XIRawEvent *raw = cookie->data;
double axis[2];
#if 0
/* true RAW mode, however the UX is pretty poor with it, perhaps
* make this an option later? */
const double x = raw->raw_values[0];
const double y = raw->raw_values[1];
handleMouseRawEvent(x, y);
#else
/* select the active validators for the X & Y axis */ /* select the active validators for the X & Y axis */
double *valuator = raw->valuators.values; double *valuator = raw->valuators.values;
double *value = raw->raw_values; double *value = raw->raw_values;
int count = 0; int count = 0;
double axis[2];
for(int i = 0; i < raw->valuators.mask_len * 8; ++i) for(int i = 0; i < raw->valuators.mask_len * 8; ++i)
{ {
if (XIMaskIsSet(raw->valuators.mask, i)) if (XIMaskIsSet(raw->valuators.mask, i))
{ {
if (params.rawMouse)
axis[count++] = *value;
else
axis[count++] = *valuator; axis[count++] = *valuator;
if (count == 2) if (count == 2)
break; break;
++valuator; ++valuator;
@ -1282,15 +1279,16 @@ int eventFilter(void * userdata, SDL_Event * event)
/* filter out duplicate events */ /* filter out duplicate events */
static Time prev_time = 0; static Time prev_time = 0;
static double prev_axis[2] = {0}; static double prev_axis[2] = {0};
if (raw->time == prev_time && axis[0] == prev_axis[0] && axis[1] == prev_axis[1]) if (raw->time == prev_time &&
axis[0] == prev_axis[0] &&
axis[1] == prev_axis[1])
break; break;
prev_time = raw->time; prev_time = raw->time;
prev_axis[0] = axis[0]; prev_axis[0] = axis[0];
prev_axis[1] = axis[1]; prev_axis[1] = axis[1];
handleMouseRawEvent(axis[0], axis[1]); handleMouseRawEvent(axis[0], axis[1]);
#endif
} }
else else
{ {

View File

@ -138,6 +138,7 @@ struct AppParams
const char * windowTitle; const char * windowTitle;
bool mouseRedraw; bool mouseRedraw;
int mouseSens; int mouseSens;
bool rawMouse;
}; };
struct CBRequest struct CBRequest