From 1a522bb76bd9fc9867c892226de4ff456e048568 Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 7 Oct 2016 12:46:22 -0400 Subject: [PATCH] v2_03_75_src Former-commit-id: a616cd9c318d40393233f30c84c4587aacefb377 --- build/dxwnd.dll | 4 +-- build/dxwnd.exe | 4 +-- build/readme-relnotes.txt | 11 ++++++- dll/ddraw.cpp | 45 ++++++++++++++++++++------ dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 814592 -> 814592 bytes dll/gdi32.cpp | 4 +++ dll/user32.cpp | 52 ++++++++++++++++++++++++++++-- host/CDragEdit.cpp | 35 ++++++++++++++++++++ host/CDragEdit.h | 13 ++++++++ host/TabProgram.cpp | 33 ++++++++++++++++++- host/TabProgram.h | 1 + host/TargetDlg.h | 5 +-- host/dxwndhost.rc | Bin 126068 -> 126072 bytes host/dxwndhost.vs2008.suo | Bin 236544 -> 236544 bytes host/dxwndhost.vs2008.vcproj | 18 ++++++++--- host/dxwndhostView.cpp | 60 ++++++++++++++++++++++++++++++++++- host/dxwndhostView.h | 4 +++ 18 files changed, 263 insertions(+), 28 deletions(-) create mode 100644 host/CDragEdit.cpp create mode 100644 host/CDragEdit.h diff --git a/build/dxwnd.dll b/build/dxwnd.dll index f16fa96..51a40a3 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:49d7c2658bf62db9650233f60f2cf5dd82912f2a522c26d4c115891440ccabd9 -size 659968 +oid sha256:7fd28d3540f74ceab1034bff9cd6fd4059e759568c2c207393d61fe20f0367da +size 660480 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 275e23a..5b71e95 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c966fe71e5250ed781b9e1415ce53fec601a93c4384893a2afb78bab76d75e56 -size 640512 +oid sha256:b4833fd88b00f606494df68b4af21d27e5f419a90686cb407e0539166dea762e +size 642560 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 91bdde8..a2a517c 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1146,4 +1146,13 @@ add: revised log configuration, added "Separate" mode to make each process to wr v2.03.74 fix: logging of dwFOURCC field text value fix: Injection routine: avoid closing a few handles that should not be closed, simplified logic. -add: GUI global configuration panel \ No newline at end of file +add: GUI global configuration panel + +v2.03.75 +fix: handling of restore previous screen mode when a primary fullscreen window is terminated. Fixes "Dethkarz" initialization error after 8BPP intro movie termination. +fix: SystemParameterInfo for SPI_SETSCREENSAVERRUNNING does not return an error +fix: added default pixel format specification to backbuffer: improves the possibility of ZBUFFER attach +fix: recovery of DDERR_SURFACELOST error on primary surface in PrimaryStretchBlt routine. +fix: possible palette handle leakage +fix: DC leakage caused by CreateCompatibleDC. Fix "Mechwarrior 3" repeated play sessions. +add: GUI drag & drop of game executables \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 0cd05af..98909f8 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2659,6 +2659,10 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + + // v2.03.75: if a surface desc is NOT specified, build one. This will allow ZBUF attach. + if(!(lpddsd->dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); if(ddsd.ddsCaps.dwCaps & DDSCAPS_3DDEVICE) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // necessary: Martian Gotic crashes otherwise @@ -3426,14 +3430,27 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA OutTraceE("PrimaryStretchBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); } else { - // fast-blit to primary - if(dxw.dwFlags3 & FORCECLIPPER){ - res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); - if(res) OutTraceE("PrimaryStretchBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - } - else{ - res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); - if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + while(TRUE) { + // fast-blit to primary + if(dxw.dwFlags3 & FORCECLIPPER){ + res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); + if(res) OutTraceE("PrimaryStretchBlt: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } + else{ + res= (*pBltFast)(lpdds, lpdestrect->left, lpdestrect->top, lpddsTmp, &TmpRect, DDBLTFAST_WAIT); + if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } + if(res == DDERR_SURFACELOST){ + res = lpdds->Restore(); + if(res) { + OutTraceE("PrimaryStretchBlt: Restore ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } + else { + OutTraceDW("PrimaryStretchBlt: surface sucessfully recovered, retry\n"); + continue; + } + } + break; } } (*pReleaseSMethod(dxversion))(lpddsTmp); @@ -5522,8 +5539,16 @@ HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette) OutTraceDDRAW("Release(P): lpddPalette=%x ref=%x\n", lpddPalette, ref); if (lpddPalette == lpDDP) { - OutTraceDW("Release(P): lpDDP extrarefcount=%d\n", iDDPExtraRefCounter); - ref -= iDDPExtraRefCounter; + if(dxw.dwFlags4 & FIXREFCOUNTER) { + OutTraceDW("Release(P): lpDDP extrarefcount=%d\n", iDDPExtraRefCounter); + if((ULONG)iDDPExtraRefCounter >= ref){ + while(ref) ref = (*pReleaseP)(lpddPalette); + lpDDP=NULL; + iDDPExtraRefCounter = 0; + return 0; + } + ref -= iDDPExtraRefCounter; + } if (ref <= 0) { ref = 0; OutTraceDW("Release(P): clearing lpDDP=%x->NULL\n", lpDDP); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index d8d9631..ace19f4 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.74" +#define VERSION "2.03.75" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index b035987adf9a347d411215de99b82a296f256d99..fe9277578515f937d78a2970a069653238383c1d 100644 GIT binary patch delta 11441 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 diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 7362d22..7867f9a 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -921,12 +921,15 @@ HDC WINAPI extCreateICA(LPCTSTR lpszDriver, LPCTSTR lpszDevice, LPCTSTR lpszOutp HDC WINAPI extGDICreateCompatibleDC(HDC hdc) { + // v2.03.75: fixed dc leakage that crashed "Mechwarrior 3" HDC RetHdc; DWORD LastError; + BOOL bSwitchedToMainWin = FALSE; OutTraceDW("GDI.CreateCompatibleDC: hdc=%x\n", hdc); if(hdc==0){ hdc=(*pGDIGetDC)(dxw.GethWnd()); + bSwitchedToMainWin = TRUE; if(dxw.dwFlags6 & CREATEDESKTOP){ extern HWND hDesktopWindow; hdc=(*pGDIGetDC)(hDesktopWindow); @@ -937,6 +940,7 @@ HDC WINAPI extGDICreateCompatibleDC(HDC hdc) // eliminated error message for errorcode 0. SetLastError(0); RetHdc=(*pGDICreateCompatibleDC)(hdc); + if(bSwitchedToMainWin) (*pGDIReleaseDC)(dxw.GethWnd(),hdc); LastError=GetLastError(); if(LastError == 0){ OutTraceDW("GDI.CreateCompatibleDC: returning HDC=%x\n", RetHdc); diff --git a/dll/user32.cpp b/dll/user32.cpp index e2d3ff6..2e34e3d 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -108,6 +108,9 @@ BOOL WINAPI extDrawMenuBar(HWND); //typedef BOOL (WINAPI *TranslateMessage_Type)(MSG *); //TranslateMessage_Type pTranslateMessage = NULL; //BOOL WINAPI extTranslateMessage(MSG *); +typedef BOOL (WINAPI *EnumDisplayDevicesA_Type)(LPCSTR, DWORD, PDISPLAY_DEVICE, DWORD); +EnumDisplayDevicesA_Type pEnumDisplayDevicesA = NULL; +BOOL WINAPI extEnumDisplayDevicesA(LPCSTR, DWORD, PDISPLAY_DEVICE, DWORD); #ifdef TRACEPALETTE @@ -200,6 +203,8 @@ static HookEntryEx_Type Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "ShowScrollBar", (FARPROC)ShowScrollBar, (FARPROC *)&pShowScrollBar, (FARPROC)extShowScrollBar}, {HOOK_HOT_CANDIDATE, 0, "DrawMenuBar", (FARPROC)DrawMenuBar, (FARPROC *)&pDrawMenuBar, (FARPROC)extDrawMenuBar}, + //{HOOK_HOT_CANDIDATE, 0, "EnumDisplayDevicesA", (FARPROC)EnumDisplayDevicesA, (FARPROC *)&pEnumDisplayDevicesA, (FARPROC)extEnumDisplayDevicesA}, + {HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator }; @@ -1466,6 +1471,9 @@ static BOOL IsFullscreenWindow( return FALSE; } +static HWND hLastFullScrWin = 0; +static DDPIXELFORMAT ddpLastPixelFormat; + static HWND WINAPI extCreateWindowCommon( LPCTSTR ApiName, BOOL WideChar, @@ -1529,6 +1537,12 @@ static HWND WINAPI extCreateWindowCommon( RECT screen; POINT upleft = {0,0}; + // if already in fullscreen mode, save previous settings + if(dxw.IsFullScreen() && dxw.GethWnd()){ + hLastFullScrWin = dxw.GethWnd(); + ddpLastPixelFormat = dxw.VirtualPixelFormat; + } + // update virtual screen size if it has grown // v2.03.58 fix: do't consider CW_USEDEFAULT ad a big unsigned integer!! Fixes "Imperialism". if((nWidth != CW_USEDEFAULT) && (nHeight != CW_USEDEFAULT)) dxw.SetScreenSize(nWidth, nHeight); @@ -2648,12 +2662,25 @@ BOOL WINAPI extDestroyWindow(HWND hWnd) OutTraceB("DestroyWindow: hwnd=%x\n", hWnd); if (hWnd == dxw.GethWnd()) { + OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); + if(hLastFullScrWin){ + OutTraceDW("DestroyWindow: revert to main hwnd=%x bpp=%d\n", + hWnd, ddpLastPixelFormat.dwRGBBitCount); + dxw.SethWnd(hLastFullScrWin); + hLastFullScrWin = NULL; + dxw.VirtualPixelFormat = ddpLastPixelFormat; + extern int iBakBufferVersion; + SetBltTransformations(iBakBufferVersion); + } + else { + OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); + dxw.SethWnd(NULL); + } + if(dxw.dwFlags6 & NODESTROYWINDOW) { OutTraceDW("DestroyWindow: do NOT destroy main hwnd=%x\n", hWnd); return TRUE; } - OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); - dxw.SethWnd(NULL); } if (hControlParentWnd && (hWnd == hControlParentWnd)) { OutTraceDW("DestroyWindow: destroy control parent hwnd=%x\n", hWnd); @@ -3049,6 +3076,7 @@ BOOL WINAPI extSystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, switch(uiAction){ case SPI_SETKEYBOARDDELAY: case SPI_SETKEYBOARDSPEED: + case SPI_SETSCREENSAVERRUNNING: // v2.03.75 used by Dethkarz, but not really necessary OutTraceDW("SystemParametersInfoA: bypass action=%x\n", uiAction); return TRUE; break; @@ -3722,4 +3750,22 @@ BOOL WINAPI extTranslateMessage(MSG *pMsg) ret=(*pTranslateMessage)(pMsg); return ret; } -#endif \ No newline at end of file +#endif + +BOOL WINAPI extEnumDisplayDevicesA(LPCSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICE lpDisplayDevice, DWORD dwFlags) +{ + BOOL ret; + MessageBox(0, "EnumDisplayDevicesA", "dxwnd", 0); + OutTrace("EnumDisplayDevices: device=%s devnum=%i flags=%x\n", lpDevice, iDevNum, dwFlags); + + ret = (*pEnumDisplayDevicesA)(lpDevice, iDevNum, lpDisplayDevice, dwFlags); + + if(ret){ + OutTrace("EnumDisplayDevices: cb=%x devname=%s devstring=%s stateflags=%x\n", + lpDisplayDevice->cb, lpDisplayDevice->DeviceName, lpDisplayDevice->DeviceString, lpDisplayDevice->StateFlags); + } + else{ + OutTraceE("EnumDisplayDevices ERROR: err=%d\n", GetLastError()); + } + return ret; +} diff --git a/host/CDragEdit.cpp b/host/CDragEdit.cpp new file mode 100644 index 0000000..63953c4 --- /dev/null +++ b/host/CDragEdit.cpp @@ -0,0 +1,35 @@ +#include "stdafx.h" +#include "CDragEdit.h" + +CDragEdit::CDragEdit() +{ +} + +CDragEdit::~CDragEdit() +{ +} + +BOOL CDragEdit::OnInitDialog() +{ + DragAcceptFiles(); + return TRUE; +} + +void CDragEdit::OnDropFiles(HDROP dropInfo) +{ + CString sFile; + DWORD nBuffer = 0; + // Get number of files + UINT nFilesDropped = DragQueryFile(dropInfo, 0xFFFFFFFF, NULL, 0); + if(nFilesDropped > 0){ + nBuffer = DragQueryFile(dropInfo, 0, NULL, 0); + DragQueryFile(dropInfo, 0, sFile.GetBuffer(nBuffer+1), nBuffer+1); + SetWindowTextA(sFile.GetBuffer()); + sFile.ReleaseBuffer(); + } + DragFinish(dropInfo); +} + +BEGIN_MESSAGE_MAP(CDragEdit, CEdit) + ON_WM_DROPFILES() +END_MESSAGE_MAP() diff --git a/host/CDragEdit.h b/host/CDragEdit.h new file mode 100644 index 0000000..9d7aee3 --- /dev/null +++ b/host/CDragEdit.h @@ -0,0 +1,13 @@ +// CDragEdit class: inherited by DEdit, adds drag & drop of file pathnames +// within the text field. + +class CDragEdit : public CEdit +{ +public: + CDragEdit(); + virtual ~CDragEdit(); + BOOL OnInitDialog(); +private: + afx_msg void OnDropFiles(HDROP hDropInfo); + DECLARE_MESSAGE_MAP() +}; diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index 0cce3dd..8582597 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -66,9 +66,10 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX) BEGIN_MESSAGE_MAP(CTabProgram, CDialog) //{{AFX_MSG_MAP(CTabProgram) - // NOTE: the ClassWizard will add message map macros here + // NOTE: the ClassWizard will add message map macros here ON_BN_CLICKED(IDC_OPEN, OnOpen) ON_BN_CLICKED(IDC_OPENLAUNCH, OnOpenLaunch) + ON_WM_DROPFILES() //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -150,6 +151,25 @@ void CTabProgram::OnOpenLaunch() } } +void CTabProgram::OnDropFiles(HDROP dropInfo) +{ + CString sFile; + DWORD nBuffer = 0; + // Get number of files + UINT nFilesDropped = DragQueryFile(dropInfo, 0xFFFFFFFF, NULL, 0); + if(nFilesDropped > 0){ + nBuffer = DragQueryFile(dropInfo, 0, NULL, 0); + DragQueryFile(dropInfo, 0, sFile.GetBuffer(nBuffer+1), nBuffer+1); + //CTargetDlg *pDlg = (CTargetDlg *)this->GetParent()->GetParent(); + //pDlg->m_FilePath = sFile; + CDragEdit *pEditFile = (CDragEdit *)this->GetDlgItem(IDC_FILE); + pEditFile->SetWindowTextA(sFile.GetBuffer()); + //MessageBox(sFile.GetBuffer(), "debug", 0); + sFile.ReleaseBuffer(); + } + DragFinish(dropInfo); +} + BOOL CTabProgram::OnInitDialog() { HINSTANCE Hinst; @@ -157,6 +177,17 @@ BOOL CTabProgram::OnInitDialog() CStatic *IconBox; IFormat *m_pRelIntegerFormat = new(RelIntegerFormat); + //ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); + //ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD); + //ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); + DragAcceptFiles(); + CDragEdit *pEditFile; + pEditFile = (CDragEdit *)this->GetDlgItem(IDC_FILE); + pEditFile->DragAcceptFiles(); + pEditFile = (CDragEdit *)this->GetDlgItem(IDC_LAUNCH); + pEditFile->DragAcceptFiles(); + //m_File.DragAcceptFiles(); + //m_Launch.DragAcceptFiles(); CDialog::OnInitDialog(); CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); Hinst = ::LoadLibrary(cTarget->m_FilePath); diff --git a/host/TabProgram.h b/host/TabProgram.h index efcedb3..d5779b0 100644 --- a/host/TabProgram.h +++ b/host/TabProgram.h @@ -45,6 +45,7 @@ public: protected: CSpecialEdit m_EditPosX; CSpecialEdit m_EditPosY; + afx_msg void OnDropFiles(HDROP hDropInfo); }; //{{AFX_INSERT_LOCATION}} diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 5903984..bbed84e 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -8,6 +8,7 @@ // #include "dxTabCtrl.h" #include "SpecialEdit.h" +#include "CDragEdit.h" ///////////////////////////////////////////////////////////////////////////// // CTargetDlg Dialog @@ -23,8 +24,8 @@ public: //{{AFX_DATA(CTargetDlg) enum { IDD = IDD_TARGET }; CDXTabCtrl m_tabdxTabCtrl; - CEdit m_File; - CEdit m_Launch; + CDragEdit m_File; + CDragEdit m_Launch; int m_DXVersion; int m_Coordinates; int m_InitColorDepth; diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index df676ffffec3d7ab4466c21c0d412567fdd35061..f41a4d9297b8d16f2787726d3cd10690503a3505 100644 GIT binary patch delta 33 rcmV++0N(%f*a!I72e2Fhmlmr5q=UW!x4r@a%IKH)d;z4FD(nGD5rz+o delta 27 jcmexygZ;}5_6;&j&2miJ<(L?AUQU){S~A_>4WkDDqTvdh diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index fa826d61fe8be3353702046337680617496a554a..88714c8a1af680c6bafda0b5b751ba5ccedc6483 100644 GIT binary patch delta 2911 zcmYk83s6*57{|}Kdv|#W3883$EFuqOQ8W}ykhL_CUND)are&H>97|~eqn2hAOC2XW z;SCdk93P{N1739PrTEB4nfWT6N(U*CeBz^0M7IC8`%Uec`S15XzwsT2i7dAwsD6kx_D(n%(7BIphB^;#SH& zYVPGn)aPA;RejeL7Ml>}6H!uHZ=pNQJE}Dfw$Lo@_LNiyBGPO#khKZ3t$SIxF5%VU zl+17}R%8Udf?pvpCCuqWN`E6gN7}t>!8kF>`Dic0c}ON3d9TU{wbs#FMPx+le=n#n zQ`K>iA(3cG{e_}Sk7I<LjIH7-5s1|grOgmE8w72EDD8lV zkv8F{KjLOY%BMp+AxcdEsxI1YR;N{KE-H6e?nC`2WC`4cJ5HggyF(lueSr2A*uxO)Zr52@Kl%|&6 zA+xBOgNx(fQ@KeNGg{MdW}}%62FoF4Jhx0H7zLFw*<3bww^bd^bg072JZn#sW&580 zOxOr@FEf{pNXRVYmIdMmZ9VZa)?AmhF<8d^cVNuIoV*d%XcRy0ZEoKApjzt9*emms z<(rdS&+rVWgJ*eGdCce?&Sy4`*(k8_%wA*G9c%`(0%pCz<}oW_Mh~a~p70?bGir{> z5g*mJ24>+&jfd3T`swybFcYBlsPrWC68vOn3RDT1B|Gl+?6eN93fc{+($gh+4W8om zpPXG>czog=8U^V`-#}h}oY_fcc(=tV_DvjzgEe!#tIVkJHD=eDVNeld6@tbJMx@2X zLN|0l7mE;G8K%KU!Ba|MMz7l#czPFdnNed0*L%y46){`O%#M1M%dIAG7_;27n!4_5-sduw%?lGD`$I&_0Or+Yq;6bLq;YJf)6RQ&SSY1o#U2h6{Eh?tvPhy-+K(!5DB`o0fVG zwh=lH4MShl$73AH{{emxYJoiN3X9wn>Y@wL!P9-wJ6$2@9htzan3)}H5wl8W^vu>V z+rumltby4DX7ON6%xt)-FeUFv2?!KUSRs-b(!hOucbOQ>j5^Fl}b z5Z5#=q2)~H+FSf;Z)J9b8TI-dv*XO@X`W#AGc%g{8D{60(Jaq1yXIqVPmEkLP#>k^ z%k+MpOt*%%;#Ii`-GcBOGj@)X&VJt0be)^t;qGYIznI-;mIT($Obhbu7?|6&Se9$u z=tDst4!WAhK)KKjjN^7Jm8YGqrNL;8v>cJPn!dIxn0@HSRxvC0W2>31Vb&LIKV??M zjPA2)W>@^!RUZo$^#6w5H(}&Yll@mOl%0)+IZ}5YJuKS;kfHxh#+~DGtbEw(-GwLQ z(Q>B+3#Amq3#Jnn%&Z5qEU;*1#ms247Qw5!mQ3U8nc7GffT-Y7@@u%oT4qsT>){=U z+nCYCRSQq&*Ysm&;IY5rPd|1Wp1#;^%;+|6ho=MaAV>`NZacvMY)LL+2yc@ez7iEF z#WL#)Z-=LpNX&>+GTz-dOKTjG?Y&L7a26G!5@`YaM8t*6?C`U>UKul-1-GY0lWqS3 D7v#&X delta 1429 zcmZ9Mdr(w$6vxlGdv{#{mq)y6kVnwS$ZJ_)Q$$-3(6O3fozgL&0VTmAKqHeRxHFLz zP80G&fA)t(n2)kjyvkAV{sH8;eeVvL({Jaq=Xrm>-<)&q z)p~4NkL`GsYN4j*TVEU#TUEChNJ|%XRTWd}V|<@1dD0XQGeGoNRk7WCTdg1>vE35I zUVV?n#HrVrs1m+AUa$9A$Ql6EYuLs*s1WUhZwt7_;;T81NF$`d+_!#XRZx4t%2%5b z9`270SRve2yKq_0nX-uF*|kcHtS#dQ#PYcoyEAQ@}Dq6!6M0a>g zTSTI$jQG)PTsh2ljyVp`Y}4x_A7%4jP=kD4%g0b_*Xc9&?+ixSm_>6^wrC7Y6q8Aj z3CqYz^N_HHo}nsGMlayMf!5Jxs-{Kcprs@yhB!*Nk~O*I5<5idXS5&OtVee3o{-CVd&slMg=Y4$v2lz@%6a($N*|3SmA<+xj^&ZEI zQfI8vtLRF`9hPlHoT!$!UcN0l;zH$`7WQqGsJA$K%^Wvd)9gZ#mu)vUVWS&jI(xN+ zjY>S?i~7F;uhCm9>5bBkFVc)y- zhEr3~0rz@@Hrn7j{KS|mOk4>KlOsc%rci@)m$AFD0sYuPcFLi2%Agg{9F$KfZZ_4%r1x03DnJr@#T=0X^Uh_#B)DUw{G73%&$> z;4HWa4&pWU&wQw95c;=Z2n>S}@E!ObjDj(65nKY};0JIS`~rRg6X0jC6!*OXnFaYP z + + @@ -508,6 +512,10 @@ RelativePath=".\cdib.h" > + + @@ -714,22 +722,22 @@ > - - + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 4a3299f..801ba76 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -153,6 +153,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView) ON_COMMAND(ID_MOVE_BOTTOM, OnMoveBottom) ON_WM_RBUTTONDOWN() ON_WM_HOTKEY() + ON_WM_DROPFILES() //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -1154,6 +1155,11 @@ void CDxwndhostView::OnInitialUpdate() LV_ITEM listitem; int i; + DragAcceptFiles(); + ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); + ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD); + ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); + // Create 256 color image lists HIMAGELIST hList = ImageList_Create(32,32, ILC_COLOR8 |ILC_MASK , 4, 1); m_cImageListNormal.Attach(hList); @@ -1295,6 +1301,27 @@ void CDxwndhostView::OnExport() } } +void CDxwndhostView::OnImport(CString sFilePath) +{ + LV_ITEM listitem; + int i; + for (i=0; strlen(TargetMaps[i].path) && iInitDevMode); } -void CDxwndhostView::OnAdd() +void CDxwndhostView::OnAdd() +{ + OnAdd(NULL); +} + +void CDxwndhostView::OnAdd(char *sInitialPath) { // TODO: Please add a command handler code here. int i; @@ -1815,6 +1847,8 @@ void CDxwndhostView::OnAdd() return; } memset(&TargetMaps[i],0,sizeof(TARGETMAP)); // clean up, just in case.... + if(sInitialPath) dlg.m_FilePath = CString(sInitialPath); + if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ strnncpy(PrivateMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); PrivateMaps[i].notes = (char *)malloc(strlen(dlg.m_Notes.GetString())+1); @@ -2759,3 +2793,27 @@ void CDxwndhostView::OnClearCompatibilityFlags() RegCloseKey(hk); } } + +void CDxwndhostView::OnDropFiles(HDROP dropInfo) +{ + CString sFile; + DWORD nBuffer = 0; + char *p; + // Get number of files + UINT nFilesDropped = DragQueryFile(dropInfo, 0xFFFFFFFF, NULL, 0); + if(nFilesDropped > 0){ + nBuffer = DragQueryFile(dropInfo, 0, NULL, 0); + DragQueryFile(dropInfo, 0, sFile.GetBuffer(nBuffer+1), nBuffer+1); + p = (char *)sFile.GetString(); + p += (strlen(p)-4); + if(!_strnicmp(p, ".dxw", 4)){ + this->OnImport(sFile); + } + else { + this->OnAdd(sFile.GetBuffer()); + } + sFile.ReleaseBuffer(); + } + DragFinish(dropInfo); +} + diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index 835cbd0..e1654cb 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -19,6 +19,7 @@ protected: // Create from serialization only features. DECLARE_DYNCREATE(CDxwndhostView) BOOL isUpdated; void SaveConfigFile(); + BOOL OnInitDialog(); private: void Resize(void); @@ -62,10 +63,12 @@ protected: //{{AFX_MSG(CDxwndhostView) afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnAdd(); + afx_msg void OnAdd(char *); afx_msg void OnDuplicate(); afx_msg void OnModify(); afx_msg void OnExport(); afx_msg void OnImport(); + afx_msg void OnImport(CString); afx_msg void OnDelete(); afx_msg void OnExplore(); afx_msg void OnKill(); @@ -109,6 +112,7 @@ protected: afx_msg void OnMoveUp(); afx_msg void OnMoveDown(); afx_msg void OnMoveBottom(); + afx_msg void OnDropFiles(HDROP hDropInfo); //}}AFX_MSG DECLARE_MESSAGE_MAP() };