# HG changeset patch # User hmk # Date 1569873256 -10800 # Mon Sep 30 22:54:16 2019 +0300 # Node ID bb6ade3c7daef8e93582aea6789e9509731e07e8 # Parent 57c63adfdad172f03e53b182e3a4455bd9d0d04a add a hint for toggling relative scaling diff --git a/include/SDL_hints.h b/include/SDL_hints.h --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -289,6 +289,17 @@ extern "C" { #define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE" /** + * \brief A variable controlling whether relative mouse motion is affected by renderer scaling + * + * This variable can be set to the following values: + * "0" - Relative motion is unaffected by DPI or renderer's logical size + * "1" - Relative motion is scaled according to DPI scaling and logical size + * + * By default relative mouse deltas are affected by DPI and renderer scaling + */ +#define SDL_HINT_MOUSE_RELATIVE_SCALING "SDL_MOUSE_RELATIVE_SCALING" + +/** * \brief A variable controlling whether relative mouse mode is implemented using mouse warping * * This variable can be set to the following values: diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -654,13 +654,13 @@ SDL_RendererEventWatch(void *userdata, S event->motion.y -= (int)(viewport.y * renderer->dpi_scale.y); event->motion.x = (int)(event->motion.x / (scale.x * renderer->dpi_scale.x)); event->motion.y = (int)(event->motion.y / (scale.y * renderer->dpi_scale.y)); - if (event->motion.xrel != 0) { + if (event->motion.xrel != 0 && renderer->relative_scaling) { float rel = renderer->xrel + event->motion.xrel / (scale.x * renderer->dpi_scale.x); float trunc = truncf(rel); renderer->xrel = rel - trunc; event->motion.xrel = trunc; } - if (event->motion.yrel != 0) { + if (event->motion.yrel != 0 && renderer->relative_scaling) { float rel = renderer->yrel + event->motion.yrel / (scale.y * renderer->dpi_scale.y); float trunc = truncf(rel); renderer->yrel = rel - trunc; @@ -865,6 +865,8 @@ SDL_CreateRenderer(SDL_Window * window, } } + renderer->relative_scaling = SDL_GetHintBoolean(SDL_HINT_MOUSE_RELATIVE_SCALING, SDL_TRUE); + if (SDL_GetWindowFlags(window) & (SDL_WINDOW_HIDDEN|SDL_WINDOW_MINIMIZED)) { renderer->hidden = SDL_TRUE; } else { diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h --- a/src/render/SDL_sysrender.h +++ b/src/render/SDL_sysrender.h @@ -194,6 +194,9 @@ struct SDL_Renderer /* The pixel to point coordinate scale */ SDL_FPoint dpi_scale; + /* Whether or not to scale relative mouse motion */ + SDL_bool relative_scaling; + /* Remainder from scaled relative motion */ float xrel; float yrel;