From af4c0710f682e326c5c1b4e31acb39dc3acdd755 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Thu, 17 Jun 2021 05:13:29 +0200
Subject: [PATCH] use rounding for better results

---
 src/winapi_hooks.c | 13 +++++++------
 src/wndproc.c      | 12 +++++-------
 2 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c
index d15f611..c09d186 100644
--- a/src/winapi_hooks.c
+++ b/src/winapi_hooks.c
@@ -1,5 +1,6 @@
 #include <windows.h>
 #include <windowsx.h>
+#include <math.h>
 #include "debug.h"
 #include "dd.h"
 #include "hook.h"
@@ -61,8 +62,8 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
 
         if (g_ddraw->adjmouse)
         {
-            g_ddraw->cursor.x = (DWORD)(pt.x * g_ddraw->render.unscale_w);
-            g_ddraw->cursor.y = (DWORD)(pt.y * g_ddraw->render.unscale_h);
+            g_ddraw->cursor.x = min((DWORD)(roundf(pt.x * g_ddraw->render.unscale_w)), g_ddraw->width);
+            g_ddraw->cursor.y = min((DWORD)(roundf(pt.y * g_ddraw->render.unscale_h)), g_ddraw->height);
         }
         else
         {
@@ -223,8 +224,8 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y)
     {
         if (g_ddraw->adjmouse)
         {
-            pt.x = (LONG)(pt.x * g_ddraw->render.scale_w);
-            pt.y = (LONG)(pt.y * g_ddraw->render.scale_h);
+            pt.x = (LONG)(roundf(pt.x * g_ddraw->render.scale_w));
+            pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h));
         }
 
         pt.x += g_ddraw->render.viewport.x;
@@ -330,8 +331,8 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar
 
         if (g_ddraw->adjmouse)
         {
-            x = (int)(x * g_ddraw->render.scale_w);
-            y = (int)(y * g_ddraw->render.scale_h);
+            x = (int)(roundf(x * g_ddraw->render.scale_w));
+            y = (int)(roundf(y * g_ddraw->render.scale_h));
         }
 
         lParam = MAKELPARAM(x + g_ddraw->render.viewport.x, y + g_ddraw->render.viewport.y);
diff --git a/src/wndproc.c b/src/wndproc.c
index 779f6aa..176aa21 100644
--- a/src/wndproc.c
+++ b/src/wndproc.c
@@ -101,7 +101,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
                 case HTTOPRIGHT:
                     return DefWindowProc(hWnd, uMsg, wParam, lParam);
                 case HTCLIENT:
-                    if (!g_ddraw->locked)
+                    if (!g_ddraw->locked && !g_ddraw->devmode)
                     {
                         real_SetCursor(LoadCursor(NULL, IDC_ARROW));
                         return DefWindowProc(hWnd, uMsg, wParam, lParam);
@@ -691,12 +691,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
 
         if (g_ddraw->devmode)
         {
-            mouse_lock();
-
             if (g_ddraw->adjmouse)
             {
-                g_ddraw->cursor.x = (DWORD)(GET_X_LPARAM(lParam) * g_ddraw->render.unscale_w);
-                g_ddraw->cursor.y = (DWORD)(GET_Y_LPARAM(lParam) * g_ddraw->render.unscale_h);
+                g_ddraw->cursor.x = (DWORD)(roundf(GET_X_LPARAM(lParam) * g_ddraw->render.unscale_w));
+                g_ddraw->cursor.y = (DWORD)(roundf(GET_Y_LPARAM(lParam) * g_ddraw->render.unscale_h));
 
                 lParam = MAKELPARAM(g_ddraw->cursor.x, g_ddraw->cursor.y);
             }
@@ -709,8 +707,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
 
         if (GET_X_LPARAM(lParam) > g_ddraw->width || GET_Y_LPARAM(lParam) > g_ddraw->height)
         {
-            g_ddraw->cursor.x = GET_X_LPARAM(lParam) > g_ddraw->width ? g_ddraw->width : GET_X_LPARAM(lParam);
-            g_ddraw->cursor.y = GET_Y_LPARAM(lParam) > g_ddraw->height ? g_ddraw->height : GET_Y_LPARAM(lParam);
+            g_ddraw->cursor.x = min(GET_X_LPARAM(lParam), g_ddraw->width);
+            g_ddraw->cursor.y = min(GET_Y_LPARAM(lParam), g_ddraw->height);
 
             lParam = MAKELPARAM(g_ddraw->cursor.x, g_ddraw->cursor.y);
         }