aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/browserUiHook.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/browserUiHook.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/omBrowser/browserUiHook.cpp')
-rw-r--r--Src/omBrowser/browserUiHook.cpp321
1 files changed, 321 insertions, 0 deletions
diff --git a/Src/omBrowser/browserUiHook.cpp b/Src/omBrowser/browserUiHook.cpp
new file mode 100644
index 00000000..8d75c45a
--- /dev/null
+++ b/Src/omBrowser/browserUiHook.cpp
@@ -0,0 +1,321 @@
+#include "main.h"
+#include "./browserUiHook.h"
+#include "./browserUiCommon.h"
+#include "./browserUiInternal.h"
+#include "./browserPopup.h"
+#include "./browserHost.h"
+
+#include "./ifc_omservice.h"
+#include "./ifc_omserviceeventmngr.h"
+#include "./ifc_omservicecommand.h"
+#include "./ifc_omtoolbarconfig.h"
+#include "./ifc_omstatusbarconfig.h"
+#include "./ifc_omserviceeditor.h"
+#include "./ifc_omconfig.h"
+#include "./obj_ombrowser.h"
+
+#include "./toolbar.h"
+#include "./statusbar.h"
+
+#include "../winamp/IWasabiDispatchable.h"
+#include "../winamp/JSAPI_Info.h"
+
+#include <strsafe.h>
+
+BrowserUiHook::BrowserUiHook(HWND hTarget, BOOL fPopupMode)
+ : ref(1), popupMode(fPopupMode), hwnd(hTarget), winampCookie(NULL), configCookie(NULL)
+{
+}
+
+BrowserUiHook::~BrowserUiHook()
+{
+}
+
+HRESULT BrowserUiHook::CreateInstance(HWND hTarget, BOOL fPopupMode, BrowserUiHook **instance)
+{
+ if (NULL == instance) return E_POINTER;
+ *instance = NULL;
+
+ if (NULL == hTarget || FALSE == IsWindow(hTarget))
+ return E_INVALIDARG;
+
+ *instance = new BrowserUiHook(hTarget, fPopupMode);
+ if (NULL == *instance) return E_OUTOFMEMORY;
+
+ return S_OK;
+}
+
+size_t BrowserUiHook::AddRef()
+{
+ return InterlockedIncrement((LONG*)&ref);
+}
+
+size_t BrowserUiHook::Release()
+{
+ if (0 == ref)
+ return ref;
+
+ LONG r = InterlockedDecrement((LONG*)&ref);
+ if (0 == r)
+ delete(this);
+
+ return r;
+}
+
+int BrowserUiHook::QueryInterface(GUID interface_guid, void **object)
+{
+ if (NULL == object) return E_POINTER;
+
+ if (IsEqualIID(interface_guid, IFC_WinampHook))
+ *object = static_cast<ifc_winamphook*>(this);
+ else if (IsEqualIID(interface_guid, IFC_OmServiceEvent))
+ *object = static_cast<ifc_omserviceevent*>(this);
+ else if (IsEqualIID(interface_guid, IFC_OmConfigCallback))
+ *object = static_cast<ifc_omconfigcallback*>(this);
+ else
+ {
+ *object = NULL;
+ return E_NOINTERFACE;
+ }
+
+ if (NULL == *object)
+ return E_UNEXPECTED;
+
+ AddRef();
+ return S_OK;
+}
+
+
+HRESULT BrowserUiHook::SkinChanging(void)
+{
+ if (FALSE != popupMode)
+ {
+ BrowserPopup_SkinRefreshing(hwnd);
+ PostMessage(hwnd, NBPM_SKINREFRESHED, 0, 0L);
+ }
+ return S_OK;
+}
+
+HRESULT BrowserUiHook::SkinChanged(const wchar_t *skinName)
+{
+ PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE);
+ return S_OK;
+}
+
+HRESULT BrowserUiHook::SkinColorChange(const wchar_t *colorTheme)
+{
+ PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE);
+ return S_OK;
+}
+
+HRESULT BrowserUiHook::ResetFont(void)
+{
+ PostMessage(hwnd, NBCM_UPDATESKIN, 0, TRUE);
+ return S_OK;
+}
+
+void BrowserUiHook::ServiceChange(ifc_omservice *service, UINT nModified)
+{
+ ifc_omservice *windowService;
+ if (FALSE == (BOOL)SendMessage(hwnd, NBCM_GETSERVICE, 0, (LPARAM)&windowService) || NULL == windowService)
+ return;
+
+ if (windowService != service) return;
+
+ if (0 != (ifc_omserviceeditor::modifiedName & nModified))
+ {
+ IDispatch *pDispatch;
+ if (SUCCEEDED(windowService->GetExternal(&pDispatch) && NULL != pDispatch))
+ {
+ IWasabiDispatchable *pWasabi;
+ if (SUCCEEDED(pDispatch->QueryInterface(IID_IWasabiDispatchable, (void**)&pWasabi)))
+ {
+ JSAPI::ifc_info *info = NULL;
+ if (SUCCEEDED(pWasabi->QueryDispatchable(JSAPI::IID_JSAPI_ifc_info, (Dispatchable**)&info)))
+ {
+ WCHAR szName[512] = {0};
+ if (FAILED(service->GetName(szName, ARRAYSIZE(szName))))
+ StringCchCopy(szName, ARRAYSIZE(szName), L"Unknown");
+
+ info->SetName(szName);
+ info->Release();
+ }
+ pWasabi->Release();
+ }
+ pDispatch->Release();
+ }
+
+ if (FALSE != popupMode)
+ PostMessage(hwnd, NBPM_REFRESHTITLE, 0, 0L);
+ }
+
+ if (0 != (ifc_omserviceeditor::modifiedRating & nModified))
+ {
+ HWND hToolbar = BrowserControl_GetToolbar(hwnd);
+ if (NULL != hToolbar)
+ {
+ UINT rating;
+ if(SUCCEEDED(service->GetRating(&rating)))
+ {
+ Toolbar_SetItemInt(hToolbar, TOOLITEM_USERRATING, rating);
+ }
+ }
+ }
+
+ if (0 != (ifc_omserviceeditor::modifiedGeneration & nModified))
+ {
+ HWND hHost = BrowserControl_GetHost(hwnd);
+ if (NULL != hHost) PostMessage(hHost, NBHM_UPDATEEXTERNAL, 0 , 0L);
+ }
+
+}
+
+void BrowserUiHook::CommandStateChange(ifc_omservice *service, const GUID *commandGroup, unsigned int commandId)
+{
+ if (NULL != commandGroup)
+ {
+ if (IsEqualGUID(CMDGROUP_SERVICE, *commandGroup))
+ {
+ switch(commandId)
+ {
+ case SVCCOMMAND_BLOCKNAV:
+ CheckBlockedState(service);
+ break;
+
+ }
+
+ }
+ }
+}
+
+HRESULT BrowserUiHook::ValueChanged(const GUID *configUid, UINT valueId, ULONG_PTR value)
+{
+ if (NULL == configUid)
+ return E_UNEXPECTED;
+
+ if (IsEqualIID(IFC_OmToolbarConfig, *configUid))
+ {
+ HWND hToolbar = (HWND)SendMessage(hwnd, NBCM_GETTOOLBAR, 0, 0L);
+ if (NULL == hToolbar) return S_FALSE;
+
+ switch(valueId)
+ {
+ case CFGID_TOOLBAR_BOTTOMDOCK: Toolbar_EnableBottomDock(hToolbar, (BOOL)value); break;
+ case CFGID_TOOLBAR_AUTOHIDE: Toolbar_EnableAutoHide(hToolbar, (BOOL)value); break;
+ case CFGID_TOOLBAR_TABSTOP: Toolbar_EnableTabStop(hToolbar, (BOOL)value); break;
+ case CFGID_TOOLBAR_FORCEADDRESS: Toolbar_EnableForceAddress(hToolbar, (BOOL)value); break;
+ case CFGID_TOOLBAR_FANCYADDRESS: Toolbar_EnableFancyAddress(hToolbar, (BOOL)value); break;
+ }
+ }
+ else if (IsEqualIID(IFC_OmStatusbarConfig, *configUid))
+ {
+ HWND hStatusbar = (HWND)SendMessage(hwnd, NBCM_GETSTATUSBAR, 0, 0L);
+ if (NULL == hStatusbar) return S_FALSE;
+
+ switch(valueId)
+ {
+ case CFGID_STATUSBAR_ENABLED: Statusbar_Enable(hStatusbar, (BOOL)value); break;
+ }
+ }
+
+ return S_OK;
+}
+
+HRESULT BrowserUiHook::Register(obj_ombrowser *browserManager, ifc_omservice *service)
+{
+
+ Plugin_RegisterWinampHook(this, &winampCookie);
+
+ ifc_omconfig *config;
+ if (NULL != browserManager && SUCCEEDED(browserManager->GetConfig(NULL, (void**)&config)))
+ {
+ config->RegisterCallback(this, &configCookie);
+ config->Release();
+ }
+
+ ifc_omserviceeventmngr *eventManager;
+ if (NULL != service && SUCCEEDED(service->QueryInterface(IFC_OmServiceEventMngr, (void**)&eventManager)))
+ {
+ eventManager->RegisterHandler(this);
+ eventManager->Release();
+ }
+
+ return S_OK;
+}
+
+HRESULT BrowserUiHook::Unregister(obj_ombrowser *browserManager, ifc_omservice *service)
+{
+ if (0 != configCookie)
+ {
+ ifc_omconfig *config;
+ if (NULL != browserManager && SUCCEEDED(browserManager->GetConfig(NULL, (void**)&config)))
+ {
+ config->UnregisterCallback(configCookie);
+ config->Release();
+ }
+ configCookie = 0;
+ }
+
+ ifc_omserviceeventmngr *eventManager;
+ if (NULL != service && SUCCEEDED(service->QueryInterface(IFC_OmServiceEventMngr, (void**)&eventManager)))
+ {
+ eventManager->UnregisterHandler(this);
+ eventManager->Release();
+ }
+
+
+ if (0 != winampCookie)
+ {
+ Plugin_UnregisterWinampHook(winampCookie);
+ winampCookie = 0;
+ }
+
+ return S_OK;
+}
+
+HRESULT BrowserUiHook::CheckBlockedState(ifc_omservice *service)
+{
+ if (NULL == service)
+ return E_INVALIDARG;
+
+ HRESULT hr;
+
+ ifc_omservicecommand *serviceCommand;
+ hr = service->QueryInterface(IFC_OmServiceCommand, (void**)&serviceCommand);
+ if (SUCCEEDED(hr))
+ {
+ HRESULT state = serviceCommand->QueryState(hwnd, &CMDGROUP_SERVICE, SVCCOMMAND_BLOCKNAV);
+ PostMessage(hwnd, NBCM_BLOCK, 0, (CMDSTATE_ENABLED == state));
+ serviceCommand->Release();
+ }
+ return hr;
+}
+
+#define CBCLASS BrowserUiHook
+START_MULTIPATCH;
+ START_PATCH(MPIID_WINAMPHOOK)
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, ADDREF, AddRef);
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, RELEASE, Release);
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, QUERYINTERFACE, QueryInterface);
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCHANGING, SkinChanging);
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCHANGED, SkinChanged);
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_SKINCOLORCHANGE, SkinColorChange);
+ M_CB(MPIID_WINAMPHOOK, ifc_winamphook, API_RESETFONT, ResetFont);
+ NEXT_PATCH(MPIID_SERVICEEVENT)
+ M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, ADDREF, AddRef);
+ M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, RELEASE, Release);
+ M_CB(MPIID_SERVICEEVENT, ifc_omserviceevent, QUERYINTERFACE, QueryInterface);
+ M_VCB(MPIID_SERVICEEVENT, ifc_omserviceevent, API_SERVICECHANGE, ServiceChange);
+ M_VCB(MPIID_SERVICEEVENT, ifc_omserviceevent, API_COMMANDSTATECHANGE, CommandStateChange);
+
+ NEXT_PATCH(MPIID_CONFIGCALLBACK)
+ M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, ADDREF, AddRef);
+ M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, RELEASE, Release);
+ M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, QUERYINTERFACE, QueryInterface);
+ M_CB(MPIID_CONFIGCALLBACK, ifc_omconfigcallback, API_VALUECHANGED, ValueChanged);
+ END_PATCH
+END_MULTIPATCH;
+#undef CBCLASS
+
+
+