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
This commit is contained in:
anders_k 2021-08-18 23:48:20 +00:00
parent d4306769b9
commit 7fce1681df
9 changed files with 53 additions and 5 deletions

View file

@ -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

View file

@ -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
)

View file

@ -64,11 +64,13 @@ template<class T> 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)
{

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -206,6 +206,29 @@ void CopyToClipboard(HWND hwnd) {
CloseClipboard();
}
#include <shlobj.h>
#if defined(MSFTEDIT_CLASS)
#include <tom.h>
#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) {

View file

@ -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);

View file

@ -57,6 +57,7 @@ libs = Split("""
iconv
shlwapi
oleaut32
version
shell32
""")