From 23126d31352ce1315bfb380cc72bfda8d09d3de4 Mon Sep 17 00:00:00 2001 From: John Johns Date: Sat, 5 Jun 2021 16:29:38 -0700 Subject: [PATCH] Hoikas' Windows 7 taskbar loading indicator https://github.com/H-uru/Plasma/commit/dcba1fb60a1da9eb2398c65a0945fc36fa10fa09 and https://github.com/H-uru/Plasma/commit/3a354020e15ff154c44263ebb46670de2c9746b4 --- Sources/Plasma/Apps/plClient/plClient.cpp | 32 ++++++++++++++ Sources/Plasma/Apps/plClient/winmain.cpp | 51 +++++++++++++++-------- 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/Sources/Plasma/Apps/plClient/plClient.cpp b/Sources/Plasma/Apps/plClient/plClient.cpp index c1013bf1..cd7d14c3 100644 --- a/Sources/Plasma/Apps/plClient/plClient.cpp +++ b/Sources/Plasma/Apps/plClient/plClient.cpp @@ -162,6 +162,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "plTweak.h" +#include + #define MSG_LOADING_BAR // static hsVector3 gAbsDown(0,0,-hsScalar1); @@ -170,6 +172,10 @@ static plDispatchBase* gDisp = nil; static plTimerCallbackManager* gTimerMgr = nil; static plAudioSystem* gAudio = nil; +#ifdef HS_BUILD_FOR_WIN32 +extern ITaskbarList3* gTaskbarList; +#endif + hsBool plClient::fDelayMS = false; plClient* plClient::fInstance=nil; @@ -1286,6 +1292,32 @@ void plClient::IProgressMgrCallbackProc(plOperationProgress * progress) if(!fInstance) return; + // Increments the taskbar progress [Windows 7+] +#ifdef HS_BUILD_FOR_WIN32 + if (gTaskbarList && fInstance->GetWindowHandle()) + { + static TBPFLAG lastState = TBPF_NOPROGRESS; + TBPFLAG myState; + + // So, calling making these kernel calls is kind of SLOW. So, let's + // hide that behind a userland check--this helps linking go faster! + if (progress->IsLastUpdate()) + myState = TBPF_NOPROGRESS; + else if (progress->GetMax() == 0.f) + myState = TBPF_INDETERMINATE; + else + // This will set TBPF_NORMAL for us + myState = TBPF_NORMAL; + + if (myState == TBPF_NORMAL) + // This sets us to TBPF_NORMAL + gTaskbarList->SetProgressValue(fInstance->GetWindowHandle(), (ULONGLONG)progress->GetProgress(), (ULONGLONG)progress->GetMax()); + else if (myState != lastState) + gTaskbarList->SetProgressState(fInstance->GetWindowHandle(), myState); + lastState = myState; + } +#endif + fInstance->fMessagePumpProc(); fInstance->IDraw(); } diff --git a/Sources/Plasma/Apps/plClient/winmain.cpp b/Sources/Plasma/Apps/plClient/winmain.cpp index 7ac2e06b..97a88df0 100644 --- a/Sources/Plasma/Apps/plClient/winmain.cpp +++ b/Sources/Plasma/Apps/plClient/winmain.cpp @@ -77,6 +77,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include #include "WinHttp.h" #include "loginfix.h" +#include // // Defines // @@ -99,6 +100,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com // Globals // hsBool gHasMouse = false; +ITaskbarList3* gTaskbarList = nil; // NT 6.1+ taskbar stuff extern hsBool gDataServerLocal; extern hsBool gUseBackgroundDownloader; @@ -137,6 +139,7 @@ bool gPendingActivateFlag = false; static bool s_loginDlgRunning = false; static CEvent s_statusEvent(kEventManualReset); +static UINT s_WmTaskbarList = RegisterWindowMessage("TaskbarButtonCreated"); FILE *errFP = nil; HINSTANCE gHInst = NULL; // Instance of this app @@ -502,7 +505,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (gClient->WindowActive() && gClient->GetInputManager()) gClient->GetInputManager()->HandleWin32ControlEvent(message, wParam, lParam, hWnd); } - break; + return TRUE; case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: @@ -514,19 +517,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_KEYUP: if (gClient && gClient->WindowActive() && gClient->GetInputManager()) gClient->GetInputManager()->HandleWin32ControlEvent(message, wParam, lParam, hWnd); - break; + return TRUE; case WM_MOUSEMOVE: { if (gClient && gClient->GetInputManager()) gClient->GetInputManager()->HandleWin32ControlEvent(message, wParam, lParam, hWnd); } - break; + return TRUE; #if 0 case WM_KILLFOCUS: SetForegroundWindow(hWnd); - break; + return TRUE; #endif case WM_SYSKEYUP: @@ -538,7 +541,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } //DefWindowProc(hWnd, message, wParam, lParam); } - break; + return TRUE; case WM_SYSCOMMAND: switch (wParam) { @@ -554,9 +557,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (plNetClientMgr * mgr = plNetClientMgr::GetInstance()) mgr->QueueDisableNet(false, nil); DestroyWindow(gClient->GetWindowHandle()); - break; + return TRUE; } - break; + return TRUE; case WM_SETCURSOR: { @@ -579,9 +582,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) plMouseDevice::HideCursor(); } } - return TRUE; } - break; + return TRUE; case WM_ACTIVATE: { @@ -601,7 +603,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) gPendingActivateFlag = active; } } - break; + return TRUE; // Let go of the mouse if the window is being moved. case WM_ENTERSIZEMOVE: @@ -609,7 +611,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) gDragging = true; if( gClient ) gClient->WindowActivate(false); - break; + return TRUE; // Redo the mouse capture if the window gets moved case WM_EXITSIZEMOVE: @@ -617,7 +619,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) gDragging = false; if( gClient ) gClient->WindowActivate(true); - break; + return TRUE; // Redo the mouse capture if the window gets moved (special case for Colin // and his cool program that bumps windows out from under the taskbar) @@ -629,7 +631,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } else DebugMsgF("Got WM_MOVE, but ignoring"); - break; + return TRUE; /// Resize the window // (we do WM_SIZING here instead of WM_SIZE because, for some reason, WM_SIZE is @@ -644,7 +646,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ::GetClientRect(hWnd, &r); gClient->GetPipeline()->Resize(r.right - r.left, r.bottom - r.top); } - break; + return TRUE; case WM_SIZE: // Let go of the mouse if the window is being minimized @@ -661,7 +663,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if (gClient) gClient->WindowActivate(true); } - break; + return TRUE; case WM_CLOSE: gClient->SetDone(TRUE); @@ -677,9 +679,22 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; case WM_CREATE: // Create renderer - break; - } - return DefWindowProc(hWnd, message, wParam, lParam); + return TRUE; + } + + // Messages we registered for manually (no const value) + if (message == s_WmTaskbarList) + { + // Grab the Windows 7 taskbar list stuff + if (gTaskbarList) + gTaskbarList->Release(); + HRESULT result = CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_ALL, IID_ITaskbarList3, (void**)&gTaskbarList); + if (FAILED(result)) + gTaskbarList = nil; + return TRUE; + } + else + return DefWindowProc(hWnd, message, wParam, lParam); } void PumpMessageQueueProc( void )