On 22/09/15 15:32, Jernej Simončič wrote:
On Tuesday, September 22, 2015, 12:38:02, Tim Ruehsen wrote:

I would like to see that (if I was using Windows).
Should be activated by a switch (maybe windows only).
Feel free to create a patch.
There already is a patch for this, but it's C++:
<https://eternallybored.org/misc/wget/src/taskbar-progress.patch>
I have adapted the above patch to C. See attachment.

Warning: I haven't tested it other than verifying that it compiles.

Also, I don't know about the copyright status of the patch you linked.
It will be GPLv3, hopefully…

>From 6f1f09594cebff4382a890cf33621f672e5d4534 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81ngel=20Gonz=C3=A1lez?= <[email protected]>
Date: Wed, 23 Sep 2015 00:53:49 +0200
Subject: [PATCH] Progress bar on Windows console title

Adaptation of patch https://eternallybored.org/misc/wget/src/taskbar-progress.patch
from C++ to C
---
 configure.ac     |   2 +-
 src/Makefile.am  |   5 ++-
 src/mswindows.c  |   3 ++
 src/tbprogress.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/tbprogress.h |   6 +++
 5 files changed, 130 insertions(+), 3 deletions(-)
 create mode 100644 src/tbprogress.c
 create mode 100644 src/tbprogress.h

diff --git a/configure.ac b/configure.ac
index eb128f3..278bd64 100644
--- a/configure.ac
+++ b/configure.ac
@@ -298,7 +298,7 @@ WGET_NSL_SOCKET
 dnl Deal with specific hosts
 case $host_os in
   *mingw32* )
-    LIBS+=' -lws2_32'
+    LIBS+=' -lws2_32 -lole32'
     AC_LIBOBJ([mswindows])
     ;;
 esac
diff --git a/src/Makefile.am b/src/Makefile.am
index 050f58e..f564e00 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -51,13 +51,14 @@ wget_SOURCES = connect.c convert.c cookies.c ftp.c	\
 		ftp-basic.c ftp-ls.c hash.c host.c hsts.c html-parse.c html-url.c	\
 		http.c init.c log.c main.c netrc.c progress.c ptimer.c	\
 		recur.c res.c retr.c spider.c url.c warc.c	\
-		utils.c exits.c build_info.c $(IRI_OBJ) $(METALINK_OBJ)	\
+		utils.c exits.c tbprogress.c build_info.c \
+		$(IRI_OBJ) $(METALINK_OBJ)	\
 		css-url.h css-tokens.h connect.h convert.h cookies.h	\
 		ftp.h hash.h host.h hsts.h  html-parse.h html-url.h	\
 		http.h http-ntlm.h init.h log.h mswindows.h netrc.h	\
 		options.h progress.h ptimer.h recur.h res.h retr.h	\
 		spider.h ssl.h sysdep.h url.h warc.h utils.h wget.h iri.h	\
-		exits.h version.h metalink.h
+		exits.h version.h metalink.h tbprogress.h
 nodist_wget_SOURCES = version.c
 EXTRA_wget_SOURCES = iri.c
 LDADD = $(LIBOBJS) ../lib/libgnu.a
diff --git a/src/mswindows.c b/src/mswindows.c
index 1a43b51..a15f6b8 100644
--- a/src/mswindows.c
+++ b/src/mswindows.c
@@ -43,6 +43,7 @@ as that of the covered work.  */
 #include "utils.h"
 #include "url.h"
 #include "exits.h"
+#include "tbprogress.h"
 
 #ifndef ES_SYSTEM_REQUIRED
 #define ES_SYSTEM_REQUIRED  0x00000001
@@ -89,6 +90,7 @@ windows_main (char **exec_name)
 static void
 ws_cleanup (void)
 {
+  SetTBProgress(-1);
   xfree (exec_name);
   WSACleanup ();
 }
@@ -402,6 +404,7 @@ ws_percenttitle (double percentage_float)
 
   sprintf (title_buf, "Wget [%d%%] %s", percentage, curr_url);
   SetConsoleTitle (title_buf);
