Force RichEdit COM calls to UI thread

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@7307 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
anders_k 2021-08-26 17:09:42 +00:00
parent ddf9e907a3
commit fc5f7c8ad4
3 changed files with 17 additions and 3 deletions

View file

@ -621,6 +621,17 @@ INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script); EnableUICommand(IDM_BROWSESCR, !!g_sdata.input_script);
break; break;
} }
case WM_MAKENSIS_FREEZEEDITOR:
{
ITextDocument*pTD = (ITextDocument*) g_sdata.pLogTextDoc;
if (pTD) {
if (lParam)
return pTD->Freeze(0);
else
pTD->Unfreeze(0);
}
break;
}
case WM_TIMER: case WM_TIMER:
{ {
HWND hCtl; HWND hCtl;

View file

@ -96,6 +96,7 @@ static inline bool IsWin95() { return SupportsW95() && (GetVersion() & (0x8000FF
#define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002) #define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002)
#define WM_MAKENSIS_SAVESYMBOLSET (WM_USER+1003) #define WM_MAKENSIS_SAVESYMBOLSET (WM_USER+1003)
#define WM_MAKENSIS_UPDATEUISTATE (WM_USER+1004) #define WM_MAKENSIS_UPDATEUISTATE (WM_USER+1004)
#define WM_MAKENSIS_FREEZEEDITOR (WM_USER+1005)
#define TID_CONFIGURECLOSEORABORT 1 #define TID_CONFIGURECLOSEORABORT 1
namespace MakensisAPI { namespace MakensisAPI {

View file

@ -233,14 +233,16 @@ void ReleaseLogWindow() {
#endif #endif
} }
void InitializeLogWindow() { void InitializeLogWindow() {
HWND hRE = GetDlgItem(g_sdata.hwnd, IDC_LOGWIN);
#ifdef RE_HAS_TOM #ifdef RE_HAS_TOM
IUnknown *pTD = 0, *pREO; IUnknown *pTD = 0, *pREO;
if (SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_GETOLEINTERFACE, 0, (LPARAM)&pREO) && pREO) { if (SendMessage(hRE, EM_GETOLEINTERFACE, 0, (LPARAM)&pREO) && pREO) {
if (FAILED(pREO->QueryInterface(IID_ITextDocument, (void**) &pTD))) pTD = 0; if (FAILED(pREO->QueryInterface(IID_ITextDocument, (void**) &pTD))) pTD = 0;
pREO->Release(); pREO->Release();
} }
g_sdata.pLogTextDoc = pTD; g_sdata.pLogTextDoc = pTD;
#endif #endif
SendMessage(hRE, EM_SETTEXTMODE, TM_PLAINTEXT, 0);
} }
void SetLogColor(enum LOGCOLOR lc) void SetLogColor(enum LOGCOLOR lc)
@ -268,13 +270,13 @@ void LogMessage(HWND hwnd,const TCHAR *str) {
HWND hLogWin = GetDlgItem(hwnd, IDC_LOGWIN); HWND hLogWin = GetDlgItem(hwnd, IDC_LOGWIN);
#ifdef RE_HAS_TOM #ifdef RE_HAS_TOM
ITextDocument*pTD = (ITextDocument*) g_sdata.pLogTextDoc; ITextDocument*pTD = (ITextDocument*) g_sdata.pLogTextDoc;
if (pTD) pTD->Freeze(0); HRESULT hr = (HRESULT) SendMessage(hwnd, WM_MAKENSIS_FREEZEEDITOR, 0, true); // Force COM calls to UI thread
#endif #endif
SendMessage(hLogWin, EM_SETSEL, g_sdata.logLength, g_sdata.logLength); SendMessage(hLogWin, EM_SETSEL, g_sdata.logLength, g_sdata.logLength);
SendMessage(hLogWin, EM_REPLACESEL, 0, (LPARAM)str); SendMessage(hLogWin, EM_REPLACESEL, 0, (LPARAM)str);
SendMessage(hLogWin, EM_SCROLLCARET, 0, 0); SendMessage(hLogWin, EM_SCROLLCARET, 0, 0);
#ifdef RE_HAS_TOM #ifdef RE_HAS_TOM
if (pTD) pTD->Unfreeze(0), InvalidateRect(hLogWin, NULL, false); if (SUCCEEDED(hr)) SendMessage(hwnd, WM_MAKENSIS_FREEZEEDITOR, 0, false);
#endif #endif
g_sdata.logLength += lstrlen(str); g_sdata.logLength += lstrlen(str);
} }