diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/UpdateWindow.cpp | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Winamp/UpdateWindow.cpp')
-rw-r--r-- | Src/Winamp/UpdateWindow.cpp | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/Src/Winamp/UpdateWindow.cpp b/Src/Winamp/UpdateWindow.cpp new file mode 100644 index 00000000..786c96ce --- /dev/null +++ b/Src/Winamp/UpdateWindow.cpp @@ -0,0 +1,214 @@ +#include "Main.h" +#include "Browser.h" +#include "./api.h" + +#include "../nu/ns_wc.h" +#include "menuv5.h" +#include "ExternalCOM.h" +#include "wa_dlg.h" + +#include "./updateService.h" + +UpdateBrowser *updateBrowser=0; +static WNDPROC oldUpdateProc = 0; +static BOOL fUnicode = FALSE; + +static void CALLBACK UpdateBrowser_TimerProc(HWND hwnd, UINT uMsg, UINT_PTR eventId, DWORD elapsed) +{ + KillTimer(hwnd, eventId); + + if (0 == (WS_VISIBLE & GetWindowLongPtrW(hwnd, GWL_STYLE))) + { + ShowWindow(hwnd, SW_SHOW); + } + + embedWindowState *state = (embedWindowState*)(ULONG_PTR)GetWindowLongPtrW(hwnd, GWLP_USERDATA); + if(NULL != state) + { + if (NULL != state->wasabi_window) + { + state->wasabi_window->activate(); + return; + } + else if (NULL != g_dialog_box_parent) + { + SetTimer(hwnd, eventId, 200, UpdateBrowser_TimerProc); + return; + } + } + + HWND hFrame = hwnd; + while (NULL != hFrame && 0 != (WS_CHILD & GetWindowLongPtrW(hFrame, GWL_STYLE))) + hFrame = GetAncestor(hFrame, GA_PARENT); + + if (NULL != hFrame && (g_dialog_box_parent == hFrame || hMainWindow == hFrame)) + hFrame = NULL; + + if (NULL == hFrame) hFrame = hwnd; + + SetWindowPos(hFrame, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + SetForegroundWindow(hFrame); + +} + +HRESULT UpdateWindow_Show(LPCSTR pszUrl) +{ + if (0 != _strnicmp(pszUrl, "http://client.winamp.com", 21)) + return E_UNEXPECTED; + + + UpdateService *service; + if (SUCCEEDED(UpdateService::CreateInstance(pszUrl, &service))) + { + HRESULT hr = service->Show(); + service->Release(); + if (SUCCEEDED(hr)) + return hr; + } + + updateBrowser = new UpdateBrowser; + updateBrowser->CreateHWND(); + updateBrowser->setVisible(TRUE); + updateBrowser->NavigateToName((LPCTSTR)pszUrl); + SetTimer(updateBrowser->m_hwnd, 1980, 1000, UpdateBrowser_TimerProc); + + return S_OK; +} + +static LRESULT WINAPI BrowserSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_PAINT: + { + HDC out = GetDC(hwnd); + RECT r; + GetClientRect(hwnd, &r); + r.left=11; + r.top=20; + r.right-=8; + r.bottom-=14; + + HBRUSH b = CreateSolidBrush(WADlg_getColor(WADLG_WNDBG)); + FillRect(out, &r, b); + DeleteObject(b); + ValidateRect(hwnd, &r); + } + break; + + case WM_USER+0x102: + { + if (wParam == 1) + { + ShowWindow(updateBrowser->m_hwnd, SW_SHOW); + } + else + { + ShowWindow(updateBrowser->m_hwnd, SW_HIDE); + } + } + break; + case WM_USER + 101: + { + //updateBrowser->setVisible(FALSE); + ShowWindow(hwnd, SW_HIDE); + ShowWindow(updateBrowser->m_hwnd, SW_HIDE); + return 0; + } + break; + + case WM_NCDESTROY: + case WM_DESTROY: + updateBrowser->m_hwnd = 0; + return 0; + break; + + } + + + if (oldUpdateProc) + return (fUnicode) ? CallWindowProcW(oldUpdateProc, hwnd, msg, wParam, lParam) : CallWindowProcA(oldUpdateProc, hwnd, msg, wParam, lParam); + else + return (fUnicode) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); + +} + +HWND UpdateBrowser::CreateHWND() +{ + if (!m_hwnd) + { + state.flags = EMBED_FLAGS_NOWINDOWMENU; + state.me = 0; + state.r.left = config_wx; + state.r.right = config_wx+300; + state.r.top = config_wy; + state.r.bottom = config_wy+200; + + HWND owner = (HWND) SendMessageW(hMainWindow, WM_WA_IPC, (WPARAM) & state, IPC_GET_EMBEDIF); + + m_hwnd = owner; + setLocation(11,20, 300-19, 200-34); + fUnicode = IsWindowUnicode(owner); + oldUpdateProc = (WNDPROC) ((fUnicode) ? SetWindowLongPtrW(owner, GWLP_WNDPROC, (LONG_PTR)BrowserSubclassProc) : + SetWindowLongPtrA(owner, GWLP_WNDPROC, (LONG_PTR)BrowserSubclassProc)); + SetWindowTextW(owner, getStringW(IDS_WINAMP_UPDATE, NULL, 0)); + } + + return m_hwnd; +} + +// --------------------------------------------------------------- +void UpdateBrowser::NavigateToName(LPCTSTR pszUrl) +{ + if (!m_pweb) return ; + DWORD dwChars = lstrlen (pszUrl) + 1; + LPWSTR pwszUrl = (LPWSTR)LocalAlloc (LPTR, dwChars * sizeof (WCHAR)); + long moptions = navNoReadFromCache | navNoWriteToCache | navNoHistory; + VARIANT options; + memset( (void*)&options, 0, sizeof(VARIANT)); + V_VT(&options) = VT_I4; + V_I4(&options) = moptions; + if (pwszUrl) + { + MultiByteToWideCharSZ(CP_ACP, 0, (LPCSTR)pszUrl, -1, pwszUrl, dwChars); + m_pweb->Navigate (pwszUrl, &options , 0, 0, 0); + LocalFree (pwszUrl); + } +} + + +#define VIDEO_GENFF_SIZEREQUEST (WM_USER+2048) +void UpdateBrowser::Resized(unsigned long width, unsigned long height) +{ + updateBrowser->setLocation(11,20, width, height); + + if (GetParent(m_hwnd)) + SendMessageW(GetParent(m_hwnd), VIDEO_GENFF_SIZEREQUEST, width, height); + else + SetWindowPos(m_hwnd, 0, 0, 0, width + 19, height + 34, SWP_NOMOVE|SWP_ASYNCWINDOWPOS); + + InvalidateRect(m_hwnd, NULL, TRUE); + +} + +HRESULT UpdateBrowser::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) +{ + if (NULL == ppDispatch) + return E_POINTER; + + ExternalCOM *external; + HRESULT hr = JSAPI1_GetExternal(&external); + if (FAILED(hr)) external = NULL; + + *ppDispatch = (IDispatch*) external; + return S_OK; +} + + +void UpdateBrowser::OnNavigateComplete() +{ + setVisible(TRUE); + RECT r; + GetClientRect(m_hwnd, &r); + setLocation(11,20, r.right-19, r.bottom-34); +}
\ No newline at end of file |