123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660 |
- /** (c) Nullsoft, Inc. C O N F I D E N T I A L
- ** Filename:
- ** Project:
- ** Description:
- ** Author:
- ** Created:
- **/
- #include "main.h"
- #include <windows.h>
- #include "strutil.h"
- #include "../nu/ns_wc.h"
- #include "plush/plush.h"
- #include "../nu/AutoChar.h"
- #include "../nu/AutoWide.h"
- #include "WinampAttributes.h"
- #undef GetSystemMetrics
- int IsUrl(const char *url)
- {
- return !!strstr(url, "://");
- }
- void link_startsubclass(HWND hwndDlg, UINT id){
- HWND ctrl = GetDlgItem(hwndDlg, id);
- if(!GetPropW(ctrl, L"link_proc"))
- {
- SetPropW(ctrl, L"link_proc",
- (HANDLE)SetWindowLongPtrW(ctrl, GWLP_WNDPROC, (LONG_PTR)link_handlecursor));
- }
- }
- static HCURSOR link_hand_cursor;
- LRESULT link_handlecursor(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- LRESULT ret = CallWindowProcW((WNDPROC)GetPropW(hwndDlg, L"link_proc"), hwndDlg, uMsg, wParam, lParam);
- // override the normal cursor behaviour so we have a hand to show it is a link
- if(uMsg == WM_SETCURSOR)
- {
- if((HWND)wParam == hwndDlg)
- {
- if(!link_hand_cursor)
- {
- link_hand_cursor = LoadCursor(NULL, IDC_HAND);
- }
- SetCursor(link_hand_cursor);
- return TRUE;
- }
- }
- return ret;
- }
- void link_handledraw(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- if (uMsg == WM_DRAWITEM)
- {
- DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam;
- if (di->CtlType == ODT_BUTTON)
- {
- wchar_t wt[123] = {0};
- int y;
- RECT r;
- HPEN hPen, hOldPen;
- GetDlgItemTextW(hwndDlg, wParam, wt, sizeof(wt)/sizeof(wt[0]));
- // draw text
- SetTextColor(di->hDC, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220));
- r = di->rcItem;
- // is used by the file types page to have a slimmer button so it doesn't override other
- // characters which are otherwise drawn over by the size of the button needed for a link
- if(GetPropW(di->hwndItem, L"slim"))
- {
- r.top -= 2;
- }
- r.left += 2;
- DrawTextW(di->hDC, wt, -1, &r, DT_VCENTER | DT_SINGLELINE);
- memset(&r, 0, sizeof(r));
- DrawTextW(di->hDC, wt, -1, &r, DT_SINGLELINE | DT_CALCRECT);
- // draw underline
- y = di->rcItem.bottom - ((di->rcItem.bottom - di->rcItem.top) - (r.bottom - r.top)) / 2 - 1;
- hPen = CreatePen(PS_SOLID, 0, (di->itemState & ODS_SELECTED) ? RGB(220, 0, 0) : RGB(0, 0, 220));
- hOldPen = (HPEN) SelectObject(di->hDC, hPen);
- MoveToEx(di->hDC, di->rcItem.left + 2, y, NULL);
- LineTo(di->hDC, di->rcItem.right + 2 - ((di->rcItem.right - di->rcItem.left) - (r.right - r.left)), y);
- SelectObject(di->hDC, hOldPen);
- DeleteObject(hPen);
- }
- }
- }
- ///////// if you update this, be sure to update the copy of it in $/winampa/winampicon.c
- // thx.
- int geticonid(int x)
- {
- switch (x) {
- case 1: return IDI_FILEICON;
- case 2: return IDI_FILEICON2;
- case 3: return IDI_FILEICON3;
- case 4: return IDI_FILEICON10;
- case 5: return IDI_FILEICON5;
- case 6: return IDI_FILEICON6;
- case 7: return IDI_FILEICON7;
- case 8: return IDI_FILEICON8;
- case 9: return IDI_FILEICON9;
- case 10: return IDI_FILEICON4;
- case 11: return IDI_FILEICON11;
- case 12: return ICON_TB1;
- case 13: return -666;
- default: return ICON_XP;
- }
- }
- /*
- void plSplineGetPoint(pl_Spline *s, float frame, float *out)
- {
- int i, i_1, i0, i1, i2;
- float time1, time2, time3;
- float t1, t2, t3, t4, u1, u2, u3, u4, v1, v2, v3;
- float a, b, c, d;
- float *keys = s->keys;
- a = (1 - s->tens) * (1 + s->cont) * (1 + s->bias);
- b = (1 - s->tens) * (1 - s->cont) * (1 - s->bias);
- c = (1 - s->tens) * (1 - s->cont) * (1 + s->bias);
- d = (1 - s->tens) * (1 + s->cont) * (1 - s->bias);
- v1 = t1 = -a / 2.0f; u1 = a;
- u2 = ( -6 - 2 * a + 2 * b + c) / 2.0f; v2 = (a - b) / 2.0f; t2 = (4 + a - b - c) / 2.0f;
- t3 = ( -4 + b + c - d) / 2.0f;
- u3 = (6 - 2 * b - c + d) / 2.0f;
- v3 = b / 2.0f;
- t4 = d / 2.0f; u4 = -t4;
- i0 = (int) frame;
- i_1 = i0 - 1;
- while (i_1 < 0) i_1 += s->numKeys;
- i1 = i0 + 1;
- while (i1 >= s->numKeys) i1 -= s->numKeys;
- i2 = i0 + 2;
- while (i2 >= s->numKeys) i2 -= s->numKeys;
- time1 = frame - (float) ((int) frame);
- time2 = time1 * time1;
- time3 = time2 * time1;
- i0 *= s->keyWidth;
- i1 *= s->keyWidth;
- i2 *= s->keyWidth;
- i_1 *= s->keyWidth;
- for (i = 0; i < s->keyWidth; i ++)
- {
- a = t1 * keys[i + i_1] + t2 * keys[i + i0] + t3 * keys[i + i1] + t4 * keys[i + i2];
- b = u1 * keys[i + i_1] + u2 * keys[i + i0] + u3 * keys[i + i1] + u4 * keys[i + i2];
- c = v1 * keys[i + i_1] + v2 * keys[i + i0] + v3 * keys[i + i1];
- *out++ = a * time3 + b * time2 + c * time1 + keys[i + i0];
- }
- }
- */
- //int transAccel(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
- //{
- // HACCEL h;
- // MSG msg;
- // if (hwnd == hMainWindow) h = hAccel[0];
- // else if (hwnd == hEQWindow) h = hAccel[1];
- // else if (hwnd == hPLWindow) h = hAccel[2];
- // // else if (hwnd==hMBWindow) h=hAccel[3];
- // else if (hwnd == hVideoWindow || GetParent(hwnd) == hVideoWindow)
- // {
- // h = hAccel[0];
- // }
- // else
- // {
- // return 0;
- // }
- // msg.hwnd = hwnd;
- // msg.lParam = lParam;
- // msg.message = uMsg;
- // msg.wParam = wParam;
- // return TranslateAccelerator(hwnd, h, &msg);
- //
- //}
- #include <pshpack4.h>
- typedef struct
- {
- DWORD dwSize;
- HANDLE hrasconn;
- char szEntryName[256 + 1];
- char szDeviceType[ 16 + 1 ];
- char szDeviceName[ 128 + 1 ];
- }
- RASCONN ;
- #include <poppack.h>
- typedef DWORD (WINAPI *RASENUMCONNECTIONS)(RASCONN *lprasconn,
- LPDWORD lpcb,
- LPDWORD lpcConnections);
- static int isRASActive()
- {
- int r = 0;
- HINSTANCE h = LoadLibraryA("rasapi32.dll");
- RASENUMCONNECTIONS RasEnumConnections;
- RASCONN v = {sizeof(RASCONN), };
- DWORD i = sizeof(v), o = 0;
- if (!h) return 0;
- RasEnumConnections = (RASENUMCONNECTIONS)GetProcAddress(h, "RasEnumConnectionsA");
- if (RasEnumConnections && !RasEnumConnections(&v, &i, &o) && o) r = 1;
- FreeModule(h);
- return r;
- }
- int isInetAvailable(void)
- {
- if (config_inet_mode == 3)
- {
- if (isRASActive()) config_inet_mode = 1;
- else config_inet_mode = 0;
- return (1 == config_inet_mode);
- }
- if (config_inet_mode == 0) return 1;
- if (config_inet_mode == 2) return 0;
- return isRASActive();
- }
- unsigned int getDay(void)
- {
- unsigned int day = 0;
- SYSTEMTIME tm, st = {0, };
- FILETIME ft1, ft2;
- ULARGE_INTEGER l1, l2;
- GetSystemTime(&tm);
- st.wYear = 1978;
- st.wMonth = 10;
- st.wDay = 14;
- SystemTimeToFileTime(&tm, &ft1);
- SystemTimeToFileTime(&st, &ft2);
- memcpy(&l1, &ft1, sizeof(l1));
- memcpy(&l2, &ft2, sizeof(l2));
- day = (int) ((l1.QuadPart - l2.QuadPart) / (10 * 1000 * 1000) / (60 * 60 * 24));
- return day;
- }
- void recent_add(const wchar_t *loc)
- {
- wchar_t ls[MAX_PATH] = {0};
- _r_sW("RecentURL1", ls, MAX_PATH);
- _w_sW("RecentURL1", loc);
- if (wcscmp(ls, loc))
- {
- int x = 2;
- while(1)
- {
- char s[123] = {0};
- wchar_t temp[MAX_PATH] = {0};
- StringCchPrintfA(s, 123, "RecentURL%d", x);
- _r_sW(s, temp, MAX_PATH);
- if (ls[0]) _w_sW(s, ls);
- if (!_wcsicmp(temp, loc) || !temp[0])
- break;
- lstrcpynW(ls, temp, MAX_PATH);
- x++;
- }
- }
- }
- #include <assert.h>
- 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);
- }
- void readwrite_client_uid(int isWrite, wchar_t uid_str[64])
- {
- HKEY hkey;
- wchar_t path[MAX_PATH] = {0};
- GetModuleFileNameW(0, path, MAX_PATH);
- if (isWrite)
- {
- IFileTypeRegistrar *registrar=0;
- if (GetRegistrar(®istrar, true) == 0 && registrar)
- {
- registrar->WriteClientUIDKey(path, uid_str);
- registrar->Release();
- }
- return;
- }
- if (!isWrite) *uid_str = 0;
- if (RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Nullsoft\\Winamp", 0, 0, 0, KEY_READ, NULL, &hkey, NULL) == ERROR_SUCCESS)
- {
- DWORD s = 512, t = REG_SZ;
- if (RegQueryValueExW(hkey, path, 0, &t, (LPBYTE)uid_str, &s) != ERROR_SUCCESS || t != REG_SZ) uid_str[0] = 0;
- RegCloseKey(hkey);
- }
- }
- BOOL read_compatmode()
- {
- HKEY hkey = NULL;
- wchar_t path[MAX_PATH] = {0};
- GetModuleFileNameW(0, path, MAX_PATH);
- if (RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", 0, 0, 0, KEY_READ, NULL, &hkey, NULL) == ERROR_SUCCESS)
- {
- DWORD s = 512, t = REG_SZ;
- wchar_t buf[128] = {0};
- if (RegQueryValueExW(hkey, path, 0, &t, (LPBYTE)buf, &s) != ERROR_SUCCESS || t != REG_SZ) buf[0] = 0;
- RegCloseKey(hkey);
- wchar_t *p = buf, *fields[] = {L"256COLOR", L"640X480", L"DISABLETHEMES", L"$",
- L"DISABLEDWM", L"DISABLEUSERCALLBACKEXCEPTION",
- L"HIGHDPIAWARE", L"RUNASADMIN", L"IGNOREFREELIBRARY",
- L"ELEVATECREATEPROCESS", L"#", L"~", L"PLACEHOLDERFILES"};
- int fields_len[] = {8, 7, 13, 1, 10, 28, 12, 10, 17, 20, 1, 1, 16};
- while (p && *p)
- {
- wchar_t *pp = p;
- while (pp && *pp && *pp != L' ')
- {
- pp = CharNextW(pp);
- }
- wchar_t pp_old = (pp ? *pp : 0);
- if (pp && *pp) *pp = 0;
- bool found = false;
- for (int i = 0; i < sizeof(fields)/sizeof(fields[0]); i++)
- {
- if (!wcsncmp(fields[i], p, fields_len[i]))
- found = true;
- }
- if (!found)
- return TRUE;
- if (pp) *pp = pp_old;
- if (!pp_old) break;
- p = CharNextW(pp);
- }
- }
- return FALSE;
- }
- BOOL IsVista(void)
- {
- static INT fVista = -1;
- if (-1 == fVista)
- {
- OSVERSIONINFO osver = {0};
- osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
- fVista = (::GetVersionEx(&osver) && osver.dwPlatformId == VER_PLATFORM_WIN32_NT && (osver.dwMajorVersion >= 6)) ? 1 : 0;
- }
- return (1 == fVista);
- }
- BOOL IsVistaOrLower(void)
- {
- static INT fVistaOrLower = -1;
- if (-1 == fVistaOrLower)
- {
- OSVERSIONINFO osver = {0};
- osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
- fVistaOrLower = (::GetVersionEx(&osver) && osver.dwPlatformId == VER_PLATFORM_WIN32_NT &&
- (osver.dwMajorVersion <= 5 || (osver.dwMajorVersion == 6 && osver.dwMinorVersion == 0))) ? 1 : 0;
- }
- return (1 == fVistaOrLower);
- }
- BOOL IsWin8(void)
- {
- static INT fWin8 = -1;
- if (-1 == fWin8)
- {
- OSVERSIONINFO osver = {0};
- osver.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
- fWin8 = ( ::GetVersionEx(&osver) && osver.dwPlatformId == VER_PLATFORM_WIN32_NT && (osver.dwMajorVersion > 6 || (osver.dwMajorVersion == 6 && osver.dwMinorVersion >= 2))) ? 1 : 0;
- }
- return (1 == fWin8);
- }
- //XP Theme crap
- typedef HRESULT (WINAPI * ENABLETHEMEDIALOGTEXTURE)(HWND, DWORD);
- int IsWinXPTheme(void)
- {
- static int previousRet = -1;
- if (previousRet == -1)
- {
- BOOL bEnabled(FALSE);
- OSVERSIONINFO vi;
- vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- if (GetVersionEx(&vi) && (vi.dwMajorVersion > 5 || (vi.dwMajorVersion == 5 && vi.dwMinorVersion > 0)))
- {
- HINSTANCE dll = LoadLibraryW(TEXT("uxtheme.dll"));
- if (dll)
- {
- BOOL (WINAPI *waIsAppThemed)(void);
- BOOL (WINAPI *waIsThemeActive)(void);
- waIsAppThemed = (BOOL (WINAPI *)())GetProcAddress(dll, "IsAppThemed");
- waIsThemeActive = (BOOL (WINAPI *)())GetProcAddress(dll, "IsThemeActive");
- if (waIsAppThemed && waIsThemeActive && waIsAppThemed() && waIsThemeActive())
- {
- HMODULE hComCtl = LoadLibraryW(TEXT("comctl32.dll"));
- if (hComCtl)
- {
- HRESULT (CALLBACK *waDllGetVersion)(DLLVERSIONINFO*) = (HRESULT (CALLBACK *)(DLLVERSIONINFO*))GetProcAddress(hComCtl, "DllGetVersion");
- if (waDllGetVersion)
- {
- DLLVERSIONINFO dllVer;
- dllVer.cbSize = sizeof(DLLVERSIONINFO);
- if (S_OK == waDllGetVersion(&dllVer) && dllVer.dwMajorVersion >= 6) bEnabled = TRUE;
- }
- FreeLibrary(hComCtl);
- }
- }
- FreeLibrary(dll);
- }
- }
- previousRet = bEnabled;
- }
- return previousRet;
- }
- void DoWinXPStyle(HWND tab)
- {
- WAEnableThemeDialogTexture(tab, ETDT_ENABLETAB);
- }
- HRESULT WAEnableThemeDialogTexture(HWND hwnd, DWORD dwFlags)
- {
- static int uxThemeTried = 0;
- static ENABLETHEMEDIALOGTEXTURE pfnETDT = NULL;
-
- if(!uxThemeTried)
- {
- HINSTANCE ux_hDll;
- if ((ux_hDll = LoadLibraryA("uxtheme.dll")) != NULL)
- pfnETDT = (ENABLETHEMEDIALOGTEXTURE)GetProcAddress(ux_hDll, "EnableThemeDialogTexture");
- uxThemeTried = 1;
- }
- return (pfnETDT) ? pfnETDT(hwnd, dwFlags) : E_NOTIMPL;
- }
- typedef BOOL(WINAPI*ISCOMPOSITIONACTIVE)(VOID);
- int IsAero(void)
- {
- static int uxTried = 0;
- static ISCOMPOSITIONACTIVE IsAeroActive = 0;
- if (!uxTried)
- {
- static HMODULE UXTHEME = 0;
- if ((UXTHEME = LoadLibraryA("uxtheme.dll")) != NULL)
- IsAeroActive = (ISCOMPOSITIONACTIVE)GetProcAddress(UXTHEME, "IsCompositionActive");
- uxTried = 1;
- }
- if (IsAeroActive)
- return !!IsAeroActive();
- else
- return 0;
- }
- /*
- int IsCharSpace(char digit)
- {
- WORD type=0;
- GetStringTypeEx(LOCALE_USER_DEFAULT, CT_CTYPE1, &digit, 1, &type);
- return type&C1_SPACE;
- }
- int IsCharSpaceW(wchar_t digit)
- {
- WORD type=0;
- GetStringTypeExW(LOCALE_USER_DEFAULT, CT_CTYPE1, &digit, 1, &type);
- return type&C1_SPACE;
- }
- */
- LPCWSTR BuildFullPath(LPCWSTR pszPathRoot, LPCWSTR pszPath, LPWSTR pszDest, INT cchDest)
- {
- LPCWSTR pszFile;
- if (!pszPath || !*pszPath)
- {
- pszDest[0] = 0x00;
- return pszDest;
- }
- pszFile = PathFindFileNameW(pszPath);
- if (pszFile != pszPath)
- {
- if (PathIsRelativeW(pszPath))
- {
- wchar_t szTemp[MAX_PATH] = {0};
- PathCombineW(szTemp, pszPathRoot, pszPath);
- PathCanonicalizeW(pszDest, szTemp);
- }
- else StringCchCopyW(pszDest, cchDest, pszPath);
- }
- else {
- if (pszPathRoot && *pszPathRoot) PathCombineW(pszDest, pszPathRoot, pszPath);
- else StringCchCopyW(pszDest, cchDest, pszPath);
- }
-
- return pszDest;
- }
- INT ComparePath(LPCWSTR pszPath1, LPCWSTR pszPath2, LPCWSTR pszPathRoot) // compares two pathes
- {
- INT cr;
- DWORD lcid;
- LPCWSTR pszFile1, pszFile2;
- if (!pszPath1 || !pszPath2) return 0;
- lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
-
- pszFile1 = PathFindFileNameW(pszPath1);
- pszFile2 = PathFindFileNameW(pszPath2);
- cr = CompareStringW(lcid, NORM_IGNORECASE, pszFile1, -1, pszFile2, -1);
-
- if (CSTR_EQUAL == cr && (pszFile1 != pszPath1 || pszFile2 != pszPath2))
- {
- wchar_t path1[MAX_PATH*2] = {0}, path2[MAX_PATH*2] = {0};
- pszPath1 = BuildFullPath(pszPathRoot, pszPath1, path1, sizeof(path1)/sizeof(wchar_t));
- pszPath2 = BuildFullPath(pszPathRoot, pszPath2, path2, sizeof(path2)/sizeof(wchar_t));
- if (!pszPath1 || !pszPath2) return 0;
- cr = CompareStringW(lcid, NORM_IGNORECASE, pszPath1, -1, path2, -1);
- }
- return cr;
- }
- BOOL DisabledWindow_OnMouseClick(HWND hwnd)
- {
- DWORD windowStyle = GetWindowLongPtrW(hwnd, GWL_STYLE);
- if (WS_DISABLED != ((WS_CHILD | WS_DISABLED) & windowStyle))
- return FALSE;
- HWND hActive = GetActiveWindow();
- HWND hPopup = GetWindow(hwnd, GW_ENABLEDPOPUP);
- BOOL beepOk = (hPopup == hActive || hwnd == GetWindow(hActive, GW_OWNER));
- if (!beepOk && NULL == hPopup)
- {
- for (HWND hWalker = hwnd; ;)
- {
- hWalker = GetWindow(hWalker, GW_OWNER);
- if (NULL == hWalker || (0 != (WS_CHILD & GetWindowLongPtrW(hWalker, GWL_STYLE))))
- break;
- if (hActive == GetWindow(hWalker, GW_ENABLEDPOPUP))
- {
- beepOk = TRUE;
- break;
- }
- }
- }
- if (beepOk)
- {
- if (config_accessibility_modalflash.GetBool())
- {
- FLASHWINFO flashInfo;
- flashInfo.cbSize = sizeof(FLASHWINFO);
- flashInfo.hwnd = hActive;
- flashInfo.dwFlags = FLASHW_CAPTION;
- flashInfo.uCount = 2;
- flashInfo.dwTimeout = 100;
- FlashWindowEx(&flashInfo);
- }
- if (config_accessibility_modalbeep.GetBool())
- MessageBeep(MB_OK);
- }
- else
- {
- for (HWND hWalker = hwnd; NULL == hPopup;)
- {
- hWalker = GetWindow(hWalker, GW_OWNER);
- if (NULL == hWalker || (0 != (WS_CHILD & GetWindowLongPtrW(hWalker, GWL_STYLE))))
- break;
- hPopup = GetWindow(hWalker, GW_ENABLEDPOPUP);
- }
- SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);
- if (NULL != hPopup && hPopup != hwnd)
- {
- BringWindowToTop(hPopup);
- SetActiveWindow(hPopup);
- }
- }
- return TRUE;
- }
|