From 1f153bb8537b4c757ce38e8c7dd1b7e78aeb7620 Mon Sep 17 00:00:00 2001 From: gho tik Date: Thu, 23 Feb 2017 11:50:25 -0500 Subject: [PATCH] v2_04_16_src Former-commit-id: 208a69bad39b49b740d61779b454ca3b8309c530 --- Include/dxwnd.h | 14 +- build/dxwnd.dll | 2 +- build/dxwnd.exe | 4 +- build/exports/Xwing vs. Tie-Fighter demo.dxw | 36 +++++ build/readme-relnotes.txt | 4 + dll/ddraw.cpp | 35 ++++- dll/dxwnd.cpp | 6 +- dll/dxwnd.vs2008.suo | Bin 16896 -> 33792 bytes dll/user32.cpp | 10 -- dll/winmm.cpp | 32 +++- host/TargetDlg.cpp | 2 +- host/VJoyDialog.cpp | 145 +++++++++++++++++++ host/VJoyDialog.h | 40 +++++ host/dxwndhost.aps | Bin 260884 -> 262424 bytes host/dxwndhost.rc | Bin 151124 -> 154256 bytes host/dxwndhost.vs2008.suo | Bin 216064 -> 224768 bytes host/dxwndhost.vs2008.vcproj | 18 ++- host/dxwndhostView.cpp | 40 +++-- host/dxwndhostView.h | 1 + host/resource | Bin 54754 -> 55674 bytes 20 files changed, 342 insertions(+), 47 deletions(-) create mode 100644 build/exports/Xwing vs. Tie-Fighter demo.dxw create mode 100644 host/VJoyDialog.cpp create mode 100644 host/VJoyDialog.h diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 153d559..1bf8969 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -340,6 +340,15 @@ typedef struct TARGETMAP short ScanLine; }TARGETMAP; +// VJoyStatus flags +#define VJOYPRESENT 0x00000001 // Virtual joystick configured for the program +#define VJOYENABLED 0x00000002 // Virtual Joystick enabled and sending input coordinates +#define CROSSENABLED 0x00000004 // Crossfire display enabled +#define INVERTYAXIS 0x00000008 // Invert virtual joystick Y axis +#define INVERTXAXIS 0x00000010 // Invert virtual joystick X axis +#define B1AUTOFIRE 0x00000020 // Button 1 auto fire +#define B2AUTOFIRE 0x00000040 // Button 2 auto fire + typedef struct { short Status; @@ -358,11 +367,14 @@ typedef struct short CursorX, CursorY; PALETTEENTRY Palette[256]; BOOL AllowMultiTask; + DWORD VJoyStatus; + short joyposx; + short joyposy; } DXWNDSTATUS; extern DXWNDSTATUS DxWndStatus; -int SetTarget(TARGETMAP *); +int SetTarget(DXWNDSTATUS *, TARGETMAP *); int StartHook(void); int EndHook(void); void GetDllVersion(char *); diff --git a/build/dxwnd.dll b/build/dxwnd.dll index be2c990..0cf6795 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a6e3eed0ef40c5d67c9179b539a02e0d2044ede982322f019816d85db5694161 +oid sha256:7b2007119a0075012b9c97e2f0532e9c00393cd639510b97d7984683ad53776d size 793088 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 8e63215..161bb2d 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b65ce7c723d642c6c753ab05c5e3e8eb4d50fc80592f0e333decdf7e77c0b00e -size 677376 +oid sha256:2708b771a49673ae154fffa2cadaaefe2eab5b1fb497f35c84f14d1a4bde1701 +size 681472 diff --git a/build/exports/Xwing vs. Tie-Fighter demo.dxw b/build/exports/Xwing vs. Tie-Fighter demo.dxw new file mode 100644 index 0000000..5c7ea2e --- /dev/null +++ b/build/exports/Xwing vs. Tie-Fighter demo.dxw @@ -0,0 +1,36 @@ +[target] +title0=Xwing vs. Tie-Fighter demo +path0=D:\Games\XwingTie Demo\z_xvt__.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185846 +flagg0=1207959552 +flagh0=8212 +flagi0=138412036 +flagj0=1073746048 +flagk0=134283264 +flagl0=512 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 98d7b8a..e49beaa 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1559,3 +1559,7 @@ fix: in mciSendCommand using ANSI MCI_OVLY_WINDOW_PARMS instead of WIDECHAR vers fix: DirectDraw:GetCaps wrapper crash when setting SUPPRESSOVERLAY and the hw or sw caps pointer is NULL fix: exception when trying to use ddraw SetAppCompatData and LoadLibrary failed fix: error messages on LoadLibrary errors + +v2.04.16 +add: improved virtual joystick with configuration and monitoring panel, invert axis options, show crossfire. +fix: GetAttachedSurface now simulates also the primary surface as attach to backbuffer. Fixes GTA first episode windows version. diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index bb764a6..b58ce2c 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -724,6 +724,7 @@ void InitScreenParameters(int dxversion) extern void FixPixelFormat(int , DDPIXELFORMAT *); DEVMODE CurrDevMode; static int DoOnce = FALSE; + DWORD dwVJoyStatus; if(DoOnce) return; DoOnce = TRUE; @@ -736,6 +737,11 @@ void InitScreenParameters(int dxversion) GetHookInfo()->ColorDepth=0; // unknown GetHookInfo()->DXVersion=0; // unknown GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE); + + dwVJoyStatus = GetHookInfo()->VJoyStatus; + dwVJoyStatus &= ~VJOYPRESENT; + if(dxw.dwFlags6 & VIRTUALJOYSTICK) dwVJoyStatus |= VJOYPRESENT; + GetHookInfo()->VJoyStatus = dwVJoyStatus; if(!(*pEnumDisplaySettings)(NULL, ENUM_CURRENT_SETTINGS, &CurrDevMode)){ OutTraceE("EnumDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); @@ -4607,9 +4613,10 @@ HRESULT WINAPI extGetColorKey7(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLOR static HRESULT WINAPI extEnumAttachedSurfaces(EnumAttachedSurfaces_Type pEnumAttachedSurfaces, LPDIRECTDRAWSURFACE lpdds, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) { HRESULT res; - BOOL IsPrim; + BOOL IsPrim, IsBack; IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback); @@ -4635,13 +4642,35 @@ static HRESULT WINAPI extEnumAttachedSurfaces(EnumAttachedSurfaces_Type pEnumAtt res=(lpEnumSurfacesCallback)(lpDDSBack, (LPDDSURFACEDESC)&ddsd, lpContext); OutTraceDW("EnumSurfacesCallback: on DDSBack res=%x(%s)\n", res, ExplainDDError(res)); } - res=DD_OK; // for Black Dahlia + return DD_OK; // for Black Dahlia } - else { + + if(IsBack){ + LPDIRECTDRAWSURFACE lpDDSPrim; + // A Primary surface has not backbuffer attached surfaces actually, + // so don't rely on ddraw and call the callback function directly. + // Needed to make Nox working. + DDSURFACEDESC2 ddsd; + // first, call hooked function res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); if (res) OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(lpDDSPrim = dxwss.GetPrimarySurface()){ + ddsd.dwSize=Set_dwSize_From_Surface(); + res=lpDDSPrim->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); + if(res){ + OutTraceE("EnumAttachedSurfaces: GetSurfaceDesc ERROR %x(%s)\n", + res, ExplainDDError(res)); + return res; + } + res=(lpEnumSurfacesCallback)(lpDDSPrim, (LPDDSURFACEDESC)&ddsd, lpContext); + OutTraceDW("EnumSurfacesCallback: on DDSPrim res=%x(%s)\n", res, ExplainDDError(res)); + } + return DD_OK; // for GTA (first episode, window version "gtawin.exe") } + res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); + if (res) + OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index c550cc2..1b30614 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.04.15" +#define VERSION "2.04.16" #define DDTHREADLOCK 1 @@ -108,7 +108,7 @@ static BOOL GetMultiTaskEnabling(){ return GetPrivateProfileInt("window", "multiprocesshook", 0, inipath); } -int SetTarget(TARGETMAP *targets){ +int SetTarget(DXWNDSTATUS *statusmap, TARGETMAP *targets){ int i; char path[MAX_PATH+1]; @@ -122,6 +122,8 @@ int SetTarget(TARGETMAP *targets){ pStatus->Height = pStatus->Width = 0; pStatus->DXVersion = 0; pStatus->AllowMultiTask=GetMultiTaskEnabling(); + //pStatus->VJoyStatus=VJOYENABLED|CROSSENABLED|INVERTYAXIS; + if(statusmap) pStatus->VJoyStatus=statusmap->VJoyStatus; for(i = 0; targets[i].path[0]; i ++){ char *c; pMapping[i] = targets[i]; diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 48d23b4d49bb0af527b362ff0ba68baa74ababa2..5f975ddf41746ab5737ec21875e4cfa0a0836b9e 100644 GIT binary patch literal 33792 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 PHt{}^9+b`h&E@|u95R0j delta 649 zcmYL`&uddb5XWcs?QZkqMf0<-)=Dd;Jro+M9?U`QD~dH*rFseysAv%^fkN{RF?tAC z!GnloE?)f)4DTNZRuuG*>OY`f#FJhMR>8*ECmUxEZ|1YJ-~H~q_G8iB!e>5WckwOC z{lQ>Bt|-P#5*1}}k)Dfu_hubCav3#!kW;B!C2#u4M|1$dPf$y~Q=^>5=u4wOpX6vK zE~%+5YhaOqu#|dfNqegLU%RTy8FR@DAGR0ncdxBt`tzHhdE@2Y(u?H_zkr%dJKWCJ$gHq>AZ>bz>qO$=)`I!(R!mhzZ7LlZ$_M@c3rOO)d3I^9e5 zF>Vojk z+L_nNNGGkd&U5<+P%B%}$b#V79aZ2;(y#0#+Lp&D$gQXxleFCrcXKt^B!u<@^;>8P%yUQ9%N!Xnc%?{^)Uu5px%x\n", dwThreadId); } - // "Starsiege" ..... - //if((idHook == WH_MOUSE_LL) && (dwThreadId == NULL)) { - // dwThreadId = GetCurrentThreadId(); - // OutTraceDW("SetWindowsHookEx: fixing WH_MOUSE_LL thread=0->%x\n", dwThreadId); - //} - //if((idHook == WH_KEYBOARD_LL) && (dwThreadId == NULL)) { - // dwThreadId = GetCurrentThreadId(); - // OutTraceDW("SetWindowsHookEx: fixing WH_KEYBOARD_LL thread=0->%x\n", dwThreadId); - //} - // v2.03.54: disable the disable Alt-Tab fix if((dxw.dwFlags7 & DISABLEDISABLEALTTAB) && (idHook == WH_KEYBOARD_LL)) { OutTraceDW("SetWindowsHookEx: DISABLEDISABLEALTTAB bypass active\n"); diff --git a/dll/winmm.cpp b/dll/winmm.cpp index 4e7f7e7..762b764 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -549,10 +549,22 @@ static MMRESULT GetJoy(char *apiname, DWORD uJoyID, LPJOYINFO lpj) DWORD dwButtons; static BOOL bJoyLock = FALSE; static DWORD dwLastClick = 0; + extern DXWNDSTATUS *pStatus; + DWORD dwVJoyStatus; + + dwVJoyStatus = GetHookInfo()->VJoyStatus; + if(!(dwVJoyStatus & VJOYENABLED)) { + lpj->wXpos = 0; + lpj->wYpos = 0; + lpj->wZpos = 0; + pStatus->joyposx = (short)0; + pStatus->joyposy = (short)0; + return JOYERR_NOERROR; + } dwButtons = 0; - if (GetKeyState(VK_LBUTTON) < 0) dwButtons |= JOY_BUTTON1; - if (GetKeyState(VK_RBUTTON) < 0) dwButtons |= JOY_BUTTON2; + if ((GetKeyState(VK_LBUTTON) < 0) || (dwVJoyStatus & B1AUTOFIRE)) dwButtons |= JOY_BUTTON1; + if ((GetKeyState(VK_RBUTTON) < 0) || (dwVJoyStatus & B2AUTOFIRE)) dwButtons |= JOY_BUTTON2; if (GetKeyState(VK_MBUTTON) < 0) dwButtons |= JOY_BUTTON3; OutTraceB("%s: Virtual Joystick buttons=%x\n", apiname, dwButtons); @@ -595,19 +607,21 @@ static MMRESULT GetJoy(char *apiname, DWORD uJoyID, LPJOYINFO lpj) if(pt.y > client.bottom) pt.y = client.bottom; CenterX = (client.right - client.left) >> 1; CenterY = (client.bottom - client.top) >> 1; + x = ((pt.x - CenterX) * XSPAN) / client.right; - if(INVERTJOYAXIS) - y = ((CenterY - pt.y) * YSPAN) / client.bottom; // inverted y axis - else - y = ((pt.y - CenterY) * YSPAN) / client.bottom; + y = ((pt.y - CenterY) * YSPAN) / client.bottom; + if(dwVJoyStatus & INVERTXAXIS) x = -x; + if(dwVJoyStatus & INVERTYAXIS) y = -y; } - ShowJoystick(pt.x, pt.y, dwButtons); + if (dwVJoyStatus & CROSSENABLED) ShowJoystick(pt.x, pt.y, dwButtons); } lpj->wXpos = x; lpj->wYpos = y; lpj->wZpos = 0; lpj->wButtons = dwButtons; OutTraceC("%s: joyid=%d pos=(%d,%d)\n", apiname, uJoyID, lpj->wXpos, lpj->wYpos); + pStatus->joyposx = (short)x; + pStatus->joyposy = (short)y; return JOYERR_NOERROR; } @@ -632,7 +646,7 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) MMRESULT WINAPI extjoyGetPos(DWORD uJoyID, LPJOYINFO pji) { MMRESULT res; - res=GetJoy("joyGetPosEx", uJoyID, pji); + res=GetJoy("joyGetPos", uJoyID, pji); return res; } @@ -652,6 +666,8 @@ static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) RECT win; POINT PrevViewPort; + //return; + // don't show when system cursor is visible CURSORINFO ci; ci.cbSize = sizeof(CURSORINFO); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 0ceaffa..a89ff6e 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -376,7 +376,7 @@ void CTargetDlg::OnBnClickedTry() memset(&RestrictedMaps[1], 0, sizeof(TARGETMAP)); strcpy_s(path, sizeof(path), m_FilePath.GetBuffer()); PathRemoveFileSpec(path); - SetTarget(RestrictedMaps); + SetTarget(NULL, RestrictedMaps); iHookStatus=GetHookStatus(NULL); if(iHookStatus == DXW_IDLE) StartHook(); switch(m_InjectionMode){ diff --git a/host/VJoyDialog.cpp b/host/VJoyDialog.cpp new file mode 100644 index 0000000..282161c --- /dev/null +++ b/host/VJoyDialog.cpp @@ -0,0 +1,145 @@ +// VJoyDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "dxwndhost.h" +#include "VJoyDialog.h" + +#define XSPAN 128 +#define YSPAN 128 +#define PICWIDTH 140 +#define PICHEIGHT 140 + +// CVJoyDialog dialog + +IMPLEMENT_DYNAMIC(CVJoyDialog, CDialog) + +CVJoyDialog::CVJoyDialog(CWnd* pParent /*=NULL*/) + : CDialog(CVJoyDialog::IDD, pParent) +{ + //MessageBoxEx(0, "VJoy constructor", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); +} + +CVJoyDialog::~CVJoyDialog() +{ + //MessageBoxEx(0, "VJoy destructor", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL); + //CVJoyDialog::OnOK(); // kill timer.... +} + +void CVJoyDialog::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); + //{{AFX_DATA_MAP(CTargetDlg) + DDX_Check(pDX, IDC_VJOYENABLED, this->m_VJoyEnabled); + DDX_Check(pDX, IDC_CROSSENABLED, this->m_CrossEnabled); + DDX_Check(pDX, IDC_INVERTXAXIS, this->m_InvertXAxis); + DDX_Check(pDX, IDC_INVERTYAXIS, this->m_InvertYAxis); + DDX_Check(pDX, IDC_B1AUTOFIRE, this->m_B1AutoFire); + DDX_Check(pDX, IDC_B2AUTOFIRE, this->m_B2AutoFire); + //}}AFX_DATA_MAP +} + + +BEGIN_MESSAGE_MAP(CVJoyDialog, CDialog) + ON_WM_TIMER() +END_MESSAGE_MAP() + +#define IDVJoyTIMER 3 +#define FINDERSIZE 5 +#define CROSSSIZE 20 + +// CVJoyDialog message handlers + +void CVJoyDialog::OnTimer(UINT_PTR nIDEvent) +{ + // IDC_VJOYPOSITION + int x, y; + DWORD dwVJoyStatus; + CDialog::UpdateData(); // calls DoDataExchange + dwVJoyStatus = GetHookInfo()->VJoyStatus; + this->m_VJoyPresent = (dwVJoyStatus & VJOYPRESENT) ? 1 : 0; + dwVJoyStatus &= VJOYPRESENT; // clear all BUT VJOYPRESENT! + if(this->m_VJoyEnabled) dwVJoyStatus |= VJOYENABLED; + if(this->m_CrossEnabled) dwVJoyStatus |= CROSSENABLED; + if(this->m_InvertYAxis) dwVJoyStatus |= INVERTYAXIS; + if(this->m_InvertXAxis) dwVJoyStatus |= INVERTXAXIS; + if(this->m_B1AutoFire) dwVJoyStatus |= B1AUTOFIRE; + if(this->m_B2AutoFire) dwVJoyStatus |= B2AUTOFIRE; + if(this->m_VJoyEnabled && this->m_VJoyPresent){ + CWnd *JoyPos = this->GetDlgItem(IDC_VJOYPOSITION); + CDC *dc = JoyPos->GetDC(); + RECT client; + CString coord; + JoyPos->GetClientRect(&client); + x = (client.right/2) + ((GetHookInfo()->joyposx * client.right) / XSPAN); + y = (client.bottom/2) + ((GetHookInfo()->joyposy * client.bottom) / YSPAN); + dc->FillRect(&client, Background); + dc->SelectObject(CenterPen); + dc->MoveTo((client.right/2)-CROSSSIZE,(client.bottom/2)); + dc->LineTo((client.right/2)+CROSSSIZE,(client.bottom/2)); + dc->MoveTo((client.right/2),(client.bottom/2)-CROSSSIZE); + dc->LineTo((client.right/2),(client.bottom/2)+CROSSSIZE); + dc->SelectObject(FinderPen); + int x0, y0; + x0 = (x-FINDERSIZE)MoveTo(x0,y); + x0 = (x+FINDERSIZE)>client.right ? client.right : x+FINDERSIZE; + dc->LineTo(x0,y); + y0 = (y-FINDERSIZE)MoveTo(x,y0); + y0 = (y+FINDERSIZE)>client.bottom ? client.bottom : y+FINDERSIZE; + dc->LineTo(x,y0); + dc->MoveTo(20,20); + coord.Format("%d,%d", GetHookInfo()->joyposx, GetHookInfo()->joyposy); + dc->TextOutA(5, 5, coord); + dc->DeleteDC(); + } + GetHookInfo()->VJoyStatus = dwVJoyStatus; +} + +BOOL CVJoyDialog::OnInitDialog() +{ + DWORD dwVJoyStatus; + + // TODO: Add extra initialization here + Background = new(CBrush); + Background->CreateSolidBrush(RGB(255, 255, 255)); // white + CenterPen = new(CPen); + CenterPen->CreatePen(PS_DOT, 1, RGB(255, 0, 0)); + FinderPen = new(CPen); + FinderPen->CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); + dwVJoyStatus = GetHookInfo()->VJoyStatus; + this->m_VJoyPresent = (dwVJoyStatus & VJOYPRESENT) ? 1 : 0; + this->m_VJoyEnabled = (dwVJoyStatus & VJOYENABLED) ? 1 : 0; + this->m_CrossEnabled= (dwVJoyStatus & CROSSENABLED) ? 1 : 0; + this->m_InvertYAxis = (dwVJoyStatus & INVERTYAXIS) ? 1 : 0; + this->m_InvertXAxis = (dwVJoyStatus & INVERTXAXIS) ? 1 : 0; + this->m_B1AutoFire = (dwVJoyStatus & B1AUTOFIRE) ? 1 : 0; + this->m_B2AutoFire = (dwVJoyStatus & B2AUTOFIRE) ? 1 : 0; + CDialog::OnInitDialog(); + SetTimer(IDVJoyTIMER, 40, NULL); + + return TRUE; // return TRUE unless you set the focus to a control +} + +void CVJoyDialog::OnOK() +{ + char val[80]; + DWORD dwVJoyStatus; + // stop timer + KillTimer(IDVJoyTIMER); + // update joystick flags + CDialog::UpdateData(); // calls DoDataExchange + dwVJoyStatus = GetHookInfo()->VJoyStatus; + dwVJoyStatus &= VJOYPRESENT; // clear all BUT VJOYPRESENT! + if(this->m_VJoyEnabled) dwVJoyStatus |= VJOYENABLED; + if(this->m_CrossEnabled) dwVJoyStatus |= CROSSENABLED; + if(this->m_InvertYAxis) dwVJoyStatus |= INVERTYAXIS; + if(this->m_InvertXAxis) dwVJoyStatus |= INVERTXAXIS; + if(this->m_B1AutoFire) dwVJoyStatus |= B1AUTOFIRE; + if(this->m_B2AutoFire) dwVJoyStatus |= B2AUTOFIRE; + sprintf_s(val, sizeof(val), "%i", dwVJoyStatus); + WritePrivateProfileString("joystick", "flags", val, gInitPath); + GetHookInfo()->VJoyStatus = dwVJoyStatus; + CDialog::OnOK(); +} \ No newline at end of file diff --git a/host/VJoyDialog.h b/host/VJoyDialog.h new file mode 100644 index 0000000..b0508d5 --- /dev/null +++ b/host/VJoyDialog.h @@ -0,0 +1,40 @@ +#pragma once + + +// CTimeSlider dialog + +class CVJoyDialog : public CDialog +{ + DECLARE_DYNAMIC(CVJoyDialog) + +public: + CVJoyDialog(CWnd* pParent = NULL); // standard constructor + virtual ~CVJoyDialog(); + //~VJoyDialog(); + +// Dialog Data + enum { IDD = IDD_VJOYDIALOG }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnTimer(UINT_PTR nIDEvent); +public: + virtual BOOL OnInitDialog(); +protected: + virtual void OnOK(); + //virtual void OnCancel(); +private: + BOOL m_VJoyPresent; + BOOL m_VJoyEnabled; + BOOL m_CrossEnabled; + BOOL m_InvertYAxis; + BOOL m_InvertXAxis; + BOOL m_B1AutoFire; + BOOL m_B2AutoFire; + CBrush *Background; + CPen *CenterPen; + CPen *FinderPen; +}; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 371390a29da861698374439e403b1d7cd5a5faf9..29c5c67bdbfb2e67374ac8ce00833fa5fd992561 100644 GIT binary patch delta 13396 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 QA6jz&#bZa-oatx(zpFzx_5c6? diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 2bac5514af5f734fa0e8f87a7db5be95786809d7..d97d8bc5d877c590c0372ebf258fb74eb942ca6e 100644 GIT binary patch delta 834 zcma))KWI}?6vn?3qA?X?MT>|wyaX4q(Z0MSPjHYlHu9<@wMp7INQnP!N`r}(>hNfB z5S&`ha2HYB9sD0~5L}!^oFqd#R0O9k4o;r?8bxD~@Zi47{qsBD_ucd9L2&6+@agBU zD%#Y)a}0IdMiV!29T!pK&EW6F>1Ln z-}F9i`=9W9?%?i8j3JM6I0*-7oRRq{UVR_g5yvoW48ed2ORd+*QVTU&+PvJOsjKYH zMy)Qm%ZPb)6!?sD2cEC2lpS`pp(lya!NxbC8Y1FAzT*4-IUz#kiNPBXu2_<<#;tB@a(Y+!c(-!h}4g z&TB~0v1HU8V~PrG&inI;xug8H6y=rIe!jn_Z?As-JWk90#+#d+AZnBQTOZm~q+S1X lq`L8)N|aL1zK}`7>fIVuwrIG`i;;*r@`JLiuUX$r;3w>LxZ(f+ delta 48 zcmV-00MGxBwF%Um39#B8vuq!d4wK$53X{Mk7_;;sP62{2hA;uPFaiu1m&o1$GPhP! G0y+ooU=k(( diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 37dc7369a62fd3f97dc56b40d288583c4cb77215..66ec858a7461a03edaa36db7a279f3cccd3a9545 100644 GIT binary patch delta 8670 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 A4gdfE diff --git a/host/dxwndhost.vs2008.vcproj b/host/dxwndhost.vs2008.vcproj index ec04e8b..78b6991 100644 --- a/host/dxwndhost.vs2008.vcproj +++ b/host/dxwndhost.vs2008.vcproj @@ -511,6 +511,10 @@ RelativePath=".\ViewFlagsDialog.cpp" > + + + + - - + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index df49485..c1a831a 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -16,6 +16,7 @@ #include "DesktopDialog.h" #include "PaletteDialog.h" #include "TimeSliderDialog.h" +#include "VJoyDialog.h" #include "ShimsDialog.h" #include "ViewFlagsDialog.h" #include "CGlobalSettings.h" @@ -145,6 +146,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView) ON_COMMAND(ID_VIEW_DESKTOP, OnViewDesktop) ON_COMMAND(ID_VIEW_PALETTE, OnViewPalette) ON_COMMAND(ID_VIEW_TIMESLIDER, OnViewTimeSlider) + ON_COMMAND(ID_VIEW_VIRTUALJOYSTICK, OnViewVirtualJoystick) ON_COMMAND(ID_DESKTOPCOLORDEPTH_8BPP, OnDesktopcolordepth8bpp) ON_COMMAND(ID_DESKTOPCOLORDEPTH_16BPP, OnDesktopcolordepth16bpp) ON_COMMAND(ID_DESKTOPCOLORDEPTH_24BPP, OnDesktopcolordepth24bpp) @@ -1354,6 +1356,7 @@ void CDxwndhostView::OnInitialUpdate() LV_COLUMN listcol; LV_ITEM listitem; int i; + DXWNDSTATUS StatusMap; typedef BOOL (WINAPI *ChangeWindowMessageFilter_Type)(UINT, DWORD); ChangeWindowMessageFilter_Type pChangeWindowMessageFilter; @@ -1398,6 +1401,8 @@ void CDxwndhostView::OnInitialUpdate() strcat_s(gInitPath, sizeof(gInitPath), m_ConfigFileName); listctrl.InsertColumn(0, &listcol); + StatusMap.VJoyStatus = GetPrivateProfileInt("joystick", "flags", VJOYENABLED|CROSSENABLED|INVERTYAXIS, gInitPath); + for(i = 0; i < MAXTARGETS; i ++){ if (!LoadConfigItem(&TargetMaps[i], &PrivateMaps[i], i, gInitPath)) break; listitem.mask = LVIF_TEXT | LVIF_IMAGE; @@ -1412,7 +1417,7 @@ void CDxwndhostView::OnInitialUpdate() PrivateMaps[i].title[0] = 0; } Resize(); - SetTarget(TargetMaps); + SetTarget(&StatusMap, TargetMaps); if(m_InitialState == DXW_ACTIVE) this->OnHookStart(); else @@ -1522,7 +1527,7 @@ BOOL CDxwndhostView::OnImport(CString sFilePath) listctrl.InsertItem(&listitem); } Resize(); - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; return TRUE; @@ -1602,7 +1607,7 @@ void CDxwndhostView::OnImport() } } Resize(); - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -1643,7 +1648,7 @@ void CDxwndhostView::OnModify() listitem.pszText = PrivateMaps[i].title; listctrl.SetItem(&listitem); Resize(); - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; } } @@ -1875,7 +1880,7 @@ void CDxwndhostView::OnSort() TargetMaps[i].index = i; // renumber } - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2130,7 +2135,7 @@ void CDxwndhostView::OnAdd(char *sInitialPath) listitem.pszText = PrivateMaps[i].title; listctrl.InsertItem(&listitem); Resize(); - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2165,7 +2170,7 @@ void CDxwndhostView::OnDuplicate() listctrl.InsertItem(&listitem); TargetMaps[i].index = i; } - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2202,7 +2207,7 @@ void CDxwndhostView::OnMoveTop() listctrl.SetItem(&listitem); listctrl.InsertItem(&listitem); } - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2237,7 +2242,7 @@ void CDxwndhostView::OnMoveUp() listctrl.SetItem(&listitem); listctrl.InsertItem(&listitem); } - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2272,7 +2277,7 @@ void CDxwndhostView::OnMoveDown() listctrl.SetItem(&listitem); listctrl.InsertItem(&listitem); } - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2310,7 +2315,7 @@ void CDxwndhostView::OnMoveBottom() listctrl.SetItem(&listitem); listctrl.InsertItem(&listitem); } - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2346,7 +2351,7 @@ void CDxwndhostView::OnDelete() } TargetMaps[i].path[0]=0; // clear last one, in case there were MAXTARGETS entries Resize(); - SetTarget(TargetMaps); + SetTarget(NULL, TargetMaps); this->isUpdated=TRUE; this->isRegistryUpdated=TRUE; } @@ -2616,6 +2621,13 @@ void CDxwndhostView::OnViewTimeSlider() pDlg->ShowWindow(SW_SHOW); } +void CDxwndhostView::OnViewVirtualJoystick() +{ + CVJoyDialog *pDlg = new CVJoyDialog(); + BOOL ret = pDlg->Create(CVJoyDialog::IDD, this); + pDlg->ShowWindow(SW_SHOW); +} + void CDxwndhostView::Resize() { CListCtrl& listctrl = GetListCtrl(); @@ -3208,7 +3220,7 @@ void InjectSuspended(char *exepath, char *dirpath) DWORD RecoverTargetMaps(LPVOID TargetMaps) { Sleep(5000); - SetTarget((TARGETMAP *)TargetMaps); + SetTarget(NULL, (TARGETMAP *)TargetMaps); return 0; } @@ -3388,7 +3400,7 @@ void CDxwndhostView::OnRun(BOOL bForceNoHook) strncpy(RestrictedMaps[0].path, exepath, MAX_PATH); } if(bForceNoHook) RestrictedMaps[0].flags3 &= ~HOOKENABLED; - SetTarget(RestrictedMaps); + SetTarget(NULL, RestrictedMaps); OutTrace("OnRun idx=%d prog=\"%s\" unhooked=%x\n", i, TargetMaps[i].path, bForceNoHook); if(TargetMaps[i].flags7 & HOOKNORUN){ diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index 49396b4..23b1151 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -106,6 +106,7 @@ protected: afx_msg void OnViewDesktop(); afx_msg void OnViewPalette(); afx_msg void OnViewTimeSlider(); + afx_msg void OnViewVirtualJoystick(); afx_msg void OnExit(); afx_msg void OnDesktopcolordepth8bpp(); afx_msg void OnDesktopcolordepth16bpp(); diff --git a/host/resource b/host/resource index 6a04992522a037d0db931e421f3749c1deb49030..0882bd01be18826bdf8e9a3bc754b6dec2d93aae 100644 GIT binary patch delta 320 zcmaE~n)%lz<_)U^CU4+k;SFQ(V(@2(WN=~dWN@6kmQ#E3k}Fb^KS&8|-X`#_ksl@< z08|vr;5j)_MSXMKBr8Tvm_)>6#VOj856t4&JY(`1p~(XN96&v;3_%Pb3=s^DK^BpgtP&i_@%