From 3db2839a3c0792e0431123c75f7323a6db40d3d4 Mon Sep 17 00:00:00 2001 From: kichik Date: Fri, 12 Dec 2008 19:31:52 +0000 Subject: [PATCH] no more /UNLOAD with new plug-in api git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@5844 212acab6-be3b-0410-9dea-997c60f758d6 --- Contrib/Banner/Banner.c | 9 +++++- Contrib/Banner/Example.nsi | 4 +-- Contrib/Banner/Readme.txt | 10 +++--- Contrib/BgImage/BgImage.cpp | 19 ++++++++++-- Contrib/BgImage/BgImage.txt | 7 +---- Contrib/BgImage/Example.nsi | 34 ++++++++++----------- Contrib/InstallOptions/InstallerOptions.cpp | 9 +++++- Contrib/StartMenu/Readme.txt | 2 +- Contrib/StartMenu/StartMenu.c | 7 +++++ 9 files changed, 65 insertions(+), 36 deletions(-) diff --git a/Contrib/Banner/Banner.c b/Contrib/Banner/Banner.c index 2c2cefd7..d3ed2cbf 100644 --- a/Contrib/Banner/Banner.c +++ b/Contrib/Banner/Banner.c @@ -98,10 +98,17 @@ DWORD WINAPI BannerThread(LPVOID lpParameter) return 0; } -void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +static UINT_PTR PluginCallback(enum NSPIM msg) +{ + return 0; +} + +void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { EXDLL_INIT(); + extra->RegisterPluginCallback(hInstance, PluginCallback); + { DWORD dwThreadId; DWORD dwMainThreadId = GetCurrentThreadId(); diff --git a/Contrib/Banner/Example.nsi b/Contrib/Banner/Example.nsi index 7719e205..9b1271b2 100644 --- a/Contrib/Banner/Example.nsi +++ b/Contrib/Banner/Example.nsi @@ -9,9 +9,9 @@ OutFile "Banner Test.exe" ShowInstDetails show Function .onInit - Banner::show /NOUNLOAD "Calculating important stuff..." + Banner::show "Calculating important stuff..." - Banner::getWindow /NOUNLOAD + Banner::getWindow Pop $1 again: diff --git a/Contrib/Banner/Readme.txt b/Contrib/Banner/Readme.txt index 97813bc6..b114e5e7 100644 --- a/Contrib/Banner/Readme.txt +++ b/Contrib/Banner/Readme.txt @@ -8,9 +8,9 @@ There are three functions - show, getWindow and destroy. Usage ----- -Banner::show /NOUNLOAD "Text to show" +Banner::show "Text to show" -[optional] Banner::getWindow /NOUNLOAD +[optional] Banner::getWindow Banner::destroy @@ -21,7 +21,7 @@ Modern UI The Modern UI has two labels on the IDD_VERIFY dialog. To change all the texts, use: -Banner::show /NOUNLOAD /set 76 "Text 1 (replaces Please wait while Setup is loading...)" "Normal text" +Banner::show /set 76 "Text 1 (replaces Please wait while Setup is loading...)" "Normal text" Custom UI --------- @@ -30,7 +30,7 @@ If you have more labels on your IDD_VERIFY dialog, you can use multiple /set par Example: -Banner::show /NOUNLOAD /set 76 "bah #1" /set 54 "bah #2" "Normal text" +Banner::show /set 76 "bah #1" /set 54 "bah #2" "Normal text" The second parameter for /set is the ID of the control. @@ -39,7 +39,7 @@ Some More Tricks If you use /set to set the main string (IDC_STR, 1030) you can specify a different string for the window's caption and for the main string. -If you use an empty string as the main string (Banner::show /NOUNLOAD "") the banner window will not show on the taskbar. +If you use an empty string as the main string (Banner::show "") the banner window will not show on the taskbar. Credits ------- diff --git a/Contrib/BgImage/BgImage.cpp b/Contrib/BgImage/BgImage.cpp index da05c3fa..0f8c841a 100644 --- a/Contrib/BgImage/BgImage.cpp +++ b/Contrib/BgImage/BgImage.cpp @@ -8,7 +8,7 @@ g_stringsize=string_size; \ g_stacktop=stacktop; } -#define NSISFunc(name) extern "C" void __declspec(dllexport) name(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) +#define NSISFunc(name) extern "C" void __declspec(dllexport) name(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) char szTemp[2048]; HWND hWndImage, hWndParent; @@ -61,11 +61,24 @@ HBITMAP __stdcall LoadBitmapFile(long right, long bottom, BITMAP *bBitmap); COLORREF GetColor(); void __stdcall GetXY(LPPOINT lpPoint); +NSISFunc(Destroy); + +static UINT_PTR PluginCallback(enum NSPIM msg) +{ + if (msg == NSPIM_GUIUNLOAD) + { + Destroy(0, 0, 0, 0, 0); + } + return 0; +} + BOOL bReturn; NSISFunc(SetReturn) { EXDLL_INIT(); + extra->RegisterPluginCallback(g_hInstance, PluginCallback); + popstring(szTemp); bReturn = !lstrcmpi(szTemp, "on"); } @@ -83,6 +96,8 @@ static void __stdcall my_pushstring(char *str) NSISFunc(SetBg) { EXDLL_INIT(); + extra->RegisterPluginCallback(g_hInstance, PluginCallback); + ECS(); if (!hWndImage) { @@ -335,7 +350,7 @@ NSISFunc(Destroy) { SendMessage(hWndImage, WM_CLOSE, 0, 0); hWndImage = 0; oldProc = NULL; - Clear(0, 0, 0, 0); + Clear(0, 0, 0, 0, 0); UnregisterClass("NSISBGImage", g_hInstance); } diff --git a/Contrib/BgImage/BgImage.txt b/Contrib/BgImage/BgImage.txt index 305ca6fc..6650c422 100644 --- a/Contrib/BgImage/BgImage.txt +++ b/Contrib/BgImage/BgImage.txt @@ -20,15 +20,10 @@ Usage Notes ~~~~~ -* All but the last used function (which should be Destroy) must use /NOUNLOAD so the image window won't be destroyed before it should. - -* This plugin requires NSIS 2.0b4 and above. +* This plugin requires NSIS 2.42 and above. * Do not call SetBg (which creates the window) from a section or a function called by a section. -* Never use /NOUNLOAD in .onInstSuccess and .onInstFailed. Failing to do so will cause the installer to crash. - This means you should not call Destroy from .onInstSuccess or .onInstFailed. - Available functions ~~~~~~~~~~~~~~ diff --git a/Contrib/BgImage/Example.nsi b/Contrib/BgImage/Example.nsi index 9dc85359..14154ddb 100644 --- a/Contrib/BgImage/Example.nsi +++ b/Contrib/BgImage/Example.nsi @@ -22,32 +22,32 @@ Function .onGUIInit !ifdef DEBUG # turn return values on if in debug mode - BgImage::SetReturn /NOUNLOAD on + BgImage::SetReturn on !endif # set the initial background for images to be drawn on # we will use a gradient from drak green to dark red - BgImage::SetBg /NOUNLOAD /GRADIENT 0 0x80 0 0x80 0 0 + BgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0 !insertmacro GetReturnValue # add an image @ (150,0) - BgImage::AddImage /NOUNLOAD $PLUGINSDIR\2.bmp 150 0 + BgImage::AddImage $PLUGINSDIR\2.bmp 150 0 !insertmacro GetReturnValue # add the same image only transparent (magenta wiped) @ (150,16) - BgImage::AddImage /NOUNLOAD /TRANSPARENT 255 0 255 $PLUGINSDIR\2.bmp 150 16 + BgImage::AddImage /TRANSPARENT 255 0 255 $PLUGINSDIR\2.bmp 150 16 !insertmacro GetReturnValue # create the font for the following text CreateFont $R0 "Comic Sans MS" 50 700 # add a blue shadow for the text - BgImage::AddText /NOUNLOAD "Testing 1... 2... 3..." $R0 0 0 255 48 48 798 198 + BgImage::AddText "Testing 1... 2... 3..." $R0 0 0 255 48 48 798 198 !insertmacro GetReturnValue # add a green shadow for the text - BgImage::AddText /NOUNLOAD "Testing 1... 2... 3..." $R0 0 255 0 52 52 802 202 + BgImage::AddText "Testing 1... 2... 3..." $R0 0 255 0 52 52 802 202 !insertmacro GetReturnValue # add the text - BgImage::AddText /NOUNLOAD "Testing 1... 2... 3..." $R0 255 0 0 50 50 800 200 + BgImage::AddText "Testing 1... 2... 3..." $R0 255 0 0 50 50 800 200 !insertmacro GetReturnValue # show our creation to the world! - BgImage::Redraw /NOUNLOAD + BgImage::Redraw # Refresh doesn't return any value FunctionEnd @@ -60,7 +60,7 @@ Section StrCmp $0 "" skipSound moreSounds: StrCmp $1 "" noMoreSounds - BgImage::Sound /NOUNLOAD /WAIT $WINDIR\Media\$1 + BgImage::Sound /WAIT $WINDIR\Media\$1 # Sound doesn't return any value either MessageBox MB_YESNO "Another sound?" IDNO noMoreSounds FindNext $0 $1 @@ -71,32 +71,30 @@ Section skipSound: # change the background image to Mike, tiled - BgImage::SetBg /NOUNLOAD /TILED $PLUGINSDIR\1.bmp + BgImage::SetBg /TILED $PLUGINSDIR\1.bmp !insertmacro GetReturnValue # we have to redraw to reflect the changes - BgImage::Redraw /NOUNLOAD + BgImage::Redraw MessageBox MB_OK "Mike the llama" # clear everything - BgImage::Clear /NOUNLOAD + BgImage::Clear # Clear doesn't return any value # set another gradient - BgImage::SetBg /NOUNLOAD /GRADIENT 0xFF 0xFA 0xBA 0xAA 0xA5 0x65 + BgImage::SetBg /GRADIENT 0xFF 0xFA 0xBA 0xAA 0xA5 0x65 !insertmacro GetReturnValue # add some text - BgImage::AddText /NOUNLOAD "A Desert for Mike" $R0 0 0 0 50 50 800 150 + BgImage::AddText "A Desert for Mike" $R0 0 0 0 50 50 800 150 !insertmacro GetReturnValue # add mike as an image - BgImage::AddImage /NOUNLOAD $PLUGINSDIR\1.bmp 50 150 + BgImage::AddImage $PLUGINSDIR\1.bmp 50 150 !insertmacro GetReturnValue # again, we have to call redraw to reflect changes - BgImage::Redraw /NOUNLOAD + BgImage::Redraw SectionEnd Function .onGUIEnd - # Destroy must not have /NOUNLOAD so NSIS will be able to unload - # and delete BgImage before it exits BgImage::Destroy # Destroy doesn't return any value FunctionEnd \ No newline at end of file diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp index 845ffbc3..9b41b4a7 100644 --- a/Contrib/InstallOptions/InstallerOptions.cpp +++ b/Contrib/InstallOptions/InstallerOptions.cpp @@ -1508,11 +1508,18 @@ extern "C" void __declspec(dllexport) dialog(HWND hwndParent, int string_size, showCfgDlg(); } +static UINT_PTR PluginCallback(enum NSPIM msg) +{ + return 0; +} + extern "C" void __declspec(dllexport) initDialog(HWND hwndParent, int string_size, - char *variables, stack_t **stacktop) + char *variables, stack_t **stacktop, + extra_parameters *extra) { hMainWindow=hwndParent; EXDLL_INIT(); + extra->RegisterPluginCallback(m_hInstance, PluginCallback); if (initCalled) { pushstring("error"); return; diff --git a/Contrib/StartMenu/Readme.txt b/Contrib/StartMenu/Readme.txt index 74f39fa2..74329986 100644 --- a/Contrib/StartMenu/Readme.txt +++ b/Contrib/StartMenu/Readme.txt @@ -33,7 +33,7 @@ To set properties of the controls on the page, such as colors and fonts use Init and Show instead of Select. Init will push the HWND of the page on the stack, or an error string. For example: -StartMenu::Init /NOUNLOAD "Test" +StartMenu::Init "Test" Pop $0 IntCmp $0 0 failed GetDlgItem $0 $0 1003 diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c index 5e03b709..69e828d7 100644 --- a/Contrib/StartMenu/StartMenu.c +++ b/Contrib/StartMenu/StartMenu.c @@ -29,6 +29,11 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static BOOL CALLBACK ParentWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); void AddFolderFromReg(int nFolder); +static UINT_PTR PluginCallback(enum NSPIM msg) +{ + return 0; +} + void __declspec(dllexport) Init(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { HWND hwStartMenuSelect; @@ -39,6 +44,8 @@ void __declspec(dllexport) Init(HWND hwndParent, int string_size, char *variable EXDLL_INIT(); + extra->RegisterPluginCallback(g_hInstance, PluginCallback); + { hwChild = GetDlgItem(hwndParent, 1018); if (!hwChild)