123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399 |
- #include "main.h"
- #include "./options.h"
- #include "./optionsHook.h"
- #include "./resource.h"
- #include "./ifc_omconfig.h"
- #include "./ifc_ombrowserconfig.h"
- #include "./ifc_omtoolbarconfig.h"
- #include "./ifc_omstatusbarconfig.h"
- #include "../winamp/wa_ipc.h"
- #include <windows.h>
- #include <commctrl.h>
- #include <shlwapi.h>
- #include <strsafe.h>
- HWND CALLBACK OptionsUI_CreatePage(HWND hParent, UINT style);
- HWND CALLBACK OptionsDebug_CreatePage(HWND hParent, UINT style);
- HWND CALLBACK OptionsInfo_CreatePage(HWND hParent, UINT style);
- static const OPTIONSPAGECREATOR szPageList[] =
- {
- OptionsUI_CreatePage,
- OptionsDebug_CreatePage,
- OptionsInfo_CreatePage,
- };
- typedef struct __OPTIONSDATA
- {
- obj_ombrowser *browserManager;
- BROWSEROPTIONSCALLBACK callback;
- ULONG_PTR user;
- UINT configCookie;
- UINT style;
- } OPTIONSDATA;
- #define OPTIONS_PROP L"OptionsDataProp"
- #define GetOptions(__hwnd) ((OPTIONSDATA*)GetProp(__hwnd, OPTIONS_PROP))
- #define IDC_ACTIVEPAGE 10001
- static INT_PTR CALLBACK OptionsFrame_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- HRESULT BrowserOptions_ShowDialog(obj_ombrowser *browserManager, HWND hOwner, UINT style, BROWSEROPTIONSCALLBACK callback, ULONG_PTR user)
- {
- OPTIONSDATA optionsData = {0};
- optionsData.browserManager = browserManager;
- optionsData.callback = callback;
- optionsData.user = user;
- optionsData.style = style;
- INT_PTR result = Plugin_DialogBoxParam(MAKEINTRESOURCE(IDD_BROWSER_OPTIONS), hOwner,
- OptionsFrame_DialogProc, (LPARAM)&optionsData);
- return (0 == result) ? S_OK : E_FAIL;
- }
- BOOL Options_SetCheckbox(HWND hwnd, UINT controlId, HRESULT checkedState)
- {
- HWND hControl = GetDlgItem(hwnd, controlId);
- if (NULL == hControl) return FALSE;
- if (FAILED(checkedState))
- {
- EnableWindow(hControl, FALSE);
- }
- else
- {
- WPARAM wParam = (S_OK == checkedState) ? BST_CHECKED : BST_UNCHECKED;
- SendMessage(hControl, BM_SETCHECK, wParam, 0L);
- EnableWindow(hControl, TRUE);
- }
- return TRUE;
- }
- static void OptionsFrame_NotifyTabSelected(HWND hwnd)
- {
- HWND hFrame = GetDlgItem(hwnd, IDC_TABFRAME);
- if (NULL == hFrame) return;
- NMHDR nmh = {0};
- nmh.code = TCN_SELCHANGE;
- nmh.hwndFrom = hFrame;
- nmh.idFrom = GetDlgCtrlID(hFrame);
- SendNotifyMessage(hwnd, WM_NOTIFY, (WPARAM)nmh.idFrom, (LPARAM)&nmh);
- }
- static void OptionsFrame_InitializePages(HWND hwnd, UINT style)
- {
- HWND hFrame = GetDlgItem(hwnd, IDC_TABFRAME);
- if (NULL == hFrame) return;
- HWND hWinamp = NULL;
- if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
- hWinamp = NULL;
- INT pageCount = 0;
- WCHAR szBuffer[256] = {0};
- TCITEM tabItem = {0};
- tabItem.mask = TCIF_TEXT | TCIF_PARAM;
- for (size_t i = 0; i < ARRAYSIZE(szPageList); i++)
- {
- HWND hPage = szPageList[i](hwnd, style);
- if (NULL == hPage) continue;
- if (NULL != hWinamp && 0 == SENDWAIPC(hWinamp, IPC_USE_UXTHEME_FUNC, IPC_ISWINTHEMEPRESENT))
- SENDWAIPC(hWinamp, IPC_USE_UXTHEME_FUNC, hPage);
- if (0 == GetWindowText(hPage, szBuffer, ARRAYSIZE(szBuffer)))
- StringCchPrintf(szBuffer, ARRAYSIZE(szBuffer), L"Page %d", pageCount + 1);
- tabItem.lParam = (LPARAM)hPage;
- tabItem.pszText = szBuffer;
- tabItem.iImage = 0;
- if (-1 != TabCtrl_InsertItem(hFrame, pageCount, &tabItem))
- {
- pageCount++;
- }
- }
- TabCtrl_SetCurSel(hFrame, 0);
- }
- void getViewport(RECT *r, HWND wnd, int full, RECT *sr)
- {
- POINT *p = NULL;
- if (p || sr || wnd)
- {
- HMONITOR hm = NULL;
- if (sr)
- hm = MonitorFromRect(sr, MONITOR_DEFAULTTONEAREST);
- else if (wnd)
- hm = MonitorFromWindow(wnd, MONITOR_DEFAULTTONEAREST);
- else if (p)
- hm = MonitorFromPoint(*p, MONITOR_DEFAULTTONEAREST);
- if (hm)
- {
- MONITORINFOEXW mi;
- memset(&mi, 0, sizeof(mi));
- mi.cbSize = sizeof(mi);
- if (GetMonitorInfoW(hm, &mi))
- {
- if (!full)
- *r = mi.rcWork;
- else
- *r = mi.rcMonitor;
- return ;
- }
- }
- }
- if (full)
- { // this might be borked =)
- r->top = r->left = 0;
- r->right = GetSystemMetrics(SM_CXSCREEN);
- r->bottom = GetSystemMetrics(SM_CYSCREEN);
- }
- else
- {
- SystemParametersInfoW(SPI_GETWORKAREA, 0, r, 0);
- }
- }
- BOOL windowOffScreen(HWND hwnd, POINT pt)
- {
- RECT r = {0}, wnd = {0}, sr = {0};
- GetWindowRect(hwnd, &wnd);
- sr.left = pt.x;
- sr.top = pt.y;
- sr.right = sr.left + (wnd.right - wnd.left);
- sr.bottom = sr.top + (wnd.bottom - wnd.top);
- getViewport(&r, hwnd, 0, &sr);
- return !PtInRect(&r, pt);
- }
- static INT_PTR OptionsFrame_OnInitDialog(HWND hwnd, HWND hFocus, LPARAM param)
- {
- HWND hWinamp = NULL;
- if (FAILED(Plugin_GetWinampWnd(&hWinamp)))
- hWinamp = NULL;
- OPTIONSDATA *optionsData = (OPTIONSDATA*)param;
- SetProp(hwnd, OPTIONS_PROP, optionsData);
- OptionsConfigHook *configHook;
- if (SUCCEEDED(OptionsConfigHook::CreateInstance(hwnd, &configHook)))
- {
- ifc_omconfig *config;
- if (NULL != optionsData->browserManager && SUCCEEDED(optionsData->browserManager->GetConfig(NULL, (void**)&config)))
- {
- config->RegisterCallback(configHook, &optionsData->configCookie);
- config->Release();
- }
- configHook->Release();
- }
- HWND hFrame = GetDlgItem(hwnd, IDC_TABFRAME);
- if (NULL != hFrame)
- {
- if (NULL != hWinamp && 0 == SENDWAIPC(hWinamp, IPC_USE_UXTHEME_FUNC, IPC_ISWINTHEMEPRESENT))
- SENDWAIPC(hWinamp, IPC_USE_UXTHEME_FUNC, hFrame);
- TabCtrl_SetMinTabWidth(hFrame, 60);
- OptionsFrame_InitializePages(hwnd, optionsData->style);
- OptionsFrame_NotifyTabSelected(hwnd);
- UINT style = GetWindowStyle(hFrame);
- style |= TCS_HOTTRACK | TCS_TABS | TCS_MULTILINE | TCS_RIGHTJUSTIFY;
- SetWindowLongPtr(hFrame, GWL_STYLE, style);
- }
- PostMessage(hwnd, WM_CHANGEUISTATE, MAKEWPARAM(UIS_INITIALIZE, UISF_HIDEACCEL | UISF_HIDEFOCUS), 0L);
- if (0 != optionsData->callback)
- optionsData->callback(hwnd, BOCALLBACK_INIT, optionsData->user);
- // show config window and restore last position as applicable
- obj_ombrowser *browserManager;
- if (FALSE != SendMessage(hwnd, BOM_GETBROWSER, 0, (LPARAM)&browserManager))
- {
- ifc_ombrowserconfig *browserConfig;
- if (SUCCEEDED(browserManager->GetConfig(&IFC_OmBrowserConfig, (void**)&browserConfig)))
- {
- POINT pt = {-1, -1};
- pt.x = browserConfig->GetX();
- pt.y = browserConfig->GetY();
- browserConfig->Release();
- if (!windowOffScreen(hwnd, pt))
- SetWindowPos(hwnd, HWND_TOP, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOSENDCHANGING);
- }
- browserManager->Release();
- }
- return 0;
- }
- static void OptionsFrame_OnDestroy(HWND hwnd)
- {
- obj_ombrowser *browserManager;
- if (FALSE != SendMessage(hwnd, BOM_GETBROWSER, 0, (LPARAM)&browserManager))
- {
- ifc_ombrowserconfig *browserConfig;
- if (SUCCEEDED(browserManager->GetConfig(&IFC_OmBrowserConfig, (void**)&browserConfig)))
- {
- RECT rect = {0};
- GetWindowRect(hwnd, &rect);
- browserConfig->SetX(rect.left);
- browserConfig->SetY(rect.top);
- browserConfig->Release();
- }
- browserManager->Release();
- }
- OPTIONSDATA *optionsData = GetOptions(hwnd);
- RemoveProp(hwnd, OPTIONS_PROP);
- if (NULL == optionsData)
- return;
- if (0 != optionsData->configCookie)
- {
- ifc_omconfig *config;
- if (NULL != optionsData->browserManager && SUCCEEDED(optionsData->browserManager->GetConfig(NULL, (void**)&config)))
- {
- config->UnregisterCallback(optionsData->configCookie);
- config->Release();
- }
- optionsData->configCookie = 0;
- }
- }
- static void OptionsFrame_OnWindowPosChanged(HWND hwnd, WINDOWPOS *pwp)
- {
- }
- static void OptionsFrame_OnTabSelected(HWND hwnd, HWND hFrame)
- {
- if (NULL == hFrame) return;
- HWND hPageOld = GetDlgItem(hwnd, IDC_ACTIVEPAGE);
- if (NULL != hPageOld)
- SetWindowLongPtr(hPageOld, GWLP_ID, 0);
- INT iSelected = TabCtrl_GetCurSel(hFrame);
- TCITEM tabItem;
- tabItem.mask = TCIF_PARAM;
- HWND hPage = (TRUE == TabCtrl_GetItem(hFrame, iSelected, &tabItem)) ? (HWND)tabItem.lParam : NULL;
- if (NULL != hPage)
- {
- SetWindowLongPtr(hPage, GWLP_ID, IDC_ACTIVEPAGE);
- RECT rcTab;
- GetClientRect(hFrame, &rcTab);
- MapWindowPoints(hFrame, hwnd, (POINT*)&rcTab, 2);
- TabCtrl_AdjustRect(hFrame, FALSE, &rcTab);
- SetWindowPos(hPage, HWND_TOP, rcTab.left, rcTab.top,
- rcTab.right - rcTab.left, rcTab.bottom - rcTab.top,
- SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOREDRAW);
- }
- if (NULL != hPage)
- {
- ShowWindow(hPage, SW_SHOWNA);
- }
- if (NULL != hPageOld)
- {
- ShowWindow(hPageOld, SW_HIDE);
- if (NULL != hPage)
- RedrawWindow(hPage, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN | RDW_NOINTERNALPAINT | RDW_NOERASE);
- }
- }
- static void OptionsFrame_OnCommand(HWND hwnd, INT commandId, INT eventId, HWND hControl)
- {
- switch(commandId)
- {
- case IDOK:
- case IDCANCEL:
- EndDialog(hwnd, 0);
- break;
- }
- }
- static LRESULT OptionsFrame_OnNotify(HWND hwnd, INT controlId, NMHDR *pnmh)
- {
- switch(controlId)
- {
- case IDC_TABFRAME:
- switch(pnmh->code)
- {
- case TCN_SELCHANGE:
- OptionsFrame_OnTabSelected(hwnd, pnmh->hwndFrom);
- break;
- }
- break;
- }
- return 0;
- }
- static LRESULT OptionsFrame_OnGetBrowser(HWND hwnd, obj_ombrowser **ppBrowser)
- {
- if (NULL == ppBrowser) return FALSE;
- OPTIONSDATA *optionsData = GetOptions(hwnd);
- if (NULL == optionsData || NULL == optionsData->browserManager)
- return FALSE;
- *ppBrowser = optionsData->browserManager;
- (*ppBrowser)->AddRef();
- return TRUE;
- }
- static void OptionsFrame_OnConfigChanged(HWND hwnd, BOMCONFIGCHANGED *configData)
- {
- HWND hControl = GetDlgItem(hwnd, IDC_TABFRAME);
- if (NULL == hControl) return;
- TCITEM item = {0};
- item.mask = TCIF_PARAM;
- INT count = (INT)SendMessage(hControl, TCM_GETITEMCOUNT, 0, 0L);
- for(INT i = 0; i < count; i++)
- {
- if (FALSE != (BOOL)SendMessage(hControl, TCM_GETITEM, (WPARAM)i, (LPARAM)&item) &&
- NULL != item.lParam)
- {
- SendMessage((HWND)item.lParam, BOM_CONFIGCHANGED, 0, (LPARAM)configData);
- }
- }
- }
- static INT_PTR CALLBACK OptionsFrame_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch(uMsg)
- {
- case WM_INITDIALOG: return OptionsFrame_OnInitDialog(hwnd, (HWND)wParam, lParam);
- case WM_DESTROY: OptionsFrame_OnDestroy(hwnd); return 0;
- case WM_WINDOWPOSCHANGED: OptionsFrame_OnWindowPosChanged(hwnd, (WINDOWPOS*)lParam); return TRUE;
- case WM_COMMAND: OptionsFrame_OnCommand(hwnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); return TRUE;
- case WM_NOTIFY: MSGRESULT(hwnd, OptionsFrame_OnNotify(hwnd, (INT)wParam, (NMHDR*)lParam));
- case BOM_GETBROWSER: MSGRESULT(hwnd, OptionsFrame_OnGetBrowser(hwnd, (obj_ombrowser**)lParam));
- case BOM_CONFIGCHANGED: OptionsFrame_OnConfigChanged(hwnd, (BOMCONFIGCHANGED*)lParam); return TRUE;
- }
- return 0;
- }
|