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 48d23b4..5f975dd 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/user32.cpp b/dll/user32.cpp
index e4b8cea..2136309 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -3707,16 +3707,6 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx,
OutTraceDW("SetWindowsHookEx: fixing WH_CBT thread=0->%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 371390a..29c5c67 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index 2bac551..d97d8bc 100644
Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 37dc736..66ec858 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ
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 6a04992..0882bd0 100644
Binary files a/host/resource and b/host/resource differ