diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index c805ff5c2e..e25695df6c 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -350,7 +350,7 @@ int SDL_SendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_MouseID mouseI return SDL_PrivateSendMouseMotion(timestamp, window, mouseID, relative, x, y); } -static float CalculateSystemScale(SDL_Mouse *mouse, const float *x, const float *y) +static float CalculateSystemScale(SDL_Mouse *mouse, SDL_Window *window, const float *x, const float *y) { int i; int n = mouse->num_system_scale_values; @@ -359,23 +359,38 @@ static float CalculateSystemScale(SDL_Mouse *mouse, const float *x, const float /* If we're using a single scale value, return that */ if (n == 1) { - return v[0]; - } - - speed = SDL_sqrtf((*x * *x) + (*y * *y)); - for (i = 0; i < (n - 2); i += 2) { - if (speed < v[i + 2]) { - break; + scale = v[0]; + } else { + speed = SDL_sqrtf((*x * *x) + (*y * *y)); + for (i = 0; i < (n - 2); i += 2) { + if (speed < v[i + 2]) { + break; + } + } + if (i == (n - 2)) { + scale = v[n - 1]; + } else if (speed <= v[i]) { + scale = v[i + 1]; + } else { + coef = (speed - v[i]) / (v[i + 2] - v[i]); + scale = v[i + 1] + (coef * (v[i + 3] - v[i + 1])); } } - if (i == (n - 2)) { - scale = v[n - 1]; - } else if (speed <= v[i]) { - scale = v[i + 1]; - } else { - coef = (speed - v[i]) / (v[i + 2] - v[i]); - scale = v[i + 1] + (coef * (v[i + 3] - v[i + 1])); +#ifdef __WIN32__ + { + /* On Windows the mouse speed is affected by the content scale */ + SDL_VideoDisplay *display; + + if (window) { + display = SDL_GetVideoDisplayForWindow(window); + } else { + display = SDL_GetVideoDisplay(SDL_GetPrimaryDisplay()); + } + if (display) { + scale *= display->content_scale; + } } +#endif return scale; } @@ -421,14 +436,14 @@ int SDL_SetMouseSystemScale(int num_values, const float *values) return 0; } -static void GetScaledMouseDeltas(SDL_Mouse *mouse, float *x, float *y) +static void GetScaledMouseDeltas(SDL_Mouse *mouse, SDL_Window *window, float *x, float *y) { if (mouse->relative_mode) { if (mouse->enable_relative_speed_scale) { *x *= mouse->relative_speed_scale; *y *= mouse->relative_speed_scale; } else if (mouse->enable_relative_system_scale && mouse->num_system_scale_values > 0) { - float relative_system_scale = CalculateSystemScale(mouse, x, y); + float relative_system_scale = CalculateSystemScale(mouse, window, x, y); *x *= relative_system_scale; *y *= relative_system_scale; } @@ -529,7 +544,7 @@ static int SDL_PrivateSendMouseMotion(Uint64 timestamp, SDL_Window *window, SDL_ } if (relative) { - GetScaledMouseDeltas(mouse, &x, &y); + GetScaledMouseDeltas(mouse, window, &x, &y); xrel = x; yrel = y; x = (mouse->last_x + xrel);