From dcba1fb60a1da9eb2398c65a0945fc36fa10fa09 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Mon, 19 Mar 2012 22:21:35 -0400 Subject: [PATCH] Windows 7 taskbar goodies Update the Windows 7 taskbarlist progress bar on plOperationProgress callbacks. It's not totally nesecary, but it adds a nice bit of polish to the experience. --- Sources/Plasma/Apps/plClient/plClient.cpp | 19 ++++++++++ Sources/Plasma/Apps/plClient/winmain.cpp | 43 +++++++++++++++-------- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/Sources/Plasma/Apps/plClient/plClient.cpp b/Sources/Plasma/Apps/plClient/plClient.cpp index ce487eb7..ec04183a 100644 --- a/Sources/Plasma/Apps/plClient/plClient.cpp +++ b/Sources/Plasma/Apps/plClient/plClient.cpp @@ -168,6 +168,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; @@ -1291,6 +1295,21 @@ void plClient::IProgressMgrCallbackProc(plOperationProgress * progress) if(!fInstance) return; + // Increments the taskbar progress [Windows 7+] +#ifdef HS_BUILD_FOR_WIN32 + if (gTaskbarList) + { + HWND hwnd = fInstance->GetWindowHandle(); // lazy + if (progress->IsLastUpdate()) + gTaskbarList->SetProgressState(hwnd, TBPF_NOPROGRESS); + else if (progress->GetMax() == 0.f) + gTaskbarList->SetProgressState(hwnd, TBPF_INDETERMINATE); + else + // This will set TBPF_NORMAL for us + gTaskbarList->SetProgressValue(hwnd, (ULONGLONG)progress->GetProgress(), (ULONGLONG)progress->GetMax()); + } +#endif + fInstance->fMessagePumpProc(); // HACK HACK HACK HACK! diff --git a/Sources/Plasma/Apps/plClient/winmain.cpp b/Sources/Plasma/Apps/plClient/winmain.cpp index 94bcdd5b..3ac8b6ed 100644 --- a/Sources/Plasma/Apps/plClient/winmain.cpp +++ b/Sources/Plasma/Apps/plClient/winmain.cpp @@ -92,6 +92,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; @@ -121,6 +122,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 @@ -361,7 +363,7 @@ void DebugMsgF(const char* format, ...); // Handles all the windows messages we might receive LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ +{ static bool gDragging = false; static uint32_t keyState=0; @@ -401,12 +403,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) gClient->GetInputManager()->HandleWin32ControlEvent(message, wParam, lParam, hWnd); } } - break; + return TRUE; #if 0 case WM_KILLFOCUS: SetForegroundWindow(hWnd); - break; + return TRUE; #endif case WM_SYSKEYUP: @@ -418,7 +420,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) { @@ -434,9 +436,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_ACTIVATE: { @@ -477,7 +479,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: @@ -485,7 +487,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: @@ -493,7 +495,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) @@ -505,7 +507,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 @@ -520,7 +522,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 @@ -537,7 +539,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); @@ -553,9 +555,22 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; case WM_CREATE: // Create renderer - break; + return TRUE; } - return DefWindowProc(hWnd, message, wParam, lParam); + + // 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 )