2020-10-13 09:20:52 +02:00
|
|
|
#include <windows.h>
|
|
|
|
#include <windowsx.h>
|
2021-06-17 06:13:16 +02:00
|
|
|
#include <math.h>
|
2020-10-13 09:20:52 +02:00
|
|
|
#include "dllmain.h"
|
|
|
|
#include "dd.h"
|
|
|
|
#include "hook.h"
|
|
|
|
#include "mouse.h"
|
|
|
|
#include "render_d3d9.h"
|
|
|
|
#include "config.h"
|
|
|
|
#include "screenshot.h"
|
|
|
|
#include "winapi_hooks.h"
|
2023-08-02 17:09:01 +02:00
|
|
|
#include "directinput.h"
|
2020-10-13 09:20:52 +02:00
|
|
|
#include "wndproc.h"
|
|
|
|
#include "utils.h"
|
2021-02-18 05:00:35 +01:00
|
|
|
#include "debug.h"
|
2020-10-13 09:20:52 +02:00
|
|
|
|
|
|
|
|
|
|
|
LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
|
|
{
|
2023-08-10 14:47:26 +02:00
|
|
|
#ifdef _DEBUG
|
2022-09-05 06:16:21 +02:00
|
|
|
if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR &&
|
2022-09-05 06:25:33 +02:00
|
|
|
uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT &&
|
2023-08-15 08:59:26 +02:00
|
|
|
uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER &&
|
|
|
|
uMsg != WM_D3D9DEVICELOST)
|
2022-09-05 06:07:23 +02:00
|
|
|
{
|
2023-08-10 14:47:26 +02:00
|
|
|
TRACE(
|
2023-08-22 16:04:50 +02:00
|
|
|
" uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n",
|
2022-09-05 06:07:23 +02:00
|
|
|
dbg_mes_to_str(uMsg),
|
|
|
|
uMsg,
|
|
|
|
wParam,
|
|
|
|
wParam,
|
|
|
|
lParam,
|
2023-08-22 16:04:50 +02:00
|
|
|
lParam,
|
|
|
|
(int)(short)LOWORD(lParam),
|
|
|
|
(int)(short)HIWORD(lParam));
|
2022-09-05 06:07:23 +02:00
|
|
|
}
|
2022-09-09 23:55:45 +02:00
|
|
|
#endif
|
2021-02-18 05:00:35 +01:00
|
|
|
|
2020-10-13 09:20:52 +02:00
|
|
|
static BOOL in_size_move = FALSE;
|
|
|
|
static int redraw_count = 0;
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
switch (uMsg)
|
|
|
|
{
|
|
|
|
case WM_MOVING:
|
|
|
|
case WM_NCLBUTTONDOWN:
|
|
|
|
case WM_NCLBUTTONUP:
|
|
|
|
case WM_NCPAINT:
|
|
|
|
case WM_CANCELMODE:
|
|
|
|
case WM_DISPLAYCHANGE:
|
|
|
|
{
|
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
|
|
}
|
2023-08-24 18:37:16 +02:00
|
|
|
case WM_GETMINMAXINFO:
|
|
|
|
{
|
|
|
|
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
|
|
|
|
|
|
|
|
if (g_ddraw->windowed && g_ddraw->width)
|
|
|
|
{
|
|
|
|
RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height };
|
|
|
|
|
|
|
|
AdjustWindowRectEx(
|
|
|
|
&rc,
|
|
|
|
real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE),
|
|
|
|
GetMenu(g_ddraw->hwnd) != NULL,
|
|
|
|
real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE));
|
|
|
|
|
|
|
|
// set minimum window size
|
|
|
|
//mmi->ptMinTrackSize.x = rc.right - rc.left;
|
|
|
|
//mmi->ptMinTrackSize.y = rc.bottom - rc.top;
|
|
|
|
|
|
|
|
if (mmi->ptMaxTrackSize.x < rc.right - rc.left)
|
|
|
|
mmi->ptMaxTrackSize.x = rc.right - rc.left;
|
|
|
|
|
|
|
|
if (mmi->ptMaxTrackSize.y < rc.bottom - rc.top)
|
|
|
|
mmi->ptMaxTrackSize.y = rc.bottom - rc.top;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
case WM_NCACTIVATE:
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->noactivateapp)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
|
|
}
|
2020-10-14 10:58:59 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_NCHITTEST:
|
|
|
|
{
|
|
|
|
LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->resizable)
|
|
|
|
{
|
|
|
|
switch (result)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
case HTBOTTOM:
|
|
|
|
case HTBOTTOMLEFT:
|
|
|
|
case HTBOTTOMRIGHT:
|
|
|
|
case HTLEFT:
|
|
|
|
case HTRIGHT:
|
|
|
|
case HTTOP:
|
|
|
|
case HTTOPLEFT:
|
|
|
|
case HTTOPRIGHT:
|
|
|
|
return HTBORDER;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
case WM_SETCURSOR:
|
|
|
|
{
|
|
|
|
/* show resize cursor on window borders */
|
|
|
|
if ((HWND)wParam == g_ddraw->hwnd)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
WORD message = HIWORD(lParam);
|
|
|
|
|
|
|
|
if (message == WM_MOUSEMOVE || message == WM_LBUTTONDOWN)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
WORD htcode = LOWORD(lParam);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
switch (htcode)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
case HTCAPTION:
|
|
|
|
case HTMINBUTTON:
|
|
|
|
case HTMAXBUTTON:
|
|
|
|
case HTCLOSE:
|
|
|
|
case HTBOTTOM:
|
|
|
|
case HTBOTTOMLEFT:
|
|
|
|
case HTBOTTOMRIGHT:
|
|
|
|
case HTLEFT:
|
|
|
|
case HTRIGHT:
|
|
|
|
case HTTOP:
|
|
|
|
case HTTOPLEFT:
|
|
|
|
case HTTOPRIGHT:
|
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
|
|
case HTCLIENT:
|
2022-09-20 08:59:36 +02:00
|
|
|
if (!g_mouse_locked && !g_ddraw->devmode)
|
2021-06-12 05:45:28 +02:00
|
|
|
{
|
|
|
|
real_SetCursor(LoadCursor(NULL, IDC_ARROW));
|
2021-06-19 04:28:15 +02:00
|
|
|
return TRUE;
|
2021-06-12 05:45:28 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
default:
|
|
|
|
break;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-02 23:07:55 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_SIZE_DDRAW:
|
|
|
|
{
|
|
|
|
uMsg = WM_SIZE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_MOVE_DDRAW:
|
|
|
|
{
|
|
|
|
uMsg = WM_MOVE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_DISPLAYCHANGE_DDRAW:
|
|
|
|
{
|
|
|
|
uMsg = WM_DISPLAYCHANGE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_D3D9DEVICELOST:
|
|
|
|
{
|
2023-08-20 23:12:00 +02:00
|
|
|
if (((!g_ddraw->windowed && !g_ddraw->nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) &&
|
2022-10-14 22:06:10 +02:00
|
|
|
g_ddraw->renderer == d3d9_render_main &&
|
|
|
|
d3d9_on_device_lost())
|
2021-06-02 23:07:55 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->windowed)
|
|
|
|
mouse_lock();
|
2021-06-02 23:07:55 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case WM_TIMER:
|
|
|
|
{
|
|
|
|
switch (wParam)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
case IDT_TIMER_LEAVE_BNET:
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->windowed)
|
|
|
|
g_ddraw->bnet_was_fullscreen = FALSE;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->bnet_active)
|
2020-10-13 21:58:04 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->bnet_was_fullscreen)
|
|
|
|
{
|
|
|
|
int ws = g_config.window_state;
|
|
|
|
util_toggle_fullscreen();
|
|
|
|
g_config.window_state = ws;
|
|
|
|
g_ddraw->bnet_was_fullscreen = FALSE;
|
|
|
|
}
|
|
|
|
else if (g_ddraw->bnet_was_upscaled)
|
|
|
|
{
|
|
|
|
util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
|
|
|
g_ddraw->bnet_was_upscaled = FALSE;
|
|
|
|
}
|
2020-10-13 21:58:04 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_WINDOWPOSCHANGED:
|
|
|
|
{
|
|
|
|
WINDOWPOS* pos = (WINDOWPOS*)lParam;
|
|
|
|
|
2023-08-22 16:04:50 +02:00
|
|
|
/*
|
|
|
|
dbg_dump_swp_flags(pos->flags);
|
|
|
|
TRACE(
|
|
|
|
" hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n",
|
|
|
|
pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy);
|
|
|
|
*/
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->wine &&
|
|
|
|
!g_ddraw->windowed &&
|
|
|
|
(pos->x > 0 || pos->y > 0) &&
|
|
|
|
g_ddraw->last_set_window_pos_tick + 500 < timeGetTime())
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
PostMessage(g_ddraw->hwnd, WM_WINEFULLSCREEN, 0, 0);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_WINEFULLSCREEN:
|
|
|
|
{
|
|
|
|
if (!g_ddraw->windowed)
|
|
|
|
{
|
|
|
|
g_ddraw->last_set_window_pos_tick = timeGetTime();
|
|
|
|
|
|
|
|
real_SetWindowPos(
|
|
|
|
g_ddraw->hwnd,
|
|
|
|
HWND_TOPMOST,
|
|
|
|
1,
|
|
|
|
1,
|
|
|
|
g_ddraw->render.width,
|
|
|
|
g_ddraw->render.height,
|
|
|
|
SWP_SHOWWINDOW);
|
|
|
|
|
|
|
|
real_SetWindowPos(
|
|
|
|
g_ddraw->hwnd,
|
|
|
|
HWND_TOPMOST,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
g_ddraw->render.width,
|
|
|
|
g_ddraw->render.height,
|
|
|
|
SWP_SHOWWINDOW);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case WM_ENTERSIZEMOVE:
|
|
|
|
{
|
|
|
|
if (g_ddraw->windowed)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
in_size_move = TRUE;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_EXITSIZEMOVE:
|
|
|
|
{
|
|
|
|
if (g_ddraw->windowed)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
in_size_move = FALSE;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->render.thread)
|
2021-07-03 18:07:38 +02:00
|
|
|
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_SIZING:
|
|
|
|
{
|
|
|
|
RECT* windowrc = (RECT*)lParam;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->windowed)
|
|
|
|
{
|
|
|
|
if (in_size_move)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->render.thread)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
EnterCriticalSection(&g_ddraw->cs);
|
|
|
|
g_ddraw->render.run = FALSE;
|
|
|
|
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
|
|
|
LeaveCriticalSection(&g_ddraw->cs);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
WaitForSingleObject(g_ddraw->render.thread, INFINITE);
|
|
|
|
g_ddraw->render.thread = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
RECT clientrc = { 0 };
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
/* maintain aspect ratio */
|
|
|
|
if (g_ddraw->maintas &&
|
|
|
|
CopyRect(&clientrc, windowrc) &&
|
2022-02-04 04:50:23 +01:00
|
|
|
util_unadjust_window_rect(
|
|
|
|
&clientrc,
|
2022-09-21 21:24:04 +02:00
|
|
|
real_GetWindowLongA(hWnd, GWL_STYLE),
|
2022-02-04 04:50:23 +01:00
|
|
|
GetMenu(hWnd) != NULL,
|
2022-09-21 21:24:04 +02:00
|
|
|
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
|
2021-06-11 20:30:43 +02:00
|
|
|
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
|
|
|
|
{
|
|
|
|
float scaleH = (float)g_ddraw->height / g_ddraw->width;
|
|
|
|
float scaleW = (float)g_ddraw->width / g_ddraw->height;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
switch (wParam)
|
|
|
|
{
|
|
|
|
case WMSZ_BOTTOMLEFT:
|
|
|
|
case WMSZ_BOTTOMRIGHT:
|
|
|
|
case WMSZ_LEFT:
|
|
|
|
case WMSZ_RIGHT:
|
|
|
|
{
|
|
|
|
windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WMSZ_TOP:
|
|
|
|
case WMSZ_BOTTOM:
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WMSZ_TOPRIGHT:
|
|
|
|
case WMSZ_TOPLEFT:
|
|
|
|
{
|
|
|
|
windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
/* enforce minimum window size */
|
|
|
|
if (CopyRect(&clientrc, windowrc) &&
|
2022-02-04 04:50:23 +01:00
|
|
|
util_unadjust_window_rect(
|
|
|
|
&clientrc,
|
2022-09-21 21:24:04 +02:00
|
|
|
real_GetWindowLongA(hWnd, GWL_STYLE),
|
2022-02-04 04:50:23 +01:00
|
|
|
GetMenu(hWnd) != NULL,
|
2022-09-21 21:24:04 +02:00
|
|
|
real_GetWindowLongA(hWnd, GWL_EXSTYLE)) &&
|
2021-06-11 20:30:43 +02:00
|
|
|
SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top))
|
|
|
|
{
|
|
|
|
if (clientrc.right < g_ddraw->width)
|
|
|
|
{
|
2020-10-13 09:20:52 +02:00
|
|
|
switch (wParam)
|
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
case WMSZ_TOPRIGHT:
|
|
|
|
case WMSZ_BOTTOMRIGHT:
|
|
|
|
case WMSZ_RIGHT:
|
|
|
|
case WMSZ_BOTTOM:
|
|
|
|
case WMSZ_TOP:
|
|
|
|
{
|
|
|
|
windowrc->right += g_ddraw->width - clientrc.right;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WMSZ_TOPLEFT:
|
|
|
|
case WMSZ_BOTTOMLEFT:
|
|
|
|
case WMSZ_LEFT:
|
|
|
|
{
|
|
|
|
windowrc->left -= g_ddraw->width - clientrc.right;
|
|
|
|
break;
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (clientrc.bottom < g_ddraw->height)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
switch (wParam)
|
|
|
|
{
|
|
|
|
case WMSZ_BOTTOMLEFT:
|
|
|
|
case WMSZ_BOTTOMRIGHT:
|
|
|
|
case WMSZ_BOTTOM:
|
|
|
|
case WMSZ_RIGHT:
|
|
|
|
case WMSZ_LEFT:
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
windowrc->bottom += g_ddraw->height - clientrc.bottom;
|
|
|
|
break;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
case WMSZ_TOPLEFT:
|
|
|
|
case WMSZ_TOPRIGHT:
|
|
|
|
case WMSZ_TOP:
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
windowrc->top -= g_ddraw->height - clientrc.bottom;
|
|
|
|
break;
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
/* save new window position */
|
|
|
|
if (CopyRect(&clientrc, windowrc) &&
|
2022-02-04 04:50:23 +01:00
|
|
|
util_unadjust_window_rect(
|
|
|
|
&clientrc,
|
2022-09-21 21:24:04 +02:00
|
|
|
real_GetWindowLongA(hWnd, GWL_STYLE),
|
2022-02-04 04:50:23 +01:00
|
|
|
GetMenu(hWnd) != NULL,
|
2022-09-21 21:24:04 +02:00
|
|
|
real_GetWindowLongA(hWnd, GWL_EXSTYLE)))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
g_config.window_rect.left = clientrc.left;
|
|
|
|
g_config.window_rect.top = clientrc.top;
|
|
|
|
g_config.window_rect.right = clientrc.right - clientrc.left;
|
|
|
|
g_config.window_rect.bottom = clientrc.bottom - clientrc.top;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
return TRUE;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_SIZE:
|
|
|
|
{
|
|
|
|
if (g_ddraw->windowed)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (wParam == SIZE_RESTORED)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2023-08-22 18:06:49 +02:00
|
|
|
if (in_size_move && !g_ddraw->render.thread)
|
2023-08-22 18:06:36 +02:00
|
|
|
{
|
|
|
|
g_config.window_rect.right = LOWORD(lParam);
|
|
|
|
g_config.window_rect.bottom = HIWORD(lParam);
|
2020-10-13 21:58:04 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
/*
|
|
|
|
else if (g_ddraw->wine)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
WindowRect.right = LOWORD(lParam);
|
|
|
|
WindowRect.bottom = HIWORD(lParam);
|
|
|
|
if (WindowRect.right != g_ddraw->render.width || WindowRect.bottom != g_ddraw->render.height)
|
|
|
|
dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
*/
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-16 05:57:19 +02:00
|
|
|
if (g_ddraw->got_child_windows)
|
2021-06-11 20:30:43 +02:00
|
|
|
{
|
|
|
|
redraw_count = 2;
|
|
|
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
|
|
|
|
}
|
|
|
|
case WM_MOVE:
|
|
|
|
{
|
|
|
|
if (g_ddraw->windowed)
|
2021-02-18 07:13:25 +01:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
int x = (int)(short)LOWORD(lParam);
|
|
|
|
int y = (int)(short)HIWORD(lParam);
|
2021-02-18 07:13:25 +01:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (x != -32000 && y != -32000)
|
|
|
|
{
|
|
|
|
util_update_bnet_pos(x, y);
|
2021-02-18 10:04:05 +01:00
|
|
|
}
|
2021-02-18 07:10:15 +01:00
|
|
|
|
2023-07-25 05:26:38 +02:00
|
|
|
if (in_size_move || (g_ddraw->wine && !g_ddraw->fullscreen && g_ddraw->render.thread))
|
2021-02-18 07:13:25 +01:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (x != -32000)
|
|
|
|
g_config.window_rect.left = x; /* -32000 = Exit/Minimize */
|
2021-02-18 10:04:05 +01:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (y != -32000)
|
|
|
|
g_config.window_rect.top = y;
|
2021-02-18 07:13:25 +01:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
}
|
2021-02-18 07:13:25 +01:00
|
|
|
|
2021-06-16 05:57:19 +02:00
|
|
|
if (g_ddraw->got_child_windows)
|
2021-06-11 20:30:43 +02:00
|
|
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
2021-02-18 07:10:15 +01:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */
|
|
|
|
}
|
2023-08-22 18:06:39 +02:00
|
|
|
case WM_NCMOUSELEAVE:
|
|
|
|
{
|
|
|
|
if (!g_ddraw->wine) /* hack: disable aero snap */
|
|
|
|
{
|
|
|
|
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
|
|
|
|
|
|
|
|
if (!(style & WS_MAXIMIZEBOX))
|
|
|
|
{
|
|
|
|
real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
case WM_SYSCOMMAND:
|
|
|
|
{
|
2023-08-22 18:06:39 +02:00
|
|
|
if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */
|
|
|
|
{
|
|
|
|
LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE);
|
|
|
|
|
|
|
|
if ((style & WS_MAXIMIZEBOX))
|
|
|
|
{
|
|
|
|
real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (wParam == SC_MAXIMIZE)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->resizable)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
util_toggle_maximize();
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
return 0;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (wParam == SC_CLOSE && !GameHandlesClose)
|
2021-05-29 15:30:32 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
exit(0);
|
2021-05-29 15:30:32 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2022-02-16 16:24:39 +01:00
|
|
|
if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL)
|
2021-06-11 20:30:43 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (!GameHandlesClose)
|
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_WINDOWPOSCHANGING:
|
|
|
|
{
|
2023-08-17 14:17:36 +02:00
|
|
|
WINDOWPOS* pos = (WINDOWPOS*)lParam;
|
|
|
|
|
2023-08-17 14:30:02 +02:00
|
|
|
/*
|
2023-08-17 14:17:36 +02:00
|
|
|
dbg_dump_swp_flags(pos->flags);
|
|
|
|
TRACE(
|
|
|
|
" hwndInsertAfter=%p, x=%d, y=%d, cx=%d, cy=%d\n",
|
|
|
|
pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy);
|
2023-08-17 14:30:02 +02:00
|
|
|
*/
|
2023-08-20 22:15:06 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
/* workaround for a bug where sometimes a background window steals the focus */
|
2022-09-20 08:59:36 +02:00
|
|
|
if (g_mouse_locked)
|
2021-05-29 15:30:32 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (pos->flags == SWP_NOMOVE + SWP_NOSIZE)
|
2021-05-29 15:30:32 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_unlock();
|
|
|
|
|
2022-10-19 05:08:22 +02:00
|
|
|
if (real_GetForegroundWindow() == g_ddraw->hwnd)
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_lock();
|
2021-05-29 15:30:32 +02:00
|
|
|
}
|
2022-09-20 09:17:57 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_MOUSELEAVE:
|
|
|
|
{
|
2021-06-17 09:42:04 +02:00
|
|
|
//mouse_unlock();
|
2021-06-11 20:30:43 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case WM_ACTIVATE:
|
|
|
|
{
|
|
|
|
if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE)
|
|
|
|
{
|
2021-06-16 05:57:19 +02:00
|
|
|
if (g_ddraw->got_child_windows)
|
2021-06-11 20:30:43 +02:00
|
|
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
|
|
|
}
|
2021-05-29 15:30:32 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
//if (g_ddraw->windowed || g_ddraw->noactivateapp)
|
2022-09-05 09:08:59 +02:00
|
|
|
|
|
|
|
if (!g_ddraw->allow_wmactivate)
|
|
|
|
return 0;
|
2021-05-29 15:30:32 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_ACTIVATEAPP:
|
|
|
|
{
|
|
|
|
if (wParam)
|
2021-05-29 15:30:32 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->windowed)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2023-08-14 19:56:00 +02:00
|
|
|
if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN);
|
2021-11-27 17:38:22 +01:00
|
|
|
real_ShowWindow(g_ddraw->hwnd, SW_RESTORE);
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_lock();
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
2022-10-19 05:08:22 +02:00
|
|
|
else if (g_ddraw->fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)
|
2021-06-21 01:43:58 +02:00
|
|
|
{
|
|
|
|
mouse_lock();
|
|
|
|
}
|
2023-08-15 08:46:14 +02:00
|
|
|
|
|
|
|
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
2021-06-11 20:30:43 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-09-20 08:59:36 +02:00
|
|
|
if (!g_ddraw->windowed && !g_mouse_locked && g_ddraw->noactivateapp && !g_ddraw->devmode)
|
2021-06-11 20:30:43 +02:00
|
|
|
return 0;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_unlock();
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime())
|
|
|
|
return 0;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (!g_ddraw->windowed)
|
|
|
|
{
|
2023-08-14 19:56:00 +02:00
|
|
|
if (g_ddraw->renderer != d3d9_render_main || g_ddraw->nonexclusive)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-08-04 15:24:16 +02:00
|
|
|
real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE);
|
2021-06-11 20:30:43 +02:00
|
|
|
ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-09-16 01:57:44 +02:00
|
|
|
if (wParam && g_ddraw->releasealt)
|
|
|
|
{
|
|
|
|
INPUT ip;
|
|
|
|
memset(&ip, 0, sizeof(ip));
|
|
|
|
|
|
|
|
ip.type = INPUT_KEYBOARD;
|
|
|
|
ip.ki.wVk = VK_MENU;
|
|
|
|
ip.ki.dwFlags = KEYEVENTF_KEYUP;
|
|
|
|
SendInput(1, &ip, sizeof(ip));
|
2022-10-18 18:34:47 +02:00
|
|
|
|
2023-08-02 17:09:01 +02:00
|
|
|
if (g_dinput_hook_active)
|
2022-10-18 18:45:15 +02:00
|
|
|
{
|
|
|
|
ip.type = INPUT_KEYBOARD;
|
|
|
|
ip.ki.wScan = 56; // LeftAlt
|
|
|
|
ip.ki.dwFlags = KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;
|
|
|
|
SendInput(1, &ip, sizeof(ip));
|
|
|
|
}
|
2021-09-16 01:57:44 +02:00
|
|
|
}
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
if (g_ddraw->windowed || g_ddraw->noactivateapp)
|
|
|
|
{
|
|
|
|
/* let it pass through once (tiberian sun) */
|
|
|
|
static BOOL one_time;
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-18 12:18:35 +02:00
|
|
|
if (wParam && !one_time && g_ddraw->tshack)
|
2021-06-11 20:30:43 +02:00
|
|
|
{
|
|
|
|
one_time = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
2021-09-09 03:49:54 +02:00
|
|
|
|
2021-09-16 01:57:44 +02:00
|
|
|
if (wParam && g_ddraw->alt_key_down && !g_ddraw->releasealt)
|
|
|
|
PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0);
|
2021-01-17 22:36:26 +01:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_AUTORENDERER:
|
|
|
|
{
|
|
|
|
mouse_unlock();
|
|
|
|
real_SetWindowPos(g_ddraw->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
|
|
|
real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
|
|
|
|
mouse_lock();
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case WM_NCLBUTTONDBLCLK:
|
|
|
|
{
|
|
|
|
if (g_ddraw->resizable)
|
|
|
|
{
|
|
|
|
util_toggle_maximize();
|
2021-05-29 15:30:32 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
case WM_SYSKEYDOWN:
|
|
|
|
{
|
|
|
|
BOOL context_code = (lParam & (1 << 29)) != 0;
|
|
|
|
BOOL key_state = (lParam & (1 << 30)) != 0;
|
|
|
|
|
2021-09-29 12:55:20 +02:00
|
|
|
if (g_ddraw->hotkeys.toggle_fullscreen &&
|
|
|
|
wParam == g_ddraw->hotkeys.toggle_fullscreen &&
|
2023-07-03 05:13:47 +02:00
|
|
|
(!g_ddraw->fullscreen || (g_ddraw->windowed && g_ddraw->toggle_borderless)) &&
|
2021-09-29 12:55:20 +02:00
|
|
|
context_code &&
|
|
|
|
!key_state)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
util_toggle_fullscreen();
|
2020-10-13 09:20:52 +02:00
|
|
|
return 0;
|
2021-09-05 02:17:38 +02:00
|
|
|
}
|
|
|
|
|
2021-09-29 12:55:20 +02:00
|
|
|
if (g_ddraw->hotkeys.toggle_maximize &&
|
|
|
|
wParam == g_ddraw->hotkeys.toggle_maximize &&
|
|
|
|
g_ddraw->resizable &&
|
|
|
|
g_ddraw->windowed &&
|
|
|
|
!g_ddraw->fullscreen)
|
2021-09-05 02:17:38 +02:00
|
|
|
{
|
|
|
|
util_toggle_maximize();
|
|
|
|
return 0;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
if (wParam == VK_MENU)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
g_ddraw->alt_key_down = TRUE;
|
|
|
|
}
|
2021-02-11 00:50:09 +01:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_SYSKEYUP:
|
|
|
|
{
|
|
|
|
if (wParam == VK_MENU)
|
|
|
|
{
|
|
|
|
g_ddraw->alt_key_down = FALSE;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
2021-09-29 12:55:20 +02:00
|
|
|
if (wParam == VK_TAB || (g_ddraw->hotkeys.toggle_fullscreen && wParam == g_ddraw->hotkeys.toggle_fullscreen))
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_KEYDOWN:
|
|
|
|
{
|
2021-09-29 12:55:20 +02:00
|
|
|
if (g_ddraw->hotkeys.unlock_cursor1 &&
|
|
|
|
(wParam == VK_CONTROL || wParam == g_ddraw->hotkeys.unlock_cursor1))
|
2021-06-11 20:30:43 +02:00
|
|
|
{
|
2021-09-29 12:55:20 +02:00
|
|
|
if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor1) & 0x8000)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_unlock();
|
2020-10-13 09:20:52 +02:00
|
|
|
return 0;
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
}
|
2020-10-13 21:58:04 +02:00
|
|
|
|
2021-09-29 12:55:20 +02:00
|
|
|
if (g_ddraw->hotkeys.unlock_cursor2 &&
|
|
|
|
(wParam == g_ddraw->hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL))
|
2021-06-11 20:30:43 +02:00
|
|
|
{
|
2021-09-29 12:55:20 +02:00
|
|
|
if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_ddraw->hotkeys.unlock_cursor2) & 0x8000)
|
2021-03-20 06:15:53 +01:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_unlock();
|
|
|
|
return 0;
|
2021-03-20 06:15:53 +01:00
|
|
|
}
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_KEYUP:
|
|
|
|
{
|
2021-09-29 12:55:20 +02:00
|
|
|
if (g_ddraw->hotkeys.screenshot && wParam == g_ddraw->hotkeys.screenshot)
|
2021-06-11 20:30:43 +02:00
|
|
|
ss_take_screenshot(g_ddraw->primary);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
/* button up messages reactivate cursor lock */
|
|
|
|
case WM_LBUTTONUP:
|
|
|
|
case WM_RBUTTONUP:
|
|
|
|
case WM_MBUTTONUP:
|
|
|
|
{
|
2022-09-20 08:59:36 +02:00
|
|
|
if (!g_ddraw->devmode && !g_mouse_locked)
|
2021-03-20 06:15:53 +01:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
int x = GET_X_LPARAM(lParam);
|
|
|
|
int y = GET_Y_LPARAM(lParam);
|
|
|
|
|
|
|
|
if (x > g_ddraw->render.viewport.x + g_ddraw->render.viewport.width ||
|
|
|
|
x < g_ddraw->render.viewport.x ||
|
|
|
|
y > g_ddraw->render.viewport.y + g_ddraw->render.viewport.height ||
|
|
|
|
y < g_ddraw->render.viewport.y)
|
2021-03-20 06:15:53 +01:00
|
|
|
{
|
2021-06-17 06:13:16 +02:00
|
|
|
x = g_ddraw->width / 2;
|
|
|
|
y = g_ddraw->height / 2;
|
2021-03-20 06:15:53 +01:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
else
|
2021-05-31 14:07:41 +02:00
|
|
|
{
|
2021-06-17 06:13:16 +02:00
|
|
|
x = (DWORD)((x - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w);
|
|
|
|
y = (DWORD)((y - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h);
|
2021-05-31 14:07:41 +02:00
|
|
|
}
|
|
|
|
|
2021-06-17 06:13:16 +02:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
|
|
|
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_lock();
|
|
|
|
return 0;
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
/* fall through for lParam */
|
|
|
|
}
|
|
|
|
/* down messages are ignored if we have no cursor lock */
|
|
|
|
case WM_XBUTTONDBLCLK:
|
|
|
|
case WM_XBUTTONDOWN:
|
|
|
|
case WM_XBUTTONUP:
|
|
|
|
case WM_MOUSEWHEEL:
|
|
|
|
case WM_MOUSEHOVER:
|
|
|
|
case WM_LBUTTONDBLCLK:
|
|
|
|
case WM_MBUTTONDBLCLK:
|
|
|
|
case WM_RBUTTONDBLCLK:
|
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
case WM_RBUTTONDOWN:
|
|
|
|
case WM_MBUTTONDOWN:
|
|
|
|
case WM_MOUSEMOVE:
|
|
|
|
{
|
2022-09-20 08:59:36 +02:00
|
|
|
if (!g_ddraw->devmode && !g_mouse_locked)
|
2021-06-17 06:46:39 +02:00
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
2021-06-16 05:57:19 +02:00
|
|
|
|
2021-09-19 03:04:45 +02:00
|
|
|
int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0);
|
|
|
|
int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0);
|
2021-06-16 05:57:19 +02:00
|
|
|
|
2021-06-17 06:46:39 +02:00
|
|
|
if (g_ddraw->adjmouse)
|
2020-10-13 21:58:04 +02:00
|
|
|
{
|
2021-06-17 07:21:50 +02:00
|
|
|
if (g_ddraw->vhack && !g_ddraw->devmode)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-17 06:46:39 +02:00
|
|
|
POINT pt = { 0, 0 };
|
2021-06-17 06:13:16 +02:00
|
|
|
fake_GetCursorPos(&pt);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-17 06:46:39 +02:00
|
|
|
x = pt.x;
|
|
|
|
y = pt.y;
|
|
|
|
}
|
|
|
|
else
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-17 06:46:39 +02:00
|
|
|
x = (DWORD)(roundf(x * g_ddraw->render.unscale_w));
|
|
|
|
y = (DWORD)(roundf(y * g_ddraw->render.unscale_h));
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
}
|
2021-01-15 01:11:07 +01:00
|
|
|
|
2022-02-15 10:17:05 +01:00
|
|
|
x = min(x, g_ddraw->width - 1);
|
|
|
|
y = min(y, g_ddraw->height - 1);
|
2021-06-17 05:18:55 +02:00
|
|
|
|
2021-06-17 06:46:39 +02:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
2021-06-17 07:40:31 +02:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
2021-01-15 01:11:07 +01:00
|
|
|
|
2021-06-17 06:46:39 +02:00
|
|
|
lParam = MAKELPARAM(x, y);
|
2021-06-17 06:28:18 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_PARENTNOTIFY:
|
|
|
|
{
|
|
|
|
switch (LOWORD(wParam))
|
|
|
|
{
|
|
|
|
case WM_DESTROY: /* Workaround for invisible menu on Load/Save/Delete in Tiberian Sun */
|
|
|
|
redraw_count = 2;
|
2020-10-13 09:20:52 +02:00
|
|
|
break;
|
2021-06-11 20:30:43 +02:00
|
|
|
case WM_LBUTTONDOWN:
|
|
|
|
case WM_MBUTTONDOWN:
|
|
|
|
case WM_RBUTTONDOWN:
|
|
|
|
case WM_XBUTTONDOWN:
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2022-09-20 08:59:36 +02:00
|
|
|
if (!g_ddraw->devmode && !g_mouse_locked)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-17 06:13:16 +02:00
|
|
|
int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->render.unscale_w);
|
|
|
|
int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->render.unscale_h);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-17 06:13:16 +02:00
|
|
|
InterlockedExchange((LONG*)&g_ddraw->cursor.x, x);
|
|
|
|
InterlockedExchange((LONG*)&g_ddraw->cursor.y, y);
|
2020-10-13 09:20:52 +02:00
|
|
|
|
2021-06-11 20:30:43 +02:00
|
|
|
mouse_lock();
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_PAINT:
|
|
|
|
{
|
2021-06-16 05:57:19 +02:00
|
|
|
if (redraw_count > 0)
|
2020-10-13 09:20:52 +02:00
|
|
|
{
|
2021-06-11 20:30:43 +02:00
|
|
|
redraw_count--;
|
|
|
|
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
|
|
|
|
EnterCriticalSection(&g_ddraw->cs);
|
|
|
|
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
|
|
|
LeaveCriticalSection(&g_ddraw->cs);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case WM_ERASEBKGND:
|
|
|
|
{
|
2021-08-05 00:39:06 +02:00
|
|
|
if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0)
|
2021-08-05 00:26:29 +02:00
|
|
|
{
|
|
|
|
InterlockedExchange(&g_ddraw->render.clear_screen, TRUE);
|
2021-08-05 00:55:28 +02:00
|
|
|
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
|
2021-08-05 00:26:29 +02:00
|
|
|
}
|
2021-06-11 20:30:43 +02:00
|
|
|
break;
|
|
|
|
}
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|
|
|
|
|
2021-03-02 22:50:06 +01:00
|
|
|
return CallWindowProcA(g_ddraw->wndproc, hWnd, uMsg, wParam, lParam);
|
2020-10-13 09:20:52 +02:00
|
|
|
}
|