+  SetTBProgress((int)(percentage_float * 10.0));
 }
 
 /* Returns a pointer to the fully qualified name of the directory that
diff --git a/src/tbprogress.c b/src/tbprogress.c
new file mode 100644
index 0000000..5465b98
--- /dev/null
+++ b/src/tbprogress.c
@@ -0,0 +1,117 @@
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0500
+#endif
+
+#include <windows.h>
+#include <commctrl.h>
+#include <objbase.h>
+#include <shlguid.h>
+#include <shlobj.h>
+#include "tbprogress.h"
+
+const CLSID CLSID_TaskbarList = {0x56FDF344,0xFD6D,0x11d0,{0x95,0x8A,0x00,0x60,0x97,0xC9,0xA0,0x90}};
+const IID IID_ITaskbarList1 = {0x56FDF342,0xFD6D,0x11d0,{0x95,0x8A,0x00,0x60,0x97,0xC9,0xA0,0x90}};
+const IID IID_ITaskbarList3 = {0xea1afb91,0x9e28,0x4b86,{0x90,0xe9,0x9e,0x9f,0x8a,0x5e,0xef,0xaf}};
+
+#ifndef __ITaskbarList3_INTERFACE_DEFINED__
+typedef enum {
+	TBPF_NOPROGRESS    = 0, // Normal state / no progress bar
+	TBPF_INDETERMINATE = 1, // Marquee style progress bar
+	TBPF_NORMAL        = 2, // Standard progress bar
+	TBPF_ERROR         = 4, // Red taskbar button to indicate an error occurred
+	TBPF_PAUSED        = 8  // Yellow taskbar button to indicate user attention
+} TBPFLAG;
+
+typedef void* LPTHUMBBUTTON;//dummy typedef!
+typedef enum {TBATF_DUMMY} TBATFLAG;
+
+#define INTERFACE ITaskbarList3
+DECLARE_INTERFACE_(ITaskbarList3,IUnknown)
+{
+	STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
+	STDMETHOD_(ULONG,AddRef)(THIS) PURE;
+	STDMETHOD_(ULONG,Release)(THIS) PURE;
+
+	//ITaskbarList(1)
+	STDMETHOD(HrInit)(THIS) PURE;
+	STDMETHOD(AddTab)(THIS, HWND hwnd) PURE;
+	STDMETHOD(DeleteTab)(THIS, HWND hwnd) PURE;
+	STDMETHOD(ActivateTab)(THIS, HWND hwnd) PURE;
+	STDMETHOD(SetActiveAlt)(THIS, HWND hwnd) PURE;
+	//ITaskbarList2
+	STDMETHOD(MarkFullscreenWindow)(THIS, HWND hwnd, BOOL fFullscreen) PURE;
+	//ITaskbarList3
+	STDMETHOD(SetProgressValue)(THIS, HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE;
+	STDMETHOD(SetProgressState)(THIS, HWND hwnd, TBPFLAG tbpFlags) PURE;
+	STDMETHOD(RegisterTab)(THIS, HWND hwndTab, HWND hwndMDI) PURE;
+	STDMETHOD(UnregisterTab)(THIS, HWND hwndTab) PURE;
+	STDMETHOD(SetTabOrder)(THIS, HWND hwndTab,HWND hwndInsertBefore) PURE;
+	STDMETHOD(SetTabActive)(THIS, HWND hwndTab,HWND hwndMDI, TBATFLAG tbatFlags) PURE;
+	STDMETHOD(ThumbBarAddButtons)(THIS, HWND hwnd,UINT cButtons, LPTHUMBBUTTON pButton) PURE;
+	STDMETHOD(ThumbBarUpdateButtons)(THIS, HWND hwnd,UINT cButtons, LPTHUMBBUTTON pButton) PURE;
+	STDMETHOD(ThumbBarSetImageList)(THIS, HWND hwnd, HIMAGELIST himl) PURE;
+	STDMETHOD(SetOverlayIcon)(THIS, HWND hwnd, HICON hIcon, LPCWSTR pszDescription) PURE;
+	STDMETHOD(SetThumbnailTooltip)(THIS, HWND hwnd, LPCWSTR pszTip);
+	STDMETHOD(SetThumbnailClip)(THIS, HWND hwnd, RECT *prcClip);
+
+	STDMETHOD(QueryContextMenu)(THIS_ HMENU,UINT,UINT,UINT,UINT) PURE;
+	STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO) PURE;
+	STDMETHOD(GetCommandString)(THIS_ UINT,UINT,PUINT,LPSTR,UINT) PURE;
+	STDMETHOD(HandleMenuMsg)(THIS_ UINT,WPARAM,LPARAM) PURE;
+};
+#undef INTERFACE
+#endif
+
+void SetTBProgress(int permille)
+{
+
+	static ITaskbarList3 *g_pTL = NULL;
+	static HWND g_hwndConsole = NULL;
+	static int TB_status = 0;
+
+    if (g_pTL == NULL && permille < 0) return;
+    if (TB_status != 0) return;
+    if (permille > 1000) permille = 1000;
+
+    if (g_pTL == NULL) {
+        HRESULT hr;
+
+        g_hwndConsole = GetConsoleWindow();
+        if (g_hwndConsole == NULL) {
+            TB_status = -1;
+            return;
+        }
+
+        hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
+	    if (!SUCCEEDED(hr)) {
+            CoUninitialize();
+            TB_status = -1;
+            return;
+        }
+
+        hr = CoCreateInstance(&CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskbarList3, (void**)&g_pTL);
+        if (!SUCCEEDED(hr) || g_pTL == NULL) {
+            CoUninitialize();
+            TB_status = -1;
+            return;
+        }
+
+        hr = g_pTL->lpVtbl->HrInit(g_pTL);
+	    if (!SUCCEEDED(hr)) {
+            TB_status = -1;
+            g_pTL->lpVtbl->Release(g_pTL);
+            g_pTL = NULL;
+            CoUninitialize();
+            return;
+        }
+    }
+
+    if (permille >= 0) {
+        g_pTL->lpVtbl->SetProgressValue(g_pTL, g_hwndConsole, permille, 1000);
+    } else {
+        g_pTL->lpVtbl->SetProgressState(g_pTL, g_hwndConsole, TBPF_NOPROGRESS);
+        g_pTL->lpVtbl->Release(g_pTL);
+        g_pTL = NULL;
+        CoUninitialize();
+    }
+}
diff --git a/src/tbprogress.h b/src/tbprogress.h
new file mode 100644
index 0000000..a59ad6d
--- /dev/null
+++ b/src/tbprogress.h
@@ -0,0 +1,6 @@
+#ifndef tbprogress_h
+#define tbprogress_h
+
+extern void SetTBProgress(int permille); // 0 - 1000
+
+#endif
-- 
2.5.1

Reply via email to