mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-15 06:04:49 +01:00
fix for uncontrollable mouse cursor on window 10 fall creators update
This commit is contained in:
parent
d858afe38a
commit
7a17726679
8
ddraw.rc
8
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"
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
69
src/main.c
69
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')
|
||||
{
|
||||
|
97
src/mouse.c
97
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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user