From 7fce1681df788a960f81de021a1fcf8cb2f89a77 Mon Sep 17 00:00:00 2001 From: anders_k Date: Wed, 18 Aug 2021 23:48:20 +0000 Subject: [PATCH] Attempt to prevent a selection change from currupting the log git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7297 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Makensisw/Readme.txt | 4 ++++ Contrib/Makensisw/SConscript | 2 +- Contrib/Makensisw/lookup.cpp | 2 ++ Contrib/Makensisw/makensisw.cpp | 4 ++++ Contrib/Makensisw/makensisw.h | 1 + Contrib/Makensisw/toolbar.cpp | 3 +++ Contrib/Makensisw/utils.cpp | 37 ++++++++++++++++++++++++++++++--- Contrib/Makensisw/utils.h | 4 +++- Source/SConscript | 1 + 9 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Contrib/Makensisw/Readme.txt b/Contrib/Makensisw/Readme.txt index ebf07902..b1d2b9f3 100644 --- a/Contrib/Makensisw/Readme.txt +++ b/Contrib/Makensisw/Readme.txt @@ -215,6 +215,10 @@ Version History - Added Lookup tool - Use Consolas font if it exists +2.4.1 +- Prevent user from modifying the log + + Copyright Information --------------------- Copyright (c) 2002 Robert Rainwater diff --git a/Contrib/Makensisw/SConscript b/Contrib/Makensisw/SConscript index a424ddf5..68ae649c 100644 --- a/Contrib/Makensisw/SConscript +++ b/Contrib/Makensisw/SConscript @@ -60,7 +60,7 @@ BuildUtil( res = res, resources = resources, entry = None, - defines = ['RELEASE=2.4'], + defines = ['RELEASE=2.4.1'], docs = docs, root_util = True ) diff --git a/Contrib/Makensisw/lookup.cpp b/Contrib/Makensisw/lookup.cpp index 5281f510..002bf196 100644 --- a/Contrib/Makensisw/lookup.cpp +++ b/Contrib/Makensisw/lookup.cpp @@ -64,11 +64,13 @@ template static ULARGE_INTEGER PathParseIconLocationEx(T*Path) return (li.HighPart = (UINT) comma, li.LowPart = idx, li); } +#ifndef _WIN64 static int WINAPI PathParseIconLocationFallback(LPSTR Path) { ULARGE_INTEGER li = PathParseIconLocationEx(Path); return li.LowPart; } +#endif static HRESULT GetSpecialFolderPath(HWND hWnd, LPTSTR Buf, UINT csidl) { diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index fc568556..ce7d5e74 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -72,6 +72,8 @@ int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hOldInst,LPTSTR CmdLineParams,int RegisterClass(&wc); // Superclass the old link window class if SysLink is not available } } + #else + if (succ) {} // Unreferenced variable #endif memset(&g_sdata,0,sizeof(NSCRIPTDATA)); @@ -265,6 +267,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam // Altered by Darren Owen (DrO) on 29/9/2003 // Added in receiving of mouse and key events from the richedit control SendDlgItemMessage(hwndDlg,IDC_LOGWIN,EM_SETEVENTMASK,(WPARAM)NULL,ENM_SELCHANGE|ENM_MOUSEEVENTS|ENM_KEYEVENTS); + InitializeLogWindow(); g_sdata.menu = GetMenu(g_sdata.hwnd); g_sdata.fileSubmenu = FindSubMenu(g_sdata.menu, IDM_FILE); g_sdata.editSubmenu = FindSubMenu(g_sdata.menu, IDM_EDIT); @@ -333,6 +336,7 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam SaveSymbols(); SaveMRUList(); SaveWindowPos(g_sdata.hwnd); + ReleaseLogWindow(); ImageList_Destroy(g_toolbar.imagelist); ImageList_Destroy(g_toolbar.imagelistd); ImageList_Destroy(g_toolbar.imagelisth); diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h index 4f0e0df1..9e46b3cd 100644 --- a/Contrib/Makensisw/makensisw.h +++ b/Contrib/Makensisw/makensisw.h @@ -237,6 +237,7 @@ typedef struct NSISScriptData { HANDLE sigint_event; HANDLE sigint_event_legacy; HWND focused_hwnd; + void*pLogTextDoc; NCOMPRESSOR default_compressor; NCOMPRESSOR compressor; LPCTSTR compressor_name; diff --git a/Contrib/Makensisw/toolbar.cpp b/Contrib/Makensisw/toolbar.cpp index 6a72ff62..6f54a9fd 100644 --- a/Contrib/Makensisw/toolbar.cpp +++ b/Contrib/Makensisw/toolbar.cpp @@ -197,6 +197,9 @@ void EnableToolBarButton(int cmdid, BOOL enabled) static bool IsRTL(HWND hWnd) { return (((UINT) GetWindowLongPtr(hWnd, GWL_EXSTYLE)) & (WS_EX_LAYOUTRTL)) != 0; } // WS_EX_RIGHT? WS_EX_RTLREADING? +#ifndef TPM_LAYOUTRTL +#define TPM_LAYOUTRTL 0x8000 // For MinGW (w32api-4.0.3-1) +#endif static UINT GetToolbarDropdownMenuPos(HWND hTB, UINT Id, POINT&pt) { RECT r; diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index 5112c69c..fa0eb890 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -206,6 +206,29 @@ void CopyToClipboard(HWND hwnd) { CloseClipboard(); } +#include +#if defined(MSFTEDIT_CLASS) +#include +#define RE_HAS_TOM +#define IID_ITextDocument NSIS_IID_ITextDocument +static const GUID IID_ITextDocument = { 0x8cc497c0, 0xa1df, 0x11ce, { 0x80,0x98,0x0,0xaa,0x0,0x47,0xbe,0x5d } }; +#endif +void ReleaseLogWindow() { +#ifdef RE_HAS_TOM + if (g_sdata.pLogTextDoc) ((IUnknown*)g_sdata.pLogTextDoc)->Release(); +#endif +} +void InitializeLogWindow() { +#ifdef RE_HAS_TOM + IUnknown *pTD = 0, *pREO; + if (SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_GETOLEINTERFACE, 0, (LPARAM)&pREO) && pREO) { + if (FAILED(pREO->QueryInterface(IID_ITextDocument, (void**) &pTD))) pTD = 0; + pREO->Release(); + } + g_sdata.pLogTextDoc = pTD; +#endif +} + void SetLogColor(enum LOGCOLOR lc) { enum { em_seteditstyle = (WM_USER + 204), ses_extendbackcolor = 4 }; @@ -228,10 +251,18 @@ void ClearLog(HWND hwnd) { } void LogMessage(HWND hwnd,const TCHAR *str) { - SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_SETSEL, g_sdata.logLength, g_sdata.logLength); + HWND hLogWin = GetDlgItem(hwnd, IDC_LOGWIN); +#ifdef RE_HAS_TOM + ITextDocument*pTD = (ITextDocument*) g_sdata.pLogTextDoc; + if (pTD) pTD->Freeze(0); +#endif + SendMessage(hLogWin, EM_SETSEL, g_sdata.logLength, g_sdata.logLength); + SendMessage(hLogWin, EM_REPLACESEL, 0, (LPARAM)str); + SendMessage(hLogWin, EM_SCROLLCARET, 0, 0); +#ifdef RE_HAS_TOM + if (pTD) pTD->Unfreeze(0), InvalidateRect(hLogWin, NULL, false); +#endif g_sdata.logLength += lstrlen(str); - SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_REPLACESEL, 0, (LPARAM)str); - SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_SCROLLCARET, 0, 0); } void ErrorMessage(HWND hwnd,const TCHAR *str) { diff --git a/Contrib/Makensisw/utils.h b/Contrib/Makensisw/utils.h index 8a82f28b..7097fc8a 100644 --- a/Contrib/Makensisw/utils.h +++ b/Contrib/Makensisw/utils.h @@ -65,6 +65,8 @@ int SetArgv(const TCHAR *cmdLine, TCHAR ***argv); void SetTitle(HWND hwnd,const TCHAR *substr); void PlayAppSoundAsync(LPCSTR SoundName, int MBFallback = -1); void CopyToClipboard(HWND hwnd); +void InitializeLogWindow(); +void ReleaseLogWindow(); enum LOGCOLOR { LC_SUCCESS, LC_WARNING, LC_ERROR, LC_SYSCOLOR }; void SetLogColor(enum LOGCOLOR lc); void ClearLog(HWND hwnd); @@ -138,7 +140,7 @@ bool FileExists(const TCHAR *fname); bool OpenUrlInDefaultBrowser(HWND hwnd, LPCSTR Url); HMENU FindSubMenu(HMENU hMenu, UINT uId); -static UINT GetMenuDropAlignment() { return GetSystemMetrics(SM_MENUDROPALIGNMENT) ? TPM_RIGHTALIGN : TPM_LEFTALIGN; } +static inline UINT GetMenuDropAlignment() { return GetSystemMetrics(SM_MENUDROPALIGNMENT) ? TPM_RIGHTALIGN : TPM_LEFTALIGN; } typedef enum { CFF_RAWSIZE = 0x00, CFF_DPIPT = 0x01, CFF_DPIFROMHWND = 0x02 } CREATEFONTFLAGS; HFONT CreateFontHelper(INT_PTR Data, int Height, DWORD p1, LPCTSTR Face); diff --git a/Source/SConscript b/Source/SConscript index 3728935a..dbf4ba93 100644 --- a/Source/SConscript +++ b/Source/SConscript @@ -57,6 +57,7 @@ libs = Split(""" iconv shlwapi oleaut32 + version shell32 """)