1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-20 16:09:12 +01:00
cnc-ddraw/src/wndproc.c

966 lines
28 KiB
C
Raw Normal View History

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);
}
case WM_GETMINMAXINFO:
{
MINMAXINFO* mmi = (MINMAXINFO*)lParam;
2024-03-22 22:27:00 +01:00
if (g_config.windowed && g_ddraw.width)
{
2024-03-22 22:27:00 +01:00
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
AdjustWindowRectEx(
&rc,
2024-03-22 22:27:00 +01:00
real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE),
GetMenu(g_ddraw.hwnd) != NULL,
real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE));
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;
/*
2024-03-22 22:27:00 +01:00
RECT rcmin = { 0, 0, g_ddraw.width, g_ddraw.height };
AdjustWindowRectEx(
&rcmin,
2024-03-22 22:27:00 +01:00
real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE),
GetMenu(g_ddraw.hwnd) != NULL,
real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE));
mmi->ptMinTrackSize.x = rcmin.right - rcmin.left;
mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.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
{
2023-09-22 00:38:42 +02:00
if (g_config.noactivateapp)
2020-10-13 09:20:52 +02:00
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
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
2023-09-22 00:38:42 +02:00
if (!g_config.resizable)
2021-06-11 20:30:43 +02:00
{
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 */
2024-03-22 22:27:00 +01:00
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:
2023-09-22 00:38:42 +02:00
if (!g_mouse_locked && !g_config.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:
{
2024-03-22 22:27:00 +01:00
if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) &&
g_ddraw.renderer == d3d9_render_main &&
2022-10-14 22:06:10 +02:00
d3d9_on_device_lost())
2021-06-02 23:07:55 +02:00
{
2023-09-22 00:38:42 +02:00
if (!g_config.windowed)
2021-06-11 20:30:43 +02:00
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
{
2024-03-22 22:27:00 +01:00
KillTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET);
2020-10-13 09:20:52 +02:00
2023-09-22 00:38:42 +02:00
if (!g_config.windowed)
2024-03-22 22:27:00 +01:00
g_ddraw.bnet_was_fullscreen = FALSE;
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01:00
if (!g_ddraw.bnet_active)
2020-10-13 21:58:04 +02:00
{
2024-03-22 22:27:00 +01:00
if (g_ddraw.bnet_was_fullscreen)
2021-06-11 20:30:43 +02:00
{
int ws = g_config.window_state;
util_toggle_fullscreen();
g_config.window_state = ws;
2024-03-22 22:27:00 +01:00
g_ddraw.bnet_was_fullscreen = FALSE;
2021-06-11 20:30:43 +02:00
}
2024-03-22 22:27:00 +01:00
else if (g_ddraw.bnet_was_upscaled)
2021-06-11 20:30:43 +02:00
{
util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
2024-03-22 22:27:00 +01:00
g_ddraw.bnet_was_upscaled = FALSE;
2021-06-11 20:30:43 +02:00
}
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);
*/
2023-11-04 03:20:30 +01:00
if (g_config.is_wine &&
2023-09-22 00:38:42 +02:00
!g_config.windowed &&
2021-06-11 20:30:43 +02:00
(pos->x > 0 || pos->y > 0) &&
2024-03-22 22:27:00 +01:00
g_ddraw.last_set_window_pos_tick + 500 < timeGetTime())
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01: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:
{
2023-09-22 00:38:42 +02:00
if (!g_config.windowed)
2021-06-11 20:30:43 +02:00
{
2024-03-22 22:27:00 +01:00
g_ddraw.last_set_window_pos_tick = timeGetTime();
2021-06-11 20:30:43 +02:00
int menu_height = GetMenu(g_ddraw.hwnd) ? real_GetSystemMetrics(SM_CYMENU) : 0;
2021-06-11 20:30:43 +02:00
real_SetWindowPos(
2024-03-22 22:27:00 +01:00
g_ddraw.hwnd,
2021-06-11 20:30:43 +02:00
HWND_TOPMOST,
1,
1,
2024-03-22 22:27:00 +01:00
g_ddraw.render.width,
g_ddraw.render.height + menu_height,
2021-06-11 20:30:43 +02:00
SWP_SHOWWINDOW);
real_SetWindowPos(
2024-03-22 22:27:00 +01:00
g_ddraw.hwnd,
2021-06-11 20:30:43 +02:00
HWND_TOPMOST,
0,
0,
2024-03-22 22:27:00 +01:00
g_ddraw.render.width,
g_ddraw.render.height + menu_height,
2021-06-11 20:30:43 +02:00
SWP_SHOWWINDOW);
}
return 0;
}
case WM_ENTERSIZEMOVE:
{
2023-09-22 00:38:42 +02:00
if (g_config.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:
{
2023-09-22 00:38:42 +02:00
if (g_config.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
2024-03-22 22:27:00 +01:00
if (!g_ddraw.render.thread)
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
2023-09-22 00:38:42 +02:00
if (g_config.windowed)
2021-06-11 20:30:43 +02:00
{
if (in_size_move)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
if (g_ddraw.render.thread)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01: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
2024-03-22 22:27:00 +01:00
WaitForSingleObject(g_ddraw.render.thread, INFINITE);
g_ddraw.render.thread = NULL;
2021-06-11 20:30:43 +02:00
}
RECT clientrc = { 0 };
2020-10-13 09:20:52 +02:00
2021-06-11 20:30:43 +02:00
/* maintain aspect ratio */
2023-09-22 00:38:42 +02:00
if (g_config.maintas &&
2021-06-11 20:30:43 +02:00
CopyRect(&clientrc, windowrc) &&
util_unadjust_window_rect(
&clientrc,
real_GetWindowLongA(hWnd, GWL_STYLE),
GetMenu(hWnd) != NULL,
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))
{
2024-03-22 22:27:00 +01:00
double scaleH = (double)g_ddraw.height / g_ddraw.width;
double scaleW = (double)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:
{
2023-12-31 04:35:08 +01:00
windowrc->bottom += (LONG)round(scaleH * clientrc.right - clientrc.bottom);
2021-06-11 20:30:43 +02:00
break;
}
case WMSZ_TOP:
case WMSZ_BOTTOM:
2020-10-13 09:20:52 +02:00
{
2023-12-31 04:35:08 +01:00
windowrc->right += (LONG)round(scaleW * clientrc.bottom - clientrc.right);
2021-06-11 20:30:43 +02:00
break;
}
case WMSZ_TOPRIGHT:
case WMSZ_TOPLEFT:
{
2023-12-31 04:35:08 +01:00
windowrc->top -= (LONG)round(scaleH * clientrc.right - clientrc.bottom);
2021-06-11 20:30:43 +02:00
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) &&
util_unadjust_window_rect(
&clientrc,
real_GetWindowLongA(hWnd, GWL_STYLE),
GetMenu(hWnd) != NULL,
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))
{
2024-03-22 22:27:00 +01:00
if (clientrc.right < g_ddraw.width)
2021-06-11 20:30:43 +02:00
{
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:
{
2024-03-22 22:27:00 +01:00
windowrc->right += g_ddraw.width - clientrc.right;
2021-06-11 20:30:43 +02:00
break;
}
case WMSZ_TOPLEFT:
case WMSZ_BOTTOMLEFT:
case WMSZ_LEFT:
{
2024-03-22 22:27:00 +01:00
windowrc->left -= g_ddraw.width - clientrc.right;
2021-06-11 20:30:43 +02:00
break;
}
2020-10-13 09:20:52 +02:00
}
}
2024-03-22 22:27:00 +01: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
{
2024-03-22 22:27:00 +01:00
windowrc->bottom += g_ddraw.height - clientrc.bottom;
2021-06-11 20:30:43 +02:00
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
{
2024-03-22 22:27:00 +01:00
windowrc->top -= g_ddraw.height - clientrc.bottom;
2021-06-11 20:30:43 +02:00
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) &&
util_unadjust_window_rect(
&clientrc,
real_GetWindowLongA(hWnd, GWL_STYLE),
GetMenu(hWnd) != NULL,
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:
{
2023-09-22 00:38:42 +02:00
if (g_config.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
{
2024-03-22 22:27:00 +01:00
if (in_size_move && !g_ddraw.render.thread)
{
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
/*
2024-03-22 22:27:00 +01: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);
2024-03-22 22:27:00 +01:00
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
2024-03-22 22:27:00 +01: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:
{
2023-09-22 00:38:42 +02:00
if (g_config.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
2024-03-22 22:27:00 +01:00
if (in_size_move || (g_config.is_wine && !g_config.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
2024-03-22 22:27:00 +01: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 */
}
case WM_NCMOUSELEAVE:
{
2023-11-04 03:20:30 +01:00
if (!g_config.is_wine) /* hack: disable aero snap */
{
2024-03-22 22:27:00 +01:00
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
if (!(style & WS_MAXIMIZEBOX))
{
2024-03-22 22:27:00 +01:00
real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX);
}
}
break;
}
2021-06-11 20:30:43 +02:00
case WM_SYSCOMMAND:
{
2023-11-04 03:20:30 +01:00
if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */
{
2024-03-22 22:27:00 +01:00
LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE);
if ((style & WS_MAXIMIZEBOX))
{
2024-03-22 22:27:00 +01:00
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
{
2023-09-22 00:38:42 +02:00
if (g_config.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
{
2023-10-05 02:02:07 +02:00
_exit(0);
2021-05-29 15:30:32 +02:00
}
2021-06-11 20:30:43 +02:00
2024-03-22 22:27:00 +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
*/
2021-06-11 20:30:43 +02:00
/* workaround for a bug where sometimes a background window steals the focus */
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();
2024-03-22 22:27:00 +01: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)
{
2024-03-22 22:27:00 +01: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
if (wParam == WA_INACTIVE)
{
if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd)
{
char class_name[MAX_PATH] = { 0 };
GetClassNameA((HWND)lParam, class_name, sizeof(class_name) - 1);
if (strcmp(class_name, "#32770") == 0) // dialog box
{
mouse_unlock();
/*
// Center to main window
RECT rc_main = { 0 };
RECT rc_dialog = { 0 };
RECT rc = { 0 };
real_GetWindowRect(hWnd, &rc_main);
real_GetWindowRect((HWND)lParam, &rc_dialog);
CopyRect(&rc, &rc_main);
OffsetRect(&rc_dialog, -rc_dialog.left, -rc_dialog.top);
OffsetRect(&rc, -rc.left, -rc.top);
OffsetRect(&rc, -rc_dialog.right, -rc_dialog.bottom);
real_SetWindowPos(
(HWND)lParam,
HWND_TOP,
rc_main.left + (rc.right / 2),
rc_main.top + (rc.bottom / 2),
0, 0,
SWP_NOSIZE);
*/
}
}
}
2024-03-22 22:27:00 +01:00
//if (g_ddraw.windowed || g_ddraw.noactivateapp)
2022-09-05 09:08:59 +02:00
2023-09-22 00:38:42 +02:00
if (!g_config.allow_wmactivate)
2022-09-05 09:08:59 +02:00
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
{
2023-09-22 00:38:42 +02:00
if (!g_config.windowed)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
real_ShowWindow(g_ddraw.hwnd, SW_RESTORE);
ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN);
2021-06-11 20:30:43 +02:00
mouse_lock();
2020-10-13 09:20:52 +02:00
}
}
2024-03-22 22:27:00 +01:00
else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)
{
mouse_lock();
}
2023-08-15 08:46:14 +02:00
2024-03-22 22:27:00 +01:00
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
2021-06-11 20:30:43 +02:00
}
else
{
2023-09-22 00:38:42 +02:00
if (!g_config.windowed && !g_mouse_locked && g_config.noactivateapp && !g_config.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
2024-03-22 22:27:00 +01:00
if (g_config.is_wine && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime())
2021-06-11 20:30:43 +02:00
return 0;
2020-10-13 09:20:52 +02:00
2023-09-22 00:38:42 +02:00
if (!g_config.windowed)
2021-06-11 20:30:43 +02:00
{
2024-03-22 22:27:00 +01:00
if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE);
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
2023-09-22 00:38:42 +02:00
if (wParam && g_config.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));
}
}
2023-09-22 00:38:42 +02:00
if (g_config.windowed || g_config.noactivateapp)
2021-06-11 20:30:43 +02:00
{
/* let it pass through once (tiberian sun) */
static BOOL one_time;
2023-09-22 00:38:42 +02:00
if (wParam && !one_time && g_config.tshack)
2021-06-11 20:30:43 +02:00
{
one_time = TRUE;
break;
}
2024-03-22 22:27:00 +01:00
if (wParam && g_ddraw.alt_key_down && !g_config.releasealt)
PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0);
2021-06-11 20:30:43 +02:00
return 0;
}
break;
}
case WM_AUTORENDERER:
{
mouse_unlock();
2024-03-22 22:27:00 +01:00
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);
2021-06-11 20:30:43 +02:00
mouse_lock();
return 0;
}
case WM_TOGGLE_FULLSCREEN:
{
if (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless))
{
/* Check if we are fullscreen/borderless already */
if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen))
return 0;
/* Check if we are windowed already */
if (wParam == CNC_DDRAW_SET_WINDOWED && g_config.windowed && !g_config.fullscreen)
return 0;
util_toggle_fullscreen();
}
return 0;
}
case WM_TOGGLE_MAXIMIZE:
{
if (g_config.resizable)
{
util_toggle_maximize();
}
return 0;
}
2021-06-11 20:30:43 +02:00
case WM_NCLBUTTONDBLCLK:
{
2023-09-22 00:38:42 +02:00
if (g_config.resizable)
2021-06-11 20:30:43 +02:00
{
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;
2023-09-22 00:38:42 +02:00
if (g_config.hotkeys.toggle_fullscreen &&
wParam == g_config.hotkeys.toggle_fullscreen &&
(!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.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;
}
2023-09-22 00:38:42 +02:00
if (g_config.hotkeys.toggle_maximize &&
wParam == g_config.hotkeys.toggle_maximize &&
g_config.resizable &&
g_config.windowed &&
!g_config.fullscreen)
{
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
{
2024-03-22 22:27:00 +01:00
g_ddraw.alt_key_down = TRUE;
2021-06-11 20:30:43 +02:00
}
2021-02-11 00:50:09 +01:00
2021-06-11 20:30:43 +02:00
break;
}
case WM_SYSKEYUP:
{
if (wParam == VK_MENU)
{
2024-03-22 22:27:00 +01:00
g_ddraw.alt_key_down = FALSE;
2020-10-13 09:20:52 +02:00
}
2021-06-11 20:30:43 +02:00
2023-09-22 00:38:42 +02:00
if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.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:
{
2023-09-22 00:38:42 +02:00
if (g_config.hotkeys.unlock_cursor1 &&
(wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1))
2021-06-11 20:30:43 +02:00
{
2024-03-20 05:41:42 +01:00
if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_GetAsyncKeyState(g_config.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
2023-09-22 00:38:42 +02:00
if (g_config.hotkeys.unlock_cursor2 &&
(wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL))
2021-06-11 20:30:43 +02:00
{
2024-03-20 05:41:42 +01:00
if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)
{
2021-06-11 20:30:43 +02:00
mouse_unlock();
return 0;
}
}
2021-06-11 20:30:43 +02:00
2024-03-22 22:27:00 +01:00
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0);
if (video_hwnd)
{
PostMessageA(video_hwnd, uMsg, wParam, lParam);
return 0;
}
2021-06-11 20:30:43 +02:00
break;
}
case WM_KEYUP:
{
2023-09-22 00:38:42 +02:00
if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot)
2024-03-22 22:27:00 +01:00
ss_take_screenshot(g_ddraw.primary);
2021-06-11 20:30:43 +02:00
2024-03-22 22:27:00 +01:00
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0);
if (video_hwnd)
{
PostMessageA(video_hwnd, uMsg, wParam, lParam);
return 0;
}
2021-06-11 20:30:43 +02:00
break;
}
/* button up messages reactivate cursor lock */
case WM_LBUTTONUP:
case WM_RBUTTONUP:
case WM_MBUTTONUP:
{
2023-09-22 00:38:42 +02:00
if (!g_config.devmode && !g_mouse_locked)
{
2021-06-11 20:30:43 +02:00
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
2024-03-22 22:27:00 +01:00
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)
{
2024-03-22 22:27:00 +01:00
x = g_ddraw.width / 2;
y = g_ddraw.height / 2;
}
2021-06-11 20:30:43 +02:00
else
2021-05-31 14:07:41 +02:00
{
2024-03-22 22:27:00 +01:00
x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
2021-05-31 14:07:41 +02:00
}
2024-03-22 22:27:00 +01:00
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
2021-06-17 06:13:16 +02:00
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:
{
2023-09-22 00:38:42 +02:00
if (!g_config.devmode && !g_mouse_locked)
2021-06-17 06:46:39 +02:00
{
return 0;
}
2021-06-16 05:57:19 +02:00
if (uMsg == WM_MOUSEWHEEL)
{
POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
2024-03-22 22:27:00 +01:00
real_ScreenToClient(g_ddraw.hwnd, &pt);
lParam = MAKELPARAM(pt.x, pt.y);
}
2024-03-22 22:27:00 +01: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
2023-09-22 00:38:42 +02:00
if (g_config.adjmouse)
2020-10-13 21:58:04 +02:00
{
2023-09-22 00:38:42 +02:00
if (g_config.vhack && !g_config.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
{
2024-03-22 22:27:00 +01:00
x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x));
y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y));
2020-10-13 09:20:52 +02:00
}
2021-06-11 20:30:43 +02:00
}
2024-03-22 22:27:00 +01:00
x = min(x, g_ddraw.width - 1);
y = min(y, g_ddraw.height - 1);
2021-06-17 05:18:55 +02:00
2024-03-22 22:27:00 +01:00
InterlockedExchange((LONG*)&g_ddraw.cursor.x, x);
InterlockedExchange((LONG*)&g_ddraw.cursor.y, y);
2021-06-17 06:46:39 +02:00
lParam = MAKELPARAM(x, y);
2021-06-17 06:28:18 +02:00
2024-03-22 22:27:00 +01:00
HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0);
if (video_hwnd)
{
PostMessageA(video_hwnd, uMsg, wParam, lParam);
return 0;
}
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
{
2023-09-22 00:38:42 +02:00
if (!g_config.devmode && !g_mouse_locked)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x);
int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y);
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01: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
2024-03-22 22:27:00 +01:00
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
2021-06-11 20:30:43 +02:00
break;
}
case WM_ERASEBKGND:
{
2024-03-22 22:27:00 +01:00
if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)
{
2024-03-22 22:27:00 +01:00
InterlockedExchange(&g_ddraw.render.clear_screen, TRUE);
ReleaseSemaphore(g_ddraw.render.sem, 1, NULL);
}
2021-06-11 20:30:43 +02:00
break;
}
2020-10-13 09:20:52 +02:00
}
2024-03-22 22:27:00 +01:00
return CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, lParam);
2020-10-13 09:20:52 +02:00
}