aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/browserPopup.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/omBrowser/browserPopup.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/omBrowser/browserPopup.cpp')
-rw-r--r--Src/omBrowser/browserPopup.cpp2093
1 files changed, 2093 insertions, 0 deletions
diff --git a/Src/omBrowser/browserPopup.cpp b/Src/omBrowser/browserPopup.cpp
new file mode 100644
index 00000000..866f537d
--- /dev/null
+++ b/Src/omBrowser/browserPopup.cpp
@@ -0,0 +1,2093 @@
+#include "main.h"
+#include "./browser.h"
+#include "./browserUiInternal.h"
+#include "./browserPopup.h"
+#include "./browserHost.h"
+#include "./browserThread.h"
+#include "./graphics.h"
+#include "./resource.h"
+#include "./toolbar.h"
+#include "./statusbar.h"
+#include "./curtain.h"
+#include "../winamp/skinWindowIPC.h"
+#include "../Plugins/General/gen_ml/colors.h"
+
+#include "./obj_ombrowser.h"
+#include "./ifc_omservice.h"
+#include "./ifc_omserviceeventmngr.h"
+#include "./ifc_omserviceevent.h"
+#include "./ifc_ombrowserwndmngr.h"
+#include "./ifc_ombrowsereventmngr.h"
+
+#include "./ifc_omconfig.h"
+#include "./ifc_omtoolbarconfig.h"
+#include "./ifc_omstatusbarconfig.h"
+
+#include "./ifc_wasabihelper.h"
+#include "./ifc_skinhelper.h"
+#include "./ifc_skinnedbrowser.h"
+
+#include "./browserUiHook.h"
+
+#ifdef _DEBUG
+#pragma warning( push )
+#pragma warning( disable : 4244 )
+#endif
+
+#include <api/wnd/api_window.h>
+
+#ifdef _DEBUG
+#pragma warning( pop )
+#endif
+
+
+#include "../winamp/wa_dlg.h"
+
+#include <exdispid.h>
+#include <strsafe.h>
+
+#define IDC_BROWSER 0x1000
+#define IDC_TOOLBAR 0x1001
+#define IDC_STATUSBAR 0x1002
+
+#define BPT_ACTIVATEFRAME 27
+#define BPT_ACTIVATEFRAME_DELAY 300
+
+#define OSWNDHOST_REQUEST_IDEAL_SIZE (WM_USER + 2048)
+
+typedef struct __BROWSERPOPUPCREATEPARAM
+{
+ obj_ombrowser *browserManager;
+ ifc_omservice *service;
+ WPARAM callbackParam;
+ DISPATCHAPC callback;
+ HWND hOwner;
+} BROWSERPOPUPCREATEPARAM;
+
+
+typedef struct __POPUPRESTORE
+{
+ UINT style;
+ UINT exStyle;
+ RECT rect;
+ UINT embedStyle;
+ UINT embedFlags;
+ GUID embedGuid;
+ HWND hOwner; // NULL - if DlgParent
+} POPUPRESTORE;
+
+#define BPF_LOCKRESIZE 0x00000001
+#define BPF_FORCEDTOPMOST 0x00000002
+#define BPF_MODECHANGELOCK 0x00000004
+
+typedef struct __BROWSERPOPUP
+{
+
+ UINT extendedStyle;
+ UINT flags;
+ obj_ombrowser *browserManager;
+ ifc_omservice *service;
+ LPWSTR storedUrl;
+ BSTR storedData;
+ HWND lastFocus;
+ BrowserUiHook *browserHook;
+ WPARAM callbackParam;
+ DISPATCHAPC callback;
+ COLORREF rgbBack;
+ POPUPRESTORE *restore;
+ HWND hOwner;
+} BROWSERPOPUP;
+
+#define FULLSCREEN_STYLE_FILTER (WS_CAPTION | WS_THICKFRAME | WS_SYSMENU | WS_POPUP)
+#define FULLSCREEN_EXSTYLE_FILTER (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_DLGMODALFRAME | WS_EX_TOOLWINDOW)
+
+
+#define GetPopup(__hwnd) ((BROWSERPOPUP*)(LONG_PTR)(LONGX86)GetWindowLongPtr((__hwnd), 0))
+
+static LRESULT CALLBACK BrowserPopup_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+
+
+static BOOL BrowserPopup_RegisterClass(HINSTANCE hInstance)
+{
+ WNDCLASS wc;
+ if (GetClassInfo(hInstance, NWC_OMBROWSERPOPUP, &wc)) return TRUE;
+
+ ZeroMemory(&wc, sizeof(WNDCLASS));
+
+ wc.hInstance = hInstance;
+ wc.lpszClassName = NWC_OMBROWSERPOPUP;
+ wc.lpfnWndProc = BrowserPopup_WindowProc;
+ wc.style = CS_DBLCLKS;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = NULL;
+ wc.cbWndExtra = sizeof(BROWSERPOPUP*);
+
+ if (0 == RegisterClassW(&wc))
+ return FALSE;
+
+
+ return TRUE;
+}
+
+
+HWND BrowserPopup_Create(obj_ombrowser *browserManager, ifc_omservice *service, UINT fStyle, INT x, INT y, INT cx, INT cy, HWND hOwner, DISPATCHAPC callback, ULONG_PTR callbackParam)
+{
+ if (FALSE == BrowserPopup_RegisterClass(Plugin_GetInstance()))
+ return NULL;
+
+ Toolbar_RegisterClass(Plugin_GetInstance());
+ Statusbar_RegisterClass(Plugin_GetInstance());
+
+ if (NULL == hOwner && FAILED(Plugin_GetWinampWnd(&hOwner)))
+ hOwner = NULL;
+
+ BROWSERPOPUPCREATEPARAM param;
+ ZeroMemory(&param, sizeof(BROWSERPOPUPCREATEPARAM));
+
+ param.browserManager = browserManager;
+ param.service = service;
+ param.callback = callback;
+ param.callbackParam = callbackParam;
+ param.hOwner = hOwner;
+
+ HWND hPopup = CreateWindowEx(WS_EX_WINDOWEDGE,
+ NWC_OMBROWSERPOPUP, OMBROWSER_NAME,
+ WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | (0x0000FFFFF & fStyle),
+ x, y, cx, cy,
+ hOwner, NULL,
+ Plugin_GetInstance(), &param);
+
+ return hPopup;
+}
+
+
+static HWND BrowserPopup_GetFrame(HWND hwnd)
+{
+ HWND hFrame = hwnd;
+ while (NULL != hFrame &&
+ 0 != (WS_CHILD & GetWindowLongPtr(hFrame, GWL_STYLE)))
+ {
+ hFrame = GetAncestor(hFrame, GA_PARENT);
+ }
+ return hFrame;
+}
+
+static void BrowserPopup_Paint(HWND hwnd, HDC hdc, const RECT *prcPaint, BOOL fErase)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ SetBkColor(hdc, popup->rgbBack);
+ ExtTextOut(hdc, 0, 0, ETO_OPAQUE, prcPaint, NULL, 0, NULL);
+}
+
+static void BrowserPopup_UpdateTitle(HWND hwnd, LPCWSTR pszTitle)
+{
+ if (NULL == hwnd) return;
+
+ WCHAR szBuffer[256] = {0};
+ LPWSTR cursor = szBuffer;
+ size_t remaining = ARRAYSIZE(szBuffer);
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup)
+ {
+ if (NULL != popup->service)
+ {
+ WCHAR szName[128] = {0};
+ if (SUCCEEDED(popup->service->GetName(szName, ARRAYSIZE(szName))) && L'\0' != szName[0])
+ StringCchCopyEx(cursor, remaining, szName, &cursor, &remaining, STRSAFE_NULL_ON_FAILURE);
+ }
+
+ HWND hFrame = (SENDWAIPC(hwnd, IPC_SKINWINDOW_GETEMBEDNUMS, 0) ? NULL : BrowserPopup_GetFrame(hwnd));
+ if (NULL != pszTitle && hFrame != hwnd) // for now we can't update title in classic skin
+ {
+ if (cursor != szBuffer)
+ StringCchCopyEx(cursor, remaining, L": ", &cursor, &remaining, STRSAFE_NULL_ON_FAILURE);
+ StringCchCopyEx(cursor, remaining, pszTitle, &cursor, &remaining, STRSAFE_NULL_ON_FAILURE);
+ }
+ else
+ {
+ /* if (NULL != popup->container)
+ {
+ IWebBrowser2 *pWeb2;
+ if (SUCCEEDED(popup->container->GetIWebBrowser2(&pWeb2)))
+ {
+ BSTR bstrTitle;
+ if (SUCCEEDED(pWeb2->get_LocationName(&bstrTitle)) && NULL != bstrTitle)
+ {
+ StringCchCopyEx(cursor, remaining, bstrTitle, &cursor, &remaining, STRSAFE_NULL_ON_FAILURE);
+ SysFreeString(bstrTitle);
+ }
+ pWeb2->Release();
+ }
+ }*/
+ }
+ }
+
+ if (cursor == szBuffer)
+ StringCchCopy(szBuffer, ARRAYSIZE(szBuffer), OMBROWSER_NAME);
+
+ SetWindowText(hwnd, szBuffer);
+}
+
+static HWND BrowserPopup_CreateToolbar(HWND hwnd)
+{
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hToolbar) return hToolbar;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return NULL;
+
+ UINT fStyle = GetWindowStyle(hwnd);
+
+ UINT toolbarStyle = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBS_LOCKUPDATE | TBS_SHOWADDRESS;
+ if (0 == (NBCS_NOTOOLBAR & fStyle))
+ toolbarStyle |= WS_VISIBLE;
+
+ ifc_omtoolbarconfig *toolbarConfig;
+ if (NULL != popup->browserManager && SUCCEEDED(popup->browserManager->GetConfig(&IFC_OmToolbarConfig, (void**)&toolbarConfig)))
+ {
+ if (S_OK == toolbarConfig->GetBottomDockEnabled())
+ toolbarStyle |= TBS_BOTTOMDOCK;
+ if (S_OK == toolbarConfig->GetAutoHideEnabled())
+ toolbarStyle |= TBS_AUTOHIDE;
+ if (S_OK == toolbarConfig->GetTabStopEnabled())
+ toolbarStyle |= TBS_TABSTOP;
+ if (S_OK == toolbarConfig->GetForceAddressbarEnabled())
+ toolbarStyle |= TBS_FORCEADDRESS;
+ if (S_OK == toolbarConfig->GetFancyAddressbarEnabled())
+ toolbarStyle |= TBS_FANCYADDRESS;
+
+ toolbarConfig->Release();
+ }
+
+ HINSTANCE hInstance = (HINSTANCE)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_HINSTANCE);
+
+ hToolbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY,
+ NWC_ONLINEMEDIATOOLBAR, NULL, toolbarStyle,
+ 0, 0, 0, 0, hwnd, (HMENU)IDC_TOOLBAR, hInstance, NULL);
+
+ if (NULL == hToolbar)
+ return NULL;
+
+ UINT populateStyle = TBPF_NORMAL | TBPF_READONLYADDRESS;
+ if (0 != (NBCS_NOSERVICECOMMANDS & fStyle))
+ populateStyle |= TBPF_NOSERVICECOMMANDS;
+
+ Toolbar_AutoPopulate(hToolbar, popup->service, populateStyle);
+
+ toolbarStyle = GetWindowStyle(hToolbar);
+ if (0 != (TBS_LOCKUPDATE & toolbarStyle))
+ Toolbar_LockUpdate(hToolbar, FALSE);
+
+ return hToolbar;
+}
+
+static HWND BrowserPopup_CreateStatusbar(HWND hwnd)
+{
+ HWND hStatusbar = GetDlgItem(hwnd, IDC_STATUSBAR);
+ if (NULL != hStatusbar) return hStatusbar;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return NULL;
+
+ UINT fStyle = GetWindowStyle(hwnd);
+
+ UINT statusbarStyle = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_DISABLED;
+ if (0 == (NBCS_NOSTATUSBAR & fStyle))
+ {
+ ifc_omstatusbarconfig *statusbarConfig;
+ if (NULL != popup->browserManager && SUCCEEDED(popup->browserManager->GetConfig(&IFC_OmStatusbarConfig, (void**)&statusbarConfig)))
+ {
+ if (S_OK == statusbarConfig->GetEnabled())
+ statusbarStyle &= ~WS_DISABLED;
+ statusbarConfig->Release();
+ }
+ }
+
+ HINSTANCE hInstance = (HINSTANCE)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_HINSTANCE);
+
+ hStatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY,
+ NWC_ONLINEMEDIASTATUSBAR, NULL, statusbarStyle,
+ 0, 0, 0, 0, hwnd, (HMENU)IDC_STATUSBAR, hInstance, NULL);
+
+ return hStatusbar;
+}
+
+static BOOL BrowserPopup_PushRect(HWND hwnd, const RECT *rectIn, BOOL fOnlyIfExist)
+{
+ if (NULL == rectIn) return FALSE;
+
+ RECT *rect = (RECT*)GetProp(hwnd, TEXT("omBrowserPopupRect"));
+ if (FALSE != fOnlyIfExist && NULL == rect)
+ return FALSE;
+
+ if (NULL == rect)
+ {
+ rect = (RECT*)calloc(1, sizeof(RECT));
+ if (NULL == rect || FALSE == SetProp(hwnd, TEXT("omBrowserPopupRect"), rect))
+ {
+ if (NULL != rect) free(rect);
+ return FALSE;
+ }
+ }
+ return CopyRect(rect, rectIn);
+}
+
+static BOOL BrwoserPopup_PushClientRect(HWND hwnd, BOOL fOnlyIfExists)
+{
+ RECT clientRect;
+ if (!GetClientRect(hwnd, &clientRect))
+ return FALSE;
+
+ MapWindowPoints(hwnd, HWND_DESKTOP, (POINT*)&clientRect, 2);
+ return BrowserPopup_PushRect(hwnd, &clientRect, fOnlyIfExists);
+}
+
+static BOOL BrowserPopup_PopRect(HWND hwnd, RECT *rectOut, BOOL fNoRemove)
+{
+ RECT *rect = (RECT*)GetProp(hwnd, TEXT("omBrowserPopupRect"));
+ if (FALSE == fNoRemove)
+ {
+ RemoveProp(hwnd, TEXT("omBrowserPopupRect"));
+ }
+
+ if (NULL == rect)
+ return FALSE;
+
+ if (NULL != rectOut)
+ CopyRect(rectOut, rect);
+
+ if (FALSE == fNoRemove)
+ free(rect);
+
+ return TRUE;
+}
+
+static BOOL BrowserPopup_ClientToFrame(HWND hwnd, RECT *rect)
+{
+ if (NULL == rect) return FALSE;
+ RECT frameRect, clientRect;
+
+ ifc_window *wasabiWnd = (ifc_window*)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETWASABIWND, 0);
+ if (NULL != wasabiWnd)
+ {
+ ifc_window *wasabiParent = wasabiWnd->getDesktopParent();
+ if (NULL == wasabiParent) wasabiParent = wasabiWnd;
+
+ if (!wasabiParent->getWindowRect(&frameRect))
+ return FALSE;
+
+ wasabiWnd->getClientRect(&clientRect);
+ MapWindowPoints(wasabiWnd->gethWnd(), HWND_DESKTOP, (POINT*)&clientRect, 2);
+ }
+ else
+ {
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (!GetWindowRect(hFrame, &frameRect) || !GetClientRect(hwnd, &clientRect))
+ return FALSE;
+ MapWindowPoints(hwnd, HWND_DESKTOP, (POINT*)&clientRect, 2);
+ }
+
+ rect->left += (frameRect.left - clientRect.left);
+ rect->top += (frameRect.top - clientRect.top);
+ rect->right += (frameRect.right - clientRect.right);
+ rect->bottom += (frameRect.bottom - clientRect.bottom);
+
+ return TRUE;
+}
+
+static INT CALLBACK BrowserPopup_FFCallback(embedWindowState *windowState, INT eventId, LPARAM param)
+{
+ switch(eventId)
+ {
+ case FFC_CREATEEMBED:
+ if(NULL != windowState && NULL != param)
+ {
+ RECT rect;
+ if (BrowserPopup_PopRect(windowState->me, &rect, FALSE))
+ {
+ BrowserPopup_ClientToFrame(windowState->me, &rect);
+ BrowserPopup_SetFramePos(windowState->me, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
+ SWP_NOACTIVATE | SWP_NOZORDER);
+ }
+ }
+ break;
+ case FFC_DESTROYEMBED:
+ if(NULL != windowState && NULL != param)
+ {
+ ifc_window *window = (ifc_window*)param;
+ if (NULL != window)
+ {
+ RECT clientRect;
+ window->getClientRect(&clientRect);
+ MapWindowPoints(window->gethWnd(), HWND_DESKTOP, (POINT*)&clientRect, 2);
+ BrowserPopup_PushRect(windowState->me, &clientRect, FALSE);
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+
+static BOOL BrowserPopup_SkinWindow(HWND hwnd, const GUID *windowGuid)
+{
+ GUID windowId;
+
+ if (NULL == windowGuid || IsEqualGUID(*windowGuid, GUID_NULL))
+ {
+ static ULONG counter = 0L;
+ windowId = SkinClass_BrowserPopup;
+ windowId.Data1 += counter;
+ counter++;
+ }
+ else
+ CopyMemory(&windowId, windowGuid, sizeof(GUID));
+
+ BrwoserPopup_PushClientRect(hwnd, FALSE);
+
+ ifc_skinhelper *skinHelper;
+ HRESULT hr = Plugin_GetSkinHelper(&skinHelper);
+ if (SUCCEEDED(hr))
+ {
+ hr = skinHelper->SkinWindow(hwnd, &windowId, SWF_NOWINDOWMENU, BrowserPopup_FFCallback);
+ if (SUCCEEDED(hr))
+ {
+ SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
+ }
+
+ skinHelper->Release();
+ }
+
+ return SUCCEEDED(hr);
+}
+
+static BOOL BrowserPopup_SwitchToFullscreen(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return FALSE;
+
+ RECT clientRect;
+ GetClientRect(hwnd, &clientRect);
+ MapWindowPoints(hwnd, HWND_DESKTOP, (POINT*)&clientRect, 2);
+
+ HMONITOR hMonitor = MonitorFromRect(&clientRect, MONITOR_DEFAULTTONEAREST);
+ MONITORINFO mi;
+ ZeroMemory(&mi, sizeof(MONITORINFO));
+ mi.cbSize = sizeof(MONITORINFO);
+ if (!GetMonitorInfo(hMonitor, &mi)) return FALSE;
+
+ POPUPRESTORE *restore = popup->restore;
+ if (NULL == restore)
+ {
+ restore = (POPUPRESTORE*)calloc(1, sizeof(POPUPRESTORE));
+ if (NULL == restore) return FALSE;
+ popup->restore = restore;
+ }
+
+ popup->flags |= BPF_MODECHANGELOCK;
+
+ CopyRect(&restore->rect, &clientRect);
+
+ restore->embedStyle = (UINT)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETEXSTYLE, 0);
+ restore->embedFlags = (UINT)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETEMBEDFLAGS, 0);
+ if (FALSE == SENDWAIPC(hwnd, IPC_SKINWINDOW_GETEMBEDFLAGS, &restore->embedGuid))
+ ZeroMemory(&restore->embedGuid, sizeof(GUID));
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ BOOL fTopmost = (NULL != hFrame && 0 != (WS_EX_TOPMOST & GetWindowStyleEx(hFrame)));
+
+ SENDWAIPC(hwnd, IPC_SKINWINDOW_UNSKIN, 0);
+
+ restore->hOwner = (HWND)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_HWNDPARENT);
+
+ HWND hWinamp;
+ if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
+ hWinamp = NULL;
+
+ HWND hDlgParent = (HWND)SENDWAIPC(hWinamp, IPC_GETDIALOGBOXPARENT, 0);
+ if (NULL != hDlgParent && restore->hOwner == hDlgParent)
+ restore->hOwner = NULL;
+
+ HWND hDesktop = GetDesktopWindow();
+ SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONGX86)(LONG_PTR)hDesktop);
+
+ DWORD style = GetWindowStyle(hwnd);
+ restore->style = (FULLSCREEN_STYLE_FILTER & style);
+ SetWindowLongPtr(hwnd, GWL_STYLE, style & ~FULLSCREEN_STYLE_FILTER);
+
+ style = GetWindowStyleEx(hwnd);
+ restore->exStyle = (FULLSCREEN_EXSTYLE_FILTER & style);
+ SetWindowLongPtr(hwnd, GWL_EXSTYLE, style & ~FULLSCREEN_EXSTYLE_FILTER);
+
+ if (FALSE == fTopmost)
+ {
+ SetWindowPos(hwnd, HWND_TOPMOST, mi.rcMonitor.left, mi.rcMonitor.top,
+ mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, SWP_NOACTIVATE | SWP_FRAMECHANGED);
+
+ SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOREDRAW);
+ }
+ else
+ {
+ SetWindowPos(hwnd, HWND_TOPMOST, mi.rcMonitor.left, mi.rcMonitor.top,
+ mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top, SWP_FRAMECHANGED);
+ }
+
+ popup->flags &= ~BPF_MODECHANGELOCK;
+ return TRUE;
+}
+
+static BOOL BrowserPopup_Restore(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup || NULL == popup->restore) return FALSE;
+
+ POPUPRESTORE *restore = popup->restore;
+ popup->restore = NULL;
+ popup->flags |= BPF_MODECHANGELOCK;
+
+ ShowWindow(hwnd, SW_HIDE);
+
+ if (NULL == restore->hOwner)
+ {
+ HWND hWinamp;
+ if (SUCCEEDED(Plugin_GetWinampWnd(&hWinamp)))
+ {
+ restore->hOwner = (HWND)SENDWAIPC(hWinamp, IPC_GETDIALOGBOXPARENT, 0);
+ }
+ }
+
+ SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONGX86)(LONG_PTR)restore->hOwner);
+
+ DWORD style;
+ style = GetWindowStyleEx(hwnd);
+ SetWindowLongPtr(hwnd, GWL_EXSTYLE, style | restore->exStyle);
+
+ style = GetWindowStyle(hwnd);
+ SetWindowLongPtr(hwnd, GWL_STYLE, style | restore->style);
+
+ BrowserPopup_SkinWindow(hwnd, &restore->embedGuid);
+ SENDWAIPC(hwnd, IPC_SKINWINDOW_SETEXSTYLE, restore->embedStyle);
+ SENDWAIPC(hwnd, IPC_SKINWINDOW_SETEMBEDFLAGS, restore->embedFlags);
+
+ BrowserPopup_PushRect(hwnd, &restore->rect, TRUE);
+ BrowserPopup_ClientToFrame(hwnd, &restore->rect);
+ SetWindowPos(hwnd, NULL, restore->rect.left, restore->rect.top,
+ restore->rect.right - restore->rect.left, restore->rect.bottom - restore->rect.top, SWP_NOACTIVATE | SWP_NOZORDER);
+
+ popup->flags &= ~BPF_MODECHANGELOCK;
+
+ ShowWindow(hwnd, SW_SHOWNA);
+ BrowserPopup_ActivateFrame(hwnd);
+
+ free(restore);
+ return TRUE;
+}
+
+static void BrowserPopup_CloseWindow(HWND hwnd)
+{
+ POINT pt;
+ GetCursorPos(&pt);
+ SendMessage(hwnd, WM_SYSCOMMAND, (WPARAM)SC_CLOSE, MAKELPARAM(pt.x, pt.y));
+}
+
+static BOOL BrowserPopup_SetStatusText(HWND hwnd, LPCWSTR pszText)
+{
+ HWND hStatusbar = GetDlgItem(hwnd, IDC_STATUSBAR);
+ if (NULL == hStatusbar) return FALSE;
+
+ Statusbar_Update(hStatusbar, pszText);
+ return TRUE;
+}
+
+static BOOL BrowserPopup_SetStatusTextRes(HWND hwnd, LPCWSTR pszText)
+{
+ if (NULL != pszText && IS_INTRESOURCE(pszText))
+ {
+ WCHAR szBuffer[512] = {0};
+ pszText = Plugin_LoadString((INT)(INT_PTR)pszText, szBuffer, ARRAYSIZE(szBuffer));
+ }
+ return BrowserPopup_SetStatusText(hwnd, pszText);
+}
+
+static BOOL BrowserPopup_ToggleFullscreen(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return FALSE;
+
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL == hBrowser) return FALSE;
+
+ UINT embedFlags = 0;
+ if (0 == (NBCS_EX_FULLSCREEN & popup->extendedStyle))
+ {
+ UINT windowStyle = GetWindowStyle(hwnd);
+ if (0 != (NBCS_DISABLEFULLSCREEN & windowStyle))
+ return FALSE;
+ embedFlags = (UINT)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETEMBEDFLAGS, 0);
+ }
+ else
+ {
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup && NULL != popup->restore)
+ embedFlags = popup->restore->embedFlags;
+ }
+
+ if (0 != (SWF_NORESIZE & embedFlags))
+ return FALSE;
+
+ return PostMessage(hBrowser, NBHM_TOGGLEFULLSCREEN, 0, 0L);
+}
+
+static void BrowserPopup_RegisterUiHook(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup || NULL != popup->browserHook) return;
+
+ if (FAILED(BrowserUiHook::CreateInstance(hwnd, TRUE, &popup->browserHook)))
+ return;
+
+ popup->browserHook->Register(popup->browserManager, popup->service);
+}
+
+static LRESULT BrowserPopup_OnCreate(HWND hwnd, CREATESTRUCT *pcs)
+{
+ BROWSERPOPUPCREATEPARAM *createParam = (BROWSERPOPUPCREATEPARAM*)pcs->lpCreateParams;
+ BROWSERPOPUP *popup = (BROWSERPOPUP*)calloc(1, sizeof(BROWSERPOPUP));
+
+ if (NULL != popup)
+ {
+ SetLastError(ERROR_SUCCESS);
+ if (!SetWindowLongPtr(hwnd, 0, (LONGX86)(LONG_PTR)popup) && ERROR_SUCCESS != GetLastError())
+ {
+ free(popup);
+ popup = NULL;
+ }
+ }
+
+ if (NULL == popup)
+ {
+ DestroyWindow(hwnd);
+ return -1;
+ }
+
+ if (NULL != createParam)
+ {
+ popup->browserManager = createParam->browserManager;
+ if (NULL != popup->browserManager)
+ popup->browserManager->AddRef();
+
+ popup->service = createParam->service;
+ if (NULL != popup->service)
+ popup->service->AddRef();
+
+ popup->callback = createParam->callback;
+ popup->callbackParam = createParam->callbackParam;
+ popup->hOwner = createParam->hOwner;
+ }
+
+ BrowserPopup_RegisterUiHook(hwnd);
+
+ SendMessage(hwnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_SET, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0L);
+
+ HWND hToolbar = BrowserPopup_CreateToolbar(hwnd);
+ HWND hStatusbar = BrowserPopup_CreateStatusbar(hwnd);
+
+ RECT clientRect;
+ GetClientRect(hwnd, &clientRect);
+
+ UINT hostStyle = NBHS_POPUP;
+ if (0 != (NBCS_DISABLECONTEXTMENU & pcs->style)) hostStyle |= NBHS_DISABLECONTEXTMENU;
+ if (0 != (NBCS_DIALOGMODE & pcs->style)) hostStyle |= NBHS_DIALOGMODE;
+ if (0 != (NBCS_DISABLEHOSTCSS & pcs->style)) hostStyle |= NBHS_DISABLEHOSTCSS;
+
+ HACCEL hAccel = BrowserControl_GetAccelTable(ACCELTABLE_POPUP);
+
+ HWND hHost = BrowserHost_CreateWindow(popup->browserManager, hwnd, hostStyle, clientRect.left, clientRect.top,
+ clientRect.right - clientRect.left, clientRect.bottom - clientRect.top, IDC_BROWSER, hAccel);
+
+ if (NULL == hHost)
+ {
+ DestroyWindow(hwnd);
+ return -1;
+ }
+
+ if (NULL != hToolbar)
+ {
+ Toolbar_SetBrowserHost(hToolbar, hHost);
+ }
+
+ if (NULL != hStatusbar)
+ {
+ Statusbar_SetBrowserHost(hStatusbar, hHost);
+ Statusbar_SetActive(hStatusbar, (0 == (WS_DISABLED & GetWindowLongPtr(hStatusbar, GWL_STYLE))));
+ }
+
+ ifc_wasabihelper *wasabiHelper;
+ if (SUCCEEDED(Plugin_GetWasabiHelper(&wasabiHelper)))
+ {
+ api_application *app;
+ if (SUCCEEDED(wasabiHelper->GetApplicationApi(&app)))
+ {
+ app->app_registerGlobalWindow(hwnd);
+
+ if (NULL != hAccel)
+ app->app_addAccelerators(hwnd, &hAccel, 1, TRANSLATE_MODE_CHILD);
+
+ app->Release();
+ }
+ wasabiHelper->Release();
+ }
+
+ BrowserPopup_UpdateTitle(hwnd, NULL);
+ BrowserPopup_SkinWindow(hwnd, NULL);
+
+ if (NULL != popup->browserManager)
+ {
+ ifc_ombrowserwndmngr *windowManager;
+ if (SUCCEEDED(popup->browserManager->QueryInterface(IFC_OmBrowserWindowManager, (void**)&windowManager)))
+ {
+ windowManager->RegisterWindow(hwnd, &WTID_BrowserPopup);
+ windowManager->Release();
+ }
+
+ ifc_ombrowsereventmngr *eventManager;
+ if (SUCCEEDED(popup->browserManager->QueryInterface(IFC_OmBrowserEventManager, (void**)&eventManager)))
+ {
+ eventManager->Signal_WindowCreate(hwnd, &WTID_BrowserPopup);
+ eventManager->Release();
+ }
+ }
+ return 0;
+}
+
+static void BrowserPopup_OnDestroy(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ SetWindowLongPtr(hwnd, 0, 0L);
+
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL != hBrowser)
+ {
+ DWORD browserStyle = GetWindowStyle(hBrowser);
+ if (0 != (WS_VISIBLE & browserStyle))
+ SetWindowLongPtr(hBrowser, GWL_STYLE, browserStyle & ~WS_VISIBLE);
+
+ HWND hWinamp = NULL;
+ if (Plugin_GetWinampWnd(&hWinamp))
+ hWinamp = NULL;
+
+ SetWindowLongPtr(hBrowser, GWLP_HWNDPARENT, (LONGX86)(LONG_PTR)hWinamp);
+
+ if (NULL == popup || NULL == popup->browserManager ||
+ S_OK == popup->browserManager->IsFinishing() ||
+ 0 == PostMessage(hBrowser, NBHM_DESTROY, 0, 0L))
+ {
+ DWORD_PTR result;
+ SendMessageTimeout(hBrowser, NBHM_DESTROY, TRUE, 0L, SMTO_NOTIMEOUTIFNOTHUNG | SMTO_BLOCK, 500, &result);
+
+ }
+ }
+
+ BrowserPopup_PopRect(hwnd, NULL, FALSE);
+
+ if (NULL != popup)
+ {
+ popup->extendedStyle &= ~(NBCS_EX_BROWSERREADY | NBCS_EX_NAVCOMPLETED);
+ popup->extendedStyle |= NBCS_EX_BLOCKNAVIGATION;
+
+ if (NULL != popup->browserHook)
+ {
+ popup->browserHook->Unregister(popup->browserManager, popup->service);
+ popup->browserHook->Release();
+ }
+
+ if (NULL != popup->service)
+ {
+ popup->service->Release();
+ popup->service = NULL;
+ }
+
+ if (NULL != popup->restore)
+ {
+ free(popup->restore);
+ }
+
+ Plugin_FreeResString(popup->storedUrl);
+ popup->storedUrl = NULL;
+
+ SysFreeString(popup->storedData);
+ popup->storedData = NULL;
+
+ if (NULL != popup->browserManager)
+ {
+ ifc_ombrowserwndmngr *windowManager;
+ if (SUCCEEDED(popup->browserManager->QueryInterface(IFC_OmBrowserWindowManager, (void**)&windowManager)))
+ {
+ windowManager->UnregisterWindow(hwnd);
+ windowManager->Release();
+ }
+
+ ifc_ombrowsereventmngr *eventManager = NULL;
+ if (SUCCEEDED(popup->browserManager->QueryInterface(IFC_OmBrowserEventManager, (void**)&eventManager)))
+ {
+ eventManager->Signal_WindowClose(hwnd, &WTID_BrowserPopup);
+ eventManager->Release();
+ }
+
+ popup->browserManager->Release();
+ popup->browserManager = NULL;
+ }
+
+ free(popup);
+ }
+
+ ifc_wasabihelper *wasabiHelper = NULL;
+ if (SUCCEEDED(Plugin_GetWasabiHelper(&wasabiHelper)))
+ {
+ api_application *app;
+ if (SUCCEEDED(wasabiHelper->GetApplicationApi(&app)))
+ {
+ app->app_unregisterGlobalWindow(hwnd);
+ app->app_removeAccelerators(hwnd);
+ app->Release();
+ }
+ wasabiHelper->Release();
+ }
+}
+
+static void BrowserPopup_OnPaint(HWND hwnd)
+{
+ PAINTSTRUCT ps;
+ if (BeginPaint(hwnd, &ps))
+ {
+ if (ps.rcPaint.left != ps.rcPaint.right)
+ BrowserPopup_Paint(hwnd, ps.hdc, &ps.rcPaint, ps.fErase);
+ EndPaint(hwnd, &ps);
+ }
+}
+
+static void BrowserPopup_OnPrintClient(HWND hwnd, HDC hdc, UINT options)
+{
+ RECT clientRect;
+ if (GetClientRect(hwnd, &clientRect))
+ BrowserPopup_Paint(hwnd, hdc, &clientRect, 0 != (PRF_ERASEBKGND & options));
+}
+
+static void BrowserPopup_OnWindowPosChanging(HWND hwnd, WINDOWPOS *pwp)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup && 0 != (BPF_LOCKRESIZE & popup->flags))
+ {
+ HWND hWinamp = NULL;
+ if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
+ hWinamp = NULL;
+
+ if (NULL != hWinamp && hWinamp == (HWND)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_HWNDPARENT))
+ {
+ RECT rect;
+ if (BrowserPopup_PopRect(hwnd, &rect, TRUE))
+ {
+ BrowserPopup_ClientToFrame(hwnd, &rect);
+ pwp->x = rect.left;
+ pwp->y = rect.top;
+ pwp->cx = rect.right - rect.left;
+ pwp->cy = rect.bottom - rect.top;
+ }
+ }
+ }
+}
+
+static void BrowserPopup_OnWindowPosChanged(HWND hwnd, WINDOWPOS *pwp)
+{
+ if (SWP_NOSIZE == ((SWP_NOSIZE | SWP_FRAMECHANGED) & pwp->flags))
+ return;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup)
+ {
+ BrowserControl_UpdateLayout(hwnd, 0 == (SWP_NOREDRAW & pwp->flags),
+ 0 != (SWP_FRAMECHANGED & pwp->flags), NULL, NULL);
+ }
+}
+
+static void BrowserPopup_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND hControl)
+{
+ switch(commandId)
+ {
+ case IDC_TOOLBAR: BrowserControl_ProcessToolbarCommand(hwnd, eventId); break;
+ case IDC_STATUSBAR: BrowserControl_ProcessStatusbarCommand(hwnd, eventId); break;
+ default:
+ if (FALSE == BrowserControl_ProcessCommonCommand(hwnd, commandId))
+ {
+ switch(commandId)
+ {
+ case ID_WINDOW_CLOSE: BrowserPopup_CloseWindow(hwnd); break;
+ case ID_WINDOW_FULLSCREEN: BrowserPopup_ToggleFullscreen(hwnd); break;
+ }
+ }
+ break;
+ }
+}
+
+static LRESULT BrowserPopup_OnAppCommand(HWND hwnd, HWND hTarget, INT commandId, INT deviceId, INT keys)
+{
+ return BrowserControl_ProcessAppCommand(hwnd, commandId);
+}
+
+static void BrowserPopup_OnBrowserReady(HWND hwnd)
+{
+ ReplyMessage(0);
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ popup->extendedStyle |= NBCS_EX_BROWSERREADY;
+
+ BrowserControl_UpdateLayout(hwnd, FALSE, FALSE, NULL, NULL);
+
+ HWND hToolbar = BrowserControl_GetToolbar(hwnd);
+ if (NULL != hToolbar)
+ Toolbar_EnableItem(hToolbar, TOOLITEM_ADDRESSBAR, TRUE);
+
+ if (NULL != popup->callback)
+ {
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL == hBrowser ||
+ FALSE == PostMessage(hBrowser, NBHM_GETDISPATCHAPC, (WPARAM)popup->callbackParam, (LPARAM)popup->callback))
+ {
+ // sucks
+ popup->callback(NULL, popup->callbackParam);
+ }
+
+ popup->callback = NULL;
+ return;
+ }
+
+ if (NULL != popup->storedUrl)
+ {
+ LPWSTR pszUrl = popup->storedUrl;
+ popup->storedUrl = NULL;
+ BrowserPopup_Navigate(hwnd, pszUrl, TRUE);
+ Plugin_FreeResString(pszUrl);
+ }
+ else
+ {
+ BrowserPopup_NavigateHome(hwnd, TRUE);
+ }
+}
+
+
+
+static void CALLBACK BrowserPopup_ActivateTimer(HWND hwnd, UINT uMsg, UINT_PTR eventId, DWORD time)
+{
+ KillTimer(hwnd, eventId);
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL != hFrame)
+ {
+ DWORD frameStyle = GetWindowStyleEx(hFrame);
+
+ if (0 != (WS_EX_TOPMOST & frameStyle) && 0 != (BPF_FORCEDTOPMOST & popup->flags))
+ {
+ popup->flags &= ~BPF_FORCEDTOPMOST;
+ SetWindowPos(hFrame, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE| SWP_NOMOVE | SWP_NOOWNERZORDER);
+ }
+
+ SetWindowPos(hFrame, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE| SWP_NOMOVE | SWP_NOOWNERZORDER);
+ }
+
+ PostMessage(hwnd, NBPM_ACTIVATEFRAME, 0, 0L);
+
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL != hBrowser)
+ PostMessage(hBrowser, NBHM_ACTIVATE, 0, 0L);
+}
+
+static void BrowserPopup_OnNavigateComplete(HWND hwnd, IDispatch *pDispath, VARIANT *URL, BOOL fTopFrame)
+{
+ if (FALSE == fTopFrame)
+ return;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ popup->extendedStyle |= NBCS_EX_NAVIGATEDONCE;
+
+ LPWSTR pszUrl = NULL;
+ if (NULL != URL && VT_BSTR == URL->vt && NULL != URL->bstrVal)
+ pszUrl = Plugin_CopyString(URL->bstrVal);
+
+ ReplyMessage(0);
+
+ if (NULL != pszUrl)
+ {
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hToolbar)
+ {
+ INT itemId = Toolbar_FindItem(hToolbar, TOOLITEM_ADDRESSBAR);
+ if (ITEM_ERR != itemId)
+ Toolbar_SetItemString(hToolbar, MAKEINTRESOURCE(itemId), pszUrl);
+ }
+ Plugin_FreeString(pszUrl);
+ }
+}
+
+static void BrowserPopup_OnDocumentReady(HWND hwnd, IDispatch *pDispath, VARIANT *URL, BOOL fTopFrame)
+{
+ ReplyMessage(0);
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ if (0 == (NBCS_EX_NAVCOMPLETED & popup->extendedStyle))
+ {
+ popup->extendedStyle |= NBCS_EX_NAVCOMPLETED;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup && NULL != popup->storedData)
+ {
+ BrowserPopup_WriteDocument(hwnd, popup->storedData, FALSE);
+ }
+
+ if(0 == (NBCS_EX_SCRIPTMODE & popup->extendedStyle))
+ {
+ HWND hHost = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL != hHost &&
+ 0 == (WS_VISIBLE & GetWindowLongPtr(hHost, GWL_STYLE)))
+ {
+ ShowWindowAsync(hHost, SW_SHOWNA);
+ }
+ }
+
+ }
+
+
+}
+
+static void BrowserPopup_OnBrowserActive(HWND hwnd, BOOL fActive)
+{
+ ReplyMessage(0);
+
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hToolbar)
+ {
+ Toolbar_EnableItem(hToolbar, TOOLITEM_DOWNLOADPROGRESS, fActive);
+ }
+
+ HWND hStatusbar = GetDlgItem(hwnd, IDC_STATUSBAR);
+ if (NULL != hStatusbar)
+ {
+ if (FALSE != fActive && (0 != (WS_DISABLED & GetWindowLongPtr(hStatusbar, GWL_STYLE))))
+ fActive = FALSE;
+ Statusbar_SetActive(hStatusbar, fActive);
+ }
+}
+
+static void BrowserPopup_OnCommandStateChange(HWND hwnd, UINT commandId, BOOL fEnable)
+{
+ ReplyMessage(0);
+
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hToolbar)
+ {
+ switch(commandId)
+ {
+ case Browser::commandBack:
+ Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_BACK, fEnable);
+ Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_HISTORY, (FALSE != fEnable) ?
+ TRUE :
+ (0 == Toolbar_GetItemStyle(hToolbar, TOOLITEM_BUTTON_FORWARD, TBIS_DISABLED)));
+ break;
+
+ case Browser::commandForward:
+ Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_FORWARD, fEnable);
+ Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_HISTORY, (FALSE != fEnable) ?
+ TRUE :
+ (0 == Toolbar_GetItemStyle(hToolbar, TOOLITEM_BUTTON_BACK, TBIS_DISABLED)));
+ break;
+ case Browser::commandStop: Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_STOP, fEnable); break;
+ case Browser::commandRefresh:
+ Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_REFRESH, fEnable);
+ Toolbar_EnableItem(hToolbar, TOOLITEM_BUTTON_HOME, fEnable);
+ break;
+ }
+ }
+
+}
+
+static void BrowserPopup_OnStatusChange(HWND hwnd, LPCWSTR pszText)
+{
+ HWND hStatusbar = GetDlgItem(hwnd, IDC_STATUSBAR);
+ if (NULL == hStatusbar) return;
+
+ WCHAR szBuffer[512] = {0};
+ if (NULL == pszText || L'\0' == *pszText) szBuffer[0] = L'\0';
+ else StringCchCopy(szBuffer, ARRAYSIZE(szBuffer), pszText);
+
+ ReplyMessage(0);
+
+ Statusbar_Update(hStatusbar, szBuffer);
+}
+
+static void BrowserPopup_OnTitleChange(HWND hwnd, LPCWSTR pszText)
+{
+ WCHAR szBuffer[256] = {0};
+ if (NULL == pszText || L'\0' == *pszText) szBuffer[0] = L'\0';
+ else StringCchCopy(szBuffer, ARRAYSIZE(szBuffer), pszText);
+
+ ReplyMessage(0);
+
+ BrowserPopup_UpdateTitle(hwnd, szBuffer);
+
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hToolbar)
+ {
+ INT itemId = Toolbar_FindItem(hToolbar, TOOLITEM_ADDRESSBAR);
+ if (ITEM_ERR != itemId)
+ Toolbar_SetItemDescription(hToolbar, MAKEINTRESOURCE(itemId), szBuffer);
+ }
+}
+
+static void BrowserPopup_OnSecureIconChange(HWND hwnd, UINT iconId)
+{
+ ReplyMessage(0);
+
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hToolbar)
+ {
+ INT itemId = Toolbar_FindItem(hToolbar, TOOLITEM_BUTTON_SECURECONNECTION);
+ if (ITEM_ERR != itemId)
+ {
+ WCHAR szBuffer[256] = {0};
+
+ if(FAILED(FormatEncryptionString(iconId, szBuffer, ARRAYSIZE(szBuffer))))
+ szBuffer[0] = L'\0';
+
+ Toolbar_ShowItem(hToolbar, MAKEINTRESOURCE(itemId), (secureLockIconUnsecure != iconId));
+ Toolbar_SetItemDescription(hToolbar, MAKEINTRESOURCE(itemId), szBuffer);
+ }
+ }
+}
+
+
+
+static LRESULT BrowserPopup_OnCreatePopup(HWND hwnd, DISPATCHAPC callback, ULONG_PTR param)
+{
+ ReplyMessage(TRUE);
+
+ HWND hPopup = NULL;
+
+ UINT windowStyle = GetWindowStyle(hwnd);
+ if (0 == (NBCS_BLOCKPOPUP & windowStyle))
+ {
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup)
+ {
+ RECT windowRect;
+ GetWindowRect(hwnd, &windowRect);
+
+ UINT popupStyle = NBCS_NOSERVICECOMMANDS | NBCS_DISABLEHOSTCSS;
+ popupStyle |= (NBCS_POPUPOWNER & GetWindowStyle(hwnd));
+
+ HWND hOwner = NULL;
+ if (0 != (NBCS_POPUPOWNER & popupStyle))
+ hOwner = popup->hOwner;
+
+ hPopup = BrowserPopup_Create(popup->browserManager, popup->service, popupStyle,
+ windowRect.left + 12, windowRect.top + 12, 640, 480, hOwner, callback, param);
+ }
+ }
+
+ if (NULL == hPopup)
+ {
+ if (NULL != callback)
+ callback(NULL, param);
+ return FALSE;
+ }
+
+ BrowserControl_SetExtendedStyle(hPopup, NBCS_EX_SCRIPTMODE, NBCS_EX_SCRIPTMODE);
+ BrowserPopup_UpdateSkin(hPopup, FALSE);
+ return TRUE;
+}
+static void BrowserPopup_OnVisibleChange(HWND hwnd, BOOL fVisible)
+{
+ ReplyMessage(0);
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL == hFrame) hFrame = hwnd;
+
+ if (FALSE != fVisible)
+ {
+ ShowWindow(hFrame, (0 == (WS_VISIBLE & GetWindowLongPtr(hFrame, GWL_STYLE))) ? SW_SHOWNOACTIVATE : SW_SHOW);
+
+ HWND hWinamp;
+ if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
+ hWinamp = NULL;
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ HWND hDlgParent = (HWND)SENDWAIPC(hWinamp, IPC_GETDIALOGBOXPARENT, 0);
+ if (NULL != hFrame && NULL != hDlgParent && hFrame != hDlgParent)
+ {
+ DWORD frameStyle = GetWindowStyleEx(hFrame);
+ if (0 == (WS_EX_TOPMOST & frameStyle))
+ {
+ popup->flags |= BPF_FORCEDTOPMOST;
+ SetWindowPos(hFrame, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE| SWP_NOMOVE | SWP_NOOWNERZORDER);
+ }
+ SetWindowPos(hFrame, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE| SWP_NOMOVE | SWP_NOOWNERZORDER);
+ }
+
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL != hBrowser)
+ {
+ ShowWindowAsync(hBrowser, SW_SHOWNA);
+ }
+
+ SetTimer(hwnd, BPT_ACTIVATEFRAME, BPT_ACTIVATEFRAME_DELAY, BrowserPopup_ActivateTimer);
+ }
+ else
+ {
+ ShowWindow(hFrame, SW_HIDE);
+ }
+}
+
+static void BrowserPopup_OnSetResizable(HWND hwnd, BOOL fEnabled)
+{
+ ReplyMessage(0);
+
+ UINT flags = (UINT)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETEMBEDFLAGS, 0);
+ if ((0 != (SWF_NORESIZE & flags)) != (FALSE == fEnabled))
+ {
+ if (FALSE == fEnabled) flags |= SWF_NORESIZE;
+ else flags &= ~EMBED_FLAGS_NORESIZE;
+ SENDWAIPC(hwnd, IPC_SKINWINDOW_SETEMBEDFLAGS, (WPARAM)flags);
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL != hFrame)
+ {
+ SetWindowPos(hFrame, NULL, 0, 0, 0, 0,
+ SWP_NOSIZE | SWP_NOMOVE| SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED);
+ }
+ }
+}
+
+static void BrowserPopup_OnBrowserClosing(HWND hwnd, BOOL isChild, BOOL *fCancel)
+{
+ // we telling ie to cancel in order to skip user prompt
+ *fCancel = TRUE;
+ ReplyMessage(0);
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL != hFrame)
+ {
+ ShowWindow(hFrame, SW_HIDE);
+ DestroyWindow(hFrame);
+ }
+}
+
+static void BrowserPopup_OnShowUiElement(HWND hwnd, UINT elementId, BOOL fShow)
+{
+ ReplyMessage(0);
+
+ HWND hControl;
+ UINT fStyle = GetWindowStyle(hwnd);
+ switch(elementId)
+ {
+ case HTMLContainer2::uiToolbar:
+ hControl = GetDlgItem(hwnd, IDC_TOOLBAR);
+ if (NULL != hControl && 0 == (NBCS_NOTOOLBAR & fStyle))
+ {
+ ShowWindow(hControl, (FALSE != fShow) ? SW_SHOW : SW_HIDE);
+ BrowserControl_UpdateLayout(hwnd, TRUE, FALSE, NULL, NULL);
+ }
+ break;
+
+ case HTMLContainer2::uiStatusbar:
+ hControl = GetDlgItem(hwnd, IDC_STATUSBAR);
+ if (NULL != hControl && 0 == (NBCS_NOSTATUSBAR & fStyle))
+ {
+ EnableWindow(hControl, fShow);
+ BrowserControl_UpdateLayout(hwnd, TRUE, FALSE, NULL, NULL);
+ }
+ break;
+ }
+}
+
+static void BrowserPopup_OnClientToHost(HWND hwnd, LONG *cx, LONG *cy)
+{
+ RECT frameRect, browserRect;
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL == hFrame || !GetWindowRect(hFrame, &frameRect))
+ return;
+
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL == hBrowser || !GetClientRect(hBrowser, &browserRect))
+ return;
+
+ *cx += ((frameRect.right - frameRect.left) - (browserRect.right - browserRect.left));
+ *cy += ((frameRect.bottom - frameRect.top) - (browserRect.bottom - browserRect.top));
+}
+
+static void BrowserPopup_OnSetWindowPos(HWND hwnd, UINT flags, LONG x, LONG y, LONG cx, LONG cy)
+{
+ ReplyMessage(0);
+
+ RECT frameRect;
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL == hFrame || !GetWindowRect(hFrame, &frameRect)) return;
+
+ UINT swpFlags = SWP_NOACTIVATE | SWP_NOZORDER;
+
+ if (0 == ((HTMLContainer2::wndLeft | HTMLContainer2::wndTop) & flags))
+ {
+ swpFlags |= SWP_NOMOVE;
+ }
+ else
+ {
+ if (0 == (HTMLContainer2::wndLeft & flags)) x = frameRect.left;
+ else if (0 != (HTMLContainer2::wndRelative & flags)) x += frameRect.left;
+
+ if (0 == (HTMLContainer2::wndTop & flags)) y = frameRect.top;
+ else if (0 != (HTMLContainer2::wndRelative & flags)) y += frameRect.top;
+ }
+
+ if (0 == ((HTMLContainer2::wndWidth | HTMLContainer2::wndHeight) & flags))
+ {
+ swpFlags |= SWP_NOSIZE;
+ }
+ else
+ {
+ if (0 == (HTMLContainer2::wndWidth & flags)) cx = (frameRect.right - frameRect.left);
+ else if (0 != (HTMLContainer2::wndRelative & flags)) cx += (frameRect.right - frameRect.left);
+
+ if (0 == (HTMLContainer2::wndHeight & flags)) cy = (frameRect.bottom - frameRect.top);
+ else if (0 != (HTMLContainer2::wndRelative & flags)) cy += (frameRect.bottom - frameRect.top);
+ }
+
+ BrowserPopup_SetFramePos(hwnd, NULL, x, y, cx, cy, swpFlags);
+
+}
+static void BrowserPopup_OnAllowFocusChange(HWND hwnd, BOOL *fAllow)
+{
+ *fAllow = TRUE;
+}
+
+static void BrowserPopup_OnSetFullscreen(HWND hwnd, BOOL fEnable)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+
+ if (0 != (NBCS_EX_FULLSCREEN & popup->extendedStyle) == (FALSE != fEnable))
+ return;
+
+ if (FALSE == fEnable)
+ popup->extendedStyle &= ~NBCS_EX_FULLSCREEN;
+ else
+ {
+ UINT windowStyle = GetWindowStyle(hwnd);
+ if (0 != (NBCS_DISABLEFULLSCREEN & windowStyle))
+ return;
+
+ popup->extendedStyle |= NBCS_EX_FULLSCREEN;
+ }
+
+ SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED);
+}
+
+static void BrowserPopup_OnClosePopup(HWND hwnd)
+{
+ ReplyMessage(0);
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL != hFrame)
+ {
+ ShowWindow(hFrame, SW_HIDE);
+ DestroyWindow(hFrame);
+ }
+}
+
+static LRESULT BrowserPopup_OnBrowserNotify(HWND hwnd, NMHDR *pnmh)
+{
+ switch(pnmh->code)
+ {
+ case NBHN_READY:
+ BrowserPopup_OnBrowserReady(hwnd);
+ break;
+ case NBHN_NAVIGATECOMPLETE:
+ BrowserPopup_OnNavigateComplete(hwnd, ((BHNNAVCOMPLETE*)pnmh)->pDispatch, ((BHNNAVCOMPLETE*)pnmh)->URL, ((BHNNAVCOMPLETE*)pnmh)->fTopFrame);
+ break;
+ case NBHN_DOCUMENTREADY:
+ BrowserPopup_OnDocumentReady(hwnd, ((BHNNAVCOMPLETE*)pnmh)->pDispatch, ((BHNNAVCOMPLETE*)pnmh)->URL, ((BHNNAVCOMPLETE*)pnmh)->fTopFrame);
+ break;
+ case NBHN_BROWSERACTIVE:
+ BrowserPopup_OnBrowserActive(hwnd, ((BHNACTIVE*)pnmh)->fActive);
+ break;
+ case NBHN_COMMANDSTATECHANGE:
+ BrowserPopup_OnCommandStateChange(hwnd, ((BHNCMDSTATE*)pnmh)->commandId, ((BHNCMDSTATE*)pnmh)->fEnabled);
+ break;
+ case NBHN_STATUSCHANGE:
+ BrowserPopup_OnStatusChange(hwnd, ((BHNTEXTCHANGE*)pnmh)->pszText);
+ break;
+ case NBHN_TITLECHANGE:
+ BrowserPopup_OnTitleChange(hwnd, ((BHNTEXTCHANGE*)pnmh)->pszText);
+ break;
+ case NBHN_SECUREICONCHANGE:
+ BrowserPopup_OnSecureIconChange(hwnd, ((BHNSECUREICON*)pnmh)->iconId);
+ break;
+ case NBHN_GETOMSERVICE:
+ return BrowserPopup_GetService(hwnd, &((BHNSERVICE*)pnmh)->instance);
+ case NBHN_CREATEPOPUP:
+ return BrowserPopup_OnCreatePopup(hwnd, ((BHNCREATEPOPUP*)pnmh)->callback, ((BHNCREATEPOPUP*)pnmh)->param);
+ case NBHN_VISIBLECHANGE:
+ BrowserPopup_OnVisibleChange(hwnd, ((BHNVISIBLE*)pnmh)->fVisible);
+ break;
+ case NBHN_RESIZABLE:
+ BrowserPopup_OnSetResizable(hwnd, ((BHNRESIZABLE*)pnmh)->fEnabled);
+ break;
+ case NBHN_CLOSING:
+ BrowserPopup_OnBrowserClosing(hwnd, ((BHNCLOSING*)pnmh)->isChild, &((BHNCLOSING*)pnmh)->cancel);
+ break;
+ case NBHN_SHOWUI:
+ BrowserPopup_OnShowUiElement(hwnd, ((BHNSHOWUI*)pnmh)->elementId, ((BHNSHOWUI*)pnmh)->fShow);
+ break;
+ case NBHN_CLIENTTOHOST:
+ BrowserPopup_OnClientToHost(hwnd, &((BHNCLIENTTOHOST*)pnmh)->cx, &((BHNCLIENTTOHOST*)pnmh)->cy);
+ break;
+ case NBHN_SETWINDOWPOS:
+ BrowserPopup_OnSetWindowPos(hwnd, ((BHNSETWINDOWPOS*)pnmh)->flags, ((BHNSETWINDOWPOS*)pnmh)->x,
+ ((BHNSETWINDOWPOS*)pnmh)->y, ((BHNSETWINDOWPOS*)pnmh)->cx, ((BHNSETWINDOWPOS*)pnmh)->cy);
+ break;
+ case NBHN_FOCUSCHANGE:
+ BrowserPopup_OnAllowFocusChange(hwnd, &((BHNFOCUSCHANGE*)pnmh)->fAllow);
+ break;
+ case NBHN_FULLSCREEN:
+ BrowserPopup_OnSetFullscreen(hwnd, ((BHNFULLSCREEN*)pnmh)->fEnable);
+ break;
+ case NBHN_CLOSEPOPUP:
+ BrowserPopup_OnClosePopup(hwnd);
+ break;
+
+ }
+ return 0;
+}
+
+static LRESULT BrowserPopup_OnNotify(HWND hwnd, INT controlId, NMHDR *pnmh)
+{
+ switch(controlId)
+ {
+ case IDC_BROWSER:
+ return BrowserPopup_OnBrowserNotify(hwnd, pnmh);
+ }
+
+ return 0;
+}
+
+static void BrowserPopup_OnSetFocus(HWND hwnd, HWND hLost)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ HWND hChild, hTab;
+ hChild = FindWindowEx(hwnd, NULL, NULL, NULL);
+ hTab = NULL;
+
+ if (NULL != popup)
+ {
+ while(popup->lastFocus && IsChild(hwnd, popup->lastFocus))
+ {
+ if (IsWindowEnabled(popup->lastFocus) && IsWindowVisible(popup->lastFocus) &&
+ 0 != (WS_TABSTOP & GetWindowLongPtrW(popup->lastFocus, GWL_STYLE)))
+ {
+ hTab = popup->lastFocus;
+ break;
+ }
+ popup->lastFocus = GetParent(popup->lastFocus);
+ }
+ }
+
+ if (NULL == hTab)
+ {
+ hTab = (hChild) ? GetNextDlgTabItem(hwnd, hChild, FALSE) : hwnd;
+ }
+
+ if (NULL != hTab && hwnd != hTab &&
+ IsWindowEnabled(hTab) &&
+ IsWindowVisible(hTab))
+ {
+ TCHAR szName[128] = {0};
+ if (NULL != hChild &&
+ GetClassName(hChild, szName, ARRAYSIZE(szName)) &&
+ CSTR_EQUAL == CompareString(CSTR_INVARIANT, NORM_IGNORECASE, szName, -1, TEXT("#32770"), -1))
+ {
+ if (IsWindowEnabled(hChild))
+ PostMessage(hChild, WM_NEXTDLGCTL, (WPARAM)hTab, TRUE);
+ else
+ DefWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hLost, 0L);
+ }
+ else
+ {
+ SetFocus(hTab);
+ }
+ return;
+ }
+
+ DefWindowProc(hwnd, WM_SETFOCUS, (WPARAM)hLost, 0L);
+}
+
+static void BrowserPopup_OnActivate(HWND hwnd, UINT uActivate, HWND hwndOther, BOOL bMinimized)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ POINT pt;
+
+ switch(uActivate)
+ {
+ case WA_INACTIVE:
+ popup->lastFocus = GetFocus();
+ if (!IsChild(hwnd, popup->lastFocus))
+ popup->lastFocus = NULL;
+ break;
+
+ case WA_CLICKACTIVE:
+ if (GetCursorPos(&pt))
+ {
+ MapWindowPoints(HWND_DESKTOP, hwnd, &pt, 1);
+ HWND hTarget = ChildWindowFromPointEx(hwnd, pt, CWP_SKIPINVISIBLE | CWP_SKIPDISABLED | CWP_SKIPTRANSPARENT);
+ if (hTarget && hTarget != hwnd && hTarget != GetDlgItem(hwnd, IDC_TOOLBAR))
+ {
+
+ popup->lastFocus = hTarget;
+ }
+ }
+ break;
+ }
+}
+
+static void BrowserPopup_OnStyleChanged(HWND hwnd, UINT nStyleType, STYLESTRUCT *pss)
+{
+ #define ISSTYLECHANGED(__style) ((__style) & pss->styleOld) != ((__style) & pss->styleNew)
+
+ if (GWL_STYLE == nStyleType)
+ {
+ if (ISSTYLECHANGED(WS_CHILD) && 0 != pss->styleNew && 0 != pss->styleOld)
+ {
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL != popup && 0 == (BPF_MODECHANGELOCK & popup->flags))
+ {
+ popup->flags |= BPF_LOCKRESIZE;
+ PostMessage(hwnd, NBPM_PARENTCHANGED, 0, 0L);
+ }
+ }
+ }
+}
+
+static void BrowserPopup_OnGetMinMaxInfo(HWND hwnd, MINMAXINFO *minMax)
+{
+ minMax->ptMinTrackSize.x = 275;
+ minMax->ptMinTrackSize.y = 116;
+}
+
+static LRESULT BrowserPopup_OnNavigate(HWND hwnd, LPCWSTR navigateUrl, BOOL fScheduleBlocked)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return FALSE;
+
+ UINT windowStyle = GetWindowStyle(hwnd);
+
+ if (NULL != popup->browserHook)
+ popup->browserHook->CheckBlockedState(popup->service);
+
+ SysFreeString(popup->storedData);
+ popup->storedData = NULL;
+
+ Plugin_FreeResString(popup->storedUrl);
+ popup->storedUrl = NULL;
+
+ if (NBCS_EX_BROWSERREADY != ((NBCS_EX_BROWSERREADY | NBCS_EX_BLOCKNAVIGATION) & popup->extendedStyle))
+ {
+ if (FALSE == fScheduleBlocked)
+ return FALSE;
+
+ popup->storedUrl = Plugin_DuplicateResString(navigateUrl);
+ return TRUE;
+ }
+
+ HWND hHost = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL == hHost) return FALSE;
+
+ LPWSTR pszDescription = NULL;
+ BSTR url = NULL;
+ if (IS_INTRESOURCE(navigateUrl))
+ {
+ switch((INT_PTR)navigateUrl)
+ {
+ case NAVIGATE_BLANK:
+ BrowserPopup_SetStatusText(hwnd, NULL);
+ url = SysAllocString(L"about:blank");
+ break;
+
+ case NAVIGATE_HOME:
+ if (0 == (NBCS_NOSERVICECOMMANDS & windowStyle) && NULL != popup->service)
+ {
+ WCHAR szBuffer[8192] = {0};
+ if (SUCCEEDED(popup->service->GetUrl(szBuffer, ARRAYSIZE(szBuffer))))
+ {
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_HOME_DESCRIPTION));
+ url = SysAllocString(szBuffer);
+ }
+
+ if (SUCCEEDED(popup->service->GetName(szBuffer, ARRAYSIZE(szBuffer))))
+ pszDescription = Plugin_CopyString(szBuffer);
+ }
+ break;
+ case NAVIGATE_BACK:
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_BACK_DESCRIPTION));
+ return PostMessage(hHost, NBHM_CONTAINERCOMMAND, (WPARAM)Browser::commandBack, 0L);
+ case NAVIGATE_FORWARD:
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_FORWARD_DESCRIPTION));
+ return PostMessage(hHost, NBHM_CONTAINERCOMMAND, (WPARAM)Browser::commandForward, 0L);
+ case NAVIGATE_STOP:
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_STOP_DESCRIPTION));
+ return PostMessage(hHost, NBHM_CONTAINERCOMMAND, (WPARAM)Browser::commandStop, 0L);
+ case NAVIGATE_REFRESH:
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_REFRESH_DESCRIPTION));
+ return PostMessage(hHost, NBHM_CONTAINERCOMMAND, (WPARAM)Browser::commandRefresh, 0L);
+ case NAVIGATE_REFRESH_COMPLETELY:
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_REFRESH_DESCRIPTION));
+ return PostMessage(hHost, NBHM_CONTAINERCOMMAND, (WPARAM)Browser::commandRefreshCompletely, 0L);
+ }
+ }
+ else
+ {
+ BrowserPopup_SetStatusTextRes(hwnd, MAKEINTRESOURCE(IDS_NAVIGATING));
+ url = SysAllocString(navigateUrl);
+ }
+
+ if (NULL == url)
+ return FALSE;
+
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ INT addressbarId = (NULL != hToolbar) ? Toolbar_FindItem(hToolbar, TOOLITEM_ADDRESSBAR) : ITEM_ERR;
+ if (ITEM_ERR != addressbarId)
+ {
+ Toolbar_SetItemString(hToolbar, MAKEINTRESOURCE(addressbarId), url);
+ Toolbar_SetItemDescription(hToolbar, MAKEINTRESOURCE(addressbarId), pszDescription);
+ }
+
+ if (!PostMessage(hHost, NBHM_NAVIGATE, 0, (LPARAM)url))
+ {
+ SysFreeString(url);
+ return FALSE;
+ }
+
+ Plugin_FreeString(pszDescription);
+
+ return TRUE;
+}
+
+static LRESULT BrowserPopup_OnWriteDocument(HWND hwnd, BSTR documentData, BOOL fScheduleBlocked)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return FALSE;
+
+ SysFreeString(popup->storedData);
+ popup->storedData = NULL;
+
+ Plugin_FreeResString(popup->storedUrl);
+ popup->storedUrl = NULL;
+
+ if (0 == (NBCS_EX_NAVCOMPLETED & popup->extendedStyle))
+ {
+ if (FALSE == fScheduleBlocked)
+ return FALSE;
+ popup->storedData = documentData;
+ return TRUE;
+ }
+
+ HWND hHost = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL == hHost) return FALSE;
+
+ return PostMessage(hHost, NBHM_WRITEDOCUMENT, 0, (LPARAM)documentData);
+}
+
+static void BrowserPopup_OnParentChanged(HWND hwnd)
+{
+ HWND hRoot = GetAncestor(hwnd, GA_ROOT);
+ DWORD oldStyleEx, newStyleEx;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ popup->flags &= ~BPF_LOCKRESIZE;
+
+ HWND hWinamp;
+ if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
+ hWinamp = NULL;
+
+ oldStyleEx = GetWindowStyleEx(hwnd);
+ newStyleEx = oldStyleEx;
+
+ if (hRoot != hwnd)
+ {
+ HWND hDlgParent = (HWND)SENDWAIPC(hWinamp, IPC_GETDIALOGBOXPARENT, 0);
+ if (hRoot != hWinamp && hRoot != hDlgParent)
+ {
+ if (NULL != hDlgParent && hWinamp == (HWND)(LONG_PTR)GetWindowLongPtr(hRoot, GWLP_HWNDPARENT))
+ {
+ SetWindowLongPtr(hRoot, GWLP_HWNDPARENT, (LONGX86)(LONG_PTR)hDlgParent);
+ }
+ }
+ newStyleEx |= WS_EX_CONTROLPARENT;
+ }
+ else
+ {
+ newStyleEx &= ~WS_EX_CONTROLPARENT;
+
+
+ if (NULL != hWinamp && hWinamp != (HWND)(LONG_PTR)GetWindowLongPtr(hwnd, GWLP_HWNDPARENT))
+ SetWindowLongPtr(hwnd, GWLP_HWNDPARENT, (LONGX86)(LONG_PTR)hWinamp);
+
+ RECT rect;
+ if (BrowserPopup_PopRect(hwnd, &rect, FALSE))
+ {
+ BrowserPopup_ClientToFrame(hwnd, &rect);
+ BrowserPopup_SetFramePos(hwnd, NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOREDRAW);
+ }
+
+ }
+
+ if (newStyleEx != oldStyleEx)
+ SetWindowLongPtr(hwnd, GWL_EXSTYLE, newStyleEx);
+
+ BrowserPopup_RefreshTitle(hwnd);
+ SendMessage(hRoot, WM_UPDATEUISTATE, MAKEWPARAM(UIS_INITIALIZE, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0L);
+}
+
+
+static void BrowserPopup_OnUpdateSkin(HWND hwnd, BOOL fRedraw)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return;
+
+ DWORD windowStyle = GetWindowStyle(hwnd);
+
+ if (0 != (WS_VISIBLE & windowStyle))
+ SetWindowLongPtr(hwnd, GWL_STYLE, ~WS_VISIBLE & windowStyle);
+
+ ifc_skinnedbrowser *skinnedBrowser;
+ if (SUCCEEDED(Plugin_GetBrowserSkin(&skinnedBrowser)))
+ {
+ popup->rgbBack = skinnedBrowser->GetBackColor();
+ skinnedBrowser->Release();
+ }
+ else
+ popup->rgbBack = GetSysColor(COLOR_WINDOW);
+
+
+ HWND hControl;
+
+ if (NULL != (hControl = GetDlgItem(hwnd, IDC_BROWSER)))
+ PostMessage(hControl, NBHM_UPDATESKIN, 0, 0L);
+
+ if (NULL != (hControl = GetDlgItem(hwnd, IDC_STATUSBAR)))
+ Statusbar_UpdateSkin(hControl, FALSE);
+
+ if (NULL != (hControl = GetDlgItem(hwnd, IDC_TOOLBAR)))
+ Toolbar_UpdateSkin(hControl, FALSE);
+
+ if (NULL != (hControl = BrowserControl_GetOperationWidget(hwnd)))
+ Curtain_UpdateSkin(hControl, FALSE);
+
+ BrowserControl_UpdateLayout(hwnd, FALSE, TRUE, NULL, NULL);
+
+ if (0 != (WS_VISIBLE & windowStyle))
+ SetWindowLongPtr(hwnd, GWL_STYLE, windowStyle);
+
+ if (FALSE != fRedraw)
+ {
+ RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN | RDW_FRAME);
+ }
+}
+
+static LRESULT BrowserPopup_OnSkinRefreshing(HWND hwnd)
+{
+
+ BrwoserPopup_PushClientRect(hwnd, FALSE);
+
+ HWND hRoot = GetAncestor(hwnd, GA_ROOT);
+ if (hRoot != hwnd)
+ {
+ HWND hWinamp;
+ if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
+ hWinamp = NULL;
+
+ HWND hDlgParent = (HWND)SENDWAIPC(hWinamp, IPC_GETDIALOGBOXPARENT, 0);
+ if (NULL != hDlgParent && hDlgParent == (HWND)(LONG_PTR)GetWindowLongPtr(hRoot, GWLP_HWNDPARENT))
+ {
+ SetWindowLongPtr(hRoot, GWLP_HWNDPARENT, (LONGX86)(LONG_PTR)hWinamp);
+ }
+ }
+ return 0;
+}
+
+static void BrowserPopup_OnSkinRefreshed(HWND hwnd)
+{
+ BrowserPopup_PopRect(hwnd, NULL, FALSE);
+
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (hwnd != hFrame)
+ {
+ UINT state = (IsWindowVisible(hwnd) && IsWindowEnabled(hwnd) && (hFrame == GetActiveWindow())) ? WA_ACTIVE : WA_INACTIVE;
+ SendMessage(hwnd, WM_ACTIVATE, state, 0L);
+ }
+}
+
+static LRESULT BrowserPopup_OnSetFramePos(HWND hwnd, WINDOWPOS *pwp)
+{
+ if (NULL == pwp) return FALSE;
+
+ HWND hFrame;
+
+ ifc_window *wasabiWnd = (ifc_window*)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETWASABIWND, 0);
+ if (NULL != wasabiWnd)
+ {
+ ifc_window *wasabiParent = wasabiWnd->getDesktopParent();
+ if (NULL == wasabiParent) wasabiParent = wasabiWnd;
+
+ hFrame = wasabiParent->gethWnd();
+ if (NULL == hFrame) return FALSE;
+
+ HWND hWinamp;
+ if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
+ hWinamp = NULL;
+
+ HWND hDlgParent = (HWND)SENDWAIPC(hWinamp, IPC_GETDIALOGBOXPARENT, 0);
+ if (hDlgParent == hFrame)
+ return FALSE; // do not change size/pos if we are part of the sui
+
+ if (0 == (SWP_NOSIZE & pwp->flags))
+ {
+ RECT windowRect;
+ wasabiParent->getWindowRect(&windowRect);
+ if (pwp->cx != (windowRect.right - windowRect.left) || pwp->cy != (windowRect.bottom - windowRect.top))
+ {
+ if (0 == SendMessage(wasabiWnd->gethWnd(), OSWNDHOST_REQUEST_IDEAL_SIZE, pwp->cx, pwp->cy))
+ {
+ return FALSE; // hmm,
+ }
+ }
+ pwp->flags |= SWP_NOSIZE;
+ }
+
+ if (0 == (SWP_NOMOVE & pwp->flags))
+ {
+ RECT windowRect;
+ wasabiParent->getWindowRect(&windowRect);
+ wasabiParent->resize(pwp->x, pwp->y, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top);
+ pwp->flags |= SWP_NOMOVE;
+ }
+ }
+ else
+ {
+ hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL == hFrame) return FALSE;
+ }
+
+ BOOL result = SetWindowPos(hFrame, pwp->hwndInsertAfter, pwp->x, pwp->y, pwp->cx, pwp->cy, pwp->flags);
+ BrwoserPopup_PushClientRect(hwnd, TRUE);
+ return result;
+}
+
+
+
+static void BrowserPopup_OnActivateFrame(HWND hwnd)
+{
+ ifc_window *wasabiWnd = (ifc_window*)SENDWAIPC(hwnd, IPC_SKINWINDOW_GETWASABIWND, 0);
+ if (NULL != wasabiWnd)
+ {
+ wasabiWnd->activate();
+ }
+ else
+ {
+ HWND hFrame = BrowserPopup_GetFrame(hwnd);
+ if (NULL == hFrame) hFrame = hwnd;
+
+ BringWindowToTop(hFrame);
+ SetActiveWindow(hFrame);
+ }
+}
+
+static LRESULT BrowserPopup_OnGetService(HWND hwnd, ifc_omservice **serviceOut)
+{
+ if (NULL == serviceOut) return FALSE;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup || NULL == popup->service)
+ {
+ *serviceOut = NULL;
+ return FALSE;
+ }
+
+ *serviceOut = popup->service;
+ (*serviceOut)->AddRef();
+ return TRUE;
+}
+
+static LRESULT BrowserPopup_OnGetBrowserObject(HWND hwnd, obj_ombrowser **browserOut)
+{
+ if (NULL == browserOut) return FALSE;
+
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup || NULL == popup->browserManager)
+ {
+ *browserOut = NULL;
+ return FALSE;
+ }
+
+ *browserOut = popup->browserManager;
+ (*browserOut)->AddRef();
+ return TRUE;
+}
+static LRESULT BrowserPopup_OnRefreshTitle(HWND hwnd)
+{
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL == hBrowser || FALSE == PostMessage(hBrowser, NBHM_QUERYTITLE, 0, 0L))
+ BrowserPopup_UpdateTitle(hwnd, NULL);
+ return TRUE;
+}
+
+static LRESULT BrowserPopup_OnGetToolbar(HWND hwnd)
+{
+ if (0 != (NBCS_NOTOOLBAR & GetWindowLongPtr(hwnd, GWL_STYLE)))
+ return 0;
+
+ HWND hToolbar = GetDlgItem(hwnd, IDC_TOOLBAR);
+ return (LRESULT)hToolbar;
+}
+
+static LRESULT BrowserPopup_OnGetStatusbar(HWND hwnd)
+{
+ if (0 != (NBCS_NOSTATUSBAR & GetWindowLongPtr(hwnd, GWL_STYLE)))
+ return 0;
+
+ HWND hStatusbar = GetDlgItem(hwnd, IDC_STATUSBAR);
+ return (LRESULT)hStatusbar;
+}
+
+static LRESULT BrowserPopup_OnGetHost(HWND hwnd)
+{
+ return (LRESULT)GetDlgItem(hwnd, IDC_BROWSER);
+}
+
+static LRESULT BrowserPopup_OnNavigateStoredUrl(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup || NULL == popup->storedUrl)
+ return FALSE;
+
+ LPWSTR url = popup->storedUrl;
+ popup->storedUrl = NULL;
+ BOOL result = BrowserPopup_Navigate(hwnd, url, TRUE);
+ Plugin_FreeResString(url);
+ return result;
+}
+
+static LRESULT BrowserPopup_OnSetExtendedStyle(HWND hwnd, UINT extMask, UINT extStyle)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ if (NULL == popup) return 0;
+
+ UINT currentStyle = popup->extendedStyle;
+ popup->extendedStyle = (currentStyle & ~extMask) | (extStyle & extMask);
+
+ if ((NBCS_EX_SCRIPTMODE & currentStyle) != (NBCS_EX_SCRIPTMODE & popup->extendedStyle))
+ {
+ HWND hBrowser = GetDlgItem(hwnd, IDC_BROWSER);
+ if (NULL != hBrowser)
+ {
+ UINT browserStyle = GetWindowStyle(hBrowser);
+
+ if (0 != (NBCS_EX_SCRIPTMODE & popup->extendedStyle))
+ browserStyle |= NBHS_SCRIPTMODE;
+ else
+ browserStyle &= ~ NBHS_SCRIPTMODE;
+
+ SetWindowLongPtr(hBrowser, GWL_STYLE, browserStyle);
+ }
+ }
+
+ if ((NBCS_EX_FULLSCREEN & currentStyle) != (NBCS_EX_FULLSCREEN & popup->extendedStyle))
+ {
+ if (0 != (NBCS_EX_FULLSCREEN & popup->extendedStyle))
+ BrowserPopup_SwitchToFullscreen(hwnd);
+ else
+ BrowserPopup_Restore(hwnd);
+ }
+
+ return currentStyle;
+}
+
+static LRESULT BrowserPopup_OnGetExtendedStyle(HWND hwnd)
+{
+ BROWSERPOPUP *popup = GetPopup(hwnd);
+ return (NULL != popup) ? popup->extendedStyle : 0;
+}
+
+static LRESULT CALLBACK BrowserPopup_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch(uMsg)
+ {
+ case WM_CREATE: return BrowserPopup_OnCreate(hwnd, (CREATESTRUCT*)lParam);
+ case WM_DESTROY: BrowserPopup_OnDestroy(hwnd); break;
+ case WM_ERASEBKGND: return 0;
+ case WM_PAINT: BrowserPopup_OnPaint(hwnd); return 0;
+ case WM_PRINTCLIENT: BrowserPopup_OnPrintClient(hwnd, (HDC)wParam, (UINT)lParam); return 0;
+ case WM_WINDOWPOSCHANGING: BrowserPopup_OnWindowPosChanging(hwnd, (WINDOWPOS*)lParam); return 0;
+ case WM_WINDOWPOSCHANGED: BrowserPopup_OnWindowPosChanged(hwnd, (WINDOWPOS*)lParam); return 0;
+ case WM_COMMAND: BrowserPopup_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break;
+ case WM_APPCOMMAND: return BrowserPopup_OnAppCommand(hwnd, (HWND)wParam, GET_APPCOMMAND_LPARAM(lParam), GET_DEVICE_LPARAM(lParam), GET_KEYSTATE_LPARAM(lParam));
+ case WM_NOTIFY: return BrowserPopup_OnNotify(hwnd, (INT)wParam, (NMHDR*)lParam);
+ case WM_SETFOCUS: BrowserPopup_OnSetFocus(hwnd, (HWND)wParam); return 0;
+ case WM_ACTIVATE: BrowserPopup_OnActivate(hwnd, LOWORD(wParam), (HWND)lParam, HIWORD(wParam)); break;
+ case WM_STYLECHANGED: BrowserPopup_OnStyleChanged(hwnd, (UINT)wParam, (STYLESTRUCT*)lParam); break;
+ case WM_GETMINMAXINFO: BrowserPopup_OnGetMinMaxInfo(hwnd, (MINMAXINFO*)lParam); return 0;
+
+ case NBCM_GETTOOLBAR: return BrowserPopup_OnGetToolbar(hwnd);
+ case NBCM_GETSTATUSBAR: return BrowserPopup_OnGetStatusbar(hwnd);
+ case NBCM_GETHOST: return BrowserPopup_OnGetHost(hwnd);
+ case NBCM_GETSERVICE: return BrowserPopup_OnGetService(hwnd, (ifc_omservice**)lParam);
+ case NBCM_UPDATESKIN: BrowserPopup_OnUpdateSkin(hwnd, (BOOL)lParam); return 0;
+ case NBCM_NAVIGATE: return BrowserPopup_OnNavigate(hwnd, (LPCWSTR)lParam, (BOOL)wParam);
+ case NBCM_WRITEDOCUMENT: return BrowserPopup_OnWriteDocument(hwnd, (BSTR)lParam, (BOOL)wParam);
+ case NBCM_GETBROWSEROBJECT: return BrowserPopup_OnGetBrowserObject(hwnd, (obj_ombrowser**)lParam);
+ case NBCM_SHOWOPERATION: return BrowserControl_OnShowOperation(hwnd, (OPERATIONINFO*)lParam);
+ case NBCM_NAVSTOREDURL: return BrowserPopup_OnNavigateStoredUrl(hwnd);
+ case NBCM_BLOCK: BrowserControl_SetBlockedState(hwnd, (BOOL)lParam); return 0;
+ case NBCM_SETEXTSTYLE: return BrowserPopup_OnSetExtendedStyle(hwnd, (UINT)wParam, (UINT)lParam);
+ case NBCM_GETEXTSTYLE: return BrowserPopup_OnGetExtendedStyle(hwnd);
+
+ case NBPM_PARENTCHANGED: BrowserPopup_OnParentChanged(hwnd); return 0;
+ case NBPM_SKINREFRESHING: return BrowserPopup_OnSkinRefreshing(hwnd);
+ case NBPM_SKINREFRESHED: BrowserPopup_OnSkinRefreshed(hwnd); return 0;
+ case NBPM_SETFRAMEPOS: return BrowserPopup_OnSetFramePos(hwnd, (WINDOWPOS*)lParam);
+ case NBPM_ACTIVATEFRAME: BrowserPopup_OnActivateFrame(hwnd); return 0;
+ case NBPM_REFRESHTITLE: return BrowserPopup_OnRefreshTitle(hwnd);
+ }
+
+ if (FALSE != Plugin_IsDirectMouseWheelMessage(uMsg))
+ {
+ SendMessage(hwnd, WM_MOUSEWHEEL, wParam, lParam);
+ return TRUE;
+ }
+
+ return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+} \ No newline at end of file