diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/nu/windowsTheme.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/nu/windowsTheme.cpp')
-rw-r--r-- | Src/nu/windowsTheme.cpp | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/Src/nu/windowsTheme.cpp b/Src/nu/windowsTheme.cpp new file mode 100644 index 00000000..2085e30c --- /dev/null +++ b/Src/nu/windowsTheme.cpp @@ -0,0 +1,266 @@ +#include "./windowsTheme.h" +#include <shlwapi.h> + + +typedef UXTHEME (WINAPI *UXOPENTHEMEDATA)(HWND hwnd, LPCWSTR /*pszClassList*/); +typedef HRESULT (WINAPI *UXCLOSETHEMEDATA)(UXTHEME /*hTheme*/); +typedef HRESULT (WINAPI *UXSETWINDOWTHEME)(HWND /*hwnd*/, LPCWSTR /*pszSubAppName*/, LPCWSTR /*pszSubIdList*/); +typedef HRESULT (WINAPI *UXDRAWTHEMEBACKGROUND)(UXTHEME /*hTheme*/, HDC /*hdc*/, INT /*iPartId*/, INT /*iStateId*/, + LPCRECT /*pRect*/, LPCRECT /*pClipRect*/); +typedef HRESULT (WINAPI *UXDRAWTHEMEPARENTBACKGROUND)(HWND /*hwnd*/, HDC /*hdc*/, const RECT * /*prc*/); +typedef HRESULT (WINAPI *UXDRAWTHEMEPARENTBACKGROUNDEX)(HWND /*hwnd*/, HDC /*hdc*/, DWORD /*dwFlags*/, const RECT * /*prc*/); +typedef HRESULT (WINAPI *UXDRAWTHEMETEXT)(UXTHEME /*hTheme*/, HDC /*hdc*/, INT /*iPartId*/, INT /*iStateId*/, + LPCWSTR /*pszText*/, INT /*iCharCount*/, DWORD /*dwTextFlags*/, + DWORD /*dwTextFlags2*/, LPCRECT /*pRect*/); +typedef COLORREF (WINAPI *UXGETTHEMESYSCOLOR)(UXTHEME /*hTheme*/, INT /*iColorID*/); + +typedef HRESULT (WINAPI *UXGETTHEMECOLOR)(UXTHEME /*hTheme*/, int /*iPartId*/, int /*iStateId*/, int /*iPropId*/, LPCOLORREF /*pColor*/); +typedef HRESULT (WINAPI *UXGETTHEMEINT)(UXTHEME /*hTheme*/, int /*iPartId*/, int /*iStateId*/, int /*iPropId*/, LPINT /*piVal*/); +typedef HRESULT (WINAPI *UXGETTHEMEMETRIC)(UXTHEME /*hTheme*/, HDC /*hdc*/, int /*iPartId*/, int /*iStateId*/, int /*iPropId*/, LPINT /*piVal*/); +typedef HRESULT (WINAPI *UXGETTHEMEPARTSIZE)(UXTHEME /*hTheme*/, HDC /*hdc*/, int /*iPartId*/, int /*iStateId*/, LPCRECT /*prc*/, UXTHEMESIZE /*eSize*/, LPSIZE /*psz*/); +typedef HRESULT (WINAPI *UXGETTHEMEBACKGROUNDCONTENTRECT)(UXTHEME /*hTheme*/, HDC /*hdc*/, int /*iPartId*/, int /*iStateId*/, LPCRECT /*pBoundingRect*/, LPRECT /*pContentRect*/); +typedef HRESULT (WINAPI *UXENABLETHEMEDIALOGTEXTURE)(HWND /*hwnd*/, DWORD /*dwFlags*/); + +typedef BOOL (WINAPI *UXISAPPTHEMED)(void); +typedef BOOL (WINAPI *UXISTHEMEACTIVE)(void); +typedef BOOL (WINAPI *UXISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)(UXTHEME /*hTheme*/, int /*iPartId*/, int /*iStateId*/); + + + +static UXOPENTHEMEDATA uxOpenThemeData = NULL; +static UXCLOSETHEMEDATA uxCloseThemeData = NULL; +static UXSETWINDOWTHEME uxSetWindowTheme = NULL; +static UXISAPPTHEMED uxIsAppThemed = NULL; +static UXISTHEMEACTIVE uxIsThemeActive = NULL; +static UXDRAWTHEMEBACKGROUND uxDrawThemeBackground = NULL; +static UXDRAWTHEMEPARENTBACKGROUND uxDrawThemeParentBackground = NULL; +static UXDRAWTHEMEPARENTBACKGROUNDEX uxDrawThemeParentBackgroundEx = NULL; +static UXDRAWTHEMETEXT uxDrawThemeText = NULL; +static UXGETTHEMESYSCOLOR uxGetThemeSysColor = NULL; +static UXGETTHEMECOLOR uxGetThemeColor = NULL; +static UXGETTHEMEINT uxGetThemeInt = NULL; +static UXGETTHEMEMETRIC uxGetThemeMetric = NULL; +static UXGETTHEMEPARTSIZE uxGetThemePartSize = NULL; +static UXGETTHEMEBACKGROUNDCONTENTRECT uxGetThemeBackgroundContentRect = NULL; +static UXISTHEMEBACKGROUNDPARTIALLYTRANSPARENT uxIsThemeBackgroundPartiallyTransparent = NULL; +static UXENABLETHEMEDIALOGTEXTURE uxEnableThemeDialogTexture = NULL; + +static HMODULE uxModule = NULL; +static HRESULT uxLoadResult = E_WINTHEME_NOTLOADED; +static BOOL fSysCheckOk = -1; +static BOOL fComCtlCheckOk = -1; + + +#define UXTHEME_LOADCHECK(__uxFunction){\ + if (NULL == uxModule && FAILED(UxTheme_LoadLibrary())) return uxLoadResult;\ + if (NULL == (__uxFunction)) return E_WINTHEME_BADFUNCTION;} + +#define UXTHEME_LOADCHECK_RESULT(__uxFunction, __failResult){\ + if ((NULL == uxModule && FAILED(UxTheme_LoadLibrary())) || NULL == (__uxFunction))\ + return (__failResult);} + +HRESULT STDAPICALLTYPE UxTheme_LoadLibrary(void) +{ + if (E_WINTHEME_NOTLOADED == uxLoadResult) + { + uxModule = LoadLibraryW(L"uxtheme.dll"); + if (NULL == uxModule) + { + uxLoadResult = E_WINTHEME_LOADFAILED; + } + else + { + uxSetWindowTheme = (UXSETWINDOWTHEME)GetProcAddress(uxModule, "SetWindowTheme"); + uxIsAppThemed = (UXISAPPTHEMED)GetProcAddress(uxModule, "IsAppThemed"); + uxIsThemeActive = (UXISTHEMEACTIVE)GetProcAddress(uxModule, "IsThemeActive"); + uxOpenThemeData = (UXOPENTHEMEDATA)GetProcAddress(uxModule, "OpenThemeData"); + uxCloseThemeData = (UXCLOSETHEMEDATA)GetProcAddress(uxModule, "CloseThemeData"); + uxDrawThemeBackground = (UXDRAWTHEMEBACKGROUND)GetProcAddress(uxModule, "DrawThemeBackground"); + uxDrawThemeParentBackground = (UXDRAWTHEMEPARENTBACKGROUND)GetProcAddress(uxModule, "DrawThemeParentBackground"); + uxDrawThemeParentBackgroundEx = (UXDRAWTHEMEPARENTBACKGROUNDEX)GetProcAddress(uxModule, "DrawThemeParentBackgroundEx"); + uxDrawThemeText = (UXDRAWTHEMETEXT)GetProcAddress(uxModule, "DrawThemeText"); + uxGetThemeSysColor = (UXGETTHEMESYSCOLOR)GetProcAddress(uxModule, "GetThemeSysColor"); + uxGetThemeColor = (UXGETTHEMECOLOR)GetProcAddress(uxModule, "GetThemeColor"); + uxGetThemeInt = (UXGETTHEMEINT)GetProcAddress(uxModule, "GetThemeInt"); + uxGetThemeMetric = (UXGETTHEMEMETRIC)GetProcAddress(uxModule, "GetThemeMetric"); + uxGetThemePartSize = (UXGETTHEMEPARTSIZE)GetProcAddress(uxModule, "GetThemePartSize"); + uxGetThemeBackgroundContentRect = (UXGETTHEMEBACKGROUNDCONTENTRECT)GetProcAddress(uxModule, "GetThemeBackgroundContentRect"); + uxIsThemeBackgroundPartiallyTransparent = (UXISTHEMEBACKGROUNDPARTIALLYTRANSPARENT)GetProcAddress(uxModule, "IsThemeBackgroundPartiallyTransparent"); + uxEnableThemeDialogTexture = (UXENABLETHEMEDIALOGTEXTURE)GetProcAddress(uxModule, "EnableThemeDialogTexture"); + + uxLoadResult = S_OK; + } + } + + if (-1 == fSysCheckOk) + { + OSVERSIONINFOW vi; + vi.dwOSVersionInfoSize = sizeof(vi); + if (FALSE != GetVersionEx(&vi) && + (vi.dwMajorVersion > 5 || (vi.dwMajorVersion == 5 && vi.dwMinorVersion > 0))) + { + fSysCheckOk = TRUE; + } + else + { + fSysCheckOk = FALSE; + } + } + + if (-1 == fComCtlCheckOk) + { + fComCtlCheckOk = FALSE; + + HMODULE hComCtl = LoadLibraryW(L"comctl32.dll"); + if (NULL != hComCtl) + { + HRESULT (CALLBACK *waDllGetVersion)(DLLVERSIONINFO*) = (HRESULT (CALLBACK *)(DLLVERSIONINFO*))GetProcAddress(hComCtl, "DllGetVersion"); + if (NULL != waDllGetVersion) + { + DLLVERSIONINFO dllVer; + dllVer.cbSize = sizeof(DLLVERSIONINFO); + if (S_OK == waDllGetVersion(&dllVer) && dllVer.dwMajorVersion >= 6) + { + fComCtlCheckOk = TRUE; + } + FreeLibrary(hComCtl); + } + } + } + + + return uxLoadResult; +} + +HRESULT STDAPICALLTYPE UxTheme_IsThemeActive(void) +{ + if (NULL == uxIsAppThemed) + { + if(FAILED(UxTheme_LoadLibrary())) + return uxLoadResult; + if (NULL == uxIsAppThemed) return E_WINTHEME_BADFUNCTION; + } + + if (NULL == uxIsThemeActive) + { + if(FAILED(UxTheme_LoadLibrary())) + return uxLoadResult; + if (NULL == uxIsThemeActive) return E_WINTHEME_BADFUNCTION; + } + + if (TRUE != fSysCheckOk || TRUE != fComCtlCheckOk || + FALSE == uxIsAppThemed() || FALSE == uxIsThemeActive()) + { + return S_FALSE; + } + + return S_OK; + + +} + +HRESULT STDAPICALLTYPE UxTheme_GetLoadResult(void) +{ + return uxLoadResult; +} + +UXTHEME STDAPICALLTYPE UxOpenThemeData(HWND hwnd, LPCWSTR pszClassList) +{ + UXTHEME_LOADCHECK_RESULT(uxOpenThemeData, NULL); + return uxOpenThemeData(hwnd, pszClassList); +} + +HRESULT STDAPICALLTYPE UxCloseThemeData(UXTHEME hTheme) +{ + UXTHEME_LOADCHECK(uxCloseThemeData); + return uxCloseThemeData(hTheme); +} + +HRESULT STDAPICALLTYPE UxSetWindowTheme(HWND hwnd, LPCWSTR pszSubAppName, LPCWSTR pszSubIdList) +{ + UXTHEME_LOADCHECK(uxSetWindowTheme); + return uxSetWindowTheme(hwnd, pszSubAppName, pszSubIdList); +} + +BOOL STDAPICALLTYPE UxIsAppThemed(void) +{ + UXTHEME_LOADCHECK_RESULT(uxIsAppThemed, FALSE); + return uxIsAppThemed(); +} + +BOOL STDAPICALLTYPE UxIsThemeActive(void) +{ + UXTHEME_LOADCHECK_RESULT(UxIsThemeActive, FALSE); + return UxIsThemeActive(); +} + +HRESULT STDAPICALLTYPE UxDrawThemeBackground(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, + const RECT *pRect, OPTIONAL const RECT *pClipRect) +{ + UXTHEME_LOADCHECK(uxDrawThemeBackground); + return uxDrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, pClipRect); +} + +HRESULT STDAPICALLTYPE UxDrawThemeParentBackground(HWND hwnd, HDC hdc, const RECT *prc) +{ + UXTHEME_LOADCHECK(uxDrawThemeParentBackground); + return uxDrawThemeParentBackground(hwnd, hdc, prc); +} + +HRESULT STDAPICALLTYPE UxDrawThemeParentBackgroundEx(HWND hwnd, HDC hdc, DWORD dwFlags, const RECT *prc) +{ + UXTHEME_LOADCHECK(uxDrawThemeParentBackgroundEx); + return uxDrawThemeParentBackgroundEx(hwnd, hdc, dwFlags, prc); +} + +HRESULT STDAPICALLTYPE UxDrawThemeText(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCWSTR pszText, + int iCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, const RECT *pRect) +{ + UXTHEME_LOADCHECK(uxDrawThemeText); + return uxDrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect); +} + +COLORREF STDAPICALLTYPE UxGetThemeSysColor(UXTHEME hTheme, int iColorID) +{ + UXTHEME_LOADCHECK_RESULT(uxGetThemeSysColor, RGB(255, 0, 255)); + return uxGetThemeSysColor(hTheme, iColorID); +} + +HRESULT STDAPICALLTYPE UxGetThemeColor(UXTHEME hTheme, int iPartId, int iStateId, int iPropId, COLORREF *pColor) +{ + UXTHEME_LOADCHECK(uxGetThemeColor); + return uxGetThemeColor(hTheme, iPartId, iStateId, iPropId, pColor); +} +HRESULT STDAPICALLTYPE UxGetThemeInt(UXTHEME hTheme, int iPartId, int iStateId, int iPropId, int *piVal) +{ + UXTHEME_LOADCHECK(uxGetThemeInt); + return uxGetThemeInt(hTheme, iPartId, iStateId, iPropId, piVal); +} +HRESULT STDAPICALLTYPE UxGetThemeMetric(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, int iPropId, int *piVal) +{ + UXTHEME_LOADCHECK(uxGetThemeMetric); + return uxGetThemeMetric(hTheme, hdc, iPartId, iStateId, iPropId, piVal); +} +HRESULT STDAPICALLTYPE UxGetThemePartSize(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT prc, UXTHEMESIZE eSize, SIZE *psz) +{ + UXTHEME_LOADCHECK(uxGetThemePartSize); + return uxGetThemePartSize(hTheme, hdc, iPartId, iStateId, prc, eSize, psz); +} + +HRESULT STDAPICALLTYPE UxGetThemeBackgroundContentRect(UXTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pBoundingRect, LPRECT pContentRect) +{ + UXTHEME_LOADCHECK(uxGetThemeBackgroundContentRect); + return uxGetThemeBackgroundContentRect(hTheme, hdc, iPartId, iStateId, pBoundingRect, pContentRect); +} + +BOOL STDAPICALLTYPE UxIsThemeBackgroundPartiallyTransparent(UXTHEME hTheme, int iPartId, int iStateId) +{ + UXTHEME_LOADCHECK_RESULT(uxIsThemeBackgroundPartiallyTransparent, FALSE); + return uxIsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId); +} + +HRESULT STDAPICALLTYPE UxEnableThemeDialogTexture(HWND hwnd, DWORD dwFlags) +{ + UXTHEME_LOADCHECK(uxEnableThemeDialogTexture); + return uxEnableThemeDialogTexture(hwnd, dwFlags); +} |