From 3b162bb65476a651e863fd593ae9a1fbb9afcdf1 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 5 Feb 2014 11:39:10 -0500 Subject: [PATCH] v2_02_73_src Former-commit-id: 4aa8086fa4b721b743570947ea3aa50d69c99954 --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 5 + build/exports/Call To Power 2.dxw | 26 ++ build/exports/Crimson Skies (DEMO).dxw | 24 ++ build/exports/Disney Groove It.dxw | 26 ++ build/exports/Empire of the Ants (ITA).dxw | 26 ++ build/exports/Hundred Swords.dxw | 26 ++ build/exports/Insane.dxw | 27 ++ build/exports/Jolly Rover.dxw | 26 ++ build/exports/LEGO Stunt Rally.dxw | 27 ++ build/exports/MDK2.dxw | 26 ++ build/exports/Mall Tycoon 3.dxw | 26 ++ build/exports/Motocross Madness Trial.dxw | 26 ++ build/exports/PC Ciclismo 2001 (HAL).dxw | 26 ++ ...clismo 2001 (through RGB sw emulation).dxw | 26 ++ build/exports/Prey.dxw | 26 ++ build/exports/Rites of War Demo.dxw | 26 ++ build/exports/SpellForce GOLD Edition.dxw | 27 ++ build/exports/Sub Command.dxw | 27 ++ build/exports/Tropico Paradise Island.dxw | 26 ++ build/readme-relnotes.txt | 3 + dll/ddraw.cpp | 129 +++++--- dll/dxhelper.cpp | 1 + dll/dxhook.cpp | 105 ++++--- dll/dxwcore.cpp | 4 +- dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 288768 -> 288768 bytes dll/hd3d.cpp | 266 ++++++++-------- dll/kernel32.cpp | 2 +- dll/syslibs.h | 8 +- dll/user32.cpp | 294 ++++++++++++------ host/Resource.h | 2 + host/TabInput.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 148656 -> 172352 bytes host/dxwndhost.rc | 19 +- host/dxwndhost.vs2008.suo | Bin 155136 -> 167424 bytes host/dxwndhostView.cpp | 2 + 42 files changed, 983 insertions(+), 340 deletions(-) create mode 100644 build/dxwnd.ini create mode 100644 build/exports/Call To Power 2.dxw create mode 100644 build/exports/Crimson Skies (DEMO).dxw create mode 100644 build/exports/Disney Groove It.dxw create mode 100644 build/exports/Empire of the Ants (ITA).dxw create mode 100644 build/exports/Hundred Swords.dxw create mode 100644 build/exports/Insane.dxw create mode 100644 build/exports/Jolly Rover.dxw create mode 100644 build/exports/LEGO Stunt Rally.dxw create mode 100644 build/exports/MDK2.dxw create mode 100644 build/exports/Mall Tycoon 3.dxw create mode 100644 build/exports/Motocross Madness Trial.dxw create mode 100644 build/exports/PC Ciclismo 2001 (HAL).dxw create mode 100644 build/exports/PC Ciclismo 2001 (through RGB sw emulation).dxw create mode 100644 build/exports/Prey.dxw create mode 100644 build/exports/Rites of War Demo.dxw create mode 100644 build/exports/SpellForce GOLD Edition.dxw create mode 100644 build/exports/Sub Command.dxw create mode 100644 build/exports/Tropico Paradise Island.dxw diff --git a/Include/dxwnd.h b/Include/dxwnd.h index cee3fd1..a479495 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -138,6 +138,7 @@ #define SUPPORTSVGA 0x00400000 // Supports SVGA standard resolutions #define SUPPORTHDTV 0x00800000 // Supports HDTV standard resolutions #define RELEASEMOUSE 0x01000000 // GetCursorPos returns centered coordinates when the mouse cursor is moved outside the window +#define FRAMECOMPENSATION 0x02000000 // Compensate for frame border adding x,y displacement of (x) left border and (y) window title bar // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 1da87e5..3065a8c 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8c611f6cdccad0df1ba3b649511c7d2b439dae191fa2b7789306494873761540 -size 474112 +oid sha256:2402376ce446d1f0d06c36f3d7cfdda81e9052c03dde6bdcb0532bf9b5fc67ef +size 475648 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 1f9b9e7..3a9a89f 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1c883d8d4dfc5696176aa802dd69c0c32d1e682d0672bfb24609b39e2a581950 +oid sha256:e351b8cb36d1cfc02f5a113555e75bc72da15b5054595777b85b4fac2d993b6d size 539136 diff --git a/build/dxwnd.ini b/build/dxwnd.ini new file mode 100644 index 0000000..56f6475 --- /dev/null +++ b/build/dxwnd.ini @@ -0,0 +1,5 @@ +[window] +posx=930 +posy=192 +sizx=320 +sizy=200 diff --git a/build/exports/Call To Power 2.dxw b/build/exports/Call To Power 2.dxw new file mode 100644 index 0000000..3ef24a5 --- /dev/null +++ b/build/exports/Call To Power 2.dxw @@ -0,0 +1,26 @@ +[target] +title0=Call To Power 2 +path0=D:\Games\Call To Power 2\ctp2_program\ctp\ctp2.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134234657 +flagg0=1207959552 +flagh0=32788 +flagi0=4 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Crimson Skies (DEMO).dxw b/build/exports/Crimson Skies (DEMO).dxw new file mode 100644 index 0000000..ff2c160 --- /dev/null +++ b/build/exports/Crimson Skies (DEMO).dxw @@ -0,0 +1,24 @@ +[target] +title0=Crimson Skies (DEMO) +path0=D:\Games\Crimson Skies\crimson.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=155205636 +flagg0=1210056720 +flagh0=20 +flagi0=260 +tflag0=3 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Disney Groove It.dxw b/build/exports/Disney Groove It.dxw new file mode 100644 index 0000000..df39fea --- /dev/null +++ b/build/exports/Disney Groove It.dxw @@ -0,0 +1,26 @@ +[target] +title0=Disney Groove It +path0=D:\Games\groove it\groove.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217728 +flagg0=1207959808 +flagh0=20 +flagi0=4 +tflag0=6211 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Empire of the Ants (ITA).dxw b/build/exports/Empire of the Ants (ITA).dxw new file mode 100644 index 0000000..8b0ba00 --- /dev/null +++ b/build/exports/Empire of the Ants (ITA).dxw @@ -0,0 +1,26 @@ +[target] +title0=Empire of the Ants (ITA) +path0=D:\Games\Empire of the Ants\Formiche.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=151011364 +flagg0=134217728 +flagh0=20 +flagi0=4 +tflag0=6467 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Hundred Swords.dxw b/build/exports/Hundred Swords.dxw new file mode 100644 index 0000000..7814396 --- /dev/null +++ b/build/exports/Hundred Swords.dxw @@ -0,0 +1,26 @@ +[target] +title0=Hundred Swords +path0=D:\Games\Hundred Swords\H_SWORDS.exe +module0= +opengllib0= +ver0=1 +coord0=0 +flag0=402653472 +flagg0=1212153856 +flagh0=20 +flagi0=4 +tflag0=6210 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=4 +maxres0=-1 diff --git a/build/exports/Insane.dxw b/build/exports/Insane.dxw new file mode 100644 index 0000000..ec5c4e0 --- /dev/null +++ b/build/exports/Insane.dxw @@ -0,0 +1,27 @@ +[target] +title0=Insane +path0=D:\Games\Insane\Game.exe +launchpath0= +module0= +opengllib0= +ver0=7 +coord0=0 +flag0=134217760 +flagg0=1207959553 +flagh0=20 +flagi0=4194308 +tflag0=6146 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Jolly Rover.dxw b/build/exports/Jolly Rover.dxw new file mode 100644 index 0000000..a00c24b --- /dev/null +++ b/build/exports/Jolly Rover.dxw @@ -0,0 +1,26 @@ +[target] +title0=Jolly Rover +path0=D:\Games\Jolly Rover\rover.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218240 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/LEGO Stunt Rally.dxw b/build/exports/LEGO Stunt Rally.dxw new file mode 100644 index 0000000..c44445b --- /dev/null +++ b/build/exports/LEGO Stunt Rally.dxw @@ -0,0 +1,27 @@ +[target] +title0=LEGO Stunt Rally +path0=D:\Games\LEGO Stunt Rally\_msr.exe +launchpath0=D:\Games\LEGO Stunt Rally\StuntRally.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217760 +flagg0=1207959552 +flagh0=20 +flagi0=4325380 +tflag0=6210 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/MDK2.dxw b/build/exports/MDK2.dxw new file mode 100644 index 0000000..8a3a852 --- /dev/null +++ b/build/exports/MDK2.dxw @@ -0,0 +1,26 @@ +[target] +title0=MDK2 +path0=D:\Games\MDK2\mdk2Main.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217760 +flagg0=1744961536 +flagh0=20 +flagi0=4 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Mall Tycoon 3.dxw b/build/exports/Mall Tycoon 3.dxw new file mode 100644 index 0000000..0311ea5 --- /dev/null +++ b/build/exports/Mall Tycoon 3.dxw @@ -0,0 +1,26 @@ +[target] +title0=Mall Tycoon 3 +path0=D:\Games\Mall Tycoon 3\Mall3Game.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671089184 +flagg0=1207959552 +flagh0=20 +flagi0=4194308 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Motocross Madness Trial.dxw b/build/exports/Motocross Madness Trial.dxw new file mode 100644 index 0000000..5ee2e35 --- /dev/null +++ b/build/exports/Motocross Madness Trial.dxw @@ -0,0 +1,26 @@ +[target] +title0=Motocross Madness Trial +path0=D:\Games\Motocross Madness Trial\mcm.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=169885728 +flagg0=134219776 +flagh0=20 +flagi0=2097156 +tflag0=6415 +initx0=0 +inity0=0 +minx0=50 +miny0=50 +maxx0=800 +maxy0=600 +posx0=0 +posy0=0 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/PC Ciclismo 2001 (HAL).dxw b/build/exports/PC Ciclismo 2001 (HAL).dxw new file mode 100644 index 0000000..bf853d0 --- /dev/null +++ b/build/exports/PC Ciclismo 2001 (HAL).dxw @@ -0,0 +1,26 @@ +[target] +title0=PC Ciclismo 2001 +path0=D:\Games\PC Ciclismo 2001\PcCiclismo.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=1207959840 +flagg0=1207959552 +flagh0=98324 +flagi0=4 +tflag0=6211 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/PC Ciclismo 2001 (through RGB sw emulation).dxw b/build/exports/PC Ciclismo 2001 (through RGB sw emulation).dxw new file mode 100644 index 0000000..b7eae2f --- /dev/null +++ b/build/exports/PC Ciclismo 2001 (through RGB sw emulation).dxw @@ -0,0 +1,26 @@ +[target] +title0=PC Ciclismo 2001 +path0=D:\Games\PC Ciclismo 2001\PcCiclismo.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=1207959586 +flagg0=1207959552 +flagh0=98324 +flagi0=4 +tflag0=6211 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Prey.dxw b/build/exports/Prey.dxw new file mode 100644 index 0000000..89454d6 --- /dev/null +++ b/build/exports/Prey.dxw @@ -0,0 +1,26 @@ +[target] +title0=Prey +path0=D:\Games\Prey\prey.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1208090624 +flagh0=20 +flagi0=4 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Rites of War Demo.dxw b/build/exports/Rites of War Demo.dxw new file mode 100644 index 0000000..af513ea --- /dev/null +++ b/build/exports/Rites of War Demo.dxw @@ -0,0 +1,26 @@ +[target] +title0=Rites of War Demo +path0=D:\Games\Rites of War Demo\RoWDemo.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134234656 +flagg0=1207959680 +flagh0=20 +flagi0=4 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/SpellForce GOLD Edition.dxw b/build/exports/SpellForce GOLD Edition.dxw new file mode 100644 index 0000000..0a5c2a7 --- /dev/null +++ b/build/exports/SpellForce GOLD Edition.dxw @@ -0,0 +1,27 @@ +[target] +title0=SpellForce GOLD Edition +path0=D:\Games\SpellForce\SpellForce.exe +launchpath0= +module0= +opengllib0= +ver0=9 +coord0=0 +flag0=134218272 +flagg0=1207959552 +flagh0=20 +flagi0=4194308 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Sub Command.dxw b/build/exports/Sub Command.dxw new file mode 100644 index 0000000..ac2c053 --- /dev/null +++ b/build/exports/Sub Command.dxw @@ -0,0 +1,27 @@ +[target] +title0=Sub Command +path0=D:\Games\Sub Command\subcommand.exe +launchpath0= +module0= +opengllib0= +ver0=8 +coord0=0 +flag0=1610613345 +flagg0=1207959552 +flagh0=20 +flagi0=37748740 +tflag0=64 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=1200 +sizy0=900 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Tropico Paradise Island.dxw b/build/exports/Tropico Paradise Island.dxw new file mode 100644 index 0000000..f75cabc --- /dev/null +++ b/build/exports/Tropico Paradise Island.dxw @@ -0,0 +1,26 @@ +[target] +title0=Tropico Paradise Island +path0=D:\Games\Tropico Paradise Island\Tropico.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218272 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=1024 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 9bcac3e..2b8f111 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -472,3 +472,6 @@ added "Launch" field (optional) to start the program with arguments or a separat v2.02.72 fix: fixed Launch field used with "Use DLL injection" flag fix: somehow improved "Use DLL injection" to avoid blocked tasks and allow exception handling + +v2.02.73 +to be written .... \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 3d2758f..8db12d4 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1843,7 +1843,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, dxw.SetScreenSize(dwwidth, dwheight); GetHookInfo()->Height=(short)dxw.GetScreenHeight(); GetHookInfo()->Width=(short)dxw.GetScreenWidth(); - AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight); + if(dxw.Windowize) AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight); if(dxw.dwFlags1 & EMULATESURFACE){ // in EMULATESURFACE mode, let SetPixFmt decide upon the PixelFormat @@ -1852,27 +1852,38 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, ddsd.dwSize=sizeof(ddsd); SetPixFmt(&ddsd); SetBltTransformations(); - OutTraceDW("SetDisplayMode: mode=EMULATE %s ret=OK\n", DumpPixelFormat(&ddsd)); - return DD_OK; + if(dxw.Windowize) { + OutTraceDW("SetDisplayMode: mode=EMULATE %s ret=OK\n", DumpPixelFormat(&ddsd)); + SetVSyncDelays(lpdd); + return DD_OK; + } + } + else{ + OutTraceDW("SetDisplayMode: mode=STANDARD BPP=%d\n", dwbpp); + dxw.ActualPixelFormat.dwRGBBitCount = dwbpp; } - - OutTraceDW("SetDisplayMode: mode=STANDARD BPP=%d\n", dwbpp); - dxw.ActualPixelFormat.dwRGBBitCount = dwbpp; ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = Set_dwSize_From_DDraw(lpdd); ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_REFRESHRATE; ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; - (*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); - if (version==1) - res = (*pSetDisplayMode1)(lpdd, ddsd.dwWidth, ddsd.dwHeight, dwbpp); - else - res = (*pSetDisplayMode2)(lpdd, ddsd.dwWidth, ddsd.dwHeight, dwbpp, ddsd.dwRefreshRate, 0); + + if(dxw.Windowize){ + dwwidth = ddsd.dwWidth; + dwheight = ddsd.dwHeight; + OutTraceDW("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n", + ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, dwwidth, dwheight); + } + if(dxw.dwFlags1 & EMULATESURFACE){ + dwbpp = ddsd.ddpfPixelFormat.dwRGBBitCount; + } - OutTraceDW("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n", - ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, ddsd.dwWidth, ddsd.dwHeight); + if (version==1) + res = (*pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); + else + res = (*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); SetVSyncDelays(lpdd); return 0; @@ -1899,14 +1910,17 @@ HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) GetPixFmt((LPDDSURFACEDESC2)lpddsd); if(!lpddsd->ddpfPixelFormat.dwFlags) SetPixFmt((LPDDSURFACEDESC2)lpddsd); } - lpddsd->dwWidth = dxw.GetScreenWidth(); - lpddsd->dwHeight = dxw.GetScreenHeight(); - // v2.1.96: fake screen color depth - if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix - if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); - if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); - OutTraceDW("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); + if(dxw.Windowize){ + lpddsd->dwWidth = dxw.GetScreenWidth(); + lpddsd->dwHeight = dxw.GetScreenHeight(); + + // v2.1.96: fake screen color depth + if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix + if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); + if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); + OutTraceDW("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); + } } //OutTraceDW("GetDisplayMode: returning WxH=(%dx%d) PixelFormat Flags=%x(%s) RGBBitCount=%d RGBAmask=(%x,%x,%x,%x) Caps=%x(%s)\n", @@ -1932,37 +1946,44 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) InitDDScreenParameters((LPDIRECTDRAW)lpdd); - if (dwflags & DDSCL_FULLSCREEN){ - // v2.01.82 fix: - // WARN: Tomb Raider 4 demo is setting cooperative level against hwnd 0 (desktop) - // so in this case better use the registered hWnd value. Same as GP500, who uses - // the desktop window handle. - // v2.02.31 fix: - // Hooligans - Storm over Europe wants to set cooperative level NORMAL to hwnd 0 - // that is legitimate, but setting against desktop window gives an error code - so - // the zero hwnd redirection had to be moved within the FULLSCREEN if case. - if(dxw.IsRealDesktop(hwnd)){ - OutTraceDW("SetCooperativeLevel: desktop hwnd=%x -> %x\n", hwnd, dxw.GethWnd()); - hwnd=dxw.GethWnd(); + if(dxw.Windowize){ + if (dwflags & DDSCL_FULLSCREEN){ + // v2.01.82 fix: + // WARN: Tomb Raider 4 demo is setting cooperative level against hwnd 0 (desktop) + // so in this case better use the registered hWnd value. Same as GP500, who uses + // the desktop window handle. + // v2.02.31 fix: + // Hooligans - Storm over Europe wants to set cooperative level NORMAL to hwnd 0 + // that is legitimate, but setting against desktop window gives an error code - so + // the zero hwnd redirection had to be moved within the FULLSCREEN if case. + if(dxw.IsRealDesktop(hwnd)){ + OutTraceDW("SetCooperativeLevel: desktop hwnd=%x -> %x\n", hwnd, dxw.GethWnd()); + hwnd=dxw.GethWnd(); + } + dxw.SetFullScreen(TRUE); + dwflags &= ~(DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX); + dwflags |= DDSCL_NORMAL; + res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); + AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); + if (dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(hwnd); + } + else{ + RECT client; + (*pGetClientRect)(hwnd, &client); + // v2.02.11: + // Non fullscreen cooperative mode means windowed, unless the window occupies the whole desktop area + dxw.SetFullScreen(client.right==dxw.iSizX && client.bottom==dxw.iSizY); + //dxw.SetFullScreen(FALSE); + res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); } - dxw.SetFullScreen(TRUE); - dwflags &= ~(DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX); - dwflags |= DDSCL_NORMAL; - res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); - AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - if (dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(hwnd); } - else{ - RECT client; - (*pGetClientRect)(hwnd, &client); - // v2.02.11: - // Non fullscreen cooperative mode means windowed, unless the window occupies the whole desktop area - dxw.SetFullScreen(client.right==dxw.iSizX && client.bottom==dxw.iSizY); - //dxw.SetFullScreen(FALSE); + else { res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); } + if(res) - OutTraceE("SetCooperativeLevel: ERROR err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("SetCooperativeLevel: ERROR lpdd=%x hwnd=%x Flags=%x err=%x(%s) at %d\n", + lpdd, hwnd, dwflags, res, ExplainDDError(res), __LINE__); GetHookInfo()->IsFullScreen=dxw.IsFullScreen(); @@ -2396,8 +2417,17 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); - res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); // ok only if the previous surface has the good properties!!! - (*pReleaseS)(lpDDSEmu_Prim); + if(dxw.Windowize){ + // in Winowize mode, the desktop properties are untouched, then the current primary surface can be recycled + res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); + (*pReleaseS)(lpDDSEmu_Prim); + } + else { + // in non-Windowized mode, the primary surface must be released and rebuilt with the proper properties + res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); + if (lpDDSEmu_Prim) while((*pReleaseS)(lpDDSEmu_Prim)); + res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); + } } if(res){ OutTraceE("CreateSurface: ERROR on DDSEmu_Prim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -2663,6 +2693,9 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate BuildSurface_Type BuildBackBuffer; BuildSurface_Type BuildGeneric; + if(!dxw.Windowize){ + } + if (dxw.dwFlags1 & EMULATESURFACE){ BuildPrimary = BuildPrimaryEmu; BuildBackBuffer = BuildBackBufferEmu; diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index a2bbba1..abfe26e 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -955,6 +955,7 @@ char *ExplainWinMessage(DWORD c) case WM_IME_COMPOSITIONFULL: eb="WM_IME_COMPOSITIONFULL"; break; case WM_IME_SELECT: eb="WM_IME_SELECT"; break; case WM_IME_CHAR: eb="WM_IME_CHAR"; break; + case WM_IME_REQUEST: eb="WM_IME_REQUEST"; break; case WM_IME_KEYDOWN: eb="WM_IME_KEYDOWN"; break; case WM_IME_KEYUP: eb="WM_IME_KEYUP"; break; #endif /* WINVER >= 0x0400 */ diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 03fd6e8..4d7619d 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -800,8 +800,8 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } if(dxw.dwFlags4 & STRETCHTIMERS){ - if(LastTimeShift != dxw.TimeShift) dxw.RenewTimers(); - LastTimeShift=dxw.TimeShift; + if(LastTimeShift != dxw.TimeShift) dxw.RenewTimers(); + LastTimeShift=dxw.TimeShift; } switch(message){ @@ -819,7 +819,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_NCPAINT: if((dxw.dwFlags1 & LOCKWINPOS) && (hwnd == dxw.GethWnd()) && dxw.IsFullScreen()){ // v2.02.30: don't alter child and other windows.... OutTraceDW("WindowProc: %s wparam=%x\n", ExplainWinMessage(message), wparam); - return (*pDefWindowProc)(hwnd, message, wparam, lparam); + return (*pDefWindowProcA)(hwnd, message, wparam, lparam); } break; case WM_NCCREATE: @@ -843,7 +843,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing POINT cursor; LRESULT ret; - ret=(*pDefWindowProc)(hwnd, message, wparam, lparam); + ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam); if (ret==HTCLIENT) { cursor.x=LOWORD(lparam); cursor.y=HIWORD(lparam); @@ -855,13 +855,13 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } break; case WM_ERASEBKGND: - if(dxw.IsDesktop(hwnd)){ + if(dxw.Windowize && dxw.IsDesktop(hwnd)){ OutTraceDW("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam); return 1; // 1 == OK, erased } break; case WM_DISPLAYCHANGE: - if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()){ + if (dxw.Windowize && (dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()){ OutTraceDW("WindowProc: prevent WM_DISPLAYCHANGE depth=%d size=(%d,%d)\n", wparam, LOWORD(lparam), HIWORD(lparam)); // v2.02.43: unless EMULATESURFACE is set, lock the screen resolution only, but not the color depth! @@ -873,7 +873,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp break; case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: - if(dxw.IsFullScreen()){ + if(dxw.Windowize && dxw.IsFullScreen()){ LPWINDOWPOS wp; wp = (LPWINDOWPOS)lparam; dxwFixWindowPos("WindowProc", hwnd, lparam); @@ -917,26 +917,28 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp while((*pShowCursor)(1) < 0); break; case WM_MOUSEMOVE: - prev.x = LOWORD(lparam); - prev.y = HIWORD(lparam); - if (dxw.dwFlags1 & HIDEHWCURSOR) { - (*pGetClientRect)(hwnd, &rect); - if(prev.x >= 0 && prev.x < rect.right && prev.y >= 0 && prev.y < rect.bottom) - while((*pShowCursor)(0) >= 0); - else + if(dxw.Windowize){ + prev.x = LOWORD(lparam); + prev.y = HIWORD(lparam); + if (dxw.dwFlags1 & HIDEHWCURSOR) { + (*pGetClientRect)(hwnd, &rect); + if(prev.x >= 0 && prev.x < rect.right && prev.y >= 0 && prev.y < rect.bottom) + while((*pShowCursor)(0) >= 0); + else + while((*pShowCursor)(1) < 0); + } + else { while((*pShowCursor)(1) < 0); + } + if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing + // scale mouse coordinates + curr=dxw.FixCursorPos(prev); //v2.02.30 + lparam = MAKELPARAM(curr.x, curr.y); + OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y); + } + GetHookInfo()->CursorX=LOWORD(lparam); + GetHookInfo()->CursorY=HIWORD(lparam); } - else { - while((*pShowCursor)(1) < 0); - } - if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing - // scale mouse coordinates - curr=dxw.FixCursorPos(prev); //v2.02.30 - lparam = MAKELPARAM(curr.x, curr.y); - OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y); - } - GetHookInfo()->CursorX=LOWORD(lparam); - GetHookInfo()->CursorY=HIWORD(lparam); break; // fall through cases: case WM_MOUSEWHEEL: @@ -949,23 +951,25 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_MBUTTONDOWN: case WM_MBUTTONUP: case WM_MBUTTONDBLCLK: - if((dxw.dwFlags1 & CLIPCURSOR) && ClipCursorToggleState) dxw.SetClipCursor(); - if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing - // scale mouse coordinates - prev.x = LOWORD(lparam); - prev.y = HIWORD(lparam); - curr = prev; - if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix - POINT upleft={0,0}; - (*pClientToScreen)(dxw.GethWnd(), &upleft); - curr = dxw.SubCoordinates(curr, upleft); + if(dxw.Windowize){ + if((dxw.dwFlags1 & CLIPCURSOR) && ClipCursorToggleState) dxw.SetClipCursor(); + if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing + // scale mouse coordinates + prev.x = LOWORD(lparam); + prev.y = HIWORD(lparam); + curr = prev; + if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix + POINT upleft={0,0}; + (*pClientToScreen)(dxw.GethWnd(), &upleft); + curr = dxw.SubCoordinates(curr, upleft); + } + curr=dxw.FixCursorPos(curr); //v2.02.30 + lparam = MAKELPARAM(curr.x, curr.y); + OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y); } - curr=dxw.FixCursorPos(curr); //v2.02.30 - lparam = MAKELPARAM(curr.x, curr.y); - OutTraceC("WindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y); + GetHookInfo()->CursorX=LOWORD(lparam); + GetHookInfo()->CursorY=HIWORD(lparam); } - GetHookInfo()->CursorX=LOWORD(lparam); - GetHookInfo()->CursorY=HIWORD(lparam); break; case WM_SETFOCUS: OutTraceDW("WindowProc: hwnd=%x GOT FOCUS\n", hwnd); @@ -1051,7 +1055,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_SETCURSOR: // shows a different cursor when moving on borders case WM_NCLBUTTONDOWN: // intercepts mouse down on borders case WM_NCLBUTTONUP: // intercepts mouse up on borders - ret=(*pDefWindowProc)(hwnd, message, wparam, lparam); + ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam); break; } } @@ -1066,7 +1070,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp sprintf(sMsg,"ASSERT: WindowProc mismatch hwnd=%x\n", hwnd); OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION); - return (*pDefWindowProc)(hwnd, message, wparam, lparam); + return (*pDefWindowProcA)(hwnd, message, wparam, lparam); } void HookSysLibsInit() @@ -1528,9 +1532,11 @@ void HookInit(TARGETMAP *target, HWND hwnd) } // make InitPosition used for both DInput and DDraw - InitPosition(target->initx, target->inity, - target->minx, target->miny, target->maxx, target->maxy); - dxw.InitWindowPos(target->posx, target->posy, target->sizx, target->sizy); + if(dxw.Windowize){ + InitPosition(target->initx, target->inity, + target->minx, target->miny, target->maxx, target->maxy); + dxw.InitWindowPos(target->posx, target->posy, target->sizx, target->sizy); + } OutTraceB("HookInit: base hmodule=%x\n", base); HookModule(base, dxw.dwTargetDDVersion); @@ -1563,14 +1569,17 @@ void HookInit(TARGETMAP *target, HWND hwnd) InitScreenParameters(); if(hwnd) HookWindowProc(hwnd); + // in fullscreen mode, messages seem to reach and get processed by the parent window + if(!dxw.Windowize && hwnd) HookWindowProc(GetParent(hwnd)); // initialize window: if // 1) not in injection mode (hwnd != 0) and - // 2) supposedly in fullscreen mode (dxw.IsFullScreen()) and - // 3) configuration ask for a overlapped bordered window (dxw.dwFlags1 & FIXWINFRAME) then + // 2) in Windowed mode and + // 3) supposedly in fullscreen mode (dxw.IsFullScreen()) and + // 4) configuration ask for a overlapped bordered window (dxw.dwFlags1 & FIXWINFRAME) then // update window styles: just this window or, when FIXPARENTWIN is set, the father one as well. - if (hwnd && dxw.IsFullScreen() && (dxw.dwFlags1 & FIXWINFRAME)) { + if (hwnd && dxw.Windowize && dxw.IsFullScreen() && (dxw.dwFlags1 & FIXWINFRAME)) { dxw.FixWindowFrame(dxw.hChildWnd); AdjustWindowPos(dxw.hChildWnd, target->sizx, target->sizy); if(dxw.dwFlags1 & FIXPARENTWIN) { diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 9acf59d..827c689 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -64,6 +64,7 @@ void dxwCore::SetFullScreen(BOOL fs) BOOL dxwCore::IsFullScreen() { + //if(!Windowize) return FALSE; return FullScreen; } @@ -74,7 +75,8 @@ void dxwCore::InitTarget(TARGETMAP *target) dwFlags3 = target->flags3; dwFlags4 = target->flags4; dwTFlags = target->tflags; - if(dxw.dwFlags3 & FULLSCREENONLY) FullScreen=TRUE; + Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; + if(dwFlags3 & FULLSCREENONLY) FullScreen=TRUE; gsModules = target->module; MaxFPS = target->MaxFPS; CustomOpenGLLib = target->OpenGLLib; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 4c06acf..9961801 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -118,6 +118,7 @@ public: // methods LARGE_INTEGER StretchLargeCounter(LARGE_INTEGER); public: // simple data variables + BOOL Windowize; DDPIXELFORMAT ActualPixelFormat; DDPIXELFORMAT VirtualPixelFormat; DWORD dwDDVersion; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 1860046..d8f7494 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.72" +#define VERSION "2.02.73" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 0a0527a0851e52848cb9e415786b90ca6802ed2b..ce9e13368e46de673f0faf32ec2688713f5c5ebe 100644 GIT binary patch delta 21805 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 diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index df0c5f5..7ddbaf8 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -661,52 +661,54 @@ HRESULT WINAPI extReset(void *pd3dd, D3DPRESENT_PARAMETERS* pPresParam) OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++)); } - if(Windowed) { - // do not attempt to reset when returning to windowed mode: it is useless (you are windowed already) - // and the code below (GetDirect3D, ...) doesn't work. - OutTraceDW("SKIPPED!\n"); - return DD_OK; - } + if(dxw.Windowize){ + if(Windowed) { + // do not attempt to reset when returning to windowed mode: it is useless (you are windowed already) + // and the code below (GetDirect3D, ...) doesn't work. + OutTraceDW("SKIPPED!\n"); + return DD_OK; + } - if (dwD3DVersion == 9){ - res=(*pGetDirect3D9)(pd3dd, &pD3D); - if(res) { - OutTraceDW("GetDirect3D FAILED! %x\n", res); - return(DD_OK); + if (dwD3DVersion == 9){ + res=(*pGetDirect3D9)(pd3dd, &pD3D); + if(res) { + OutTraceDW("GetDirect3D FAILED! %x\n", res); + return(DD_OK); + } + OutTraceDW("GetDirect3D pd3d=%x\n", pD3D); + res=(*pGetAdapterDisplayMode9)(pD3D, 0, &mode); + if(res) { + OutTraceDW("GetAdapterDisplayMode FAILED! %x\n", res); + return(DD_OK); + } + param[2] = mode.Format; + param[7] = 0; //hDeviceWindow + dxw.SetFullScreen(~param[8]?TRUE:FALSE); + param[8] = 1; //Windowed + //param[11] = D3DPRESENTFLAG_DEVICECLIP; //Flags; + param[12] = 0; //FullScreen_RefreshRateInHz; + param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval } - OutTraceDW("GetDirect3D pd3d=%x\n", pD3D); - res=(*pGetAdapterDisplayMode9)(pD3D, 0, &mode); - if(res) { - OutTraceDW("GetAdapterDisplayMode FAILED! %x\n", res); - return(DD_OK); + else{ + res=(*pGetDirect3D8)(pd3dd, &pD3D); + if(res) { + OutTraceDW("GetDirect3D FAILED! %x\n", res); + return(DD_OK); + } + OutTraceDW("GetDirect3D pd3d=%x\n", pD3D); + res=(*pGetAdapterDisplayMode8)(pD3D, 0, &mode); + if(res) { + OutTraceDW("GetAdapterDisplayMode FAILED! %x\n", res); + return(DD_OK); + } + param[2] = mode.Format; + param[6] = 0; //hDeviceWindow + dxw.SetFullScreen(~param[7]?TRUE:FALSE); + param[7] = 1; //Windowed + //param[10] = D3DPRESENTFLAG_DEVICECLIP; //Flags; + param[11] = 0; //FullScreen_RefreshRateInHz; + param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval } - param[2] = mode.Format; - param[7] = 0; //hDeviceWindow - dxw.SetFullScreen(~param[8]?TRUE:FALSE); - param[8] = 1; //Windowed - //param[11] = D3DPRESENTFLAG_DEVICECLIP; //Flags; - param[12] = 0; //FullScreen_RefreshRateInHz; - param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval - } - else{ - res=(*pGetDirect3D8)(pd3dd, &pD3D); - if(res) { - OutTraceDW("GetDirect3D FAILED! %x\n", res); - return(DD_OK); - } - OutTraceDW("GetDirect3D pd3d=%x\n", pD3D); - res=(*pGetAdapterDisplayMode8)(pD3D, 0, &mode); - if(res) { - OutTraceDW("GetAdapterDisplayMode FAILED! %x\n", res); - return(DD_OK); - } - param[2] = mode.Format; - param[6] = 0; //hDeviceWindow - dxw.SetFullScreen(~param[7]?TRUE:FALSE); - param[7] = 1; //Windowed - //param[10] = D3DPRESENTFLAG_DEVICECLIP; //Flags; - param[11] = 0; //FullScreen_RefreshRateInHz; - param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval } res = (*pReset)(pd3dd, (D3DPRESENT_PARAMETERS *)param); @@ -836,43 +838,10 @@ HRESULT WINAPI extGetAdapterDisplayMode9(void *lpd3d, UINT Adapter, D3DDISPLAYMO return res; } -//HRESULT extValidateDevice(void *, DWORD *pNumPasses); -//HRESULT extGetDeviceCaps(void *, D3DCAPS9 *pCaps); -//typedef HRESULT (WINAPI *ValidateDevice_Type)(void *, DWORD *); -//typedef HRESULT (WINAPI *GetDeviceCapsD3D_Type)(void *, D3DCAPS9 *); -//ValidateDevice_Type pValidateDevice; -//GetDeviceCapsD3D_Type pGetDeviceCapsD3D; -//HRESULT extValidateDevice(void *lpd3dd, DWORD *pNumPasses) -//{ -// OutTrace("ValidateDevice hooked\n"); -// return (*pValidateDevice)(lpd3dd, pNumPasses); -//} -//HRESULT extGetDeviceCapsD3D(void *lpd3dd, D3DCAPS9 *pCaps) -//{ -// OutTrace("GetDeviceCaps hooked\n"); -// return (*pGetDeviceCapsD3D)(lpd3dd, pCaps); -//} -HRESULT WINAPI extProbe(void *lpd3dd) +void FixD3DWindowFrame(HWND hfocuswindow) { - OutTraceD3D("Probe: d3dd=%x\n", lpd3dd); - return 0; -} - -HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, - HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, void **ppd3dd) -{ - HRESULT res; - DWORD param[64], *tmp; - D3DDISPLAYMODE mode; - int Windowed; - - OutTraceD3D("CreateDevice: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n", - dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight); - - memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52); - dxw.SethWnd(hfocuswindow); - dxw.SetScreenSize(param[0], param[1]); - if(!(dxw.dwFlags3 & NOWINDOWMOVE)) AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); + if(!(dxw.dwFlags3 & NOWINDOWMOVE)) + AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); if(dxw.dwFlags3 & FIXD3DFRAME){ char ClassName[81]; @@ -893,6 +862,24 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, OutTraceE("CreateDevice: CreateWindowEx ERROR err=%d\n", GetLastError()); dxw.SethWnd(hfocuswindow, dxw.GethWnd()); } +} + +HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, + HWND hfocuswindow, DWORD behaviorflags, D3DPRESENT_PARAMETERS *ppresentparam, void **ppd3dd) +{ + HRESULT res; + DWORD param[64], *tmp; + D3DDISPLAYMODE mode; + int Windowed; + + OutTraceD3D("CreateDevice: D3DVersion=%d lpd3d=%x adapter=%x hFocusWnd=%x behavior=%x, size=(%d,%d)\n", + dwD3DVersion, lpd3d, adapter, hfocuswindow, behaviorflags, ppresentparam->BackBufferWidth, ppresentparam->BackBufferHeight); + + memcpy(param, ppresentparam, (dwD3DVersion == 9)?56:52); + dxw.SethWnd(hfocuswindow); + dxw.SetScreenSize(param[0], param[1]); + + if(dxw.Windowize) FixD3DWindowFrame(hfocuswindow); if(IsTraceDW){ tmp = param; @@ -917,7 +904,6 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, OutTrace(" PresentationInterval = 0x%x\n", *(tmp ++)); } - //((LPDIRECT3D9)lpd3d)->GetAdapterDisplayMode(0, &mode); if(dwD3DVersion == 9) (*pGetAdapterDisplayMode9)(lpd3d, 0, &mode); else @@ -927,24 +913,26 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, OutTraceDW(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); OutTraceDW(" Current Refresh Rate = %d\n", mode.RefreshRate); - //param[0]=param[1]=0; - if(dwD3DVersion == 9){ - param[7] = 0; //hDeviceWindow - dxw.SetFullScreen(~param[8]?TRUE:FALSE); - param[8] = 1; //Windowed - //param[11] = D3DPRESENTFLAG_DEVICECLIP; //Flags; - param[12] = 0; //FullScreen_RefreshRateInHz; - param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + if(dxw.Windowize){ + param[7] = 0; //hDeviceWindow + dxw.SetFullScreen(~param[8]?TRUE:FALSE); + param[8] = 1; //Windowed + //param[11] = D3DPRESENTFLAG_DEVICECLIP; //Flags; + param[12] = 0; //FullScreen_RefreshRateInHz; + param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + } res = (*pCreateDevice9)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } else{ - param[6] = 0; //hDeviceWindow - dxw.SetFullScreen(~param[7]?TRUE:FALSE); - param[7] = 1; //Windowed - //param[10] = D3DPRESENTFLAG_DEVICECLIP; //Flags; - param[11] = 0; //FullScreen_RefreshRateInHz; - param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + if(dxw.Windowize){ + param[6] = 0; //hDeviceWindow + dxw.SetFullScreen(~param[7]?TRUE:FALSE); + param[7] = 1; //Windowed + //param[10] = D3DPRESENTFLAG_DEVICECLIP; //Flags; + param[11] = 0; //FullScreen_RefreshRateInHz; + param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + } res = (*pCreateDevice8)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, ppd3dd); } @@ -984,7 +972,8 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp memcpy(param, ppresentparam, 56); dxw.SethWnd(hfocuswindow); dxw.SetScreenSize(param[0], param[1]); - AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); + + if(dxw.Windowize) FixD3DWindowFrame(hfocuswindow); tmp = param; if(IsTraceDW){ @@ -1016,12 +1005,14 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp OutTraceDW(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); OutTraceDW(" Current Refresh Rate = %d\n", mode.RefreshRate); - //param[7] = 0; //hDeviceWindow - param[7] = (DWORD)dxw.GethWnd(); //hDeviceWindow - dxw.SetFullScreen(~param[8]?TRUE:FALSE); - param[8] = 1; //Windowed - param[12] = 0; //FullScreen_RefreshRateInHz; - param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + if(dxw.Windowize){ + //param[7] = 0; //hDeviceWindow + param[7] = (DWORD)dxw.GethWnd(); //hDeviceWindow + dxw.SetFullScreen(~param[8]?TRUE:FALSE); + param[8] = 1; //Windowed + param[12] = 0; //FullScreen_RefreshRateInHz; + param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + } res = (*pCreateDeviceEx)(lpd3d, 0, devicetype, hfocuswindow, behaviorflags, param, pFullscreenDisplayMode, ppd3dd); if(res){ @@ -1105,7 +1096,7 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3d, D3DPRESENT_PARAMETERS * memcpy(param, pPresentationParameters, (dwD3DVersion == 9)?56:52); dxw.SetScreenSize(param[0], param[1]); - AdjustWindowFrame(dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); + if(dxw.Windowize) FixD3DWindowFrame(dxw.GethWnd()); tmp = param; if(IsTraceDW){ @@ -1135,19 +1126,21 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3d, D3DPRESENT_PARAMETERS * OutTraceDW(" Current ScreenSize = (%dx%d)\n", mode.Width, mode.Height); OutTraceDW(" Current Refresh Rate = %d\n", mode.RefreshRate); - if(dwD3DVersion == 9){ - param[7] = 0; //hDeviceWindow - dxw.SetFullScreen(~param[8]?TRUE:FALSE); - param[8] = 1; //Windowed - param[12] = 0; //FullScreen_RefreshRateInHz; - param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval - } - else{ - param[6] = 0; //hDeviceWindow - dxw.SetFullScreen(~param[7]?TRUE:FALSE); - param[7] = 1; //Windowed - param[11] = 0; //FullScreen_RefreshRateInHz; - param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + if(dxw.Windowize){ + if(dwD3DVersion == 9){ + param[7] = 0; //hDeviceWindow + dxw.SetFullScreen(~param[8]?TRUE:FALSE); + param[8] = 1; //Windowed + param[12] = 0; //FullScreen_RefreshRateInHz; + param[13] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + } + else{ + param[6] = 0; //hDeviceWindow + dxw.SetFullScreen(~param[7]?TRUE:FALSE); + param[7] = 1; //Windowed + param[11] = 0; //FullScreen_RefreshRateInHz; + param[12] = D3DPRESENT_INTERVAL_DEFAULT; //PresentationInterval + } } res=(*pCreateAdditionalSwapChain)(lpd3d, (D3DPRESENT_PARAMETERS *)param, ppSwapChain); if(res) OutTraceE("CreateAdditionalSwapChain ERROR: res=%x\n", res); @@ -1175,13 +1168,16 @@ HRESULT WINAPI extD3D10CreateDevice( return res; } SetHook((void *)(*(DWORD *)*ppDevice + 100), extRSSetViewports, (void **)&pRSSetViewports, "RSSetViewports(D10)"); - ViewPort.TopLeftX=dxw.iPosX; - ViewPort.TopLeftY=dxw.iPosY; - ViewPort.Width=dxw.iSizX; - ViewPort.Height=dxw.iSizY; - ViewPort.MinDepth=1.0; - ViewPort.MaxDepth=1.0; - (*pRSSetViewports)((void *)*ppDevice, 1, (D3D11_VIEWPORT *)&ViewPort); + + if(dxw.Windowize){ + ViewPort.TopLeftX=dxw.iPosX; + ViewPort.TopLeftY=dxw.iPosY; + ViewPort.Width=dxw.iSizX; + ViewPort.Height=dxw.iSizY; + ViewPort.MinDepth=1.0; + ViewPort.MaxDepth=1.0; + (*pRSSetViewports)((void *)*ppDevice, 1, (D3D11_VIEWPORT *)&ViewPort); + } OutTraceD3D("D3D10CreateDevice: ret=%x\n", res); return res; } @@ -1216,8 +1212,10 @@ HRESULT WINAPI extD3D10CreateDeviceAndSwapChain( HRESULT res; OutTraceD3D("D3D10CreateDeviceAndSwapChain: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); //return 0x887a0004; - pSwapChainDesc->OutputWindow = dxw.GethWnd(); - pSwapChainDesc->Windowed = true; + if(dxw.Windowize){ + pSwapChainDesc->OutputWindow = dxw.GethWnd(); + pSwapChainDesc->Windowed = true; + } res=(*pD3D10CreateDeviceAndSwapChain)(pAdapter, DriverType, Software, Flags, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice); OutTraceD3D("D3D10CreateDeviceAndSwapChain ret=%x\n", res); return res; @@ -1236,8 +1234,10 @@ HRESULT WINAPI extD3D10CreateDeviceAndSwapChain1( HRESULT res; OutTraceD3D("D3D10CreateDeviceAndSwapChain1: DriverType=%x Flags=%x SDKVersion=%x\n", DriverType, Flags, SDKVersion); //return 0x887a0004; - pSwapChainDesc->OutputWindow = dxw.GethWnd(); - pSwapChainDesc->Windowed = true; + if(dxw.Windowize){ + pSwapChainDesc->OutputWindow = dxw.GethWnd(); + pSwapChainDesc->Windowed = true; + } res=(*pD3D10CreateDeviceAndSwapChain1)(pAdapter, DriverType, Software, Flags, SDKVersion, pSwapChainDesc, ppSwapChain, ppDevice); OutTraceD3D("D3D10CreateDeviceAndSwapChain1 ret=%x\n", res); return res; @@ -1294,7 +1294,7 @@ void WINAPI extRSSetViewports(ID3D11DeviceContext *This, UINT NumViewports, D3D1 { OutTraceD3D("RSSetViewports: NumViewports=%d\n", NumViewports); - if(NumViewports==1){ + if(dxw.Windowize && (NumViewports==1)){ pViewports->TopLeftX=dxw.iPosX; pViewports->TopLeftY=dxw.iPosY; pViewports->Width=dxw.iSizX; @@ -1405,8 +1405,16 @@ HRESULT WINAPI extGetDirect3D9(void *lpdd3dd, void **ppD3D9) HRESULT WINAPI extCheckFullScreen(void) { - OutTraceDW("CheckFullScreen: return OK\n"); - return 0; + HRESULT res; + if(dxw.Windowize){ + OutTraceDW("CheckFullScreen: return OK\n"); + res=0; + } + else{ + res=(*pCheckFullScreen)(); + OutTraceDW("CheckFullScreen: return %x\n", res); + } + return res; } void WINAPI extSetGammaRamp(void *lpdd3dd, UINT iSwapChain, DWORD Flags, D3DGAMMARAMP *pRamp) diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index ed30e24..358b53b 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -517,7 +517,7 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) if (remap=Remap_d3d11_ProcAddress(proc, hModule)) return remap; break; case SYSLIBIDX_OPENGL: - if (remap=Remap_gl_ProcAddress(proc, hModule)) return remap; + if(dxw.Windowize) if (remap=Remap_gl_ProcAddress(proc, hModule)) return remap; break; // case SYSLIBIDX_GLIDE: // case SYSLIBIDX_GLIDE2X: diff --git a/dll/syslibs.h b/dll/syslibs.h index bf6a021..a524f5d 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -345,7 +345,8 @@ DXWEXTERN CreateDialogIndirectParam_Type pCreateDialogIndirectParam DXWINITIALIZ DXWEXTERN CreateDialogParam_Type pCreateDialogParam DXWINITIALIZED; DXWEXTERN CreateWindowExA_Type pCreateWindowExA DXWINITIALIZED; DXWEXTERN CreateWindowExW_Type pCreateWindowExW DXWINITIALIZED; -DXWEXTERN DefWindowProc_Type pDefWindowProc DXWINITIALIZED; +DXWEXTERN DefWindowProc_Type pDefWindowProcA DXWINITIALIZED; +DXWEXTERN DefWindowProc_Type pDefWindowProcW DXWINITIALIZED; DXWEXTERN DrawText_Type pDrawText DXWINITIALIZED; DXWEXTERN DrawTextEx_Type pDrawTextEx DXWINITIALIZED; DXWEXTERN EndPaint_Type pEndPaint DXWINITIALIZED; @@ -394,6 +395,7 @@ DXWEXTERN GetForegroundWindow_Type pGetForegroundWindow DXWINITIALIZED; DXWEXTERN GetActiveWindow_Type pGetActiveWindow DXWINITIALIZED; DXWEXTERN IsWindowVisible_Type pIsWindowVisible DXWINITIALIZED; DXWEXTERN SystemParametersInfo_Type pSystemParametersInfoA DXWINITIALIZED; +DXWEXTERN SystemParametersInfo_Type pSystemParametersInfoW DXWINITIALIZED; DXWEXTERN KillTimer_Type pKillTimer DXWINITIALIZED; DXWEXTERN GetUpdateRect_Type pGetUpdateRect DXWINITIALIZED; @@ -543,7 +545,8 @@ extern HWND WINAPI extCreateDialogIndirectParam(HINSTANCE, LPCDLGTEMPLATE, HWND, extern HWND WINAPI extCreateDialogParam(HINSTANCE, LPCSTR, HWND, DLGPROC, LPARAM); extern HWND WINAPI extCreateWindowExA(DWORD, LPCTSTR, LPCTSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); extern HWND WINAPI extCreateWindowExW(DWORD, LPCWSTR, LPCWSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); -extern LRESULT WINAPI extDefWindowProc(HWND, UINT, WPARAM, LPARAM); +extern LRESULT WINAPI extDefWindowProcA(HWND, UINT, WPARAM, LPARAM); +extern LRESULT WINAPI extDefWindowProcW(HWND, UINT, WPARAM, LPARAM); extern int WINAPI extDrawTextA(HDC, LPCTSTR, int, LPRECT, UINT); extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); @@ -603,6 +606,7 @@ extern HWND WINAPI extGetForegroundWindow(void); extern HWND WINAPI extGetActiveWindow(void); extern BOOL WINAPI extIsWindowVisible(HWND); extern BOOL WINAPI extSystemParametersInfoA(UINT, UINT, PVOID, UINT); +extern BOOL WINAPI extSystemParametersInfoW(UINT, UINT, PVOID, UINT); extern BOOL WINAPI extKillTimer(HWND, UINT_PTR); extern BOOL WINAPI extGetUpdateRect(HWND, LPRECT, BOOL); diff --git a/dll/user32.cpp b/dll/user32.cpp index f691a42..848dc56 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -26,7 +26,8 @@ static HookEntry_Type Hooks[]={ {"EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings}, {"GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor}, {"ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor}, - {"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProc, (FARPROC)extDefWindowProc}, + {"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProcA, (FARPROC)extDefWindowProcA}, + {"DefWindowProcW", (FARPROC)DefWindowProcW, (FARPROC *)&pDefWindowProcW, (FARPROC)extDefWindowProcW}, {"CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA}, {"CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW}, {"RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA}, @@ -46,6 +47,7 @@ static HookEntry_Type Hooks[]={ //{"GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, {"IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible}, {"SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA}, + {"SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW}, {0, NULL, 0, 0} // terminator }; @@ -559,47 +561,48 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon OutTraceDW("SetWindowLong: hwnd=%x, Index=%x(%s) Val=%x\n", hwnd, nIndex, ExplainSetWindowIndex(nIndex), dwNewLong); - //if(!hwnd) hwnd=dxw.GethWnd(); - - if (dxw.dwFlags1 & LOCKWINSTYLE){ - if(nIndex==GWL_STYLE){ - OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); - //return 1; - return (*pGetWindowLongA)(hwnd, nIndex); - } - if(nIndex==GWL_EXSTYLE){ - OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); - //return 1; - return (*pGetWindowLongA)(hwnd, nIndex); - } - } - - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - if(nIndex==GWL_STYLE){ - dwNewLong &= ~WS_MAXIMIZE; - if(dxw.IsDesktop(hwnd)){ - OutTraceDW("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong); - dwNewLong |= WS_OVERLAPPEDWINDOW; - dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS); + if (dxw.Windowize){ + if(dxw.dwFlags1 & LOCKWINSTYLE){ + if(nIndex==GWL_STYLE){ + OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); + //return 1; + return (*pGetWindowLongA)(hwnd, nIndex); + } + if(nIndex==GWL_EXSTYLE){ + OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); + //return 1; + return (*pGetWindowLongA)(hwnd, nIndex); } } - // v2.02.32: disable topmost for main window only - if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){ - OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); - dwNewLong = dwNewLong & ~(WS_EX_TOPMOST); - } - } - if (dxw.dwFlags1 & FIXWINFRAME){ - //if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){ - if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD) && dxw.IsDesktop(hwnd)){ - OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); - dwNewLong |= WS_OVERLAPPEDWINDOW; - dwNewLong &= ~WS_CLIPSIBLINGS; + if (dxw.dwFlags1 & PREVENTMAXIMIZE){ + if(nIndex==GWL_STYLE){ + dwNewLong &= ~WS_MAXIMIZE; + if(dxw.IsDesktop(hwnd)){ + OutTraceDW("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong); + dwNewLong |= WS_OVERLAPPEDWINDOW; + dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS); + } + } + // v2.02.32: disable topmost for main window only + if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){ + OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); + dwNewLong = dwNewLong & ~(WS_EX_TOPMOST); + } + } + + if (dxw.dwFlags1 & FIXWINFRAME){ + //if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){ + if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD) && dxw.IsDesktop(hwnd)){ + OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); + dwNewLong |= WS_OVERLAPPEDWINDOW; + dwNewLong &= ~WS_CLIPSIBLINGS; + } } } if ((nIndex==GWL_WNDPROC) && dxw.IsFullScreen()){ // v2.02.51 - see A10 Cuba.... + //if (nIndex==GWL_WNDPROC){ WNDPROC lres; WNDPROC OldProc; // GPL fix @@ -800,6 +803,22 @@ BOOL WINAPI extGetCursorPos(LPPOINT lppoint) *lppoint=dxw.ScreenToClient(*lppoint); *lppoint=dxw.FixCursorPos(*lppoint); + if(dxw.dwFlags4 & FRAMECOMPENSATION){ + static int dx, dy, todo=TRUE; + if (todo){ + RECT wrect; + POINT upleft={0, 0}; + todo=FALSE; + (*pGetWindowRect)(dxw.GethWnd(), &wrect); + (*pClientToScreen)(dxw.GethWnd(), &upleft); + dx=upleft.x - wrect.left; + dy=upleft.y - wrect.top; + OutTraceC("GetCursorPos: frame compensation=(%d,%d)\n", dx, dy); + } + lppoint->x += dx; + lppoint->y += dy; + } + GetHookInfo()->CursorX=(short)lppoint->x; GetHookInfo()->CursorY=(short)lppoint->y; OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y); @@ -1118,6 +1137,33 @@ static HWND WINAPI extCreateWindowCommon( WNDPROC pWindowProc; BOOL isValidHandle=TRUE; + if(!dxw.Windowize){ + if(WideChar) + hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + else + hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); + if ((dwStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN)){ + // child window inherit the father's windproc, so if it's redirected to + // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve + // the correct value (WhndGetWindowProc) before saving it (WhndStackPush). + long res; + pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); + if((pWindowProc == extWindowProc) || + (pWindowProc == extChildWindowProc) || + (pWindowProc == extDialogWindowProc)){ // avoid recursions + HWND Father; + Father=GetParent(hwnd); + pWindowProc=WhndGetWindowProc(Father); + } + OutTraceDW("Hooking CHILD hwnd=%x father WindowProc %x->%x\n", hwnd, pWindowProc, extChildWindowProc); + res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); + if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); + WhndStackPush(hwnd, pWindowProc); + } + OutTraceDW("%s: ret=%x\n", ApiName, hwnd); + return hwnd; + } + // no maximized windows in any case if (dxw.dwFlags1 & PREVENTMAXIMIZE){ OutTraceDW("%s: handling PREVENTMAXIMIZE mode\n", ApiName); @@ -1380,7 +1426,7 @@ LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPA return res; } -LRESULT WINAPI extDefWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! HRESULT res; @@ -1389,7 +1435,21 @@ LRESULT WINAPI extDefWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lPara if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProc", hwnd, Msg, wParam, &lParam); if (res==(HRESULT)-1) - return (*pDefWindowProc)(hwnd, Msg, wParam, lParam); + return (*pDefWindowProcA)(hwnd, Msg, wParam, lParam); + else + return res; +} + +LRESULT WINAPI extDefWindowProcW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + // v2.02.30: fix (Imperialism II): apply to main window only !!! + HRESULT res; + + res = -1; + if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProc", hwnd, Msg, wParam, &lParam); + + if (res==(HRESULT)-1) + return (*pDefWindowProcW)(hwnd, Msg, wParam, lParam); else return res; } @@ -1582,7 +1642,10 @@ LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags) OutTrace("\n"); } - return MyChangeDisplaySettings("ChangeDisplaySettingsA", FALSE, lpDevMode, dwflags); + if(dxw.Windowize) + return MyChangeDisplaySettings("ChangeDisplaySettingsA", FALSE, lpDevMode, dwflags); + else + return (*pChangeDisplaySettingsA)(lpDevMode, dwflags); } LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags) @@ -1595,7 +1658,10 @@ LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags) OutTrace("\n"); } - return MyChangeDisplaySettings("ChangeDisplaySettingsW", TRUE, lpDevMode, dwflags); + if(dxw.Windowize) + return MyChangeDisplaySettings("ChangeDisplaySettingsW", TRUE, lpDevMode, dwflags); + else + return (*pChangeDisplaySettingsW)(lpDevMode, dwflags); } LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) @@ -1608,7 +1674,10 @@ LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevM OutTrace("\n"); } - return MyChangeDisplaySettings("ChangeDisplaySettingsExA", FALSE, lpDevMode, dwflags); + if(dxw.Windowize) + return MyChangeDisplaySettings("ChangeDisplaySettingsExA", FALSE, lpDevMode, dwflags); + else + return (*pChangeDisplaySettingsExA)(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam); } LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) @@ -1621,7 +1690,10 @@ LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevM OutTrace("\n"); } - return MyChangeDisplaySettings("ChangeDisplaySettingsExW", TRUE, lpDevMode, dwflags); + if(dxw.Windowize) + return MyChangeDisplaySettings("ChangeDisplaySettingsExW", TRUE, lpDevMode, dwflags); + else + return (*pChangeDisplaySettingsExW)(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam); } HDC WINAPI extGDIGetDC(HWND hwnd) @@ -1663,6 +1735,7 @@ HDC WINAPI extEMUGetDC(HWND hwnd) HWND lochwnd; OutTraceDW("GDI.GetDC: hwnd=%x\n", hwnd); + lochwnd=hwnd; if (dxw.IsRealDesktop(hwnd)) { OutTraceDW("GDI.GetDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); @@ -1927,8 +2000,9 @@ HDC WINAPI extDDBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) LPDIRECTDRAWSURFACE lpDDS; DDSURFACEDESC ddsd; res=extDirectDrawCreate(0, &lpDD, NULL); - //lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); - lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_NORMAL); + //res=extDirectDrawCreate((GUID *)&IID_IDirectDraw, &lpDD, NULL); + lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); + //lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_NORMAL); memset((void *)&ddsd, 0, sizeof(DDSURFACEDESC)); ddsd.dwSize = sizeof(DDSURFACEDESC); ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; @@ -2031,9 +2105,12 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); - WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) - OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); + // v2.02.73: redirect lpDialogFunc only when it is nor NULL + if(lpDialogFunc) { + WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); + if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) + OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); + } OutTraceDW("CreateDialogIndirectParam: hwnd=%x\n", RetHWND); isWithinDialog=FALSE; @@ -2050,9 +2127,12 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW if(hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit); - WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) - OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); + // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally" + if(lpDialogFunc) { + WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); + if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) + OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); + } OutTraceDW("CreateDialogParam: hwnd=%x\n", RetHWND); isWithinDialog=FALSE; @@ -2066,57 +2146,59 @@ BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL OutTraceDW("MoveWindow: hwnd=%x xy=(%d,%d) size=(%d,%d) repaint=%x indialog=%x fullscreen=%x\n", hwnd, X, Y, nWidth, nHeight, bRepaint, isWithinDialog, dxw.IsFullScreen()); - if(dxw.IsDesktop(hwnd)){ - // v2.1.93: happens in "Emergency Fighters for Life" ... - // what is the meaning of this? is it related to video stretching? - OutTraceDW("MoveWindow: prevent moving desktop win\n"); - return TRUE; - } + if(dxw.Windowize){ + if(dxw.IsDesktop(hwnd)){ + // v2.1.93: happens in "Emergency Fighters for Life" ... + // what is the meaning of this? is it related to video stretching? + OutTraceDW("MoveWindow: prevent moving desktop win\n"); + return TRUE; + } - if((hwnd==dxw.GethWnd()) || (hwnd==dxw.hParentWnd)){ - OutTraceDW("MoveWindow: prevent moving main win\n"); - return TRUE; - } + if((hwnd==dxw.GethWnd()) || (hwnd==dxw.hParentWnd)){ + OutTraceDW("MoveWindow: prevent moving main win\n"); + return TRUE; + } - if (dxw.IsFullScreen()){ - POINT upleft={0,0}; - RECT client; - BOOL isChild; - (*pClientToScreen)(dxw.GethWnd(),&upleft); - (*pGetClientRect)(dxw.GethWnd(),&client); - if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ - isChild=TRUE; - // child coordinate adjustement - X = (X * client.right) / dxw.GetScreenWidth(); - Y = (Y * client.bottom) / dxw.GetScreenHeight(); - nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); - nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); - } - else { - isChild=FALSE; - // regular win coordinate adjustement - X = upleft.x + (X * client.right) / dxw.GetScreenWidth(); - Y = upleft.y + (Y * client.bottom) / dxw.GetScreenHeight(); - nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); - nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); - } - OutTraceDW("MoveWindow: DEBUG client=(%d,%d) screen=(%d,%d)\n", - client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - OutTraceDW("MoveWindow: hwnd=%x child=%x relocated to xy=(%d,%d) size=(%d,%d)\n", - hwnd, isChild, X, Y, nWidth, nHeight); - } - else{ - if((X==0)&&(Y==0)&&(nWidth==dxw.GetScreenWidth())&&(nHeight==dxw.GetScreenHeight())){ - // evidently, this was supposed to be a fullscreen window.... - RECT screen; - POINT upleft = {0,0}; - (*pGetClientRect)(dxw.GethWnd(),&screen); + if (dxw.IsFullScreen()){ + POINT upleft={0,0}; + RECT client; + BOOL isChild; (*pClientToScreen)(dxw.GethWnd(),&upleft); - X=upleft.x; - Y=upleft.y; - nWidth=screen.right; - nHeight=screen.bottom; - OutTraceDW("MoveWindow: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", X, Y, nWidth, nHeight); + (*pGetClientRect)(dxw.GethWnd(),&client); + if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ + isChild=TRUE; + // child coordinate adjustement + X = (X * client.right) / dxw.GetScreenWidth(); + Y = (Y * client.bottom) / dxw.GetScreenHeight(); + nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); + nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); + } + else { + isChild=FALSE; + // regular win coordinate adjustement + X = upleft.x + (X * client.right) / dxw.GetScreenWidth(); + Y = upleft.y + (Y * client.bottom) / dxw.GetScreenHeight(); + nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); + nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); + } + OutTraceDW("MoveWindow: DEBUG client=(%d,%d) screen=(%d,%d)\n", + client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); + OutTraceDW("MoveWindow: hwnd=%x child=%x relocated to xy=(%d,%d) size=(%d,%d)\n", + hwnd, isChild, X, Y, nWidth, nHeight); + } + else{ + if((X==0)&&(Y==0)&&(nWidth==dxw.GetScreenWidth())&&(nHeight==dxw.GetScreenHeight())){ + // evidently, this was supposed to be a fullscreen window.... + RECT screen; + POINT upleft = {0,0}; + (*pGetClientRect)(dxw.GethWnd(),&screen); + (*pClientToScreen)(dxw.GethWnd(),&upleft); + X=upleft.x; + Y=upleft.y; + nWidth=screen.right; + nHeight=screen.bottom; + OutTraceDW("MoveWindow: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", X, Y, nWidth, nHeight); + } } } @@ -2268,7 +2350,7 @@ BOOL WINAPI extUpdateWindow(HWND hwnd) BOOL ret; OutTraceDW("UpdateWindow: hwnd=%x\n", hwnd); - if(dxw.IsRealDesktop(hwnd)){ + if(dxw.Windowize && dxw.IsRealDesktop(hwnd)){ OutTraceDW("UpdateWindow: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); hwnd=dxw.GethWnd(); } @@ -2391,6 +2473,22 @@ BOOL WINAPI extSystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, return ret; } +BOOL WINAPI extSystemParametersInfoW(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni) +{ + BOOL ret; + OutTraceDW("SystemParametersInfo: Action=%x Param=%x WinIni=%x\n", uiAction, uiParam, fWinIni); + ret=(*pSystemParametersInfoW)(uiAction, uiParam, pvParam, fWinIni); + if(uiAction==SPI_GETWORKAREA){ + LPRECT cli = (LPRECT)pvParam; + cli->top = 0; + cli->left = 0; + cli->bottom = dxw.GetScreenHeight(); + cli->right = dxw.GetScreenWidth(); + OutTraceDW("SystemParametersInfo: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom); + } + return ret; +} + #undef OutTraceDW #define OutTraceDW OutTrace diff --git a/host/Resource.h b/host/Resource.h index 4d5e70f..ae52826 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -213,6 +213,8 @@ #define IDC_DISABLEFOGGING 1175 #define IDC_RELEASEMOUSE 1176 #define IDC_HOOKGLIDE 1177 +#define IDC_RELEASEMOUSE2 1177 +#define IDC_FRAMECOMPENSATION 1177 #define ID_MODIFY 32771 #define ID_DELETE 32772 #define ID_ADD 32773 diff --git a/host/TabInput.cpp b/host/TabInput.cpp index b832fc9..473d65c 100644 --- a/host/TabInput.cpp +++ b/host/TabInput.cpp @@ -38,6 +38,7 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_FIXNCHITTEST, cTarget->m_FixNCHITTEST); DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown); DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse); + DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation); // DirectInput DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI); DDX_Text(pDX, IDC_INITX, cTarget->m_InitX); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 2576586..63b4ca7 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -127,6 +127,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_StretchTimers = FALSE; m_FineTiming = FALSE; m_ReleaseMouse = FALSE; + m_FrameCompensation = FALSE; m_InterceptRDTSC = FALSE; m_HookOpenGL = FALSE; m_ForceHookOpenGL = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 7d806d7..23a6cae 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -110,6 +110,7 @@ public: BOOL m_StretchTimers; BOOL m_FineTiming; BOOL m_ReleaseMouse; + BOOL m_FrameCompensation; BOOL m_InterceptRDTSC; BOOL m_HookOpenGL; BOOL m_ForceHookOpenGL; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index b1cd8ccfb6fffd5357092a6686de66b3bd5c37a3..10302559cc0e7f0fd0109b9e05b083f8de0bbcf4 100644 GIT binary patch delta 17464 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 OoF-}d?3Ddil<+^)P_E1X diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 4bf3ea7..a22a4ad 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -359,15 +359,15 @@ BEGIN CONTROL "Correct mouse position",IDC_MODIFYMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,38,107,12 CONTROL "Hide Cursor",IDC_HIDEHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,15,100,10 CONTROL "Intercept GDI Cursor Clipping",IDC_ENABLECLIPPING, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,85,109,10 - GROUPBOX "Cursor handling",IDC_STATIC,7,3,129,148 - CONTROL "Keep cursor within window",IDC_KEEPCURSORWITHIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,61,108,10 - CONTROL "Force cursor clipping",IDC_CLIPCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,50,108,10 - CONTROL "Message processing",IDC_MESSAGEPROC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,96,103,10 - CONTROL "Keep cursor fixed",IDC_KEEPCURSORFIXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,73,107,10 - CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,107,103,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,97,109,10 + GROUPBOX "Cursor handling",IDC_STATIC,7,3,129,162 + CONTROL "Keep cursor within window",IDC_KEEPCURSORWITHIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,73,108,10 + CONTROL "Force cursor clipping",IDC_CLIPCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,62,108,10 + CONTROL "Message processing",IDC_MESSAGEPROC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,108,103,10 + CONTROL "Keep cursor fixed",IDC_KEEPCURSORFIXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,85,107,10 + CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,119,103,10 CONTROL "Show Cursor",IDC_SHOWHWCURSOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,27,104,10 - CONTROL "Slow down mouse polling",IDC_SLOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,118,103,12 + CONTROL "Slow down mouse polling",IDC_SLOW,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,103,12 LTEXT "Initial coord.",IDC_STATIC,148,33,46,9 LTEXT "X",IDC_STATIC,234,34,9,9 LTEXT "Y",IDC_STATIC,261,34,9,9 @@ -388,7 +388,8 @@ BEGIN CONTROL "Filter offending messages",IDC_FILTERMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,96,114,10 CONTROL "Peek all messages in queue",IDC_PEEKALLMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,150,108,114,10 GROUPBOX "Message handling",IDC_STATIC,142,79,151,72 - CONTROL "Release mouse outside window",IDC_RELEASEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,114,12 + CONTROL "Release mouse outside window",IDC_RELEASEMOUSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,142,114,12 + CONTROL "Window frame compensation",IDC_FRAMECOMPENSATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,50,114,12 END IDD_TAB_TIMING DIALOGEX 0, 0, 300, 240 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 2c43e37970a91f9091c6d373ed051ad0426cbbf1..f8013afb9fca6e022ff8608c26e39371cecde512 100644 GIT binary patch delta 7299 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 H?Qs1UbmVeP delta 1948 zcmZ8i4Qx|Y6n^LK^@q~cZfv#GraVev6JZpbxR7O*ZK4dEa}eFwz-|sf1T3M6Iwm~S zD4K!m4(<{_Qn{-arqBPk~D=dl~6>OMi__tj0M_7wh6KWhm}D&_#T6XfY}opMUCzvC@dqMVcu1a(;c+!sY4K~RaW+$_ zBmqcL3k9-nDqZH&+Dz^Bjg_O7DwDRV(PQQu=uR5`=t`Oq~yck&E!02;M%|3l4KpNkev34YR zT585glR+ok^IssTS;rZ&34zYC3ZwKHxf`3AGx=zEeOS`gl|=yC2AtUOjYGQ}aGEeQ zPewK2!sIUwEUs$pev-iv4eHVmpFaR*J^A{BgHM%oFJkeUZ^3+5L%M-y3L`Cc(*`C< zDwDKy127F1660yUv5C2H=-6c3Uuo;CFl&uVLQL~Doin5Vwh!&SZVUuu-V};`1Ykcrj*2ahcTHiFvAe=88plG91)F>P7+mcVsfl2fG5E1v*h^tMBqqaQ zlcAT`RWoFZ)O7gKU>xa)(HSjIJqqh#hFDtyo2gz_RgG?xnx$1zNLnhrCelyA7mz4} zFU>hGj5Mkw>C!}wXXEbv2_iWM6ce)MLVoILDC#0!^b`tTBfJB#8n9ygXE*<<0u+8} zF}QGOrWK=CT&V1Iin11130z$Qicpq7(tvM%>d}q)`K3ho$u%yt@9>C{haw{%7HD7QjV|6Oh8 zKOKXKcrs)aW!vE(puf?AH`Y)xx4{)aWp|;N@fDl_%xxf}osi7I?sFwryv`$nyC7=7 zn#Y&p-e0XEycgO5hh8>ABR*42(Ig<5h2;sS@O}^H0o!Tgefq}z&})S)nJ9T`5Eeq@ zzj62|w4*oR5rwz(eU&0&p_=TDLo$1;k&;Ev<&pg5OJn68X3_tPNgi3o3b6bmFJ7qg zpm&c`YtOlgjpJbei)Fo&)U@nz!sEtyn|N6|2*m&6jaNF)9D(RJ|)uj8N>l&z7 zUNsAcitQNv#)vib{<|bxhakh+!%n@z@#Fdn=v}Vx=L)BfQN2CUZll2s+Sa>-&Nkv`)@!v(sDA9(v#e|7btz3oS0ZtHL`v1CIq3g zA%N@?Dy(Y`QGSQYr|UKhXn}?RVCb-0Od5u>Sr~Xn{xC}Q5M5&vlg#WaHF&+n{x=1g zO~;f8dQ9BTSPu;EZkh)PnW-%PJUOXt$m6F?Yzne#3P0D(T)Z;K`n00@Tu4~hpph!` z-qmARL2*CJU$?UYuH>*Y&@TSUVJ5)tIZm#wqv~%B)}pT|9Lr-iWUne1ZA>O6umEW4 sVim-|M7C+B@h)@v&1N`C{yOxF?=ketR$jT0?c*JE4Pw$VMjw^_17e7#s{jB1 diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 09eda0d..b7a58c6 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -241,6 +241,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_StretchTimers) t->flags4 |= STRETCHTIMERS; if(dlg->m_FineTiming) t->flags4 |= FINETIMING; if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE; + if(dlg->m_FrameCompensation) t->flags4 |= FRAMECOMPENSATION; if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC; if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL; if(dlg->m_ForceHookOpenGL) t->flags3 |= FORCEHOOKOPENGL; @@ -406,6 +407,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_StretchTimers = t->flags4 & STRETCHTIMERS ? 1 : 0; dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0; dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0; + dlg->m_FrameCompensation = t->flags4 & FRAMECOMPENSATION ? 1 : 0; dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0; dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0; dlg->m_ForceHookOpenGL = t->flags3 & FORCEHOOKOPENGL ? 1 : 0;