From 3d7f3704384700eb17fcd550fabe96b0769aafbe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Nov 2017 14:57:27 +0100 Subject: [PATCH] save window position --- ddraw.dll | Bin 170496 -> 171008 bytes main.c | 92 +++++++++++++++++++++++++++++++++++++++--------------- main.h | 5 ++- 3 files changed, 71 insertions(+), 26 deletions(-) diff --git a/ddraw.dll b/ddraw.dll index 6d2ed71616e7a9fd54e45ddffa948b29c7adf75f..a9778480025d75647c59b542b6cc5a6313960f2c 100644 GIT binary patch delta 19572 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 MW2*PAz?YN%15Hf6H~;_u delta 18813 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 E11_9pssI20 diff --git a/main.c b/main.c index 98c96d0..c9c23dd 100644 --- a/main.c +++ b/main.c @@ -44,6 +44,19 @@ DWORD WINAPI render_main(void); DWORD WINAPI render_soft_main(void); DWORD WINAPI render_dummy_main(void); +void SaveWindowPosition() +{ + if (ddraw->windowed) + { + char buf[16]; + sprintf(buf, "%d", ddraw->posX); + WritePrivateProfileString("ddraw", "posX", buf, ddraw->ini_path); + + sprintf(buf, "%d", ddraw->posY); + WritePrivateProfileString("ddraw", "posY", buf, ddraw->ini_path); + } +} + HRESULT __stdcall ddraw_Compact(IDirectDrawImpl *This) { printf("DirectDraw::Compact(This=%p)\n", This); @@ -221,8 +234,8 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD } /* center the window with correct dimensions */ - int x = (This->mode.dmPelsWidth / 2) - (This->render.width / 2); - int y = (This->mode.dmPelsHeight / 2) - (This->render.height / 2); + int x = (This->posX != -1) ? This->posX : (This->mode.dmPelsWidth / 2) - (This->render.width / 2); + int y = (This->posY != -1) ? This->posY : (This->mode.dmPelsHeight / 2) - (This->render.height / 2); RECT dst = { x, y, This->render.width+x, This->render.height+y }; AdjustWindowRect(&dst, GetWindowLong(This->hWnd, GWL_STYLE), FALSE); SetWindowPos(This->hWnd, HWND_NOTOPMOST, dst.left, dst.top, (dst.right - dst.left), (dst.bottom - dst.top), SWP_SHOWWINDOW); @@ -295,15 +308,35 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(uMsg) { + case WM_MOVE: + { + if (ddraw->windowed) + { + int x = (int)(short)LOWORD(lParam); + int y = (int)(short)HIWORD(lParam); + + if (x != -32000) + ddraw->posX = x; // -32000 = Exit/Minimize + + if (y != -32000) + ddraw->posY = y; + } + break; + } + /* Carmageddon stops the main loop when it sees these, DefWindowProc is also bad */ - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - return 0; + //case WM_WINDOWPOSCHANGING: + //case WM_WINDOWPOSCHANGED: + // return 0; /* C&C and RA really don't want to close down */ case WM_SYSCOMMAND: if (wParam == SC_CLOSE) { + if (ddraw->windowed) + { + SaveWindowPosition(); + } exit(0); } return DefWindowProc(hWnd, uMsg, wParam, lParam); @@ -528,6 +561,11 @@ ULONG __stdcall ddraw_Release(IDirectDrawImpl *This) { FreeLibrary(This->real_dll); } + + if (ddraw->windowed) + { + SaveWindowPosition(); + } DeleteCriticalSection(&This->cs); @@ -623,14 +661,13 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk /* load configuration options from ddraw.ini */ char cwd[MAX_PATH]; - char ini_path[MAX_PATH]; char tmp[256]; GetCurrentDirectoryA(sizeof(cwd), cwd); - snprintf(ini_path, sizeof(ini_path), "%s\\ddraw.ini", cwd); + snprintf(This->ini_path, sizeof(This->ini_path), "%s\\ddraw.ini", cwd); - if(GetFileAttributes(ini_path) == 0xFFFFFFFF) + if(GetFileAttributes(This->ini_path) == 0xFFFFFFFF) { - FILE *fh = fopen(ini_path, "w"); + FILE *fh = fopen(This->ini_path, "w"); fputs( "[ddraw]\n" "; width and height of the window, defaults to the size game requests\r\n" @@ -661,11 +698,14 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk "renderer=gdi\n" "; force CPU0 affinity, avoids crashes with RA, *might* have a performance impact\n" "singlecpu=true\n" + "; Windows position, -1 = center to screen\n" + "posX=-1\n" + "posY=-1\n" , fh); fclose(fh); } - GetPrivateProfileStringA("ddraw", "windowed", "TRUE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "windowed", "TRUE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'n' || tolower(tmp[0]) == 'f' || tolower(tmp[0]) == 'd' || tmp[0] == '0') { This->windowed = FALSE; @@ -675,7 +715,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->windowed = TRUE; } - GetPrivateProfileStringA("ddraw", "border", "TRUE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "border", "TRUE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'n' || tolower(tmp[0]) == 'f' || tolower(tmp[0]) == 'd' || tmp[0] == '0') { This->border = FALSE; @@ -685,7 +725,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->border = TRUE; } - GetPrivateProfileStringA("ddraw", "boxing", "FALSE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "boxing", "FALSE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'n' || tolower(tmp[0]) == 'f' || tolower(tmp[0]) == 'd' || tmp[0] == '0') { This->boxing = FALSE; @@ -695,17 +735,19 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->boxing = TRUE; } - This->render.maxfps = GetPrivateProfileIntA("ddraw", "max_fps", 120, ini_path); - This->render.width = GetPrivateProfileIntA("ddraw", "width", 0, ini_path); - This->render.height = GetPrivateProfileIntA("ddraw", "height", 0, ini_path); + This->render.maxfps = GetPrivateProfileIntA("ddraw", "max_fps", 120, This->ini_path); + This->render.width = GetPrivateProfileIntA("ddraw", "width", 0, This->ini_path); + This->render.height = GetPrivateProfileIntA("ddraw", "height", 0, This->ini_path); + This->posX = GetPrivateProfileIntA("ddraw", "posX", 0, This->ini_path); + This->posY = GetPrivateProfileIntA("ddraw", "posY", 0, This->ini_path); - This->render.bpp = GetPrivateProfileIntA("ddraw", "bpp", 32, ini_path); + This->render.bpp = GetPrivateProfileIntA("ddraw", "bpp", 32, This->ini_path); if (This->render.bpp != 16 && This->render.bpp != 24 && This->render.bpp != 32) { This->render.bpp = 0; } - GetPrivateProfileStringA("ddraw", "filter", tmp, tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "filter", tmp, tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'l' || tolower(tmp[3]) == 'l') { This->render.filter = 1; @@ -715,7 +757,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->render.filter = 0; } - GetPrivateProfileStringA("ddraw", "adjmouse", "FALSE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "adjmouse", "FALSE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { This->adjmouse = TRUE; @@ -725,7 +767,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->adjmouse = FALSE; } - GetPrivateProfileStringA("ddraw", "mhack", "TRUE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "mhack", "TRUE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { This->mhack = TRUE; @@ -735,7 +777,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->mhack = FALSE; } - GetPrivateProfileStringA("ddraw", "devmode", "FALSE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "devmode", "FALSE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { This->devmode = TRUE; @@ -746,7 +788,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->devmode = FALSE; } - GetPrivateProfileStringA("ddraw", "vsync", "FALSE", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "vsync", "FALSE", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { This->vsync = TRUE; @@ -756,10 +798,10 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->vsync = FALSE; } - GetPrivateProfileStringA("ddraw", "sensitivity", "0", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "sensitivity", "0", tmp, sizeof(tmp), This->ini_path); This->sensitivity = strtof(tmp, NULL); - GetPrivateProfileStringA("ddraw", "vhack", "false", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "vhack", "false", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { This->vhack = 2; @@ -773,7 +815,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->vhack = 0; } - GetPrivateProfileStringA("ddraw", "renderer", "gdi", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "renderer", "gdi", tmp, sizeof(tmp), This->ini_path); if(tolower(tmp[0]) == 'd' || tolower(tmp[0]) == 'd') { printf("DirectDrawCreate: Using dummy renderer\n"); @@ -790,7 +832,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->renderer = render_main; } - GetPrivateProfileStringA("ddraw", "singlecpu", "true", tmp, sizeof(tmp), ini_path); + GetPrivateProfileStringA("ddraw", "singlecpu", "true", tmp, sizeof(tmp), This->ini_path); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { printf("DirectDrawCreate: Setting CPU0 affinity\n"); diff --git a/main.h b/main.h index 1351246..de7f658 100644 --- a/main.h +++ b/main.h @@ -83,7 +83,10 @@ typedef struct IDirectDrawImpl BOOL vhack; BOOL isredalert; DWORD WINAPI (*renderer)(void); - + int posX; + int posY; + char ini_path[MAX_PATH]; + } IDirectDrawImpl; typedef struct IDirectDrawImplVtbl IDirectDrawImplVtbl;