aboutsummaryrefslogtreecommitdiff
path: root/Src/nu/windowsTheme.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/nu/windowsTheme.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/nu/windowsTheme.cpp')
-rw-r--r--Src/nu/windowsTheme.cpp266
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);
+}