Forráskód Böngészése

render: add a hint for toggling relative scaling

Fixes Bugzilla #4811.
hmk 5 éve
szülő
commit
0918903f3c
3 módosított fájl, 18 hozzáadás és 2 törlés
  1. 11 0
      include/SDL_hints.h
  2. 4 2
      src/render/SDL_render.c
  3. 3 0
      src/render/SDL_sysrender.h

+ 11 - 0
include/SDL_hints.h

@@ -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
  *

+ 4 - 2
src/render/SDL_render.c

@@ -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;
@@ -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 {

+ 3 - 0
src/render/SDL_sysrender.h

@@ -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;