Bump to 1.11

This commit is contained in:
Vichingo455
2025-03-23 12:49:51 +01:00
parent 7ca9105b8d
commit 23ac8a27f0
65 changed files with 2470 additions and 3597 deletions

View File

@@ -1,23 +1,23 @@
// Based on https://nsis.sourceforge.io/TaskbarProgress_plug-in - zlib licensed
// Cleaned up and refactored into C by Legacy Update
#define CINTERFACE
#define COBJMACROS
#undef _WIN32_WINNT
#define _WIN32_WINNT _WIN32_WINNT_WIN7
#include <windows.h>
#include <nsis/pluginapi.h>
#include <commctrl.h>
#include <objbase.h>
#include <shobjidl.h>
#include "main.h"
#include "VersionInfo.h"
static const GUID our_CLSID_ITaskbarList = { 0x56fdf344, 0xfd6d, 0x11d0, { 0x95, 0x8a, 0x00, 0x60, 0x97, 0xc9, 0xa0, 0x90 } };
static const GUID our_IID_ITaskbarList3 = { 0xea1afb91, 0x9e28, 0x4b86, { 0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf } };
static extra_parameters *g_extra;
static ITaskbarList3 *g_taskbarList;
static UINT g_totalRange;
static WNDPROC g_progressOrigWndProc;
static WNDPROC g_dialogOrigWndProc;
ITaskbarList3 *g_taskbarList;
UINT g_totalRange;
WNDPROC g_origWndProc;
LRESULT ProgressBarWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (g_origWndProc == NULL) {
LRESULT CALLBACK ProgressBarWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (!g_progressOrigWndProc) {
return 0;
}
@@ -31,40 +31,73 @@ LRESULT ProgressBarWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
break;
case PBM_SETPOS:
if (g_taskbarList != NULL) {
if (g_taskbarList) {
ITaskbarList3_SetProgressValue(g_taskbarList, g_hwndParent, wParam, g_totalRange);
}
break;
case WM_DESTROY:
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)g_origWndProc);
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)g_progressOrigWndProc);
if (g_taskbarList != NULL) {
if (g_taskbarList) {
ITaskbarList3_SetProgressState(g_taskbarList, g_hwndParent, TBPF_NOPROGRESS);
ITaskbarList3_Release(g_taskbarList);
g_taskbarList = NULL;
}
g_origWndProc = NULL;
g_progressOrigWndProc = NULL;
break;
}
return CallWindowProc(g_origWndProc, hwnd, uMsg, wParam, lParam);
return CallWindowProc(g_progressOrigWndProc, hwnd, uMsg, wParam, lParam);
}
UINT_PTR NSISPluginCallback(enum NSPIM event) {
static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (!g_dialogOrigWndProc) {
return 0;
}
switch (uMsg) {
case WM_NOTIFY_OUTER_NEXT:
if (g_extra->exec_flags->abort) {
// Set the progress bar to error state (red)
HWND innerWindow = FindWindowEx(hwnd, NULL, L"#32770", NULL);
HWND progressBar = FindWindowEx(innerWindow, NULL, L"msctls_progress32", NULL);
if (progressBar) {
SendMessage(progressBar, PBM_SETSTATE, PBST_ERROR, 0);
}
if (g_taskbarList) {
ITaskbarList3_SetProgressState(g_taskbarList, g_hwndParent, TBPF_ERROR);
}
}
break;
case WM_DESTROY:
SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)g_dialogOrigWndProc);
g_dialogOrigWndProc = NULL;
break;
}
return CallWindowProc(g_dialogOrigWndProc, hwnd, uMsg, wParam, lParam);
}
static UINT_PTR NSISPluginCallback(enum NSPIM event) {
// Does nothing, but keeping a callback registered prevents NSIS from unloading the plugin
return 0;
}
EXTERN_C __declspec(dllexport)
void __cdecl InitTaskbarProgress(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) {
EXDLL_INIT();
g_hwndParent = hwndParent;
PLUGIN_METHOD(InitTaskbarProgress) {
PLUGIN_INIT();
if (!AtLeastWinVista()) {
return;
}
g_extra = extra;
extra->RegisterPluginCallback(g_hInstance, NSISPluginCallback);
if (g_taskbarList != NULL && g_origWndProc != NULL) {
if (g_progressOrigWndProc) {
// Already initialised
return;
}
@@ -74,11 +107,11 @@ void __cdecl InitTaskbarProgress(HWND hwndParent, int string_size, TCHAR *variab
PBRANGE range;
HRESULT hr;
if (progressBar == NULL) {
if (!progressBar) {
goto fail;
}
hr = CoCreateInstance(our_CLSID_ITaskbarList, NULL, CLSCTX_INPROC_SERVER, our_IID_ITaskbarList3, (void**)&g_taskbarList);
hr = CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, (void **)&g_taskbarList);
if (!SUCCEEDED(hr)) {
goto fail;
}
@@ -93,17 +126,19 @@ void __cdecl InitTaskbarProgress(HWND hwndParent, int string_size, TCHAR *variab
g_totalRange = range.iLow + range.iHigh;
// Add our own window procedure so we can respond to progress bar updates
g_origWndProc = (WNDPROC)SetWindowLongPtr(progressBar, GWLP_WNDPROC, (LONG_PTR)ProgressBarWndProc);
if (g_origWndProc == NULL) {
g_progressOrigWndProc = (WNDPROC)SetWindowLongPtr(progressBar, GWLP_WNDPROC, (LONG_PTR)ProgressBarWndProc);
g_dialogOrigWndProc = (WNDPROC)SetWindowLongPtr(g_hwndParent, GWLP_WNDPROC, (LONG_PTR)MainWndProc);
if (!g_progressOrigWndProc || !g_dialogOrigWndProc) {
goto fail;
}
return;
fail:
if (g_taskbarList != NULL) {
if (g_taskbarList) {
ITaskbarList3_Release(g_taskbarList);
g_taskbarList = NULL;
}
g_origWndProc = NULL;
g_progressOrigWndProc = NULL;
g_dialogOrigWndProc = NULL;
}