diff --git a/Contrib/Banner/Banner.c b/Contrib/Banner/Banner.c index 3eb3dedf..d6c92b07 100644 --- a/Contrib/Banner/Banner.c +++ b/Contrib/Banner/Banner.c @@ -14,45 +14,101 @@ HINSTANCE hInstance; HWND hwBanner; +HWND hwParent; char buf[1024]; unsigned int myatoi(char *s); +long oldProc; BOOL CALLBACK bannerProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + if (hwndDlg == hwParent) + { + if (uMsg == WM_SIZE) + { + ShowWindow(hwBanner, wParam == SIZE_MINIMIZED ? SW_HIDE : SW_SHOW); + } + return CallWindowProc( + (WNDPROC) oldProc, + hwndDlg, + uMsg, + wParam, + lParam + ); + } if (uMsg == WM_INITDIALOG) { popstring(buf); - while (*(int*)buf == CHAR4_TO_DWORD('/','s','e','t')) { + while (*(int*)buf == CHAR4_TO_DWORD('/','s','e','t')) + { unsigned int id; + popstring(buf); id = myatoi(buf); + popstring(buf); - SetDlgItemText(hwndDlg,id,buf); + SetDlgItemText(hwndDlg, id, buf); + popstring(buf); } - SetWindowText(hwndDlg,buf); - SetDlgItemText(hwndDlg,IDC_STR,buf); + SetWindowText(hwndDlg, buf); + SetDlgItemText(hwndDlg, IDC_STR, buf); } + if (uMsg == WM_CLOSE) + { + hwBanner = 0; + DestroyWindow(hwndDlg); + } + return 0; +} + +DWORD WINAPI BannerCreator(void *lpParameter) +{ + oldProc = SetWindowLong((HWND) lpParameter, GWL_WNDPROC, (long)bannerProc); + + hwParent = (HWND) lpParameter; + + hwBanner = CreateDialog( + GetModuleHandle(0), + MAKEINTRESOURCE(IDD_VERIFY), + (HWND) lpParameter, + bannerProc + ); + + { + BOOL bRet; + MSG msg; + + while (hwBanner && (bRet = GetMessage(&msg, NULL, 0, 0))) + { + if (bRet != -1) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + } + return 0; } void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { - EXDLL_INIT(); + DWORD dwThreadId; - hwBanner = CreateDialog( - GetModuleHandle(0), - MAKEINTRESOURCE(IDD_VERIFY), - hwndParent, - bannerProc - ); + g_stringsize = string_size; + g_stacktop = stacktop; + + CreateThread(0, 0, BannerCreator, (void *) hwndParent, 0, &dwThreadId); } void __declspec(dllexport) destroy(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { - DestroyWindow(hwBanner); + if (oldProc) + SetWindowLong(hwndParent, GWL_WNDPROC, oldProc); + + SendMessage(hwBanner, WM_CLOSE, 0, 0); } BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) diff --git a/Plugins/Banner.dll b/Plugins/Banner.dll index f4f12104..b0dba246 100644 Binary files a/Plugins/Banner.dll and b/Plugins/Banner.dll differ diff --git a/TODO.txt b/TODO.txt index 1cf2a605..bf236a9c 100644 --- a/TODO.txt +++ b/TODO.txt @@ -18,10 +18,6 @@ NSIS * move no custom to compiler (custom as just another inst type) -PLUGINS - -* Banner doesn't refresh and doesn't stay on top - -- Before NSIS 2 Final -- EXAMPLES