diff --git a/inc/dd.h b/inc/dd.h index 762bace..2a5a766 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -12,7 +12,7 @@ ULONG dd_AddRef(); ULONG dd_Release(); HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback); HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE h); -HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp); +HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp, BOOL set_by_game); HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); HRESULT dd_RestoreDisplayMode(); HRESULT dd_GetCaps(LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps); @@ -107,7 +107,6 @@ typedef struct cnc_ddraw BOOL hidecursor; BOOL accurate_timers; BOOL resizable; - BOOL sierrahack; BOOL nonexclusive; BOOL fixpitch; BOOL fixchildwindows; diff --git a/inc/wndproc.h b/inc/wndproc.h index 85cad2b..6d2a199 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -4,6 +4,9 @@ #define WM_AUTORENDERER WM_APP+111 #define WM_WINEFULLSCREEN WM_APP+112 #define WM_D3D9DEVICELOST WM_APP+113 +#define WM_SIZE_DDRAW WM_APP+114 +#define WM_MOVE_DDRAW WM_APP+115 +#define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 338238d..9664869 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -316,7 +316,7 @@ HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND h HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD width, DWORD height, DWORD bpp) { dprintf("-> %s(This=%p, width=%d, height=%d, bpp=%d)\n", __FUNCTION__, This, (unsigned int)width, (unsigned int)height, (unsigned int)bpp); - HRESULT ret = dd_SetDisplayMode(width, height, bpp); + HRESULT ret = dd_SetDisplayMode(width, height, bpp, TRUE); dprintf("<- %s\n", __FUNCTION__); return ret; } @@ -324,7 +324,7 @@ HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD width HRESULT __stdcall IDirectDraw__SetDisplayModeX(IDirectDrawImpl* This, DWORD width, DWORD height, DWORD bpp, DWORD refreshRate, DWORD flags) { dprintf("-> %s(This=%p, width=%d, height=%d, bpp=%d, refreshRate=%d, flags=%d)\n", __FUNCTION__, This, (unsigned int)width, (unsigned int)height, (unsigned int)bpp, (unsigned int)refreshRate, (unsigned int)flags); - HRESULT ret = dd_SetDisplayMode(width, height, bpp); + HRESULT ret = dd_SetDisplayMode(width, height, bpp, TRUE); dprintf("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/config.c b/src/config.c index f559f6c..e1e63d6 100644 --- a/src/config.c +++ b/src/config.c @@ -54,7 +54,6 @@ void cfg_load() g_ddraw->d3d9linear = cfg_get_bool("d3d9linear", TRUE); g_ddraw->backbuffer = cfg_get_bool("backbuffer", TRUE); g_ddraw->passthrough = cfg_get_bool("passthrough", TRUE); - g_ddraw->sierrahack = cfg_get_bool("sierrahack", FALSE); // Sierra Caesar III, Pharaoh, and Zeus hack g_config.window_rect.right = cfg_get_int("width", 0); g_config.window_rect.bottom = cfg_get_int("height", 0); @@ -501,17 +500,14 @@ static void cfg_create_ini() "; Caesar III\n" "[c3]\n" "handlemouse=false\n" - "sierrahack=true\n" "\n" "; Pharaoh\n" "[Pharaoh]\n" "handlemouse=false\n" - "sierrahack=true\n" "\n" "; Master of Olympus - Zeus\n" "[Zeus]\n" "handlemouse=false\n" - "sierrahack=true\n" "renderer=gdi\n" "hook=2\n" "\n" diff --git a/src/dd.c b/src/dd.c index 3c8655c..f5f0380 100644 --- a/src/dd.c +++ b/src/dd.c @@ -294,7 +294,7 @@ HRESULT dd_RestoreDisplayMode() return DD_OK; } -HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) +HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp, BOOL set_by_game) { if (bpp != 8 && bpp != 16 && bpp != 32) return DDERR_INVALIDMODE; @@ -644,7 +644,7 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) { g_ddraw->render.run = FALSE; g_ddraw->windowed = TRUE; - return dd_SetDisplayMode(width, height, bpp); + return dd_SetDisplayMode(width, height, bpp, FALSE); } if (g_ddraw->wine) @@ -672,10 +672,11 @@ HRESULT dd_SetDisplayMode(DWORD width, DWORD height, DWORD bpp) g_ddraw->render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw->renderer, NULL, 0, NULL); } - if (g_ddraw->sierrahack) + if (set_by_game) { - PostMessageA(g_ddraw->hwnd, WM_MOVE, 0, MAKELPARAM(-32000, -32000)); - PostMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + //real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); } return DD_OK; diff --git a/src/utils.c b/src/utils.c index 918269d..4b36c7a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -231,7 +231,7 @@ void util_toggle_fullscreen() g_config.window_state = g_ddraw->windowed = FALSE; real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, GetWindowLong(g_ddraw->hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); g_ddraw->altenter = TRUE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE); util_update_bnet_pos(0, 0); mouse_lock(); @@ -250,7 +250,7 @@ void util_toggle_fullscreen() ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); } - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE); mouse_lock(); } } @@ -300,7 +300,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) g_config.window_rect.right = width; } - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE); } } diff --git a/src/wndproc.c b/src/wndproc.c index 4d5a5e3..22b0ef8 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -39,6 +39,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_NCLBUTTONUP: case WM_NCPAINT: case WM_CANCELMODE: + case WM_DISPLAYCHANGE: { return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -110,6 +111,21 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam 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: { if (g_ddraw->renderer == d3d9_render_main && d3d9_on_device_lost()) @@ -187,7 +203,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam in_size_move = FALSE; if (!g_ddraw->render.thread) - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); + dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, FALSE); } break; } @@ -369,12 +385,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (!g_ddraw->handlemouse) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - if (g_ddraw->sierrahack) - { - lParam = 0; - break; - } - return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ }