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,15 +654,17 @@ 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) { - event->motion.xrel = SDL_max(1, (int)(event->motion.xrel / (scale.x * renderer->dpi_scale.x))); - } else if (event->motion.xrel < 0) { - event->motion.xrel = SDL_min(-1, (int)(event->motion.xrel / (scale.x * renderer->dpi_scale.x))); + if (event->motion.xrel != 0) { + 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) { - event->motion.yrel = SDL_max(1, (int)(event->motion.yrel / (scale.y * renderer->dpi_scale.y))); - } else if (event->motion.yrel < 0) { - event->motion.yrel = SDL_min(-1, (int)(event->motion.yrel / (scale.y * renderer->dpi_scale.y))); + if (event->motion.yrel != 0) { + float rel = renderer->yrel + event->motion.yrel / (scale.y * renderer->dpi_scale.y); + float trunc = truncf(rel); + renderer->yrel = rel - trunc; + event->motion.yrel = trunc; } } } 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,10 @@ struct SDL_Renderer /* The pixel to point coordinate scale */ SDL_FPoint dpi_scale; + /* Remainder from scaled relative motion */ + float xrel; + float yrel; + /* The list of textures */ SDL_Texture *textures; SDL_Texture *target;