From 348fe1182f3465b6d9bae5a8905c19c67a7e8f06 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 28 Feb 2015 02:48:26 +0100 Subject: [PATCH] Added patch to implement PROGDLG_AUTOTIME for IProgressDialog. --- debian/changelog | 1 + ...nt-PROGDLG_AUTOTIME-flag-for-IProgre.patch | 161 ++++++++++++++++++ patches/patchinstall.sh | 4 +- 3 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 patches/browseui-Progress_Dialog/0002-browseui-Implement-PROGDLG_AUTOTIME-flag-for-IProgre.patch diff --git a/debian/changelog b/debian/changelog index 6801db1c..f0678872 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,6 +22,7 @@ wine-staging (1.7.38) UNRELEASED; urgency=low * Added patch for job object completion support. * Added patch to properly track handle count of wineserver objects. * Added patch to implement JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE. + * Added patch to implement PROGDLG_AUTOTIME for IProgressDialog. * Removed patch to properly call DriverUnload when unloading device drivers (accepted upstream). * Removed patch to allow Accept-Encoding for HTTP/1.0 in wininet (accepted upstream). * Removed patch to declare pDirectInputCreateEx in a MSVC compatible way (accepted upstream). diff --git a/patches/browseui-Progress_Dialog/0002-browseui-Implement-PROGDLG_AUTOTIME-flag-for-IProgre.patch b/patches/browseui-Progress_Dialog/0002-browseui-Implement-PROGDLG_AUTOTIME-flag-for-IProgre.patch new file mode 100644 index 00000000..1df82903 --- /dev/null +++ b/patches/browseui-Progress_Dialog/0002-browseui-Implement-PROGDLG_AUTOTIME-flag-for-IProgre.patch @@ -0,0 +1,161 @@ +From 61fce27e29e7e61b76916d0e1014a3294217fb54 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michael=20M=C3=BCller?= +Date: Sat, 28 Feb 2015 02:28:08 +0100 +Subject: browseui: Implement PROGDLG_AUTOTIME flag for IProgressDialog. + +--- + dlls/browseui/browseui.rc | 5 ++++ + dlls/browseui/progressdlg.c | 64 +++++++++++++++++++++++++++++++++++++++++---- + dlls/browseui/resids.h | 5 ++++ + 3 files changed, 69 insertions(+), 5 deletions(-) + +diff --git a/dlls/browseui/browseui.rc b/dlls/browseui/browseui.rc +index 833b139..64b859d 100644 +--- a/dlls/browseui/browseui.rc ++++ b/dlls/browseui/browseui.rc +@@ -25,6 +25,11 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT + STRINGTABLE + { + IDS_CANCELLING "Canceling..." ++ IDS_REMAINING1 "%u %s remaining" ++ IDS_REMAINING2 "%u %s and %u %s remaining" ++ IDS_SECONDS "seconds" ++ IDS_MINUTES "minutes" ++ IDS_HOURS "hours" + } + + IDD_PROGRESS_DLG DIALOG 0, 0, 260, 85 +diff --git a/dlls/browseui/progressdlg.c b/dlls/browseui/progressdlg.c +index 598197b..d632860 100644 +--- a/dlls/browseui/progressdlg.c ++++ b/dlls/browseui/progressdlg.c +@@ -73,6 +73,9 @@ typedef struct tagProgressDialog { + ULONGLONG ullCompleted; + ULONGLONG ullTotal; + HWND hwndDisabledParent; /* For modal dialog: the parent that need to be re-enabled when the dialog ends */ ++ ULONGLONG startTime; ++ LPWSTR remainingMsg[2]; ++ LPWSTR timeMsg[3]; + } ProgressDialog; + + static inline ProgressDialog *impl_from_IProgressDialog(IProgressDialog *iface) +@@ -257,14 +260,18 @@ static DWORD WINAPI dialog_thread(LPVOID lpParameter) + + static void ProgressDialog_Destructor(ProgressDialog *This) + { ++ int i; + TRACE("destroying %p\n", This); + if (This->hwnd) + end_dialog(This); +- heap_free(This->lines[0]); +- heap_free(This->lines[1]); +- heap_free(This->lines[2]); ++ for (i = 0; i < 3; i++) ++ heap_free(This->lines[i]); + heap_free(This->cancelMsg); + heap_free(This->title); ++ for (i = 0; i < 2; i++) ++ heap_free(This->remainingMsg[i]); ++ for (i = 0; i < 3; i++) ++ heap_free(This->timeMsg[i]); + This->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->cs); + heap_free(This); +@@ -326,8 +333,6 @@ static HRESULT WINAPI ProgressDialog_StartProgressDialog(IProgressDialog *iface, + TRACE("(%p, %p, %x, %p)\n", iface, punkEnableModeless, dwFlags, reserved); + if (punkEnableModeless || reserved) + FIXME("Reserved parameters not null (%p, %p)\n", punkEnableModeless, reserved); +- if (dwFlags & PROGDLG_AUTOTIME) +- FIXME("Flags PROGDLG_AUTOTIME not supported\n"); + if (dwFlags & PROGDLG_NOTIME) + FIXME("Flags PROGDLG_NOTIME not supported\n"); + +@@ -358,6 +363,7 @@ static HRESULT WINAPI ProgressDialog_StartProgressDialog(IProgressDialog *iface, + This->hwndDisabledParent = hwndDisable; + } + ++ This->startTime = GetTickCount64(); + LeaveCriticalSection(&This->cs); + + return S_OK; +@@ -406,6 +412,52 @@ static BOOL WINAPI ProgressDialog_HasUserCancelled(IProgressDialog *iface) + return This->isCancelled; + } + ++static void load_time_strings(ProgressDialog *This) ++{ ++ int i; ++ ++ for (i = 0; i < 2; i++) ++ { ++ if (!This->remainingMsg[i]) ++ This->remainingMsg[i] = load_string(BROWSEUI_hinstance, IDS_REMAINING1 + i); ++ } ++ for (i = 0; i < 3; i++) ++ { ++ if (!This->timeMsg[i]) ++ This->timeMsg[i] = load_string(BROWSEUI_hinstance, IDS_SECONDS + i); ++ } ++} ++ ++static void update_time_remaining(ProgressDialog *This, ULONGLONG ullCompleted, ULONGLONG ullTotal) ++{ ++ unsigned int remaining, remainder = 0; ++ ULONGLONG elapsed; ++ WCHAR line[128]; ++ int i; ++ ++ if (!This->startTime || !ullCompleted || !ullTotal) ++ return; ++ ++ load_time_strings(This); ++ ++ elapsed = GetTickCount64() - This->startTime; ++ remaining = (elapsed * ullTotal / ullCompleted - elapsed) / 1000; ++ ++ for (i = 0; remaining >= 60 && i < 2; i++) ++ { ++ remainder = remaining % 60; ++ remaining /= 60; ++ } ++ ++ if (i > 0 && remaining < 2 && remainder != 0) ++ wsprintfW(line, This->remainingMsg[1], remaining, This->timeMsg[i], remainder, This->timeMsg[i-1]); ++ else ++ wsprintfW(line, This->remainingMsg[0], remaining, This->timeMsg[i]); ++ ++ set_buffer(&This->lines[2], line); ++ This->dwUpdate |= UPDATE_LINE3; ++} ++ + static HRESULT WINAPI ProgressDialog_SetProgress64(IProgressDialog *iface, ULONGLONG ullCompleted, ULONGLONG ullTotal) + { + ProgressDialog *This = impl_from_IProgressDialog(iface); +@@ -418,6 +470,8 @@ static HRESULT WINAPI ProgressDialog_SetProgress64(IProgressDialog *iface, ULONG + This->ullCompleted = ullCompleted; + This->dwUpdate |= UPDATE_PROGRESS; + hwnd = This->hwnd; ++ if (This->dwFlags & PROGDLG_AUTOTIME) ++ update_time_remaining(This, ullCompleted, ullTotal); + LeaveCriticalSection(&This->cs); + + if (hwnd) +diff --git a/dlls/browseui/resids.h b/dlls/browseui/resids.h +index cd44a8e..865cdd1 100644 +--- a/dlls/browseui/resids.h ++++ b/dlls/browseui/resids.h +@@ -21,6 +21,11 @@ + #include "commctrl.h" + + #define IDS_CANCELLING 16 ++#define IDS_REMAINING1 17 ++#define IDS_REMAINING2 18 ++#define IDS_SECONDS 19 ++#define IDS_MINUTES 20 ++#define IDS_HOURS 21 + + #define IDC_ANIMATION 100 + #define IDC_PROGRESS_BAR 102 +-- +2.3.0 + diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 044ae458..4bb1dde9 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -1210,12 +1210,14 @@ fi # Patchset browseui-Progress_Dialog # | # | Modified files: -# | * dlls/browseui/progressdlg.c +# | * dlls/browseui/browseui.rc, dlls/browseui/progressdlg.c, dlls/browseui/resids.h # | if test "$enable_browseui_Progress_Dialog" -eq 1; then patch_apply browseui-Progress_Dialog/0001-browseui-Implement-IProgressDialog-SetAnimation.patch + patch_apply browseui-Progress_Dialog/0002-browseui-Implement-PROGDLG_AUTOTIME-flag-for-IProgre.patch ( echo '+ { "Michael Müller", "browseui: Implement IProgressDialog::SetAnimation.", 1 },'; + echo '+ { "Michael Müller", "browseui: Implement PROGDLG_AUTOTIME flag for IProgressDialog.", 1 },'; ) >> "$patchlist" fi