diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index 5e2b8cb..e37f5b1 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2cb685fd9bcac89865a83e26fbdc14663d7d2f9bba0014f1e4c44606f6bb7702
-size 680960
+oid sha256:9070435639bcf64aebc632f848af969aa24800cb40864ae90d5ce56a1d43b373
+size 681472
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 2632b2e..767685f 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b7b7d8268a048d4d8600bca6824ef8226e2dab5bb347d07b9bb2afff7d2a73d1
+oid sha256:14ddc8f6eaa1eac7dc356e8824fb118e014fe5b5e8828432e2ffa0ac58f1f3c4
size 660992
diff --git a/build/exports/Crazy Hospital 3.dxw b/build/exports/Microsoft Motocross Madness.dxw
similarity index 69%
rename from build/exports/Crazy Hospital 3.dxw
rename to build/exports/Microsoft Motocross Madness.dxw
index af26bef..328fb85 100644
--- a/build/exports/Crazy Hospital 3.dxw
+++ b/build/exports/Microsoft Motocross Madness.dxw
@@ -1,6 +1,6 @@
[target]
-title0=Crazy Hospital 3
-path0=D:\Games\Crazy Hospital 3\Dtrmain.exe
+title0=Microsoft Motocross Madness
+path0=F:\Games\Motocross Madness\mcm.exe
startfolder0=
launchpath0=
module0=
@@ -11,10 +11,10 @@ ver0=0
monitorid0=-1
coord0=0
flag0=136314914
-flagg0=1207959552
+flagg0=134219776
flagh0=20
-flagi0=138412036
-flagj0=4224
+flagi0=4194308
+flagj0=0
flagk0=65536
flagl0=0
flagm0=0
@@ -30,4 +30,4 @@ winver0=0
maxres0=-1
swapeffect0=0
maxddinterface0=7
-slowratio0=2
+slowratio0=1
diff --git a/build/exports/Street Fighter Zero II.dxw b/build/exports/Street Fighter Zero II.dxw
deleted file mode 100644
index c9f6633..0000000
--- a/build/exports/Street Fighter Zero II.dxw
+++ /dev/null
@@ -1,33 +0,0 @@
-[target]
-title0=Street Fighter Zero II
-path0=D:\Games\sfzero2\ZERO2.exe
-startfolder0=
-launchpath0=
-module0=
-opengllib0=
-notes0=
-registry0=
-ver0=0
-monitorid0=-1
-coord0=0
-flag0=136314914
-flagg0=1207959552
-flagh0=20
-flagi0=138412036
-flagj0=4224
-flagk0=65536
-flagl0=0
-flagm0=0
-tflag0=0
-dflag0=0
-posx0=50
-posy0=50
-sizx0=800
-sizy0=600
-maxfps0=0
-initts0=0
-winver0=0
-maxres0=-1
-swapeffect0=0
-maxddinterface0=7
-slowratio0=2
diff --git a/build/exports/Super Puzzle Fighter 2 Turbo.dxw b/build/exports/Super Puzzle Fighter 2 Turbo.dxw
deleted file mode 100644
index f03e1ea..0000000
--- a/build/exports/Super Puzzle Fighter 2 Turbo.dxw
+++ /dev/null
@@ -1,33 +0,0 @@
-[target]
-title0=Super Puzzle Fighter 2 Turbo
-path0=D:\Games\Super Puzzle Fighter 2 Turbo (1997)\W_Spf2x.exe
-startfolder0=
-launchpath0=
-module0=
-opengllib0=
-notes0=
-registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Capcom]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Capcom\w_spf2x]\n"SAVEDIR"=".\\"\n"SC_MODE"="SCREEN_MODE_640*480_8BIT_DIRECTX"\n"CD_ROM"=".\\"\n"SETUPCEHCK"="SETUP_ALL_OK"\n"NET_USER"=""\n\n
-ver0=0
-monitorid0=-1
-coord0=0
-flag0=136314914
-flagg0=1207959552
-flagh0=1044
-flagi0=1212153860
-flagj0=5248
-flagk0=67584
-flagl0=32768
-flagm0=0
-tflag0=0
-dflag0=0
-posx0=50
-posy0=50
-sizx0=800
-sizy0=600
-maxfps0=0
-initts0=0
-winver0=0
-maxres0=-1
-swapeffect0=0
-maxddinterface0=7
-slowratio0=2
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index 523461f..f5f400e 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -1266,6 +1266,10 @@ fix: added ddraw hooking in ddrawex/CreateDirectDraw() call: now "Theocracy" wor
fix: added hook for EnumDisplayDevicesW used by "Battleground Europe"
fix: added "Hide multi monitors" logic to EnumDisplayDevicesA/W
-
-
+v2.03.89
+fix: replaced hooked LoadLibrary with original call (*pLoadLibraryA), this seems to avoid the hook address replacements and the need for the "No hook update" flag. To be tested.
+fix: added some missing IID_DirectDraw3 case in DirectDraw hooking
+fix: fixed the logic for centering the main window for desktop with non-zero offset
+fix: improved logic for window placement in CreateWindowEx call
+fix: added wrapper for winmm/GetJoyPos() virtual joystick referenced in "Jane's FA18"
diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp
index e11185f..572cf32 100644
--- a/dll/ddblit.cpp
+++ b/dll/ddblit.cpp
@@ -369,17 +369,7 @@ HRESULT WINAPI sBlt(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDRAWSURFACE
HRESULT res;
BOOL ToPrim, FromPrim, ToScreen, FromScreen;
- if(dxw.dwFlags5 & MESSAGEPUMP){
- MSG msg;
- while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
- OutTraceW("MESSAGEPUMP: msg=%x l-wParam=(%x,%x)\n", msg.message, msg.lParam, msg.wParam);
- if((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) break; // do not consume keyboard inputs
- if((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST)) break; // do not consume mouse inputs
- PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
+ if(dxw.dwFlags5 & MESSAGEPUMP) dxw.MessagePump();
ToPrim=dxwss.IsAPrimarySurface(lpdds);
FromPrim=dxwss.IsAPrimarySurface(lpddssrc);
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index f18ef06..081a8ab 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -748,7 +748,7 @@ static void ddSetCompatibility()
HRESULT res;
HINSTANCE hinst;
- hinst=LoadLibrary("ddraw.dll");
+ hinst=(*pLoadLibraryA)("ddraw.dll");
pSetAppCompatData=(SetAppCompatData_Type)(*pGetProcAddress)(hinst, "SetAppCompatData");
if(pSetAppCompatData) {
if (dxw.dwFlags2 & SETCOMPATIBILITY){
@@ -776,7 +776,7 @@ static void BypassGOGDDrawRedirector()
GetSystemDirectory(sSysLibraryPath, MAX_PATH);
strcat(sSysLibraryPath, "\\ddraw.dll");
- hinst = LoadLibrary(sSysLibraryPath);
+ hinst = (*pLoadLibraryA)(sSysLibraryPath);
pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA");
pDirectDrawEnumerateExA = (DirectDrawEnumerateExA_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA");
pDirectDrawEnumerateW = (DirectDrawEnumerateW_Type)GetProcAddress(hinst, "DirectDrawEnumerateW");
@@ -825,7 +825,7 @@ int HookDirectDraw(HMODULE module, int version)
case 6:
HookLibraryEx(module, ddHooks, "ddraw.dll");
if(!pDirectDrawCreate){ // required for IAT patching
- hinst = LoadLibrary("ddraw.dll");
+ hinst = (*pLoadLibraryA)("ddraw.dll");
pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate");
pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA");
}
@@ -844,7 +844,7 @@ int HookDirectDraw(HMODULE module, int version)
//hinst = LoadLibrary("ddraw.dll");
HookLibraryEx(module, ddHooks, "ddraw.dll");
if(!pDirectDrawCreate){ // required for IAT patching in "Crimson skies"
- hinst = LoadLibrary("ddraw.dll");
+ hinst = (*pLoadLibraryA)("ddraw.dll");
pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA");
pDirectDrawEnumerateExA = (DirectDrawEnumerateExA_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA");
pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate");
@@ -1637,7 +1637,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I
if(!pDirectDrawCreate){ // not hooked yet....
HINSTANCE hinst;
- hinst = LoadLibrary("ddraw.dll");
+ hinst = (*pLoadLibraryA)("ddraw.dll");
if(!hinst){
OutTraceE("LoadLibrary ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
@@ -1674,6 +1674,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I
switch (*(DWORD *)lpguid){
case 0x6C14DB80: dxw.dwDDVersion=1; mode="IID_IDirectDraw"; break;
case 0xB3A6F3E0: dxw.dwDDVersion=2; mode="IID_IDirectDraw2"; break;
+ case 0x618f8ad4: dxw.dwDDVersion=3; mode="IID_IDirectDraw3"; break;
case 0x9c59509a: dxw.dwDDVersion=4; mode="IID_IDirectDraw4"; break;
case 0x15e65ec0: dxw.dwDDVersion=7; mode="IID_IDirectDraw7"; break;
default: mode="unknown"; break;
@@ -1730,7 +1731,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid,
// v2.1.70: auto-hooking (just in case...)
if(!pDirectDrawCreateEx){ // not hooked yet....
HINSTANCE hinst;
- hinst = LoadLibrary("ddraw.dll");
+ hinst = (*pLoadLibraryA)("ddraw.dll");
if(!hinst){
OutTraceE("LoadLibrary ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
@@ -1767,6 +1768,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid,
switch (*(DWORD *)lpguid){
case 0x6C14DB80: dxw.dwDDVersion=1; mode="IID_IDirectDraw"; break;
case 0xB3A6F3E0: dxw.dwDDVersion=2; mode="IID_IDirectDraw2"; break;
+ case 0x618f8ad4: dxw.dwDDVersion=3; mode="IID_IDirectDraw3"; break;
case 0x9c59509a: dxw.dwDDVersion=4; mode="IID_IDirectDraw4"; break;
case 0x15e65ec0: dxw.dwDDVersion=7; mode="IID_IDirectDraw7"; break;
default: mode="unknown"; break;
@@ -4006,7 +4008,7 @@ HRESULT WINAPI extBlt4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRA
HRESULT WINAPI extBlt7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx)
{ return extBlt(7, pBlt7, lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); }
-HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
+static HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy,
LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans)
{
@@ -4036,6 +4038,7 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
// try the actual method first, it may work in some corcumstances....
// when ret is DDERR_UNSUPPORTED try the emulated path.
if(!(ToPrim || FromPrim)) {
+ if(dxw.dwFlags5 & MESSAGEPUMP) dxw.MessagePump();
ret = pBltFast(lpdds, dwx, dwy, lpddssrc, lpsrcrect, dwtrans);
if(ret != DDERR_UNSUPPORTED) {
if(ret) OutTraceE("BltFast ERROR: res=%x(%s)\n", ret, ExplainDDError(ret));
@@ -4056,7 +4059,14 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC;
if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){
- return sBlt(dxversion, pBlt, "BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE);
+ ret = sBlt(dxversion, pBlt, "BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE);
+ if(ret) {
+ OutTraceE("BltFast FULLRECBLT res=%x\n", ret);
+ }
+ else {
+ OutTraceDDRAW("BltFast FULLRECBLT res=DD_OK\n");
+ }
+ return ret;
}
destrect.left = dwx;
@@ -4078,7 +4088,7 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
ret=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd);
if (ret){
OutTraceE("BltFast: GetSurfaceDesc ERROR %x at %d\n", ret, __LINE__);
- return 0;
+ return DD_OK;
}
destrect.right = destrect.left + ddsd.dwWidth;
destrect.bottom = destrect.top + ddsd.dwHeight;
@@ -4086,10 +4096,17 @@ HRESULT WINAPI extBltFast(int dxversion, Blt_Type pBlt, BltFast_Type pBltFast,
}
else{
//ret=sBlt("BltFast", lpdds, NULL, lpddssrc, NULL, flags, NULL, FALSE);
+ OutTraceDW("BltFast FAKE res=DD_OK at %d\n", __LINE__);
ret=DD_OK;
}
}
+ if(ret) {
+ OutTraceE("BltFast ERROR: res=%x(%s)\n", ret, ExplainDDError(ret));
+ }
+ else {
+ OutTraceDDRAW("BltFast: res=DD_OK\n");
+ }
return ret;
}
diff --git a/dll/dxmapping.cpp b/dll/dxmapping.cpp
index 1e8e984..116dc55 100644
--- a/dll/dxmapping.cpp
+++ b/dll/dxmapping.cpp
@@ -6,18 +6,20 @@
#include "syslibs.h"
#include "dxhelper.h"
-#if 0
+// IsValidMainWindow: returns TRUE if the main window can be queried for coordinates,
+// FALSE otherwise (e.g. when minimized)
+
BOOL dxwCore::IsValidMainWindow()
{
RECT Client;
POINT UpLeft = {0, 0};
-
if(!(*pGetClientRect)(hWnd, &Client)) return FALSE;
if((Client.right == 0) || (Client.bottom == 0)) return FALSE;
if(!(*pClientToScreen)(hWnd, &UpLeft)) return FALSE;
return TRUE;
}
-#endif
+
+// if the main window coordinates are still valid updates the window placement values
void dxwCore::UpdateDesktopCoordinates()
{
@@ -36,7 +38,6 @@ void dxwCore::UpdateDesktopCoordinates()
OutTraceB("dxwCore::UpdateDesktopCoordinates: NEW pos=(%d,%d) size=(%dx%d)\n", iPosX, iPosY, iSizX, iSizY);
}
-
// GetScreenRect: returns a RECT sized as the virtual desktop
RECT dxwCore::GetScreenRect()
@@ -346,7 +347,8 @@ void dxwCore::GetMonitorWorkarea(LPRECT lpRect, BOOL WorkArea)
MonitorId = -1;
GetMonitorWorkarea(lpRect, WorkArea);
}
-
+ OutTraceB("dxwCore::GetMonitorWorkarea: id=%d workarea=%x rect=(%d,%d)-(%d,%d)\n",
+ MonitorId, WorkArea, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom);
}
// v.2.1.80: unified positioning logic into CalculateWindowPos routine
@@ -360,7 +362,7 @@ void dxwCore::CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWP
int MaxX, MaxY;
HMENU hMenu;
- switch(dxw.Coordinates){
+ switch(Coordinates){
case DXW_DESKTOP_CENTER:
if(bAutoScale){
MaxX = GetScreenWidth();
@@ -381,8 +383,8 @@ void dxwCore::CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWP
if(dxw.dwFlags4 & BILINEAR2XFILTER) MaxY <<= 1; // double
}
dxw.GetMonitorWorkarea(&desktop, TRUE);
- rect.left = (desktop.right - desktop.left - MaxX) / 2;
- rect.top = (desktop.bottom - desktop.top - MaxY) / 2;
+ rect.left = (desktop.right + desktop.left - MaxX) / 2; // v2.03.89 - fixed
+ rect.top = (desktop.bottom + desktop.top - MaxY) / 2; // v2.03.89 - fixed
rect.right = rect.left + MaxX;
rect.bottom = rect.top + MaxY; //v2.02.09
// fixed ....
@@ -425,6 +427,8 @@ void dxwCore::CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWP
rect.bottom = iPosY + MaxY; //v2.02.09
break;
}
+ OutTraceB("dxwCore::CalculateWindowPos: coord=%d client rect=(%d,%d)-(%d,%d)\n",
+ Coordinates, rect.left, rect.top, rect.right, rect.bottom);
if(hwnd){
RECT UnmappedRect;
@@ -468,6 +472,9 @@ void dxwCore::CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWP
}
}
+ OutTraceB("dxwCore::CalculateWindowPos: coord=%d window rect=(%d,%d)-(%d,%d)\n",
+ Coordinates, rect.left, rect.top, rect.right, rect.bottom);
+
// update the arguments for the window creation
wp->x=rect.left;
wp->y=rect.top;
diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp
index e3161a2..4cd3b0e 100644
--- a/dll/dxwcore.cpp
+++ b/dll/dxwcore.cpp
@@ -1557,4 +1557,17 @@ void dxwCore::ToggleFreezedTime()
TimeFreeze = !TimeFreeze;
dwLastTime = (*pGetTickCount)();
OutTraceDW("DxWnd: time is %s\n", dxw.TimeFreeze ? "freezed" : "unfreezed");
-}
\ No newline at end of file
+}
+
+void dxwCore::MessagePump()
+{
+ MSG msg;
+ while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
+ OutTraceW("MESSAGEPUMP: msg=%x l-wParam=(%x,%x)\n", msg.message, msg.lParam, msg.wParam);
+ if((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST)) break; // do not consume keyboard inputs
+ if((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST)) break; // do not consume mouse inputs
+ PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp
index 47921d9..11c71b9 100644
--- a/dll/dxwcore.hpp
+++ b/dll/dxwcore.hpp
@@ -68,6 +68,7 @@ public: // methods
void FixNCHITCursorPos(LPPOINT);
void SetClipCursor(void);
void EraseClipCursor(void);
+ BOOL IsValidMainWindow();
RECT MapWindowRect(LPRECT);
RECT MapWindowRect(void);
RECT MapClientRect(LPRECT);
@@ -105,7 +106,7 @@ public: // methods
void GetSystemTimeAsFileTime(LPFILETIME);
DWORD StretchTime(DWORD);
DWORD StretchCounter(DWORD);
- LARGE_INTEGER dxwCore::StretchCounter(LARGE_INTEGER);
+ LARGE_INTEGER StretchCounter(LARGE_INTEGER);
void ShowOverlay();
void ShowOverlay(HDC);
void ShowOverlay(HDC, int, int);
@@ -144,6 +145,7 @@ public: // methods
void ToggleFreezedTime();
void GetMonitorWorkarea(LPRECT, BOOL);
void CalculateWindowPos(HWND, DWORD, DWORD, LPWINDOWPOS);
+ void MessagePump(void);
public: // simple data variables
int MonitorId;
diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps
index df04110..8d4793c 100644
Binary files a/dll/dxwnd.aps and b/dll/dxwnd.aps differ
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index fbfbfe1..4c95869 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.88.fix1"
+#define VERSION "2.03.89"
#define DDTHREADLOCK 1
//#define LOCKTHREADS
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 4841ea0..9970e5a 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj
index aded5d8..be323b1 100644
--- a/dll/dxwnd.vs2008.vcproj
+++ b/dll/dxwnd.vs2008.vcproj
@@ -562,6 +562,10 @@
RelativePath=".\hddraw.h"
>
+
+
diff --git a/dll/logall.h b/dll/logall.h
new file mode 100644
index 0000000..f1cfc08
--- /dev/null
+++ b/dll/logall.h
@@ -0,0 +1,16 @@
+#ifdef OutTraceB
+#undef OutTraceB
+#define OutTraceB OutTrace
+#endif
+#ifdef OutTraceDW
+#undef OutTraceDW
+#define OutTraceDW OutTrace
+#endif
+#ifdef OutTraceC
+#undef OutTraceC
+#define OutTraceC OutTrace
+#endif
+#ifdef OutTraceE
+#undef OutTraceE
+#define OutTraceE OutTrace
+#endif
\ No newline at end of file
diff --git a/dll/user32.cpp b/dll/user32.cpp
index 9df5cc4..f2fb7af 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -493,6 +493,9 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam)
OutTraceDW("%s: GOT hwnd=%x pos=(%d,%d) dim=(%d,%d) Flags=%x(%s)\n",
ApiName, hwnd, wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags));
+ // if nothing to be moved, do nothing
+ if ((wp->flags & (SWP_NOMOVE|SWP_NOSIZE))==(SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.13
+
if (dxw.dwFlags1 & PREVENTMAXIMIZE){
int UpdFlag = 0;
WINDOWPOS MaxPos;
@@ -504,8 +507,6 @@ void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam)
OutTraceDW("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy);
}
- if ((wp->flags & (SWP_NOMOVE|SWP_NOSIZE))==(SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.13
-
if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){
dxw.CalculateWindowPos(hwnd, MaxX, MaxY, wp);
OutTraceDW("%s: LOCK pos=(%d,%d) dim=(%d,%d)\n", ApiName, wp->x, wp->y, wp->cx, wp->cy);
@@ -1543,9 +1544,6 @@ static HWND WINAPI CreateWindowCommon(
// v2.03.53: revised code, logic moved to IsFullscreenWindow
if(isNewDesktop=IsFullscreenWindow(lpClassName, dwStyle, dwExStyle, hWndParent, x, y, nWidth, nHeight)){
- RECT screen;
- POINT upleft = {0,0};
-
// if already in fullscreen mode, save previous settings
if(dxw.IsFullScreen() && dxw.GethWnd()){
hLastFullScrWin = dxw.GethWnd();
@@ -1559,25 +1557,14 @@ static HWND WINAPI CreateWindowCommon(
// inserted some checks here, since the main window could be destroyed
// or minimized (see "Jedi Outcast") so that you may get a dangerous
// zero size. In this case, better renew the hWnd assignement and its coordinates.
- do { // fake loop
- isValidHandle = FALSE;
- if (!(*pGetClientRect)(dxw.GethWnd(),&screen)) break;
- if (!(*pClientToScreen)(dxw.GethWnd(),&upleft)) break;
- if (screen.right==0 || screen.bottom==0) break;
- isValidHandle = TRUE;
- } while(FALSE);
- if (isValidHandle){ // use parent's coordinates
- // child windows of the current virtual desktop have relative coordinates
- // but non child windows or child of the real desktop must be shifted....
- //if (!(dwStyle & WS_CHILD) || (dxw.IsDesktop(hWndParent))){
- if (!(dwStyle & WS_CHILD)){
- x=upleft.x;
- y=upleft.y;
- }
- nWidth=screen.right;
- nHeight=screen.bottom;
- OutTraceDW("%s: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight);
+ isValidHandle = dxw.IsValidMainWindow();
+ if (!(dwStyle & WS_CHILD) || (dxw.IsRealDesktop(hWndParent))){
+ x=dxw.iPosX;
+ y=dxw.iPosY;
}
+ nWidth=dxw.GetScreenWidth();
+ nHeight=dxw.GetScreenHeight();
+ OutTraceDW("%s: fixed client pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight);
dxw.SetFullScreen(TRUE);
}
@@ -1593,7 +1580,7 @@ static HWND WINAPI CreateWindowCommon(
// from here on, fullscreen is garanteed
if(!isNewDesktop){
- if (dwStyle & WS_CHILD){
+ if ((dwStyle & WS_CHILD) && !dxw.IsRealDesktop(hWndParent)){
// tested on Gangsters: coordinates must be window-relative!!!
// Age of Empires....
dxw.MapClient(&x, &y, &nWidth, &nHeight);
@@ -1601,15 +1588,13 @@ static HWND WINAPI CreateWindowCommon(
ApiName, x, y, nWidth, nHeight);
}
else {
- if ((dwExStyle & WS_EX_CONTROLPARENT) || (dwStyle & WS_POPUP)){
- // needed for "Diablo", that creates a new WS_EX_CONTROLPARENT window that must be
- // overlapped to the directdraw surface.
- // needed for "Riven", that creates a new WS_POPUP window with the menu bar that must be
- // overlapped to the directdraw surface.
- dxw.MapWindow(&x, &y, &nWidth, &nHeight);
- OutTraceDW("%s: fixed pos=(%d,%d) size=(%d,%d)\n",
- ApiName, x, y, nWidth, nHeight);
- }
+ // needed for "Diablo", that creates a new WS_EX_CONTROLPARENT window that must be
+ // overlapped to the directdraw surface.
+ // needed for "Riven", that creates a new WS_POPUP window with the menu bar that must be
+ // overlapped to the directdraw surface.
+ dxw.MapWindow(&x, &y, &nWidth, &nHeight);
+ OutTraceDW("%s: fixed ABSOLUTE pos=(%d,%d) size=(%d,%d)\n",
+ ApiName, x, y, nWidth, nHeight);
}
}
@@ -1628,6 +1613,7 @@ static HWND WINAPI CreateWindowCommon(
if (dwExStyle & WS_EX_CONTROLPARENT) hControlParentWnd=hwnd;
+ // replace the invalid main win with the new one
if ((!isValidHandle) && dxw.IsFullScreen()){
dxw.SethWnd(hwnd);
extern void AdjustWindowPos(HWND, DWORD, DWORD);
diff --git a/dll/winmm.cpp b/dll/winmm.cpp
index 224b52f..b6d0e41 100644
--- a/dll/winmm.cpp
+++ b/dll/winmm.cpp
@@ -15,6 +15,8 @@
#define EMULATEJOY TRUE
#define INVERTJOYAXIS TRUE
+// #include "logall.h" // comment when not debugging
+
BOOL IsWithinMCICall = FALSE;
typedef MCIDEVICEID (WINAPI *mciGetDeviceIDA_Type)(LPCTSTR);
@@ -32,6 +34,9 @@ MMRESULT WINAPI extjoyGetDevCapsA(DWORD, LPJOYCAPS, UINT);
typedef MMRESULT (WINAPI *joyGetPosEx_Type)(DWORD, LPJOYINFOEX);
joyGetPosEx_Type pjoyGetPosEx = NULL;
MMRESULT WINAPI extjoyGetPosEx(DWORD, LPJOYINFOEX);
+typedef MMRESULT (WINAPI *joyGetPos_Type)(DWORD, LPJOYINFO);
+joyGetPos_Type pjoyGetPos = NULL;
+MMRESULT WINAPI extjoyGetPos(DWORD, LPJOYINFO);
typedef MMRESULT (WINAPI *auxGetNumDevs_Type)(void);
auxGetNumDevs_Type pauxGetNumDevs = NULL;
MMRESULT WINAPI extauxGetNumDevs(void);
@@ -62,6 +67,7 @@ static HookEntryEx_Type JoyHooks[]={
{HOOK_IAT_CANDIDATE, 0, "joyGetNumDevs", NULL, (FARPROC *)&pjoyGetNumDevs, (FARPROC)extjoyGetNumDevs},
{HOOK_IAT_CANDIDATE, 0, "joyGetDevCapsA", NULL, (FARPROC *)&pjoyGetDevCapsA, (FARPROC)extjoyGetDevCapsA},
{HOOK_IAT_CANDIDATE, 0, "joyGetPosEx", NULL, (FARPROC *)&pjoyGetPosEx, (FARPROC)extjoyGetPosEx},
+ {HOOK_IAT_CANDIDATE, 0, "joyGetPos", NULL, (FARPROC *)&pjoyGetPos, (FARPROC)extjoyGetPos},
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
@@ -211,7 +217,7 @@ MCIERROR WINAPI extmciSendCommand(mciSendCommand_Type pmciSendCommand, MCIDEVICE
switch(uMsg){
case MCI_STATUS:
MCI_STATUS_PARMS *p = (MCI_STATUS_PARMS *)dwParam;
- OutTrace("mciSendCommand: Item=%d Track=%d return=%x\n", p->dwItem, p->dwTrack, p->dwReturn);
+ OutTraceDW("mciSendCommand: Item=%d Track=%d return=%x\n", p->dwItem, p->dwTrack, p->dwReturn);
break;
}
}
@@ -326,9 +332,9 @@ MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc)
// set Joystick capability structure
memset(pjc, 0, sizeof(JOYCAPS));
strncpy(pjc->szPname, "DxWnd Joystick Emulator", MAXPNAMELEN);
- pjc->wXmin = 0;
+ pjc->wXmin = -XSPAN;
pjc->wXmax = XSPAN;
- pjc->wYmin = 0;
+ pjc->wYmin = -YSPAN;
pjc->wYmax = YSPAN;
pjc->wNumButtons = 2;
pjc->wMaxButtons = 2;
@@ -341,11 +347,11 @@ MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc)
return JOYERR_NOERROR;
}
-MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji)
+static MMRESULT GetJoy(char *apiname, DWORD uJoyID, LPJOYINFO lpj)
{
- OutTraceC("joyGetPosEx: joyid=%d\n", uJoyID);
+ OutTraceC("%s: joyid=%d\n", apiname, uJoyID);
if(uJoyID != 0) return JOYERR_PARMS;
- LONG x, y;
+ LONG x, y, CenterX, CenterY;
HWND hwnd;
DWORD dwButtons;
static BOOL bJoyLock = FALSE;
@@ -355,7 +361,7 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji)
if (GetKeyState(VK_LBUTTON) < 0) dwButtons |= JOY_BUTTON1;
if (GetKeyState(VK_RBUTTON) < 0) dwButtons |= JOY_BUTTON2;
if (GetKeyState(VK_MBUTTON) < 0) dwButtons |= JOY_BUTTON3;
- OutTraceB("joyGetPosEx: Virtual Joystick buttons=%x\n", dwButtons);
+ OutTraceB("%s: Virtual Joystick buttons=%x\n", apiname, dwButtons);
if(dwButtons == JOY_BUTTON3){
if(((*pGetTickCount)() - dwLastClick) > 200){
@@ -365,8 +371,10 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji)
}
}
- x=(XSPAN>>1);
- y=(YSPAN>>1);
+ // default: centered position
+ x=0;
+ y=0;
+ // get cursor position and map it to virtual joystick x,y axis
if(hwnd=dxw.GethWnd()){
POINT pt;
RECT client;
@@ -379,43 +387,60 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji)
if(bJoyLock || !dxw.bActive){
// when the joystick is "locked" (bJoyLock) or when the window lost focus
// (dxw.bActive == FALSE) place the joystick in the central position
- OutTraceB("joyGetPosEx: CENTERED lock=%x active=%x\n", bJoyLock, dxw.bActive);
- x=(XSPAN>>1);
- y=(YSPAN>>1);
+ OutTraceB("%s: CENTERED lock=%x active=%x\n", apiname, bJoyLock, dxw.bActive);
+ x=0;
+ y=0;
pt.x = client.right >> 1;
pt.y = client.bottom >> 1;
dwButtons = JOY_BUTTON3;
}
else{
- OutTraceB("joyGetPosEx: ACTIVE mouse=(%d,%d)\n", pt.x, pt.y);
+ OutTraceB("%s: ACTIVE mouse=(%d,%d)\n", apiname, pt.x, pt.y);
if(pt.x < client.left) pt.x = client.left;
if(pt.x > client.right) pt.x = client.right;
if(pt.y < client.top) pt.y = client.top;
if(pt.y > client.bottom) pt.y = client.bottom;
- x = (pt.x * XSPAN) / client.right;
+ CenterX = (client.right - client.left) >> 1;
+ CenterY = (client.bottom - client.top) >> 1;
+ x = ((pt.x - CenterX) * XSPAN) / client.right;
if(INVERTJOYAXIS)
- y = ((client.bottom - pt.y) * YSPAN) / client.bottom; // inverted y axis
+ y = ((CenterY - pt.y) * YSPAN) / client.bottom; // inverted y axis
else
- y = (pt.y * YSPAN) / client.bottom;
+ y = ((pt.y - CenterY) * YSPAN) / client.bottom;
}
ShowJoystick(pt.x, pt.y, dwButtons);
}
- else {
- x=(XSPAN>>1);
- y=(YSPAN>>1);
- }
+ lpj->wXpos = x;
+ lpj->wYpos = y;
+ lpj->wZpos = 0;
+ lpj->wButtons = dwButtons;
+ OutTraceC("%s: joyid=%d pos=(%d,%d)\n", apiname, uJoyID, lpj->wXpos, lpj->wYpos);
+ return JOYERR_NOERROR;
+}
- // set Joystick info structure
+MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji)
+{
+ MMRESULT res;
+ JOYINFO jinfo;
+ res=GetJoy("joyGetPosEx", uJoyID, &jinfo);
+
+ // set Joystick JOYINFOEX info structure
memset(pji, 0, sizeof(JOYINFOEX));
pji->dwSize = sizeof(JOYINFOEX);
pji->dwFlags = 0;
- pji->dwXpos = x;
- pji->dwYpos = y;
- pji->dwButtons = dwButtons;
+ pji->dwXpos = jinfo.wXpos;
+ pji->dwYpos = jinfo.wYpos;
+ pji->dwButtons = jinfo.wButtons;
pji->dwFlags = JOY_RETURNX|JOY_RETURNY|JOY_RETURNBUTTONS;
- OutTraceC("joyGetPosEx: joyid=%d pos=(%d,%d)\n", uJoyID, pji->dwXpos, pji->dwYpos);
- return JOYERR_NOERROR;
+ return res;
+}
+
+MMRESULT WINAPI extjoyGetPos(DWORD uJoyID, LPJOYINFO pji)
+{
+ MMRESULT res;
+ res=GetJoy("joyGetPosEx", uJoyID, pji);
+ return res;
}
static void ShowJoystick(LONG x, LONG y, DWORD dwButtons)
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index d5fbefd..0b47af6 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