summaryrefslogtreecommitdiff
path: root/alf/alfcompat.cpp
diff options
context:
space:
mode:
authorJonas Kümmerlin <jonas@kuemmerlin.eu>2019-04-28 16:14:12 +0200
committerJonas Kümmerlin <jonas@kuemmerlin.eu>2019-04-28 16:14:12 +0200
commitd64290aaffd4721518747713929d79a78ba963f4 (patch)
treeb891c41a49b5d5ad2ba3ba85e87fea262cb949c1 /alf/alfcompat.cpp
parent6b301ea64ca71777e38611d8c49dd119808b4365 (diff)
add owner-drawn themed button with animation
Diffstat (limited to 'alf/alfcompat.cpp')
-rw-r--r--alf/alfcompat.cpp356
1 files changed, 356 insertions, 0 deletions
diff --git a/alf/alfcompat.cpp b/alf/alfcompat.cpp
index 2260ed4..c0e11ba 100644
--- a/alf/alfcompat.cpp
+++ b/alf/alfcompat.cpp
@@ -358,6 +358,346 @@ ALF_Compat_loadSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvP
return ALF_Compat_SystemParametersInfoForDpi(uiAction, uiParam, pvParam, fWinIni, dpi);
}
+static HTHEME WINAPI
+ALF_Compat_fallbackOpenThemeData(HWND window, LPCWSTR classNames)
+{
+ (void)window;
+ (void)classNames;
+
+ return NULL;
+}
+
+static HTHEME WINAPI
+ALF_Compat_loadOpenThemeData(HWND window, LPCWSTR classNames)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "OpenThemeData");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackOpenThemeData;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_OpenThemeData, p, (void*)ALF_Compat_loadOpenThemeData);
+
+ return ALF_Compat_OpenThemeData(window, classNames);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackCloseThemeData(HTHEME hTheme)
+{
+ (void)hTheme;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadCloseThemeData(HTHEME hTheme)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "CloseThemeData");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackCloseThemeData;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_CloseThemeData, p, (void*)ALF_Compat_loadCloseThemeData);
+
+ return ALF_Compat_CloseThemeData(hTheme);
+}
+
+static BOOL WINAPI
+ALF_Compat_fallbackIsThemeBackgroundPartiallyTransparent(HTHEME hTheme, int iPartId, int iStateId)
+{
+ (void)hTheme; (void)iPartId; (void)iStateId;
+
+ return TRUE;
+}
+
+static BOOL WINAPI
+ALF_Compat_loadIsThemeBackgroundPartiallyTransparent(HTHEME hTheme, int iPartId, int iStateId)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "IsThemeBackgroundPartiallyTransparent");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackIsThemeBackgroundPartiallyTransparent;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_IsThemeBackgroundPartiallyTransparent, p, (void*)ALF_Compat_loadIsThemeBackgroundPartiallyTransparent);
+
+ return ALF_Compat_IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackDrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
+{
+ (void)hwnd;
+ (void)hdc;
+ (void)prc;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadDrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "DrawThemeParentBackground");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackDrawThemeParentBackground;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_DrawThemeParentBackground, p, (void*)ALF_Compat_loadDrawThemeParentBackground);
+
+ return ALF_Compat_DrawThemeParentBackground(hwnd, hdc, prc);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackDrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
+{
+ (void)hTheme;
+ (void)hdc;
+ (void)iPartId;
+ (void)iStateId;
+ (void)pRect;
+ (void)pClipRect;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadDrawThemeBackground(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, const RECT *pClipRect)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "DrawThemeBackground");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackDrawThemeBackground;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_DrawThemeBackground, p, (void*)ALF_Compat_loadDrawThemeBackground);
+
+ return ALF_Compat_DrawThemeBackground(hTheme, hdc, iPartId, iStateId, pRect, pClipRect);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackGetThemeBackgroundContentRect(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pBoundingRect, RECT *pContentRect)
+{
+ (void)hTheme;
+ (void)hdc;
+ (void)iPartId;
+ (void)iStateId;
+ (void)pBoundingRect;
+ (void)pContentRect;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadGetThemeBackgroundContentRect(HTHEME hTheme, HDC hdc, int iPArtId, int iStateId, const RECT *pBoundingRect, RECT *pContentRect)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "GetThemeBackgroundContentRect");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackGetThemeBackgroundContentRect;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_GetThemeBackgroundContentRect, p, (void*)ALF_Compat_loadGetThemeBackgroundContentRect);
+
+ return ALF_Compat_GetThemeBackgroundContentRect(hTheme, hdc, iPArtId, iStateId, pBoundingRect, pContentRect);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackGetThemeTextExtent(HTHEME hTheme, HDC hdc, int iPartId,
+ int iStateId, LPCWSTR pszText, int iCharCount,
+ DWORD dwTextFlags, const RECT *pBoundingRect,
+ RECT *pExtentRect)
+{
+ (void)hTheme; (void)hdc; (void)iPartId; (void)iStateId; (void)pszText;
+ (void)iCharCount; (void)dwTextFlags; (void)pBoundingRect; (void)pExtentRect;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadGetThemeTextExtent(HTHEME hTheme, HDC hdc, int iPartId,
+ int iStateId, LPCWSTR pszText, int iCharCount,
+ DWORD dwTextFlags, const RECT *pBoundingRect,
+ RECT *pExtentRect)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "GetThemeTextExtent");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackGetThemeTextExtent;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_GetThemeTextExtent, p, (void*)ALF_Compat_loadGetThemeTextExtent);
+
+ return ALF_Compat_GetThemeTextExtent(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, pBoundingRect, pExtentRect);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackDrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
+ LPCWSTR pszText, int iCharCount, DWORD dwTextFlags,
+ DWORD dwTextFlags2, const RECT *pRect)
+{
+ (void)hTheme; (void)hdc; (void)iPartId; (void)iStateId; (void)pszText;
+ (void)iCharCount; (void)dwTextFlags; (void)dwTextFlags2; (void)pRect;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadDrawThemeText(HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
+ LPCWSTR pszText, int iCharCount, DWORD dwTextFlags,
+ DWORD dwTextFlags2, const RECT *pRect)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "DrawThemeText");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackDrawThemeText;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_DrawThemeText, p, (void*)ALF_Compat_loadDrawThemeText);
+
+ return ALF_Compat_DrawThemeText(hTheme, hdc, iPartId, iStateId, pszText, iCharCount, dwTextFlags, dwTextFlags2, pRect);
+}
+
+static BOOL WINAPI
+ALF_Compat_fallbackTrackMouseEvent(LPTRACKMOUSEEVENT tme)
+{
+ (void)tme;
+
+ return FALSE;
+}
+
+static BOOL WINAPI
+ALF_Compat_loadTrackMouseEvent(LPTRACKMOUSEEVENT tme)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("comctl32.dll"), "_TrackMouseEvent");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackTrackMouseEvent;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_TrackMouseEvent, p, (void*)ALF_Compat_loadTrackMouseEvent);
+
+ return ALF_Compat_TrackMouseEvent(tme);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackBufferedPaintInit(void)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadBufferedPaintInit(void)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BufferedPaintInit");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackBufferedPaintInit;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_BufferedPaintInit, p, (void*)ALF_Compat_loadBufferedPaintInit);
+
+ return ALF_Compat_BufferedPaintInit();
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackBufferedPaintUnInit(void)
+{
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadBufferedPaintUnInit(void)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BufferedPaintUnInit");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackBufferedPaintUnInit;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_BufferedPaintUnInit, p, (void*)ALF_Compat_loadBufferedPaintUnInit);
+
+ return ALF_Compat_BufferedPaintUnInit();
+}
+
+static ALF_Compat_HANIMATIONBUFFER WINAPI
+ALF_Compat_fallbackBeginBufferedAnimation(HWND hwnd, HDC hdcTarget,
+ const RECT *prcTarget, DWORD dwFormat,
+ ALF_Compat_BP_PAINTPARAMS *pPaintParams,
+ ALF_Compat_BP_ANIMATIONPARAMS *pAnimationParams,
+ HDC *phdcFrom, HDC *phdcTo)
+{
+ (void)hwnd; (void)hdcTarget; (void)prcTarget; (void)dwFormat;
+ (void)pPaintParams; (void)pAnimationParams; (void)phdcFrom; (void)phdcTo;
+
+ return NULL;
+}
+
+static ALF_Compat_HANIMATIONBUFFER WINAPI
+ALF_Compat_loadBeginBufferedAnimation(HWND hwnd, HDC hdcTarget,
+ const RECT *prcTarget, DWORD dwFormat,
+ ALF_Compat_BP_PAINTPARAMS *pPaintParams,
+ ALF_Compat_BP_ANIMATIONPARAMS *pAnimationParams,
+ HDC *phdcFrom, HDC *phdcTo)
+{
+ void *p = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BeginBufferedAnimation");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackBeginBufferedAnimation;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_BeginBufferedAnimation, p, (void*)ALF_Compat_loadBeginBufferedAnimation);
+
+ return ALF_Compat_BeginBufferedAnimation(hwnd, hdcTarget, prcTarget, dwFormat, pPaintParams, pAnimationParams, phdcFrom, phdcTo);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackEndBufferedAnimation(ALF_Compat_HANIMATIONBUFFER hbpAnimation, BOOL fUpdateTarget)
+{
+ (void)hbpAnimation; (void)fUpdateTarget;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadEndBufferedAnimation(ALF_Compat_HANIMATIONBUFFER hbpAnimation, BOOL fUpdateTarget)
+{
+ void *p = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "EndBufferedAnimation");
+ if (!p)
+ p = (void*)ALF_Compat_fallbackEndBufferedAnimation;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_EndBufferedAnimation, p, (void*)ALF_Compat_loadEndBufferedAnimation);
+
+ return ALF_Compat_EndBufferedAnimation(hbpAnimation, fUpdateTarget);
+}
+
+static BOOL WINAPI
+ALF_Compat_fallbackBufferedPaintRenderAnimation(HWND hwnd, HDC hdc)
+{
+ (void)hwnd; (void)hdc;
+
+ return FALSE;
+}
+
+static BOOL WINAPI
+ALF_Compat_loadBufferedPaintRenderAnimation(HWND hwnd, HDC hdc)
+{
+ void *p = (void *)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "BufferedPaintRenderAnimation");
+ if (!p)
+ p = (void *)ALF_Compat_fallbackBufferedPaintRenderAnimation;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_BufferedPaintRenderAnimation, p, (void*)ALF_Compat_loadBufferedPaintRenderAnimation);
+
+ return ALF_Compat_BufferedPaintRenderAnimation(hwnd, hdc);
+}
+
+static HRESULT WINAPI
+ALF_Compat_fallbackGetThemeTransitionDuration(HTHEME hTheme,
+ int iPartId,
+ int iStateIdFrom,
+ int iStateIdTo,
+ int iPropId,
+ DWORD *pdwDuration)
+{
+ (void)hTheme; (void)iPartId; (void)iStateIdFrom; (void)iStateIdTo; (void)iPropId; (void)pdwDuration;
+
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI
+ALF_Compat_loadGetThemeTransitionDuration(HTHEME hTheme,
+ int iPartId,
+ int iStateIdFrom,
+ int iStateIdTo,
+ int iPropId,
+ DWORD *pdwDuration)
+{
+ void *p = (void*)GetProcAddress(GetModuleHandleA("uxtheme.dll"), "GetThemeTransitionDuration");
+
+ if (!p)
+ p = (void*)ALF_Compat_fallbackGetThemeTransitionDuration;
+
+ InterlockedCompareExchangePointer((void**)&ALF_Compat_GetThemeTransitionDuration, p, (void*)ALF_Compat_loadGetThemeTransitionDuration);
+
+ return ALF_Compat_GetThemeTransitionDuration(hTheme, iPartId, iStateIdFrom, iStateIdTo, iPropId, pdwDuration);
+}
BOOL (WINAPI *ALF_Compat_IsAppThemed)(void) = ALF_Compat_loadIsAppThemed;
UINT (WINAPI *ALF_Compat_GetDpiForWindow)(HWND /*window*/) = ALF_Compat_loadGetDpiForWindow;
@@ -373,3 +713,19 @@ BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT)
#else
BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT) = ALF_Compat_fallbackSystemParametersInfoForDpi;
#endif
+
+HTHEME (WINAPI *ALF_Compat_OpenThemeData)(HWND, LPCWSTR) = ALF_Compat_loadOpenThemeData;
+HRESULT (WINAPI *ALF_Compat_CloseThemeData)(HTHEME) = ALF_Compat_loadCloseThemeData;
+BOOL (WINAPI *ALF_Compat_IsThemeBackgroundPartiallyTransparent)(HTHEME,int,int) = ALF_Compat_loadIsThemeBackgroundPartiallyTransparent;
+HRESULT (WINAPI *ALF_Compat_DrawThemeParentBackground)(HWND,HDC,RECT *) = ALF_Compat_loadDrawThemeParentBackground;
+HRESULT (WINAPI *ALF_Compat_DrawThemeBackground)(HTHEME, HDC, int, int, const RECT *, const RECT *) = ALF_Compat_loadDrawThemeBackground;
+HRESULT (WINAPI *ALF_Compat_GetThemeBackgroundContentRect)(HTHEME,HDC,int,int,const RECT *,RECT *) = ALF_Compat_loadGetThemeBackgroundContentRect;
+HRESULT (WINAPI *ALF_Compat_GetThemeTextExtent)(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,const RECT *, RECT *) = ALF_Compat_loadGetThemeTextExtent;
+HRESULT (WINAPI *ALF_Compat_DrawThemeText)(HTHEME,HDC,int,int,LPCWSTR,int,DWORD,DWORD,const RECT *) = ALF_Compat_loadDrawThemeText;
+BOOL (WINAPI *ALF_Compat_TrackMouseEvent)(LPTRACKMOUSEEVENT tme) = ALF_Compat_loadTrackMouseEvent;
+HRESULT (WINAPI *ALF_Compat_BufferedPaintInit)(void) = ALF_Compat_loadBufferedPaintInit;
+HRESULT (WINAPI *ALF_Compat_BufferedPaintUnInit)(void) = ALF_Compat_loadBufferedPaintUnInit;
+ALF_Compat_HANIMATIONBUFFER (WINAPI *ALF_Compat_BeginBufferedAnimation)(HWND,HDC,const RECT *,DWORD,ALF_Compat_BP_PAINTPARAMS *,ALF_Compat_BP_ANIMATIONPARAMS *,HDC *,HDC *) = ALF_Compat_loadBeginBufferedAnimation;
+HRESULT (WINAPI *ALF_Compat_EndBufferedAnimation)(ALF_Compat_HANIMATIONBUFFER,BOOL) = ALF_Compat_loadEndBufferedAnimation;
+BOOL (WINAPI *ALF_Compat_BufferedPaintRenderAnimation)(HWND,HDC) = ALF_Compat_loadBufferedPaintRenderAnimation;
+HRESULT (WINAPI *ALF_Compat_GetThemeTransitionDuration)(HTHEME,int,int,int,int,DWORD*) = ALF_Compat_loadGetThemeTransitionDuration;