From 7a17726679c82baa0e193b31d8580285fe15476c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Mar 2018 13:50:56 +0100 Subject: [PATCH] fix for uncontrollable mouse cursor on window 10 fall creators update --- ddraw.rc | 8 ++--- inc/main.h | 4 --- src/main.c | 69 ++++--------------------------------- src/mouse.c | 97 ++++++++++++++++++++--------------------------------- 4 files changed, 47 insertions(+), 131 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 505c063..9883af7 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -1,6 +1,6 @@ 1 VERSIONINFO -FILEVERSION 1,1,4,0 -PRODUCTVERSION 1,1,4,0 +FILEVERSION 1,1,4,1 +PRODUCTVERSION 1,1,4,1 { BLOCK "StringFileInfo" { @@ -8,13 +8,13 @@ PRODUCTVERSION 1,1,4,0 { VALUE "CompanyName", "cncnet.org" VALUE "FileDescription", "DirectDraw replacement for C&C95 and Red Alert" - VALUE "FileVersion", "1.1.4.0" + VALUE "FileVersion", "1.1.4.1" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2017" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "DirectDraw replacement for C&C95 and Red Alert" - VALUE "ProductVersion", "1.1.4.0" + VALUE "ProductVersion", "1.1.4.1" VALUE "Comments", "https://cncnet.org" } } diff --git a/inc/main.h b/inc/main.h index 4f65e1b..4c07df6 100644 --- a/inc/main.h +++ b/inc/main.h @@ -73,14 +73,10 @@ typedef struct IDirectDrawImpl HWND hWnd; LRESULT CALLBACK (*WndProc)(HWND, UINT, WPARAM, LPARAM); struct { float x; float y; } cursor; - POINT center; struct { int width; int height; } cursorclip; BOOL locked; - BOOL adjmouse; - BOOL mhack; BOOL devmode; BOOL vsync; - float sensitivity; BOOL vhack; BOOL isredalert; DWORD WINAPI (*renderer)(void); diff --git a/src/main.c b/src/main.c index 96a7847..1c8754f 100644 --- a/src/main.c +++ b/src/main.c @@ -296,12 +296,6 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD if (This->render.width > This->mode.dmPelsWidth || This->render.height > This->mode.dmPelsHeight) { // chosen game resolution higher than current resolution, use window mode for this case - if (!This->mhack) - { - This->mhack = TRUE; - mouse_init(); - } - This->windowed = TRUE; } else @@ -331,12 +325,6 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD This->render.mode.dmPelsWidth = This->render.width; This->render.mode.dmPelsHeight = This->render.height; - if (!This->mhack) - { - This->mhack = TRUE; - mouse_init(); - } - This->windowed = TRUE; } } @@ -443,12 +431,6 @@ void ToggleFullscreen() { if(ChangeDisplaySettings(&ddraw->mode, 0) == DISP_CHANGE_SUCCESSFUL) { - if (!ddraw->devmode && !ddraw->mhack) - { - ddraw->mhack = TRUE; - mouse_init(); - } - if (!ddraw->border) { SetWindowLong(ddraw->hWnd, GWL_STYLE, GetWindowLong(ddraw->hWnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); @@ -590,7 +572,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: - if (ddraw->mhack && !ddraw->locked) + if (!ddraw->devmode && !ddraw->locked) { ddraw->cursor.x = LOWORD(lParam) * ((float)ddraw->width / ddraw->render.width); ddraw->cursor.y = HIWORD(lParam) * ((float)ddraw->height / ddraw->render.height); @@ -604,22 +586,18 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: case WM_MOUSEMOVE: - if (ddraw->mhack) - { - if (!ddraw->locked) - { - return 0; - } - fake_GetCursorPos(NULL); /* update our own cursor */ - lParam = MAKELPARAM(ddraw->cursor.x, ddraw->cursor.y); + if (!ddraw->devmode && !ddraw->locked) + { + return 0; } + ddraw->cursor.x = GET_X_LPARAM(lParam); + ddraw->cursor.y = GET_Y_LPARAM(lParam); + if (ddraw->devmode) { mouse_lock(); - ddraw->cursor.x = GET_X_LPARAM(lParam); - ddraw->cursor.y = GET_Y_LPARAM(lParam); } break; @@ -895,12 +873,6 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk "vsync=false\n" "; scaling filter, nearest = sharp, linear = smooth (OpenGL only)\n" "filter=nearest\n" - "; automatic mouse sensitivity scaling\n" - "adjmouse=false\n" - "; manual sensitivity scaling, 0 = disabled, 0.5 = half, 1.0 = normal\n" - "sensitivity=0.0\n" - "; enable C&C/RA mouse hack\n" - "mhack=false\n" "; enable C&C video resize hack, auto = auto-detect game, true = forced, false = disabled\n" "vhack=false\n" "; switch between OpenGL (opengl) and software (gdi) renderers, latter supports less features but might be faster depending on the GPU\n" @@ -994,35 +966,11 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk { This->render.filter = 0; } - - GetPrivateProfileStringA("ddraw", "adjmouse", "FALSE", tmp, sizeof(tmp), SettingsIniPath); - if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') - { - This->adjmouse = TRUE; - } - else - { - This->adjmouse = FALSE; - } - - GetPrivateProfileStringA("ddraw", "mhack", "TRUE", tmp, sizeof(tmp), SettingsIniPath); - if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') - { - This->mhack = TRUE; - } - else - { - This->mhack = FALSE; - } - - if (This->windowed) - This->mhack = TRUE; GetPrivateProfileStringA("ddraw", "devmode", "FALSE", tmp, sizeof(tmp), SettingsIniPath); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { This->devmode = TRUE; - This->mhack = FALSE; } else { @@ -1039,9 +987,6 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->vsync = FALSE; } - GetPrivateProfileStringA("ddraw", "sensitivity", "0", tmp, sizeof(tmp), SettingsIniPath); - This->sensitivity = strtof(tmp, NULL); - GetPrivateProfileStringA("ddraw", "vhack", "false", tmp, sizeof(tmp), SettingsIniPath); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { diff --git a/src/mouse.c b/src/mouse.c index e3780f6..dcf442e 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -24,7 +24,7 @@ #define MAX_HOOKS 16 BOOL mouse_active = FALSE; -int real_height = 0; +int yAdjust = 0; struct hook { char name[32]; void *func; }; struct hack @@ -35,47 +35,6 @@ struct hack BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { - POINT pt; - - if(mouse_active && ddraw->locked) - { - GetCursorPos(&pt); - - if(ddraw->sensitivity > 0 && ddraw->sensitivity < 10) - { - ddraw->cursor.x += (pt.x - ddraw->center.x) * ddraw->sensitivity; - ddraw->cursor.y += (pt.y - ddraw->center.y) * ddraw->sensitivity; - } - else if(ddraw->adjmouse) - { - ddraw->cursor.x += (pt.x - ddraw->center.x) * ((float)ddraw->width / ddraw->render.width); - ddraw->cursor.y += (pt.y - ddraw->center.y) * ((float)ddraw->height / ddraw->render.height); - } - else - { - ddraw->cursor.x += pt.x - ddraw->center.x; - ddraw->cursor.y += pt.y - ddraw->center.y; - } - - if(ddraw->cursor.x < 0) ddraw->cursor.x = 0; - if(ddraw->cursor.y < 0) ddraw->cursor.y = 0; - if(ddraw->cursor.x > ddraw->cursorclip.width-1) ddraw->cursor.x = ddraw->cursorclip.width-1; - - if(real_height > 0 && real_height < ddraw->cursorclip.height) - { - if(ddraw->cursor.y > real_height-1) ddraw->cursor.y = real_height-1; - } - else - { - if(ddraw->cursor.y > ddraw->cursorclip.height-1) ddraw->cursor.y = ddraw->cursorclip.height-1; - } - - if(pt.x != ddraw->center.x || pt.y != ddraw->center.y) - { - SetCursorPos(ddraw->center.x, ddraw->center.y); - } - } - if (lpPoint) { lpPoint->x = (int)ddraw->cursor.x; @@ -89,7 +48,8 @@ BOOL WINAPI fake_ClipCursor(const RECT *lpRect) if(lpRect) { /* hack for 640x480 mode */ - real_height = lpRect->bottom; + if (lpRect->bottom == 400 && ddraw->height == 480) + yAdjust = 40; } return TRUE; } @@ -195,12 +155,25 @@ void mouse_lock() if (mouse_active && !ddraw->locked) { - GetWindowRect(ddraw->hWnd, &rc); + // Get the window client area. + GetClientRect(ddraw->hWnd, &rc); - ddraw->center.x = (rc.right + rc.left) / 2; - ddraw->center.y = (rc.top + rc.bottom) / 2; + // stretching fix + rc.right -= (ddraw->render.width - ddraw->width); + rc.bottom -= (ddraw->render.height - ddraw->height); - SetCursorPos(ddraw->center.x, ddraw->center.y); + // Convert the client area to screen coordinates. + POINT pt = { rc.left, rc.top }; + POINT pt2 = { rc.right, rc.bottom }; + ClientToScreen(ddraw->hWnd, &pt); + ClientToScreen(ddraw->hWnd, &pt2); + + SetRect(&rc, pt.x, pt.y, pt2.x, pt2.y); + + rc.bottom -= yAdjust * 2; + + SetCursorPos(rc.left + ddraw->cursor.x, rc.top + ddraw->cursor.y - yAdjust); + SetCapture(ddraw->hWnd); ClipCursor(&rc); @@ -212,7 +185,6 @@ void mouse_lock() void mouse_unlock() { RECT rc; - POINT pt; if (ddraw->devmode) { @@ -229,28 +201,31 @@ void mouse_unlock() { ddraw->locked = FALSE; - GetWindowRect(ddraw->hWnd, &rc); - - pt.x = (rc.right - rc.left - ddraw->render.width) / 2; - pt.y = (rc.bottom - rc.top - ddraw->render.height - pt.x); - rc.left += pt.x; - rc.top += pt.y; - - SetCursorPos(rc.left + (ddraw->cursor.x * ddraw->render.width / ddraw->width), rc.top + (ddraw->cursor.y * ddraw->render.height / ddraw->height)); + // Get the window client area. + GetClientRect(ddraw->hWnd, &rc); + + // Convert the client area to screen coordinates. + POINT pt = { rc.left, rc.top }; + POINT pt2 = { rc.right, rc.bottom }; + ClientToScreen(ddraw->hWnd, &pt); + ClientToScreen(ddraw->hWnd, &pt2); + SetRect(&rc, pt.x, pt.y, pt2.x, pt2.y); + while(ShowCursor(TRUE) < 0); SetCursor(LoadCursor(NULL, IDC_ARROW)); ClipCursor(NULL); ReleaseCapture(); + + SetCursorPos( + rc.left + (ddraw->cursor.x * ((float)ddraw->render.width / ddraw->width)), + rc.top + ((ddraw->cursor.y + yAdjust) * ((float)ddraw->render.height / ddraw->height))); } } void mouse_init() { - if(ddraw->mhack || ddraw->devmode) - { - hack_iat(&hacks[0]); - mouse_active = TRUE; - } + hack_iat(&hacks[0]); + mouse_active = TRUE; }