From f66b4372af04c693bd24fb01aefa82258c82fcc3 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 26 Oct 2016 12:47:52 -0400 Subject: [PATCH] v2_03_93_src Former-commit-id: 538a183458746eaea03fa8d63578a2efbc8a635d --- build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/readme-relnotes.txt | 12 +++- dll/ddblit.cpp | 4 +- dll/ddraw.cpp | 115 ++++++++++++++++++++++++++------------ dll/dinput.cpp | 43 +++++++++++++- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 51712 -> 83968 bytes dll/user32.cpp | 48 +++++++++++++++- host/CGlobalSettings.cpp | 88 +++++++++++++++++------------ host/CGlobalSettings.h | 9 +++ host/TabProgram.cpp | 67 ++++++++++++++++++++-- host/dxwndhost.aps | Bin 248724 -> 250004 bytes host/dxwndhost.rc | Bin 132114 -> 135090 bytes host/dxwndhost.vs2008.suo | Bin 46592 -> 46592 bytes host/dxwndhostView.cpp | 6 ++ host/resource | Bin 48294 -> 49030 bytes 17 files changed, 313 insertions(+), 89 deletions(-) diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 344534c..0e698fd 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:14919d03fd4ec468005183e338af3f4734eeed9ec11ef6aaf2540c1f9bb00872 -size 691712 +oid sha256:e28f7cec6d5eae185c1bdf2c27ab49e1357051f487c243b60f5d25b11172c21f +size 694784 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 6a033f1..3dd268f 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:145095298932076ccdb75aec0627b07f05ad61d9559ed3481a57de4d8a58ea21 -size 662016 +oid sha256:46c4384a402e3f5d23af6b3f6f9649833e7aefedf0c46bfd7eee282d8029f6ff +size 664576 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 92701ad..87d28d4 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1309,4 +1309,14 @@ fix: added reference to Palette object to allow final Release() without crash - fix: fix RECT structure passed to ddraw::Unlock method in case it points to bad coordinates. Fixes FIFA2000 in D3D mode fix: wrapped all OpenGL GetString methods and inserted proper logging. For diagnostic purposes. fix: fix ddraw::SetPalette wrapper in case lppd is NULL. Fixes Adrenix sw mode crash. -fix: better way to manage extra modules to be hooked (Glide ddls, SmackW32) \ No newline at end of file +fix: better way to manage extra modules to be hooked (Glide ddls, SmackW32) + +v2.03.93: +add: GUI game icon extracted also form separated *.ico icon file +add: GUI definition of default values for window position +fix: ddrawsurface::Unlock lprect usage: doesn't use the input value but refers to rect passed in Lock operation. Fixes "fifa 2000" crash. +fix: avoid issuing a GetPalette method against a deallocated object +fix: automatic creation of Clipper object if needed for emulated ddraw blit to primary surface - fixes the well known black blitting problem +fix: proper handling of dinput DirectInputDevice::GetDeviceData() DI_BUFFEROVERFLOW error condition +fix: user32 GetCursorPos() wrapper +fix: user32 mouse_event() wrapper \ No newline at end of file diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index a515a73..ca0d914 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -169,10 +169,12 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR #if FIXBIGGERRECT // seems necessary to "cure" the "FIFA 2000" soccer game in hw accelerated graphics, when the Unlock() method - // receives RECT coordinates with big negative numbers! + // receives RECT coordinates with big positive or negative numbers! if(lpdestrect){ if(lpdestrect->top < 0) lpdestrect->top = 0; + if(lpdestrect->top > (LONG)dxw.GetScreenWidth()) lpdestrect->top = 0; if(lpdestrect->left < 0) lpdestrect->left = 0; + if(lpdestrect->left > (LONG)dxw.GetScreenHeight()) lpdestrect->left = 0; if(lpdestrect->bottom > (LONG)dxw.GetScreenHeight()) lpdestrect->bottom = dxw.GetScreenHeight(); if(lpdestrect->right > (LONG)dxw.GetScreenWidth()) lpdestrect->right = dxw.GetScreenWidth(); if(lpdestrect->bottom < lpdestrect->top) lpdestrect->bottom = (LONG)dxw.GetScreenHeight(); diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 70f9f84..d31d507 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -415,6 +415,7 @@ LPDIRECTDRAWSURFACE lpDDZBuffer=NULL; // the service objects (emulated backbuffer, emulater primary, ....) are attached. LPDIRECTDRAW lpPrimaryDD=NULL; int iBakBufferVersion; +int iDirectDrawVersion; LPDIRECTDRAWPALETTE lpDDP=NULL; LPDIRECTDRAWCLIPPER lpddC=NULL; int iDDPExtraRefCounter=0; @@ -532,6 +533,7 @@ static CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) if (lpddsd->dwFlags & DDSD_LPSURFACE) sprintf(sInfo, "%s Surface=%x", sInfo, lpddsd->lpSurface); if (lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH) sprintf(sInfo, "%s ZBufferBitDepth=%d", sInfo, lpddsd->dwZBufferBitDepth); if (lpddsd->dwFlags & DDSD_ALPHABITDEPTH) sprintf(sInfo, "%s AlphaBitDepth=%d", sInfo, lpddsd->dwAlphaBitDepth); + if (lpddsd->dwReserved) sprintf(sInfo, "%s Reserved=%d", sInfo, lpddsd->dwReserved); if (lpddsd->dwFlags & DDSD_REFRESHRATE) sprintf(sInfo, "%s RefreshRate=%d", sInfo, lpddsd->dwRefreshRate); if (lpddsd->dwFlags & DDSD_LINEARSIZE) sprintf(sInfo, "%s LinearSize=%d", sInfo, lpddsd->dwLinearSize); if (lpddsd->dwSize == sizeof(DDSURFACEDESC2)){ @@ -1142,6 +1144,8 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) OutTraceDW("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", *lplpdd, dxversion, GetCurrentThreadId()); + iDirectDrawVersion = dxversion; // save for ddraw session operations + // unimplemented, but better not hook it with a single wrapper //SetHook((void *)(**(DWORD **)lplpdd + 12), extCompact, (void **)&pCompact, "Compact"); switch(dxversion) { @@ -1575,7 +1579,7 @@ static void HandleCapsD(char *sLabel, LPDDCAPS c) static HRESULT WINAPI extGetCapsD(int dxversion, GetCapsD_Type pGetCapsD, LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) { HRESULT res; - OutTraceDDRAW("GetCaps(D): lpdd=%x %s %s\n", lpdd, c1?"c1":"NULL", c2?"c2":"NULL"); + OutTraceDDRAW("GetCaps(D%d): lpdd=%x %s %s\n", dxversion, lpdd, c1?"c1":"NULL", c2?"c2":"NULL"); res=(*pGetCapsD)(lpdd, c1, c2); if(res) OutTraceE("GetCaps(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); @@ -2256,9 +2260,9 @@ HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheig HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) { return extSetDisplayMode(7, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags);} -HRESULT WINAPI extGetDisplayMode(GetDisplayMode_Type pGetDisplayMode, LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +HRESULT WINAPI extGetDisplayMode(int dxversion, GetDisplayMode_Type pGetDisplayMode, LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) { - OutTraceDDRAW("GetDisplayMode(D1): lpdd=%x lpddsd=%x\n", lpdd, lpddsd); + OutTraceDDRAW("GetDisplayMode(D%d): lpdd=%x lpddsd=%x\n", dxversion, lpdd, lpddsd); (*pGetDisplayMode)(lpdd, lpddsd); if(dxw.dwFlags1 & EMULATESURFACE) { @@ -2294,15 +2298,15 @@ HRESULT WINAPI extGetDisplayMode(GetDisplayMode_Type pGetDisplayMode, LPDIRECTDR } HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) -{ return extGetDisplayMode(pGetDisplayMode1, lpdd, lpddsd); } +{ return extGetDisplayMode(1, pGetDisplayMode1, lpdd, lpddsd); } HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) -{ return extGetDisplayMode(pGetDisplayMode2, lpdd, lpddsd); } +{ return extGetDisplayMode(2, pGetDisplayMode2, lpdd, lpddsd); } HRESULT WINAPI extGetDisplayMode3(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) -{ return extGetDisplayMode(pGetDisplayMode3, lpdd, lpddsd); } +{ return extGetDisplayMode(3, pGetDisplayMode3, lpdd, lpddsd); } HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) -{ return extGetDisplayMode((GetDisplayMode_Type)pGetDisplayMode4, lpdd, (LPDDSURFACEDESC)lpddsd); } +{ return extGetDisplayMode(4, (GetDisplayMode_Type)pGetDisplayMode4, lpdd, (LPDDSURFACEDESC)lpddsd); } HRESULT WINAPI extGetDisplayMode7(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) -{ return extGetDisplayMode((GetDisplayMode_Type)pGetDisplayMode7, lpdd, (LPDDSURFACEDESC)lpddsd); } +{ return extGetDisplayMode(7, (GetDisplayMode_Type)pGetDisplayMode7, lpdd, (LPDDSURFACEDESC)lpddsd); } HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pSetCooperativeLevel, LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) { @@ -3570,8 +3574,11 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA LPDIRECTDRAWSURFACE lpddsBak; DDSCAPS caps; CreateSurface1_Type pCreateSurface; + CreateClipper_Type pCreateClipper; + SetClipper_Type pSetClipper; BltFast_Type pBltFast; int dwSize; + static BOOL bUseFastBlt = !(dxw.dwFlags3 & FORCECLIPPER); switch(iBakBufferVersion){ default: @@ -3617,15 +3624,42 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA } else { while(TRUE) { - // fast-blit to primary - if(dxw.dwFlags3 & FORCECLIPPER){ - res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); - if(res) OutTraceE("PrimaryStretchBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(bUseFastBlt){ + res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); } else{ - res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); - if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); } + if(res == DDERR_INVALIDRECT){ + OutTraceDW("PrimaryStretchBlt: adding clipper ddversion=%x at %d\n", iDirectDrawVersion, __LINE__); + bUseFastBlt = FALSE; + switch(iDirectDrawVersion){ + case 1: pCreateClipper = pCreateClipper1; break; + case 2: pCreateClipper = pCreateClipper2; break; + case 3: pCreateClipper = pCreateClipper3; break; + case 4: pCreateClipper = pCreateClipper4; break; + case 7: pCreateClipper = pCreateClipper7; break; + } + switch(iBakBufferVersion){ + case 1: pSetClipper = pSetClipper1; break; + case 2: pSetClipper = pSetClipper2; break; + case 3: pSetClipper = pSetClipper3; break; + case 4: pSetClipper = pSetClipper4; break; + case 7: pSetClipper = pSetClipper7; break; + } + if(!lpddC){ + res=(*pCreateClipper)(lpPrimaryDD, 0, &lpddC, NULL); + if(res) OutTraceE("CreateClipper ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } + //res=(*pSetHWnd)(lpddC, 0, dxw.GethWnd()); // no good, cliper object could be unhooked yet! "Settlers III" would crash! + res=lpddC->SetHWnd(0, dxw.GethWnd()); + if(res) OutTraceE("SetHWnd ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + res=(*pSetClipper)(lpdds, lpddC); + if(res) OutTraceE("SetClipper ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceDW("PrimaryStretchBlt: added clipper lpddc=%x at %d\n", lpddC, __LINE__); + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); + } + if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); if(res == DDERR_SURFACELOST){ res = lpdds->Restore(); if(res) { @@ -4221,7 +4255,9 @@ HRESULT WINAPI extGetPalette(int dxversion, GetPalette_Type pGetPalette, LPDIREC isBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("GetPalette(%d): lpdds=%x%s%s\n", dxversion, lpdds, isPrim?"(PRIM)":"", isBack?"(BACK)":""); - res=(*pGetPalette)(lpdds, lplpddp); + res = DD_OK; + lpdds->AddRef(); + if(lpdds->Release()) res=(*pGetPalette)(lpdds, lplpddp); // v2.03.07: in "Die Hard Trilogy" the backbuffer surface is queryed for the palette // v2.03.08: in "Viper Racing" lpDDP is still NULL (how could it be?) @@ -4396,6 +4432,8 @@ HRESULT WINAPI extSetClipper7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpd DDSURFACEDESC SaveSurfaceDesc; LPDIRECTDRAWSURFACE SaveSurface = NULL; +LPRECT SaveLockedlpRect = NULL; +RECT SaveLockedRect; static HRESULT WINAPI extLock(int dxversion, Lock_Type pLock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) { @@ -4412,6 +4450,9 @@ static HRESULT WINAPI extLock(int dxversion, Lock_Type pLock, LPDIRECTDRAWSURFAC dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } + SaveLockedlpRect = lprect; + if(SaveLockedlpRect) SaveLockedRect = *lprect; + res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); if(res==DDERR_SURFACEBUSY){ // v70: fix for "Ancient Evil" (*pUnlockMethod(dxversion))(lpdds, NULL); @@ -4476,6 +4517,9 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR dxversion, lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } + SaveLockedlpRect = lprect; + if(SaveLockedlpRect) SaveLockedRect = *lprect; + switch(dxversion){ case 1: pBlt=pBlt1; pGetGDISurface=pGetGDISurface1; break; case 2: pBlt=pBlt2; pGetGDISurface=pGetGDISurface2; break; @@ -4567,7 +4611,6 @@ static HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRA HRESULT res; BOOL IsPrim; BOOL IsBack; - RECT rect; Blt_Type pBlt; IsPrim=dxwss.IsAPrimarySurface(lpdds); @@ -4599,15 +4642,12 @@ static HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRA } if(dxversion >= 4){ - // make lprect point elsewhere, so that the original values are not altered - if(lprect){ - CleanRect(&lprect,__LINE__); - rect = *lprect; - lprect = ▭ - // v2.03.20: apparently, it seems that in ddraw 7 you can set an empty rectangle to mean the whole area .... - // this fixes the black screen otherwise present in "Arcanum". - if(IsPrim && ((lprect->right - lprect->left) == 0) && ((lprect->bottom - lprect->top) == 0)) lprect = NULL; - } + // v2.03.20: apparently, it seems that in ddraw 7 you can set an empty rectangle to mean the whole area .... + // this fixes the black screen otherwise present in "Arcanum". + // v2.02.92: found in Fifa 2000: lpRect is completely ignored, receiving bogus values like (-1, -1, -1, -1} + // or {0, 0, 0, 0}, or {-109119151, -109119151, -109119151, -109119151}. + // better use the Lock-ed rect + if(IsPrim) lprect = SaveLockedlpRect; } if((dxw.dwFlags6 & FIXPITCH) && !(IsPrim||IsBack) && (lpdds == SaveSurface)){ @@ -4693,7 +4733,14 @@ static HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECT IsPrim=dxwss.IsAPrimarySurface(lpdds); IsBack=dxwss.IsABackBufferSurface(lpdds); - if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); + if(dxversion >= 4){ + // v2.03.20: apparently, it seems that in ddraw 7 you can set an empty rectangle to mean the whole area .... + // this fixes the black screen otherwise present in "Arcanum". + // v2.02.92: found in Fifa 2000: lpRect is completely ignored, receiving bogus values like (-1, -1, -1, -1} + // or {0, 0, 0, 0}, or {-109119151, -109119151, -109119151, -109119151}. + // better use the Lock-ed rect + if(IsPrim) lprect = SaveLockedlpRect; + } if(IsTraceDDRAW){ char sRect[81]; @@ -5695,6 +5742,7 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS #define FIXSURFACEDESCSIZE TRUE if(FIXSURFACEDESCSIZE){ + int prevsize = lpddsd->dwSize; switch(dxversion){ case 1: case 2: @@ -5706,21 +5754,18 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS lpddsd->dwSize = sizeof(DDSURFACEDESC2); break; } + if(prevsize != lpddsd->dwSize) OutTraceDW("GetSurfaceDesc(%d): FIXED dwSize=%d->%d\n", dxversion, prevsize, lpddsd->dwSize); } res=(*pGetSurfaceDesc)(lpdds, lpddsd); - OutTraceDDRAW("GetSurfaceDesc: %slpdds=%x%s res=%x(%s)\n", - res?"ERROR ":"", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res, ExplainDDError(res)); if(res) { - OutTraceE("GetSurfaceDesc: ERROR err=%x(%s) dxversion=%d s->len=%d at %d\n", res, ExplainDDError(res), dxversion, lpddsd->dwSize, __LINE__); + OutTraceE("GetSurfaceDesc(%d): ERROR err=%x(%s)\n", dxversion, res, ExplainDDError(res)); return res; } - OutTraceDDRAW("GetSurfaceDesc: lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__)); + OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__)); if (IsPrim) { - OutTraceDW("GetSurfaceDesc: fixing PRIMARY surface\n"); - IsFixed=TRUE; if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; lpddsd->ddsCaps.dwCaps |= DDSD_Prim.ddsCaps.dwCaps; lpddsd->ddsCaps.dwCaps |= (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE); // primary surfaces must be this way @@ -5729,21 +5774,21 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount; lpddsd->dwHeight=dxw.GetScreenHeight(); lpddsd->dwWidth=dxw.GetScreenWidth(); + OutTraceDW("GetSurfaceDesc: FIXED lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "PRIMARY", __LINE__)); } if (IsBack) { - OutTraceDW("GetSurfaceDesc: fixing BACKBUFFER surface\n"); - IsFixed=TRUE; // flags that backbuffer surfaces must have set lpddsd->ddsCaps.dwCaps |= (DDSCAPS_3DDEVICE|DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // flags that backbuffer surfaces can't have set lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN|DDSCAPS_COMPLEX|DDSCAPS_FLIP); + OutTraceDW("GetSurfaceDesc: FIXED lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "BACKBUFFER", __LINE__)); } // v2.03.82: fixed logic for ZBUFFER capabilities: "The Creed" may have two, in SYSTEMMEMORY or in VIDEOMEMORY ... if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { lpddsd->ddsCaps.dwCaps = dxwcdb.GetCaps(lpdds); - OutTraceDW("GetSurfaceDesc: lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "GetSurfaceDesc [FIXED]", __LINE__)); + OutTraceDW("GetSurfaceDesc: FIXED lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "ZBUFFER", __LINE__)); } return DD_OK; diff --git a/dll/dinput.cpp b/dll/dinput.cpp index eb1ea3a..b2d1482 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -551,6 +551,40 @@ dwFlags Normally, data is removed from the buffer after it is read. */ +/* Mind the following scenarios! +Your application can query for the number of elements in the device buffer by setting the rgdod parameter to NULL, setting pdwInOut to INFINITE +and setting dwFlags to DIGDD_PEEK. The following code example illustrates how this can be done. + +dwItems = INFINITE; +hres = idirectinputdevice9_GetDeviceData( + pdid, + sizeof(DIDEVICEOBJECTDATA), + NULL, + &dwItems, + DIGDD_PEEK); +if (SUCCEEDED(hres)) { + // dwItems = Number of elements in buffer. + if (hres == DI_BUFFEROVERFLOW) { + // Buffer overflow occurred; not all data + // was successfully captured. + } +} + +To query about whether a buffer overflow has occurred, set the rgdod parameter to NULL and the pdwInOut parameter to 0. +The following code example illustrates how this can be done. + +dwItems = 0; +hres = idirectinputdevice9_GetDeviceData( + pdid, + sizeof(DIDEVICEOBJECTDATA), + NULL, + &dwItems, + 0); +if (hres == DI_BUFFEROVERFLOW) { + // Buffer overflow occurred. +} +*/ + HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID rgdod, LPDWORD pdwinout, DWORD dwflags) { HRESULT res; @@ -577,6 +611,7 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID switch(res){ case DI_OK: + case DI_BUFFEROVERFLOW: break; case DIERR_NOTACQUIRED: case DIERR_INPUTLOST: @@ -611,9 +646,11 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID } tmp = (BYTE *)rgdod; + if(!tmp) return res; + if(dxw.bDInputAbs){ GetMousePosition((int *)&p.x, (int *)&p.y); - for(i = 0; i < *pdwinout; i ++){ + for(i = 0; (i < *pdwinout) && ((LPDIDEVICEOBJECTDATA)tmp)->dwOfs; i ++){ if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_X)((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.x; if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_Y)((LPDIDEVICEOBJECTDATA)tmp)->dwData = p.y; tmp += cbdata; @@ -621,14 +658,14 @@ HRESULT WINAPI extGetDeviceData(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPVOID OutTraceB("GetDeviceData(I): ABS mousedata=(%d,%d)\n", p.x, p.y); } else{ - for(i = 0; i < *pdwinout; i ++){ + for(i = 0; (i < *pdwinout) && ((LPDIDEVICEOBJECTDATA)tmp)->dwOfs; i ++){ if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_X) OutTraceB("GetDeviceData(I): REL mousedata X=%d\n", ((LPDIDEVICEOBJECTDATA)tmp)->dwData); if(((LPDIDEVICEOBJECTDATA)tmp)->dwOfs == DIMOFS_Y) OutTraceB("GetDeviceData(I): REL mousedata Y=%d\n", ((LPDIDEVICEOBJECTDATA)tmp)->dwData); tmp += cbdata; } } } - return DI_OK; + return res; } HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMOUSESTATE lpvdata) diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 9b19676..8e0f06b 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.92.fx2" +#define VERSION "2.03.93" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index cd0afb6999555007366cbe441c72325488f99f24..3d2b464d46d41e59e9f8e735d479424c5bb906b9 100644 GIT binary patch literal 83968 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 delta 11130 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 diff --git a/dll/user32.cpp b/dll/user32.cpp index c59265e..71ee4ca 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -307,7 +307,7 @@ static HookEntryEx_Type MouseHooks[]={ {HOOK_IAT_CANDIDATE, 0, "SetCursor", (FARPROC)SetCursor, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, {HOOK_IAT_CANDIDATE, 0, "SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessageA, (FARPROC)extSendMessageA}, {HOOK_IAT_CANDIDATE, 0, "SendMessageW", (FARPROC)SendMessageW, (FARPROC *)&pSendMessageW, (FARPROC)extSendMessageW}, - //{HOOK_IAT_CANDIDATE, 0, "mouse_event", (FARPROC)NULL, (FARPROC *)&pmouse_event, (FARPROC)extmouse_event}, + {HOOK_IAT_CANDIDATE, 0, "mouse_event", (FARPROC)mouse_event, (FARPROC *)&pmouse_event, (FARPROC)extmouse_event}, //{HOOK_IAT_CANDIDATE, 0, "SetPhysicalCursorPos", NULL, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, // ??? {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -1131,6 +1131,7 @@ static BOOL WINAPI extPeekMessage(PeekMessage_Type pPeekMessage, LPMSG lpMsg, HW { BOOL res; + if(dxw.dwFlags3 & PEEKALLMESSAGES){ if((wMsgFilterMin==0) && (wMsgFilterMax == 0)){ // no filtering, everything is good res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); @@ -1152,6 +1153,14 @@ static BOOL WINAPI extPeekMessage(PeekMessage_Type pPeekMessage, LPMSG lpMsg, HW else OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) res=%x\n", lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), res); + } + else { + res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); + OutTrace("PeekMessage: lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n", + lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), + lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), + lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); + } return res; @@ -3805,9 +3814,44 @@ BOOL WINAPI extPaintDesktop(HDC hdc) if(!ret) OutTraceE("PaintDesktop ERROR: err=%d\n", GetLastError()); return ret; } + + +char *ExplainMouseMoveFlags(DWORD c) +{ + static char eb[256]; + unsigned int l; + strcpy(eb,"MOUSEEVENTF_"); + if (c & MOUSEEVENTF_MOVE) strcat(eb, "MOVE+"); + if (c & MOUSEEVENTF_LEFTDOWN) strcat(eb, "LEFTDOWN+"); + if (c & MOUSEEVENTF_LEFTUP) strcat(eb, "LEFTUP+"); + if (c & MOUSEEVENTF_RIGHTDOWN) strcat(eb, "RIGHTDOWN+"); + if (c & MOUSEEVENTF_RIGHTUP) strcat(eb, "RIGHTUP+"); + if (c & MOUSEEVENTF_MIDDLEDOWN) strcat(eb, "MIDDLEDOWN+"); + if (c & MOUSEEVENTF_MIDDLEUP) strcat(eb, "MIDDLEUP+"); + if (c & MOUSEEVENTF_XDOWN) strcat(eb, "XDOWN+"); + if (c & MOUSEEVENTF_XUP) strcat(eb, "XUP+"); + if (c & MOUSEEVENTF_WHEEL) strcat(eb, "WHEEL+"); + if (c & MOUSEEVENTF_HWHEEL) strcat(eb, "HWHEEL+"); + if (c & MOUSEEVENTF_ABSOLUTE) strcat(eb, "ABSOLUTE+"); + l=strlen(eb); + if (l>strlen("MOUSEEVENTF_")) eb[l-1]=0; // delete last '+' if any + else eb[0]=0; + return(eb); +} + VOID WINAPI extmouse_event(DWORD dwFlags, DWORD dx, DWORD dy, DWORD dwData, ULONG_PTR dwExtraInfo) { - OutTrace("mouse_event: flags=%x xy=(%d,%d) data=%x, extrainfo=%lx\n", dwFlags, dx, dy, dwData, dwExtraInfo); + OutTrace("mouse_event: flags=%x(%s) xy=(%d,%d) data=%x, extrainfo=%lx\n", + dwFlags, ExplainMouseMoveFlags(dwFlags), dx, dy, dwData, dwExtraInfo); + + if((dwFlags & MOUSEEVENTF_MOVE) && (dxw.dwFlags2 & KEEPCURSORFIXED)) { + OutTraceDW("mouse_event: SUPPRESS mouse move\n"); + return; + } + + if(dxw.Windowize){ + dxw.MapClient((int *)&dx, (int *)&dy); + } return (*pmouse_event)(dwFlags, dx, dy, dwData, dwExtraInfo); } diff --git a/host/CGlobalSettings.cpp b/host/CGlobalSettings.cpp index 8f87276..d876a0c 100644 --- a/host/CGlobalSettings.cpp +++ b/host/CGlobalSettings.cpp @@ -79,6 +79,23 @@ IMPLEMENT_DYNAMIC(CGlobalSettings, CDialog) CGlobalSettings::CGlobalSettings(CWnd* pParent /*=NULL*/) : CDialog(CGlobalSettings::IDD, pParent) { + m_DebugMode = GetPrivateProfileInt("window", "debug", 0, gInitPath); + m_AutoHideMode = GetPrivateProfileInt("window", "autohide", 0, gInitPath); + m_CheckAdminRights = GetPrivateProfileInt("window", "checkadmin", 0, gInitPath); + m_NameFromFolder = GetPrivateProfileInt("window", "namefromfolder", 0, gInitPath); + m_MultiHooks = GetPrivateProfileInt("window", "multiprocesshook", 0, gInitPath); + m_UpdatePaths = GetPrivateProfileInt("window", "updatepaths", 1, gInitPath); + // texture limits + m_TexMinX = GetPrivateProfileInt("texture", "MinTexX", 0, gInitPath); + m_TexMinY = GetPrivateProfileInt("texture", "MinTexY", 0, gInitPath); + m_TexMaxX = GetPrivateProfileInt("texture", "MaxTexX", 0, gInitPath); + m_TexMaxY = GetPrivateProfileInt("texture", "MaxTexY", 0, gInitPath); + // defaults + m_DefaultCoordinates = GetPrivateProfileInt("window", "defaultcoord", 0, gInitPath); + m_DefaultPosX = GetPrivateProfileInt("window", "defaultposx", 50, gInitPath); + m_DefaultPosY = GetPrivateProfileInt("window", "defaultposy", 50, gInitPath); + m_DefaultSizX = GetPrivateProfileInt("window", "defaultsizx", 800, gInitPath); + m_DefaultSizY = GetPrivateProfileInt("window", "defaultsizy", 600, gInitPath); } CGlobalSettings::~CGlobalSettings() @@ -87,7 +104,12 @@ CGlobalSettings::~CGlobalSettings() void CGlobalSettings::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + //char msg[80]; + //sprintf(msg, "DoDataExchange(1) defposx = %d", m_DefaultPosX); + //MessageBox(msg, "debug", 0); + CString sDefaultPosX, sDefaultPosY; + sDefaultPosX.Format("%d", m_DefaultPosX); + sDefaultPosY.Format("%d", m_DefaultPosY); DDX_Check(pDX, IDC_CONFIG_DEBUGMODE, m_DebugMode); DDX_Check(pDX, IDC_CONFIG_AUTOHIDE, m_AutoHideMode); DDX_Check(pDX, IDC_CONFIG_CHECKADMIN, m_CheckAdminRights); @@ -98,34 +120,29 @@ void CGlobalSettings::DoDataExchange(CDataExchange* pDX) DDX_Text (pDX, IDC_TEX_MINY, m_TexMinY); DDX_Text (pDX, IDC_TEX_MAXX, m_TexMaxX); DDX_Text (pDX, IDC_TEX_MAXY, m_TexMaxY); + DDX_Radio(pDX, IDC_DEFAULTCOORDINATES, m_DefaultCoordinates); + DDX_Text(pDX, IDC_DEFAULTPOSX, sDefaultPosX); + DDX_Text(pDX, IDC_DEFAULTPOSY, sDefaultPosY); + DDX_Text(pDX, IDC_DEFAULTSIZX, m_DefaultSizX); + DDX_Text(pDX, IDC_DEFAULTSIZY, m_DefaultSizY); + m_DefaultPosX = atoi(sDefaultPosX); + m_DefaultPosY = atoi(sDefaultPosY); + CDialog::DoDataExchange(pDX); + //sprintf(msg, "DoDataExchange(2) defposx = %d", m_DefaultPosX); + //MessageBox(msg, "debug", 0); } BEGIN_MESSAGE_MAP(CGlobalSettings, CDialog) END_MESSAGE_MAP() -#define IDPaletteTIMER 2 - -// CPaletteDialog message handlers - -//static void SetKeys(HWND hDlg, Key_Type *FKeys, KeyCombo_Type *FKeyCombo) -//{ -// for(int i=0; FKeys[i].iLabelResourceId; i++){ -// int iCursor = 0; -// DWORD dwKey; -// dwKey = GetPrivateProfileInt("keymapping", FKeys[i].sIniLabel, -1, gInitPath); -// SetDlgItemText(hDlg,FKeys[i].iLabelResourceId,FKeys[i].sLabel); -// CComboBox *pCombo=(CComboBox *)GetDlgItem(FKeys[i].iComboResourceId); -// pCombo->Clear(); -// for(int j=0; FKeyCombo[j].dwVKeyCode; j++) { -// pCombo->AddString(FKeyCombo[j].sVKeyLabel); -// if(dwKey == FKeyCombo[j].dwVKeyCode) iCursor=j; -// } -// pCombo->SetCurSel(iCursor); -// } -//} - BOOL CGlobalSettings::OnInitDialog() { + IFormat *m_pRelIntegerFormat = new(RelIntegerFormat); + m_EditPosX.SubclassDlgItem(IDC_DEFAULTPOSX, this); + m_EditPosY.SubclassDlgItem(IDC_DEFAULTPOSY, this); + m_EditPosX.SetFormatter(m_pRelIntegerFormat); + m_EditPosY.SetFormatter(m_pRelIntegerFormat); + CDialog::OnInitDialog(); for(int i=0; FKeys[i].iLabelResourceId; i++){ int iCursor = 0; DWORD dwKey; @@ -152,22 +169,7 @@ BOOL CGlobalSettings::OnInitDialog() } pCombo->SetCurSel(iCursor); } - //SetKeys(this, FKeys, FKeyCombo); - //SetKeys(this, HKeys, HKeyCombo); - - m_DebugMode = GetPrivateProfileInt("window", "debug", 0, gInitPath); - m_AutoHideMode = GetPrivateProfileInt("window", "autohide", 0, gInitPath); - m_CheckAdminRights = GetPrivateProfileInt("window", "checkadmin", 0, gInitPath); - m_NameFromFolder = GetPrivateProfileInt("window", "namefromfolder", 0, gInitPath); - m_MultiHooks = GetPrivateProfileInt("window", "multiprocesshook", 0, gInitPath); - m_UpdatePaths = GetPrivateProfileInt("window", "updatepaths", 1, gInitPath); - m_TexMinX = GetPrivateProfileInt("texture", "MinTexX", 0, gInitPath); - m_TexMinY = GetPrivateProfileInt("texture", "MinTexY", 0, gInitPath); - m_TexMaxX = GetPrivateProfileInt("texture", "MaxTexX", 0, gInitPath); - m_TexMaxY = GetPrivateProfileInt("texture", "MaxTexY", 0, gInitPath); - CDialog::OnInitDialog(); return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE } void CGlobalSettings::OnOK() @@ -196,6 +198,18 @@ void CGlobalSettings::OnOK() WritePrivateProfileString("texture", "MaxTexX", val, gInitPath); sprintf_s(val, sizeof(val), "%i", m_TexMaxY); WritePrivateProfileString("texture", "MaxTexY", val, gInitPath); + // defaults + sprintf_s(val, sizeof(val), "%i", m_DefaultCoordinates); + WritePrivateProfileString("window", "defaultcoord", val, gInitPath); + sprintf_s(val, sizeof(val), "%i", m_DefaultPosX); + WritePrivateProfileString("window", "defaultposx", val, gInitPath); + sprintf_s(val, sizeof(val), "%i", m_DefaultPosY); + WritePrivateProfileString("window", "defaultposy", val, gInitPath); + sprintf_s(val, sizeof(val), "%i", m_DefaultSizX); + WritePrivateProfileString("window", "defaultsizx", val, gInitPath); + sprintf_s(val, sizeof(val), "%i", m_DefaultSizY); + WritePrivateProfileString("window", "defaultsizy", val, gInitPath); + // fkeys for(int i=0; FKeys[i].iLabelResourceId; i++){ int iCursor = 0; diff --git a/host/CGlobalSettings.h b/host/CGlobalSettings.h index b3839db..c81ac93 100644 --- a/host/CGlobalSettings.h +++ b/host/CGlobalSettings.h @@ -1,3 +1,5 @@ +#include "specialedit.h" + #pragma once typedef struct { @@ -39,11 +41,18 @@ protected: int m_TexMinY; int m_TexMaxX; int m_TexMaxY; + int m_DefaultCoordinates; + int m_DefaultPosX; + int m_DefaultPosY; + int m_DefaultSizX; + int m_DefaultSizY; DECLARE_MESSAGE_MAP() public: public: virtual BOOL OnInitDialog(); protected: + CSpecialEdit m_EditPosX; + CSpecialEdit m_EditPosY; virtual void OnOK(); }; diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index a48a52f..bbdfd86 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -2,6 +2,7 @@ // #include "stdafx.h" +#include "shlwapi.h" #include "TargetDlg.h" #include "TabProgram.h" #include "dxwndhost.h" @@ -229,6 +230,38 @@ void CTabProgram::OnDropFiles(HDROP dropInfo) DragFinish(dropInfo); } +#include +#include +#include + +void _tmain(int argc, TCHAR *argv[]) +{ + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + + if( argc != 2 ) + { + _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]); + return; + } + + _tprintf (TEXT("Target file is %s\n"), argv[1]); + hFind = FindFirstFile(argv[1], &FindFileData); + if (hFind == INVALID_HANDLE_VALUE) + { + printf ("FindFirstFile failed (%d)\n", GetLastError()); + return; + } + else + { + _tprintf (TEXT("The first file found is %s\n"), + FindFileData.cFileName); + FindClose(hFind); + } +} + + + BOOL CTabProgram::OnInitDialog() { HINSTANCE Hinst; @@ -246,14 +279,38 @@ BOOL CTabProgram::OnInitDialog() //m_Launch.DragAcceptFiles(); CDialog::OnInitDialog(); CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); + IconBox=(CStatic *)this->GetDlgItem(IDC_STATIC_ICON); Hinst = ::LoadLibrary(cTarget->m_FilePath); if(Hinst){ Icon = ::ExtractIcon(Hinst, cTarget->m_FilePath, 0); - IconBox=(CStatic *)this->GetDlgItem(IDC_STATIC_ICON); - PrevIcon = IconBox->SetIcon(Icon); - if (IconBox->GetIcon() == NULL) - IconBox->SetIcon(::LoadIcon(NULL, IDI_ERROR)); - ::FreeLibrary(Hinst); + if(Icon){ + PrevIcon = IconBox->SetIcon(Icon); + if (IconBox->GetIcon() == NULL) + IconBox->SetIcon(::LoadIcon(NULL, IDI_ERROR)); + } + else{ + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + char SearchPath[MAX_PATH]; + strcpy(SearchPath, cTarget->m_FilePath); + PathRemoveFileSpec(SearchPath); + strcat(SearchPath, "\\*.ico"); + //MessageBox(SearchPath, "debug", 0); + hFind = FindFirstFile(SearchPath, &FindFileData); + if ((hFind != INVALID_HANDLE_VALUE) && (hFind != (HANDLE)ERROR_FILE_NOT_FOUND)){ + strcpy(SearchPath, cTarget->m_FilePath); + PathRemoveFileSpec(SearchPath); + strcat(SearchPath, "\\"); + strcat(SearchPath, FindFileData.cFileName); + //MessageBox(SearchPath, "debug", 0); + Icon = ::ExtractIcon(NULL, SearchPath, 0); + PrevIcon = IconBox->SetIcon(Icon); + if (IconBox->GetIcon() == NULL) + IconBox->SetIcon(::LoadIcon(NULL, IDI_ERROR)); + FindClose(hFind); + } + ::FreeLibrary(Hinst); + } if(PrevIcon) ::DestroyIcon(PrevIcon); } diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 9c560db14f1813820b5fca0fa7b958868b2a721d..53f67572a92d7db5536318f10ed259e8129b4b01 100644 GIT binary patch delta 4682 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 diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index bcc85a2..8d3a3c6 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -1962,6 +1962,12 @@ void CDxwndhostView::OnAdd(char *sInitialPath) } memset(&TargetMaps[i],0,sizeof(TARGETMAP)); // clean up, just in case.... if(sInitialPath) dlg.m_FilePath = CString(sInitialPath); + + dlg.m_Coordinates = GetPrivateProfileInt("window", "defaultcoord", 0, gInitPath); + dlg.m_PosX = GetPrivateProfileInt("window", "defaultposx", 50, gInitPath); + dlg.m_PosY = GetPrivateProfileInt("window", "defaultposy", 50, gInitPath); + dlg.m_SizX = GetPrivateProfileInt("window", "defaultsizx", 800, gInitPath); + dlg.m_SizY = GetPrivateProfileInt("window", "defaultsizy", 600, gInitPath); if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ strnncpy(PrivateMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); diff --git a/host/resource b/host/resource index 0ec0d9412453cc740b45d803358ff56f2209c786..c2ab1e74e7dfeeb28169db8bfcb1d84b72559b26 100644 GIT binary patch delta 176 zcmZ4Xld0`L(}rmsli7;-CfAv0O*UX=nOxRU1LiZCYfV1a(Ew)00og#g&3c_I9FqeC zSU`fT0Sx{O!IK}RsWTc+Zp>9g5