mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
214 lines
No EOL
5 KiB
C++
214 lines
No EOL
5 KiB
C++
#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);
|
|
} |