From 2c9572fa77bf11e8b686efac814757ec43967f69 Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 11 Dec 2015 11:42:26 -0500 Subject: [PATCH] v2_03_45_src Former-commit-id: 306e2b4ae4951095b7efa9ce7e24075ff432076d --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/Carnivores.dxw | 10 +- build/exports/Reap, the.dxw | 32 ++++ build/exports/Star Trek Klingon Academy.dxw | 32 ++++ build/exports/Star Trek Starfleet Command.dxw | 32 ++++ build/exports/Star Wars X-Wing Alliance.dxw | 32 ++++ build/readme-relnotes.txt | 7 + dll/center.bmp | Bin 0 -> 3942 bytes dll/dinput.cpp | 162 +++++++++++++++--- dll/dxhook.h | 5 +- dll/dxwcore.cpp | 15 +- dll/dxwcore.hpp | 5 + dll/dxwnd.cpp | 2 +- dll/dxwnd.rc | 2 + dll/dxwnd.vs2008.suo | Bin 105472 -> 135168 bytes dll/gdi32.cpp | 14 +- dll/kernel32.cpp | 6 + dll/resource.h | 2 +- dll/syslibs.h | 2 +- dll/user32.cpp | 67 ++------ dll/winmm.cpp | 57 ++++-- dll/winproc.cpp | 3 + host/TabInput.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 161248 -> 161432 bytes host/dxwndhost.rc | Bin 106264 -> 106522 bytes host/dxwndhost.vs2008.suo | Bin 30208 -> 30208 bytes host/dxwndhostView.cpp | 2 + host/resource | Bin 37540 -> 37632 bytes 32 files changed, 382 insertions(+), 119 deletions(-) create mode 100644 build/exports/Reap, the.dxw create mode 100644 build/exports/Star Trek Klingon Academy.dxw create mode 100644 build/exports/Star Trek Starfleet Command.dxw create mode 100644 build/exports/Star Wars X-Wing Alliance.dxw create mode 100644 dll/center.bmp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index e026e07..a1ccce9 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -209,6 +209,7 @@ #define NOWINDOWHOOKS 0x02000000 // do not intercept window callback routines #define SYNCPALETTE 0x04000000 // Syncronize GDI to DDRAW palette #define VIRTUALJOYSTICK 0x08000000 // Enables the DxWnd virtual joystick +#define UNACQUIRE 0x10000000 // Unacquire DirectInput devices when losing focus and acquire back when gaining focus // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 29e3792..37c8401 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4fa45747fcb74b2f182ae1d40d3d2219eef7a9410a72a7db49157aba403d9fe4 -size 613888 +oid sha256:35b41771cbc6227fe2b767905fbd42e75f893b1bedc8f5ccbcf26d42dffc802f +size 619008 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index fb487c0..9152118 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:48137e513053f009fb46ef066a902428491fa3fbc00119db3d5a16cd287ce4fa -size 545792 +oid sha256:a1616682f67e2e527cec0060d101ab43de06f3cbe2ff7cd4e03394c7de2c0027 +size 546304 diff --git a/build/exports/Carnivores.dxw b/build/exports/Carnivores.dxw index ba8d91d..c987504 100644 --- a/build/exports/Carnivores.dxw +++ b/build/exports/Carnivores.dxw @@ -5,10 +5,10 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=939524640 +flag0=939524130 flagg0=1209008128 flagh0=20 -flagi0=4 +flagi0=4194308 tflag0=0 initx0=0 inity0=0 @@ -24,3 +24,9 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +registry0= +flagj0=128 +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Reap, the.dxw b/build/exports/Reap, the.dxw new file mode 100644 index 0000000..ef0d036 --- /dev/null +++ b/build/exports/Reap, the.dxw @@ -0,0 +1,32 @@ +[target] +title0=Reap, the +path0=D:\Games\theReap\thereap.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1744830464 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=327680 +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 +swapeffect0=0 diff --git a/build/exports/Star Trek Klingon Academy.dxw b/build/exports/Star Trek Klingon Academy.dxw new file mode 100644 index 0000000..3a0b67c --- /dev/null +++ b/build/exports/Star Trek Klingon Academy.dxw @@ -0,0 +1,32 @@ +[target] +title0=Star Trek Klingon Academy +path0=D:\Games\Klingon Academy\ka.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=-2011168718 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=327680 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=800 +maxy0=600 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Star Trek Starfleet Command.dxw b/build/exports/Star Trek Starfleet Command.dxw new file mode 100644 index 0000000..f0a97f6 --- /dev/null +++ b/build/exports/Star Trek Starfleet Command.dxw @@ -0,0 +1,32 @@ +[target] +title0=Star Trek Starfleet Command +path0=D:\Games\Star Trek Starfleet Command\StarFleet.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1209008128 +flagh0=20 +flagi0=138412036 +flagj0=67113088 +flagk0=65536 +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 +swapeffect0=0 diff --git a/build/exports/Star Wars X-Wing Alliance.dxw b/build/exports/Star Wars X-Wing Alliance.dxw new file mode 100644 index 0000000..aa57e39 --- /dev/null +++ b/build/exports/Star Wars X-Wing Alliance.dxw @@ -0,0 +1,32 @@ +[target] +title0=Star Wars X-Wing Alliance +path0=D:\Games\Star Wars X-Wing Alliance\XWINGALLIANCE.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314930 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=1073746048 +flagk0=402980864 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=800 +maxy0=600 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 7b294b1..7f334df 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -961,3 +961,10 @@ fix: complete recoding of GDI BitBlt, StretchBlt and PatBlt hookers: it fixes "R fix: changes in USER32 BeginPaint hooker to support DC sharing with ddraw fix: increased configuration panels heigth do avoid clipping when desktop font size is set to 125% +v2.03.45 +add: virtual joystick center-lock feature, helps using the mouse as mouse leaving the joystick locked. +fix: revised dinput hooking. dinput8 still to be completed. +add: option "Unacquire input devices on focus lost". Needed for Star wars "Tie Fighter 95". +fix: set dinput SetCooperativeLevel flags to DISCL_NONEXCLUSIVE | DISCL_FOREGROUND +fix: fixed CreateIC hooker call method (WINAPI) +fix: emulated Unacquire on virtual joystick. Needed for Star wars "Tie Fighter 95". diff --git a/dll/center.bmp b/dll/center.bmp new file mode 100644 index 0000000000000000000000000000000000000000..03fb629ef7cb3235ce1d4983bcb1fda47378149f GIT binary patch literal 3942 zcmeHJ%W8u_6it_Lq1zT*Noh(Tz7Uro>BfbrD541N`!7Pa7Tkz`njSJihM92?nLrm_ zaPU6PJ$Fu==-2m;vAJ7_^%K|o<9gY=-sA2ge|Oep~fXBeXgmkHawhiVX47 z>7Ly+g?T1G)>?45-$98phg6}c3o$hCQXNvSXCA2 zCSU0Z$9>5mnx-*aMN!BhB&(c@X}HWCCztPQS#t)paxsD|aA#^bmhm?XDPO=x_-CW8 zYrc$+Ea2L1xAgf!hy8x9>$)K_4CZ+r;T3X)VTgtzsDYlo?=vX4U>BO>IG4*s!j)wi z-aA4pf;^EVvcA70;>=8~8qO3-QbudYpKe6dev6`;kc9-xvQ+hrjV)tqZ_}obNFwil GPW=I1?LRelease(); + pDirectInputCreateEx = (DirectInputCreateEx_Type)GetProcAddress(hinst, "DirectInputCreateEx"); + if(pDirectInputCreateEx) + if(!extDirectInputCreateEx(GetModuleHandle(0), DIRECTINPUT_VERSION, + di7, (void **)&lpdi, 0)) lpdi->Release(); + } +} + +void HookDirectInput8(HMODULE module, int version) +{ + const GUID di8 = {0xBF798030,0x483A,0x4DA2,0xAA,0x99,0x5D,0x64,0xED,0x36,0x97,0x00}; + HINSTANCE hinst; + LPDIRECTINPUT lpdi; + + HookLibrary(module, di8Hooks, "dinput8.dll"); + if(!pDirectInput8Create){ + hinst = LoadLibrary("dinput8.dll"); + pDirectInput8Create = (DirectInput8Create_Type)GetProcAddress(hinst, "DirectInput8Create"); + if(pDirectInput8Create) + if(!extDirectInput8Create(GetModuleHandle(0), DIRECTINPUT_VERSION, + di8, (LPVOID *)&lpdi, 0)) lpdi->Release(); + } +} + +#if 0 int HookDirectInput(HMODULE module, int version) { HINSTANCE hinst; @@ -108,7 +157,23 @@ int HookDirectInput(HMODULE module, int version) if(pDirectInputCreateA || pDirectInputCreateW || pDirectInputCreateEx) return 1; return 0; } +#endif +FARPROC Remap_DInput_ProcAddress(LPCSTR proc, HMODULE hModule) +{ + FARPROC addr; + if (addr=RemapLibrary(proc, hModule, diHooks)) return addr; + return NULL; +} + +FARPROC Remap_DInput8_ProcAddress(LPCSTR proc, HMODULE hModule) +{ + FARPROC addr; + if (addr=RemapLibrary(proc, hModule, di8Hooks)) return addr; + return NULL; +} + +static char *libname = "dsound.dll"; HRESULT WINAPI extDirectInputCreate(HINSTANCE hinst, DWORD dwversion, LPDIRECTINPUT *lplpdi, LPUNKNOWN pu, DirectInputCreate_Type pDirectInputCreate, char *apiname) { @@ -137,8 +202,7 @@ HRESULT WINAPI extDirectInputCreateW(HINSTANCE hinst, DWORD dwversion, LPDIRECTI return extDirectInputCreate(hinst, dwversion, lplpdi, pu, pDirectInputCreateW, "DirectInputCreateW"); } -HRESULT WINAPI extDirectInputCreateEx(HINSTANCE hinst, - DWORD dwversion, REFIID riidltf, LPVOID *ppvout, LPUNKNOWN pu) +HRESULT WINAPI extDirectInputCreateEx(HINSTANCE hinst, DWORD dwversion, REFIID riidltf, LPVOID *ppvout, LPUNKNOWN pu) { HRESULT res; @@ -177,15 +241,15 @@ HRESULT WINAPI extDIQueryInterface(void * lpdi, REFIID riid, LPVOID *obp) return 0; } -HRESULT WINAPI extDirectInput8Create(HINSTANCE hinst, - DWORD dwversion, REFIID riidltf, LPVOID *ppvout, LPUNKNOWN pu) +HRESULT WINAPI extDirectInput8Create(HINSTANCE hinst, DWORD dwversion, REFIID riidltf, LPVOID *ppvout, LPUNKNOWN pu) { HRESULT res; OutTraceDW("DirectInput8Create: dwVersion=%x REFIID=%x\n", dwversion, riidltf.Data1); - res = (*pDirectInputCreateEx)(hinst, dwversion, riidltf, ppvout, pu); + //res = (*pDirectInputCreateEx)(hinst, dwversion, riidltf, ppvout, pu); + res = (*pDirectInput8Create)(hinst, dwversion, riidltf, ppvout, pu); if(res) { OutTraceE("DirectInput8Create: ERROR res=%x\n", res); return res; @@ -195,12 +259,22 @@ HRESULT WINAPI extDirectInput8Create(HINSTANCE hinst, return 0; } -HRESULT WINAPI extDICreateDevice(LPDIRECTINPUT lpdi, REFGUID rguid, - LPDIRECTINPUTDEVICE *lplpdid, LPUNKNOWN pu) +HRESULT WINAPI extDICreateDevice(LPDIRECTINPUT lpdi, REFGUID rguid, LPDIRECTINPUTDEVICE *lplpdid, LPUNKNOWN pu) { HRESULT res; + char *devtype; - OutTraceDW("CreateDevice(I): REFGUID=%x\n", rguid.Data1); + switch(rguid.Data1){ + case 0x6F1D2B60: devtype = "SysMouse"; break; + case 0x6F1D2B61: devtype = "SysKeyboard"; break; + case 0x6F1D2B70: devtype = "Joystick"; break; + case 0x6F1D2B80: devtype = "SysMouseEm"; break; + case 0x6F1D2B81: devtype = "SysMouseEm2"; break; + case 0x6F1D2B82: devtype = "SysKeyboardEm"; break; + case 0x6F1D2B83: devtype = "SysKeyboardEm2"; break; + default: devtype = "Unknown"; break; + } + OutTraceDW("CreateDevice(I): REFGUID=%x(%s)\n", rguid.Data1, devtype); res = (*pDICreateDevice)(lpdi, rguid, lplpdid, pu); if(res) { @@ -208,6 +282,8 @@ HRESULT WINAPI extDICreateDevice(LPDIRECTINPUT lpdi, REFGUID rguid, return res; } OutTraceDW("CreateDevice(I): did=%x\n", *lplpdid); + SetHook((void *)(**(DWORD **)lplpdid + 28), extAcquire, (void **)&pAcquire, "Acquire(I)"); + SetHook((void *)(**(DWORD **)lplpdid + 32), extUnacquire, (void **)&pUnacquire, "Unacquire(I)"); SetHook((void *)(**(DWORD **)lplpdid + 36), extGetDeviceState, (void **)&pGetDeviceState, "GetDeviceState(I)"); SetHook((void *)(**(DWORD **)lplpdid + 40), extGetDeviceData, (void **)&pGetDeviceData, "GetDeviceData(I)"); SetHook((void *)(**(DWORD **)lplpdid + 44), extSetDataFormat, (void **)&pSetDataFormat, "SetDataFormat(I)"); @@ -228,6 +304,8 @@ HRESULT WINAPI extDICreateDeviceEx(LPDIRECTINPUT lpdi, REFGUID rguid, return res; } OutTraceDW("CreateDeviceEx(I): did=%x\n", *pvout); + SetHook((void *)(**(DWORD **)pvout + 28), extAcquire, (void **)&pAcquire, "Acquire(I)"); + SetHook((void *)(**(DWORD **)pvout + 32), extUnacquire, (void **)&pUnacquire, "Unacquire(I)"); SetHook((void *)(**(DWORD **)pvout + 36), extGetDeviceState, (void **)&pGetDeviceState, "GetDeviceState(I)"); SetHook((void *)(**(DWORD **)pvout + 40), extGetDeviceData, (void **)&pGetDeviceData, "GetDeviceData(I)"); SetHook((void *)(**(DWORD **)pvout + 44), extSetDataFormat, (void **)&pSetDataFormat, "SetDataFormat(I)"); @@ -429,7 +507,9 @@ HRESULT WINAPI extDISetCooperativeLevel(LPDIRECTINPUTDEVICE lpdid, HWND hwnd, DW lpdid, hwnd, dwflags, ExplainDICooperativeFlags(dwflags)); if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - dwflags = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; + //dwflags = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; + dwflags = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND; + hwnd=dxw.GethWnd(); res = (*pDISetCooperativeLevel)(lpdid, hwnd, dwflags); if(res != DD_OK){ OutTraceE("SetCooperativeLevel(I) ERROR: err=%x(%s)\n", res, ExplainDDError(res)); @@ -498,3 +578,29 @@ HRESULT WINAPI extDIEnumDevices(void *lpdi, DWORD dwDevType, LPDIENUMDEVICESCALL return res; } +LPDIRECTINPUTDEVICE lpDID = NULL; + +HRESULT WINAPI extAcquire(LPDIRECTINPUTDEVICE lpdid) +{ + HRESULT res; + lpDID = lpdid; + res = (*pAcquire)(lpdid); + OutTrace("Acquire(I): lpdid=%x res=%x\n", lpdid, res); + return res; +} + +HRESULT WINAPI extUnacquire(LPDIRECTINPUTDEVICE lpdid) +{ + HRESULT res; + lpDID = lpdid; + res = (*pUnacquire)(lpdid); + OutTrace("Unacquire(I): lpdid=%x res=%x\n", lpdid, res); + return res; +} + +void ToggleAcquiredDevices(BOOL flag) +{ + if (!lpDID) return; + if(flag && pAcquire)(*pAcquire)(lpDID); + if(!flag && pUnacquire)(*pUnacquire)(lpDID); +} \ No newline at end of file diff --git a/dll/dxhook.h b/dll/dxhook.h index ecce047..9e24862 100644 --- a/dll/dxhook.h +++ b/dll/dxhook.h @@ -4,7 +4,8 @@ extern int HookDirect3D(HMODULE, int); extern int HookDirect3D7(HMODULE, int); extern void HookOle32(HMODULE); extern void HookGDI32(HMODULE); -extern int HookDirectInput(HMODULE, int); +extern void HookDirectInput(HMODULE, int); +extern void HookDirectInput8(HMODULE, int); extern void HookDirectSound(HMODULE); extern void HookImeLib(HMODULE); extern void HookKernel32(HMODULE); @@ -41,6 +42,8 @@ extern FARPROC Remap_vfw_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_AdvApi32_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_Glide_ProcAddress(LPCSTR, HMODULE); extern FARPROC Remap_Imagehlp_ProcAddress(LPCSTR, HMODULE); +extern FARPROC Remap_DInput_ProcAddress(LPCSTR, HMODULE); +extern FARPROC Remap_DInput8_ProcAddress(LPCSTR, HMODULE); typedef enum { HOOK_IAT_CANDIDATE = 0, diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 871c000..54619ff 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -123,6 +123,10 @@ void dxwCore::InitTarget(TARGETMAP *target) // Aspect Ratio from window size, or traditional 4:3 by default iRatioX = iSizX ? iSizX : 800; iRatioY = iSizY ? iSizY : 600; + + GDIEmulationMode = GDIMODE_STRETCHED; // default + if (dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; + if (dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; } void dxwCore::SetScreenSize(void) @@ -478,9 +482,14 @@ void dxwCore::SethWnd(HWND hwnd) hWndFPS=hwnd; RealHDC=(*pGDIGetDC)(hwnd); - (*pGetWindowRect)(hwnd, &WinRect); - OutTraceDW("SethWnd: setting main win=%x hdc=%x pos=(%d,%d)-(%d,%d)\n", - hwnd, RealHDC, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom); + if(hwnd){ + (*pGetWindowRect)(hwnd, &WinRect); + OutTraceDW("SethWnd: setting main win=%x hdc=%x pos=(%d,%d)-(%d,%d)\n", + hwnd, RealHDC, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom); + } + else{ + OutTraceDW("SethWnd: clearing main win\n"); + } } BOOL dxwCore::ishWndFPS(HWND hwnd) diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index ea10552..c1afc5d 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -167,6 +167,7 @@ public: // simple data variables short MaxScreenRes; HDC RealHDC; HDC VirtualHDC; + int GDIEmulationMode; // Implementation protected: @@ -348,5 +349,9 @@ typedef enum { DXVK_SIZE }; +#define GDIMODE_STRETCHED 0 +#define GDIMODE_EMULATED 1 + typedef HRESULT (WINAPI *ColorConversion_Type)(LPDIRECTDRAWSURFACE, RECT, LPDIRECTDRAWSURFACE *); extern ColorConversion_Type pColorConversion; +extern void ToggleAcquiredDevices(BOOL); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index d0a71ce..8e61fcf 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.44" +#define VERSION "2.03.45" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.rc b/dll/dxwnd.rc index 6d398ea..a1ab0cf 100644 --- a/dll/dxwnd.rc +++ b/dll/dxwnd.rc @@ -57,6 +57,8 @@ IDB_CROSS BITMAP "cross.bmp" IDB_FIRE1 BITMAP "fire1.bmp" IDB_FIRE2 BITMAP "fire2.bmp" IDB_FIRE3 BITMAP "fire3.bmp" +IDB_JOYCENTER BITMAP "center.bmp" + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 9b0adcf259f9e294e16884286d4fdf0ec992c119..bab0e9df6b344acaf6aef7563447eefb113bacd3 100644 GIT binary patch delta 25209 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 D@!ZlN delta 3148 zcmd5;e{56N6~5>B*>S)aab=hg%W}}DjBu5Ue&XEt<{W9*< z#y)PxJi9UDtkLAf+_3Ce)?jsD&Z3NO zi+_gE*R%13g}1wJGlK44XqLv5SL>zAyGjk@_NiPW;?+rBTo$(GVD3rdN#A9wjnwJ2 z%wo2cc=CaeUBN9&s1f~J$e9jawFz}jS7v_pF^q2J;!FNxGHO)i9n$3Q^kQQ=^mLAP zOc-5d-y`j&Fy1eJF{{*O5+MGn_!nLg&pKyWq;~kJHW$B&wiCK~s#@r=6S|ZwMf~zG zg@&pkoE)Y{WNg;Xbz`*DNLKZ(pmwesp>O6FmweHJ#%sF{=~lIKcE)$3V|V<=+LIRJ z!@t#&bqAjH$SpTsa&@8C4b0%|PvKWi->6g3QU2g(&Oh|c<|27*X;{AN4oYt%*GNu8 zNS17<$D14ZdLNa_SV4%g`05^N;cxX*zKl%;K+d7 zC!HUAm^{{c(JCtC?9_T~iEdO*Yvk}_^EcD38MXgBW9Ppdqdd8H#>35f$i)q>lb!P( zp$3XGwNaZqRp_Cdlo#Rr5Rti~jIDCYU+oC+P%mwg#qN##_Au=)Ab)bM>$6|D$^CYT%pmCGSxHi{wOd8ybdIQGr(EkIH2Za z+N&53wgf}J$L}A2H-JtcGv^BW`+>ohD+fdjpB{X=MTOWTO7UHiMv=G+{V-63S}YdT zKoOo*h`V7e0#ctE(^3xWddw*iPhn}rjbf(BI->oj3=X7HM*AE!&IPEsh7?fLKj2-k zFcL{C9n4b2mFQSPS8O~KrM+plXdkUKlY0h9mADe1GD_Sr zLw}~h*d60}RHyqrAjS*$fLuU@P=QG@Y%9W+uvLE5UMMONkc+0jp{P(2O~oh7%7 zA97|FVJD^cOL%aAHuBbfs^svqR5q{BmU}R4d6vF0zKN1q_pZV0`MSFnW96@s#QAm` z%ItOk@tto^%x1U-&mSf~$L-XJ`c#^b{2|6a8NlI^N6_mt zD4!=D#)`2cwIX7Xp5c3@EnLZuvpTLd!Gh-DJ;7HxdSf-Otqn z)Q%X1Ri{F}Gv(nwoi;gk%g6fzbZ7byQ$cPTCBHmArPRyKmj}pCYn7Pn%S1S!{Hx$o zqtw9lV-(1)Rq7>h^(1E7C~7JEjIx6wuy$)(s4UJOOqWIFf@Sd~R$WMk);K~E z`)+!@bz-aF>OKmALqCVlkdvFoNKYK;pi%ArBOR;(oS=?pyQ$h{{ugM@Bt3WZ&`w%5 zH=ORFt4f^~uRvIv@D`ekzEUnb`~Ck-9+}B*CfNm*3A@Hq>6z6Ck>4l2!@WjYWz-eQ zhxb!wLfc9+G}27^_~WD#yIw(lUm79DvUc16CG&J@9Y+T!b>qtOYg`mcjZtkL)QY;C zQ&(kofZS%aW&#!9>a*09k)i@_eI`|q0lqdsZVIMKTUDs+nhf%LeYo{qlO@&%%^N*B zsdUkdxQ*W$rFDGE(d35(e%SuEuJK!Ys7Ags>CY%<8D!-}840*$%}h#0Vz&q7#FVa% zUL`NA@X5%mK6i4Ts(c>~1-HL8^lJyLP8|SIN$C}s)cMpw=$siSTvsR6p0!+C2gdH@ zfhgV0zkL+_0#ow3`pBOEaY5o_FDfJ6OS((JwSr5_mg+d3#DFa-G#PFV5}tvCPx diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 4b9085c..24d7c4c 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -9,10 +9,6 @@ #include "stdio.h" -#define GDIMODE_STRETCHED 0 -#define GDIMODE_EMULATED 1 -extern int GDIEmulationMode; - static void Stopper(char *s, int line) { char sMsg[81]; @@ -333,6 +329,7 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) case BITSPIXEL: case COLORRES: case VERTRES: + case HORZRES: case SIZEPALETTE: case NUMRESERVED: sprintf(sInfo, "%s res=%d\n", sInfo, res); break; @@ -705,7 +702,7 @@ HDC WINAPI extGDICreateDC(LPSTR lpszDriver, LPSTR lpszDevice, LPSTR lpszOutput, return RetHDC; } -HDC extCreateICA(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput, const DEVMODE *lpdvmInit) +HDC WINAPI extCreateICA(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput, const DEVMODE *lpdvmInit) { HDC WinHDC, RetHDC; OutTraceDW("GDI.CreateIC: Driver=%s Device=%s Output=%s InitData=%x\n", @@ -728,6 +725,7 @@ HDC extCreateICA(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutput, con RetHDC = (*pCreateICA)(lpszDriver, lpszDevice, lpszOutput, lpdvmInit); } + OutTraceDW("CreateIC: ret=%x\n", RetHDC); return RetHDC; } @@ -788,7 +786,7 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH IsToScreen=(OBJ_DC == GetObjectType(hdcDest)); if (IsToScreen && (dxw.dwFlags3 & NOGDIBLT)) return TRUE; if(dxw.IsFullScreen()) { - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: { int nWDest, nHDest; nWDest= nWidth; @@ -838,7 +836,7 @@ BOOL WINAPI extGDIPatBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH IsToScreen=(OBJ_DC == GetObjectType(hdcDest)); if (IsToScreen && (dxw.dwFlags3 & NOGDIBLT)) return TRUE; if(dxw.IsFullScreen()) { - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: { int nWDest, nHDest; nWDest= nWidth; @@ -889,7 +887,7 @@ BOOL WINAPI extGDIStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, in IsToScreen=(OBJ_DC == GetObjectType(hdcDest)); if (IsToScreen && (dxw.dwFlags3 & NOGDIBLT)) return TRUE; if(dxw.IsFullScreen()) { - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: { int nWDest, nHDest; nWDest= nWidth; diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index ab89169..636e06c 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -638,6 +638,12 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) case SYSLIBIDX_IMAGEHLP: if (remap=Remap_Imagehlp_ProcAddress(proc, hModule)) return remap; break; + case SYSLIBIDX_DINPUT: + if (remap=Remap_DInput_ProcAddress(proc, hModule)) return remap; + break; + case SYSLIBIDX_DINPUT8: + if (remap=Remap_DInput8_ProcAddress(proc, hModule)) return remap; + break; default: break; } diff --git a/dll/resource.h b/dll/resource.h index 877fd86..67259b7 100644 --- a/dll/resource.h +++ b/dll/resource.h @@ -6,8 +6,8 @@ #define IDB_CROSS 102 #define IDB_FIRE1 103 #define IDB_FIRE2 104 -#define IDB_BITMAP2 105 #define IDB_FIRE3 105 +#define IDB_JOYCENTER 106 // Next default values for new objects // diff --git a/dll/syslibs.h b/dll/syslibs.h index 17cf2f9..efd5d5b 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -488,7 +488,7 @@ extern HDC WINAPI extEMUCreateCompatibleDC(HDC); extern HDC WINAPI extGDICreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); extern HFONT WINAPI extCreateFont(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); extern HFONT WINAPI extCreateFontIndirect(const LOGFONT*); -extern HDC extCreateICA(LPCTSTR, LPCTSTR, LPCTSTR, const DEVMODE *); +extern HDC WINAPI extCreateICA(LPCTSTR, LPCTSTR, LPCTSTR, const DEVMODE *); extern HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *); extern HDWP WINAPI extDeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT); extern BOOL WINAPI extExtTextOutW(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); diff --git a/dll/user32.cpp b/dll/user32.cpp index 4a68e35..09b10c5 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -15,9 +15,6 @@ #define FIXCHILDSIZE FALSE BOOL IsChangeDisplaySettingsHotPatched = FALSE; -#define GDIMODE_STRETCHED 0 -#define GDIMODE_EMULATED 1 -int GDIEmulationMode = 0; extern BOOL bFlippedDC; extern HDC hFlippedDC; @@ -201,6 +198,7 @@ static HookEntry_Type PeekAllHooks[]={ static HookEntry_Type MouseHooks[]={ {HOOK_HOT_CANDIDATE, "GetCursorPos", (FARPROC)GetCursorPos, (FARPROC *)&pGetCursorPos, (FARPROC)extGetCursorPos}, + {HOOK_HOT_CANDIDATE, "SetCursorPos", (FARPROC)SetCursorPos, (FARPROC *)&pSetCursorPos, (FARPROC)extSetCursorPos}, {HOOK_IAT_CANDIDATE, "GetCursorInfo", (FARPROC)GetCursorInfo, (FARPROC *)&pGetCursorInfo, (FARPROC)extGetCursorInfo}, {HOOK_IAT_CANDIDATE, "SetCursor", (FARPROC)SetCursor, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, {HOOK_IAT_CANDIDATE, "SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessageA, (FARPROC)extSendMessageA}, @@ -218,11 +216,6 @@ static HookEntry_Type WinHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -static HookEntry_Type MouseHooks2[]={ - {HOOK_HOT_CANDIDATE, "SetCursorPos", (FARPROC)SetCursorPos, (FARPROC *)&pSetCursorPos, (FARPROC)extSetCursorPos}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - static HookEntry_Type TimeHooks[]={ {HOOK_IAT_CANDIDATE, "SetTimer", (FARPROC)SetTimer, (FARPROC *)&pSetTimer, (FARPROC)extSetTimer}, {HOOK_IAT_CANDIDATE, "KillTimer", (FARPROC)KillTimer, (FARPROC *)&pKillTimer, (FARPROC)extKillTimer}, @@ -243,16 +236,16 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule) if (addr=RemapLibrary(proc, hModule, Hooks)) return addr; if (dxw.dwFlags1 & CLIENTREMAPPING) if (addr=RemapLibrary(proc, hModule, RemapHooks)) return addr; - if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; - if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; + if (dxw.dwFlags2 & GDISTRETCHED) + if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; + if (dxw.dwFlags3 & GDIEMULATEDC) + if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr; - - if (dxw.dwFlags1 & MODIFYMOUSE) if (addr=RemapLibrary(proc, hModule, MouseHooks)) return addr; if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) if (addr=RemapLibrary(proc, hModule, WinHooks)) return addr; if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) - if (addr=RemapLibrary(proc, hModule, MouseHooks2)) return addr; + if (addr=RemapLibrary(proc, hModule, MouseHooks)) return addr; if (dxw.dwFlags3 & PEEKALLMESSAGES) if (addr=RemapLibrary(proc, hModule, PeekAllHooks)) return addr; if((dxw.dwFlags2 & TIMESTRETCH) && (dxw.dwFlags4 & STRETCHTIMERS)) @@ -265,9 +258,6 @@ static char *libname = "user32.dll"; void HookUser32(HMODULE hModule) { - GDIEmulationMode = GDIMODE_STRETCHED; // default - if (dxw.dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; - if (dxw.dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; HookLibrary(hModule, Hooks, libname); if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) @@ -276,9 +266,8 @@ void HookUser32(HMODULE hModule) if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(hModule, ScaledHooks, libname); if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname); - if (dxw.dwFlags1 & MODIFYMOUSE) HookLibrary(hModule, MouseHooks, libname); if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) HookLibrary(hModule, WinHooks, libname); - if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibrary(hModule, MouseHooks2, libname); + if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibrary(hModule, MouseHooks, libname); if (dxw.dwFlags3 & PEEKALLMESSAGES) HookLibrary(hModule, PeekAllHooks, libname); if (dxw.dwFlags2 & TIMESTRETCH) HookLibrary(hModule, TimeHooks, libname); @@ -294,7 +283,6 @@ void HookUser32Init() HookLibInit(RemapHooks); HookLibInit(MouseHooks); HookLibInit(WinHooks); - HookLibInit(MouseHooks2); } /* ------------------------------------------------------------------------------ */ @@ -621,7 +609,7 @@ BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) hwnd, bErase); if(dxw.IsFullScreen()) { - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: if(lpRect) dxw.MapClient(lpRect); break; @@ -995,36 +983,6 @@ BOOL WINAPI extSetCursorPos(int x, int y) } if(dxw.dwFlags1 & MODIFYMOUSE){ -#if 0 - POINT cur; - RECT rect; - - // find window metrics - if (!(*pGetClientRect)(dxw.GethWnd(), &rect)) { - // report error and ignore ... - OutTraceE("GetClientRect(%x) ERROR %d at %d\n", dxw.GethWnd(), GetLastError(), __LINE__); - return 0; - } - - x= x * rect.right / dxw.GetScreenWidth(); - y= y * rect.bottom / dxw.GetScreenHeight(); - - // check for boundaries (???) - if (x >= rect.right) x=rect.right-1; - if (x<0) x=0; - if (y >= rect.bottom) y=rect.bottom-1; - if (y<0) y=0; - - // make it screen absolute - cur.x = x; - cur.y = y; - if (!(*pClientToScreen)(dxw.GethWnd(), &cur)) { - OutTraceE("ClientToScreen(%x) ERROR %d at %d\n", dxw.GethWnd(), GetLastError(), __LINE__); - return 0; - } - x = cur.x; - y = cur.y; -#else // v2.03.41 POINT cur; cur.x = x; @@ -1032,7 +990,6 @@ BOOL WINAPI extSetCursorPos(int x, int y) dxw.MapWindow(&cur); x = cur.x; y = cur.y; -#endif } res=0; @@ -1991,7 +1948,7 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) if(ret) return ret; } - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: ret=(*pGDIGetDC)(lochwnd); break; @@ -2058,7 +2015,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) if(bFlippedDC && (hDC == hFlippedDC)) return dxw.ReleaseSharedDC(hwnd, hDC); - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: res=(*pGDIReleaseDC)(hwnd, hDC); break; @@ -2090,7 +2047,7 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) hdc = dxw.AcquireSharedDC(hwnd); } else { - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: // on CLIENTREMAPPING, resize the paint area to virtual screen size //if(dxw.dwFlags1 & CLIENTREMAPPING) lpPaint->rcPaint=dxw.GetScreenRect(); @@ -2127,7 +2084,7 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) // avoid access to real desktop if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - switch(GDIEmulationMode){ + switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: ret=(*pEndPaint)(hwnd, lpPaint); break; diff --git a/dll/winmm.cpp b/dll/winmm.cpp index 2182c02..d3e90fa 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -335,34 +335,54 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) LONG x, y; HWND hwnd; DWORD dwButtons; + static BOOL bJoyLock = FALSE; + static DWORD dwLastClick = 0; dwButtons = 0; 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); + + if(dwButtons == JOY_BUTTON3){ + if(((*pGetTickCount)() - dwLastClick) > 200){ + bJoyLock = !bJoyLock; + dwButtons &= ~JOY_BUTTON3; + dwLastClick = (*pGetTickCount)(); + } + } + POINT pt; if(hwnd=dxw.GethWnd()){ RECT client; POINT upleft = {0,0}; (*pGetClientRect)(hwnd, &client); (*pClientToScreen)(hwnd, &upleft); - if(dwButtons & JOY_BUTTON3){ - // center joystick ... - dwButtons &= ~JOY_BUTTON3; - (*pSetCursorPos)(upleft.x + (client.right >> 1), upleft.y + (client.bottom >> 1)); - } (*pGetCursorPos)(&pt); pt.x -= upleft.x; pt.y -= upleft.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; - if(INVERTJOYAXIS) - y = ((client.bottom - pt.y) * YSPAN) / client.bottom; // inverted y axis - else - pt.y = (pt.y * YSPAN) / dxw.GetScreenHeight(); + 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); + 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); + 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; + if(INVERTJOYAXIS) + y = ((client.bottom - pt.y) * YSPAN) / client.bottom; // inverted y axis + else + pt.y = (pt.y * YSPAN) / dxw.GetScreenHeight(); + } ShowJoystick(pt.x, pt.y, dwButtons); } else { @@ -393,6 +413,7 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) static HBITMAP g_hbmJoyFire1; static HBITMAP g_hbmJoyFire2; static HBITMAP g_hbmJoyFire3; + static HBITMAP g_hbmJoyCenter; HBITMAP g_hbmJoy; RECT client; RECT win; @@ -412,6 +433,7 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) g_hbmJoyFire1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE1)); g_hbmJoyFire2 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE2)); g_hbmJoyFire3 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE3)); + g_hbmJoyCenter = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_JOYCENTER)); JustOnce=TRUE; } @@ -420,8 +442,13 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) case 0: g_hbmJoy = g_hbmJoyCross; break; case JOY_BUTTON1: g_hbmJoy = g_hbmJoyFire1; break; case JOY_BUTTON2: g_hbmJoy = g_hbmJoyFire2; break; - default: g_hbmJoy = g_hbmJoyFire3; break; + case JOY_BUTTON1|JOY_BUTTON2: g_hbmJoy = g_hbmJoyFire3; break; + case JOY_BUTTON3: g_hbmJoy = g_hbmJoyCenter; break; + default: g_hbmJoy = NULL; break; } + + if(g_hbmJoy == NULL) return; // show nothing ... + HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmJoy); GetObject(g_hbmJoy, sizeof(bm), &bm); diff --git a/dll/winproc.cpp b/dll/winproc.cpp index ae87a21..8e07353 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -391,6 +391,9 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp // turn DirectInput bActive flag on & off ..... if(message == WM_NCACTIVATE) dxw.bActive = wparam; if(dxw.bActive) (*pSetWindowPos)(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + if(dxw.dwFlags6 & UNACQUIRE){ + ToggleAcquiredDevices(dxw.bActive); + } if(dxw.dwFlags1 & UNNOTIFY){ DefWindowProc(hwnd, message, wparam, lparam); return false; diff --git a/host/TabInput.cpp b/host/TabInput.cpp index 5513149..f6342d9 100644 --- a/host/TabInput.cpp +++ b/host/TabInput.cpp @@ -44,6 +44,7 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) //DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation); // DirectInput DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI); + DDX_Check(pDX, IDC_UNACQUIRE, cTarget->m_Unacquire); DDX_Text(pDX, IDC_INITX, cTarget->m_InitX); DDX_Text(pDX, IDC_INITY, cTarget->m_InitY); DDX_Text(pDX, IDC_MAXX, cTarget->m_MaxX); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 318ec37..5a9bad8 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -30,6 +30,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_HookDI = FALSE; m_ModifyMouse = TRUE; // default true !! m_VirtualJoystick = FALSE; + m_Unacquire = FALSE; m_LogEnabled = FALSE; m_OutProxyTrace = FALSE; m_OutDebug = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index a9db998..9d16c58 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -35,6 +35,7 @@ public: BOOL m_HookDI; BOOL m_ModifyMouse; BOOL m_VirtualJoystick; + BOOL m_Unacquire; BOOL m_OutProxyTrace; BOOL m_OutDebug; BOOL m_CursorTrace; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 39a7981fa93a0c61993525e1612823f35224fce6..6202d9a1dc3a5b08954b680c876c220fe06c0896 100644 GIT binary patch delta 3620 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 F{{V>0d%GN@5&T)dTX?899 z^Y{DxzQ;M|yVpK`f99w6W)9iY-rho>xwygJRomX&&}s4;%zlg6-?3viJ=2yw-8pF=_>Fi6N|w@cp)Mrzb0_n0K=Syv-bE10FP zP5}y7LVzZF5fp~7aC*f6%R<;>e#HpZ5a6g&U2czTLNS3N!Szl@t;=1(OX{tP6^bP2 zvw5rhRZf>nbfOeNF#_G*l14MH#bU`(y}qDS%2qpF4u7TFT_t2i7FaG(0ro5v^N zLRf*c?^+73q?`094XdPvR}AlnVlaSB!o0l-zvzfZDh4Bzh0&)AR1794m$)o1T9s-u z*y*43^Uy(yuItlRONGy4tM_{xUSDX{ia~)2nw2@fpiJl50Gqv>P=(kr9$@I`9O z&cFs*ot>V(QC6ts9l2}$heoktgp=G@mD(SA-V{fA_#A#TOO^& z0GlM?b@)7v3a8iS5qFDXF~Unohi|3h%SUrkEzJn_x>`O<9%oI3-{JANJ+RDRFqq+$ z2&UG?Pf!pRc$KCIdncF=pd zS!5T|gxfmOiPU&ok3XW7dAgFW?-sK08<3~w$GJO#6l1;G<_wV**h5d}>F_oBKL6ZH zKgrXReMmFLbfg>U^05rkgS2rh1AD1^fu8gsJu{|v><=aM*~ZLLj8;)cKYFtyoClleqJFL4LSO55X!rpAq<^)>@21Lt)~}>&K+_jG>E8wx zY4mGo`k!-bYVrecCWMi~e&^AI?CBIg)=+r$NRB<7xB33=NWTFrJ=`Kl>Y&=(|3qH6yP(IQbjlZ2m9szqH0WDFV!(x_{g!9>hc#Mrf z^#Xj(`V+7K$3{jHa9?iRo|ypI0BoY2q_L(fOvJ^^=E3FctO+f|V`sNaXd=;0HrtGc ziE3lRW;{#E{cM#5HxTzaHf%wU;2&6UjlfF_v5a&yu--zh_tmk)W!MxS2cRB?p96z3 zHo6Q8lK3NM@`?gfkHJM2Z{@Jx771TvRaUIR3dXFMC#t+}#nnkpbxH+5R0_*jvVvyJ zVHFCN^yI=!{+gHo{@xFDQfdze@Q4_U)YMCMXGd5>)Zas4M4rWxEca_Qe|bi;M36mT zFV~9ha#6gdq32*JgpxTmT@f`FBMZu85bf0F(mkVjPLh*(5&?R%`_!I?kOfIF2OdR< z9q0?kPYU8O#Q$eH9{SYFV3P6w{XhK2ll(W+^UtgQo)mmLy+ECXp#qQD+7*~QIU6dU z4KJ%G#*(-uKJv4ml^IKLE<06>i<8Qp8H+adaWQ(ai~XPkYw-Yky#%XL`QPNpON>+^ zd}(rZh!@%QHj))n@B+XLcE63} zVFOFrO8C4Tr|HKtW4E^eynBM)Jdqhw$(Q6}`?iuSaxspb+DbCX*bH`A*e_K?4iCS~ z8ihUZD(eoAvZ$+Dkons%J$iw({+0) zl0QJEDbw-A6wlW&4Ig;SGe4Qk+%|`>_yiKl+>%8m7Z^WnWV2z4=L?u7bCZp*2^&d^ zOX1|(hmoy3f@%4=+-a7pox`&aia;=EwodR0!=3!d?JP%_Rm>(#DcdBB!uo`)CKO9c*)Y(xjge-4?EaFOqk6saV7cC%f>tS zC@f}=g?rw|GIz{|~L1{C@xd diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 4c24b1d3a1d9887c87aa0069e9d6b843423358b7..6b95828b58697da40cc8eaeaea94cb4caa0142ed 100644 GIT binary patch delta 484 zcmYjOJxfAi6h0zIiCTftRw5BW4XO8fZ$pvRkV{cfOY|XD7KLUXMngCU71lEp(NIg! zB9^AtQqzCn*iaJvfM^Q}q?4F6ygVQ0yzhAq?@3m3n$twvVtSdnsFN%t^65n2%7*i4 z12$p@xVi4bQ^|;l_@2rN_eTp}_RYs(sC4MMmDSxO;Bd@>@UoV*7SY>N)O*eIpsvT!{H7KQY{GbSbx&y_#IrfbI zbdWC#T-!$BzP`eDFq_s@_-+M2#%q9@Y*WfZM c<1J&r>%*g3;0YJm9(?BFJlP(*&U>G~0oW0sTL1t6 delta 373 zcmbPrfNjP;whd~V1oP2JN0F>PcrE4d@+RFoF`%mVJ13G=5lOQYzAc126bX?QayzY74O Ca)h4% diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 9805e85c2d2889cc7c9b9dee6d8a272dbcabc9c0..76f8a0b7b1d2b8e58c130612c655bb792551c78f 100644 GIT binary patch delta 409 zcmYL@OG^S_7=`B@XJl-wMhzW9NAp4&2BxX2=(>n5C}kp48f`0(@&|m&Xwjn6zIJU~ zMBlmy+5~O-1wqlWMZr+*YJ}2vci!i4&S7uF-so~yva{n%`ZUP*r3xuOe+QQm1M8Fc zx16?7jwc;wL{2=fdk|D~Fo#8Y9%MVU{k@&PsTFbOnE-R$*~uXYg4#h%cM-Gd7)@l~*<(qu<7?_A!kn7srr#+d6B)D(2m*eRb?U`+ zW0eBQ;bkbrBMqy2tM#p&_xLT1kd8; z1JO;2nZ-K0I5-PBJ2(V!)6cG(2?7RkKKH=3dpOymm!M*ld*@uzj}0`w&~>f*6Ou zkz@?teak#&I#I@RyaFd)I8GJumZ;#O(?C6~;X@ZOr5EApUsS^6=q!}6CK7PCmlr$u z5jcZO_)M0#!A8B;qA>1u=3#c(+|~s<8Hc0CNW{6Bf)Us7Vn#{D-9p|y>8|zAxSzH< p(;t8_P$Ze>NufSFhD+0eWfok|v~(%MzXkr)>ji;E{L$M~fm_HookDI) t->flags |= HOOKDI; if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE; if(dlg->m_VirtualJoystick) t->flags6 |= VIRTUALJOYSTICK; + if(dlg->m_Unacquire) t->flags6 |= UNACQUIRE; if(dlg->m_OutProxyTrace) t->tflags |= OUTPROXYTRACE; if(dlg->m_OutDebug) t->tflags |= OUTDEBUG; if(dlg->m_CursorTrace) t->tflags |= OUTCURSORTRACE; @@ -490,6 +491,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0; dlg->m_VirtualJoystick = t->flags6 & VIRTUALJOYSTICK ? 1 : 0; + dlg->m_Unacquire = t->flags6 & UNACQUIRE ? 1 : 0; dlg->m_OutProxyTrace = t->tflags & OUTPROXYTRACE ? 1 : 0; dlg->m_OutDebug = t->tflags & OUTDEBUG ? 1 : 0; dlg->m_CursorTrace = t->tflags & OUTCURSORTRACE ? 1 : 0; diff --git a/host/resource b/host/resource index 918f057a9d151e809b5fc81eab159f3ebbe292bc..434f71bf921824db0947f7615d43576d9a67ef4b 100644 GIT binary patch delta 42 ycmZ3ol&N7E(}o|}lP3ssa62+MGXye(GI%lsO;+UAoUD+|Hu+Pr%;sO&tJDBA4Gx_E delta 14 WcmZoz#oe+J9|