Skip to content

Commit

Permalink
render: add a hint for toggling relative scaling
Browse files Browse the repository at this point in the history
Fixes Bugzilla #4811.
  • Loading branch information
hmk committed Sep 30, 2019
1 parent aa18804 commit 0918903
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
11 changes: 11 additions & 0 deletions include/SDL_hints.h
Expand Up @@ -314,6 +314,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
*
Expand Down
6 changes: 4 additions & 2 deletions src/render/SDL_render.c
Expand Up @@ -660,13 +660,13 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
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 = SDL_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 = SDL_truncf(rel);
renderer->yrel = rel - trunc;
Expand Down Expand Up @@ -875,6 +875,8 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
}
}

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 {
Expand Down
3 changes: 3 additions & 0 deletions src/render/SDL_sysrender.h
Expand Up @@ -189,6 +189,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;
Expand Down

0 comments on commit 0918903

Please sign in to comment.