#include "alfpriv.h" #include #if defined(_MSC_VER) && defined(_M_IX86) # pragma warning(push) # pragma warning(disable:4035) // HACK: inline assembly for MSVC 6 // TODO: add version detection to use intrinsic on newer MSVC versions static inline LONG ALF_Compat_InterlockedIncrement(LONG volatile *addend) { __asm { mov eax,1 mov edx,addend lock xadd [edx],eax } } # ifdef InterlockedIncrement # undef InterlockedIncrement # endif # define InterlockedIncrement(d) ALF_Compat_InterlockedIncrement(d) static inline LONG ALF_Compat_InterlockedCompareExchange(volatile LONG *destination, LONG exchange, LONG comparand) { __asm { mov eax,comparand mov ecx,exchange mov edx,destination lock cmpxchg [edx],ecx } } # ifdef InterlockedCompareExchange # undef InterlockedCompareExchange # endif # define InterlockedCompareExchange(d,e,c) ALF_Compat_InterlockedCompareExchange(d,e,c) static inline PVOID ALF_Compat_InterlockedCompareExchangePointer(PVOID volatile *destination, PVOID exchange, PVOID comparand) { return (void*)InterlockedCompareExchange((LONG volatile *)destination, (LONG)exchange, (LONG)comparand); } # ifdef InterlockedCompareExchangePointer # undef InterlockedCompareExchangePointer # endif # define InterlockedCompareExchangePointer(d,e,c) ALF_Compat_InterlockedCompareExchangePointer(d,e,c) # pragma warning(pop) #endif static DWORD ALF_DllGetVersion(const char *dll) { HMODULE hDll = GetModuleHandleA(dll); if (hDll) { DLLGETVERSIONPROC pDllGetVersion; pDllGetVersion = (DLLGETVERSIONPROC)(void*)GetProcAddress(hDll, "DllGetVersion"); if (pDllGetVersion) { DLLVERSIONINFO dvi; HRESULT hr; ZeroMemory(&dvi, sizeof(dvi)); dvi.cbSize = sizeof(dvi); hr = (*pDllGetVersion)(&dvi); if (SUCCEEDED(hr)) { return MAKELONG(dvi.dwMinorVersion, dvi.dwMajorVersion); } } } return 0; } static int WINAPI ALF_Compat_fallbackGetSystemMetricsForDpi(int nIndex, UINT dpi) { (void)dpi; if (LOBYTE(LOWORD(GetVersion())) < 4) { // old NT does not support several properties, so we fake them switch (nIndex) { case SM_CXEDGE: case SM_CYEDGE: return 2; } } return GetSystemMetrics(nIndex); } static BOOL WINAPI ALF_Compat_fallbackIsAppThemed(void) { return FALSE; } static UINT WINAPI ALF_Compat_fallbackGetDpiForWindow(HWND win) { (void)win; UINT dpi = 0; HDC hdcScreen = GetDC(NULL); if (hdcScreen) { dpi = GetDeviceCaps(hdcScreen, LOGPIXELSY); ReleaseDC(NULL, hdcScreen); } if (!dpi) { dpi = 96; // FIXME! fallback to default DPI } return dpi; } static BOOL WINAPI ALF_Compat_fallbackSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, UINT dpi) { (void)dpi; return SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); } static BOOL WINAPI ALF_Compat_fallbackAdjustWindowRectExForDpi(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle, UINT dpi) { (void)dpi; return AdjustWindowRectEx(lpRect, dwStyle, bMenu, dwExStyle); } // FIXME: these support one subclass only, negating the whole point of it typedef struct { ALF_COMPAT_SUBCLASSPROC pfnSubclass; UINT_PTR uIdSubclass; DWORD_PTR dwRefData; UINT runCounter; WNDPROC orig; } ALFWindowSubclassData; static LRESULT CALLBACK ALF_Compat_fallbackSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ALFWindowSubclassData *data = (ALFWindowSubclassData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); LRESULT ret = 0; data->runCounter++; if (data->pfnSubclass) ret = data->pfnSubclass(hwnd, uMsg, wParam, lParam, data->uIdSubclass, data->dwRefData); else ret = CallWindowProc(data->orig, hwnd, uMsg, wParam, lParam); data->runCounter--; if (!data->pfnSubclass && !data->runCounter) { SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); ALF_Free(data); } return ret; } static BOOL WINAPI ALF_Compat_fallbackSetWindowSubclass(HWND hwnd, ALF_COMPAT_SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { ALFWindowSubclassData *data = ALF_New(ALFWindowSubclassData, 1); data->pfnSubclass = pfnSubclass; data->uIdSubclass = uIdSubclass; data->dwRefData = dwRefData; data->orig = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_WNDPROC); SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)data); SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)ALF_Compat_fallbackSubclassProc); return TRUE; } static LRESULT WINAPI ALF_Compat_fallbackDefSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ALFWindowSubclassData *data = (ALFWindowSubclassData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); return CallWindowProc(data->orig, hwnd, uMsg, wParam, lParam); } static BOOL WINAPI ALF_Compat_fallbackRemoveWindowSubclass(HWND hwnd, ALF_COMPAT_SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass) { (void)pfnSubclass; (void)uIdSubclass; ALFWindowSubclassData *data = (ALFWindowSubclassData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); data->pfnSubclass = 0; data->uIdSubclass = 0; SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)data->orig); // can't free it while the subclass is running, possibly in a nested SendMessage // and wants to call DefSubclassProc if (!data->runCounter) { SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); ALF_Free(data); } return TRUE; } long ALF_GetAveCharWidth(HDC hdc) { // see: HOWTO: Calculate Dialog Units When Not Using the System Font SIZE s; GetTextExtentPoint32A(hdc, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 52, &s); return (s.cx / 26 + 1) / 2; } void ALF_UniqueCounterValue(LONG_PTR *pCounterId, LONG_PTR *pCounterValue) { static LONG counter = 0; LONG r = InterlockedIncrement(&counter); *pCounterId = (LONG_PTR)&counter; *pCounterValue = r; } static BOOL WINAPI ALF_Compat_loadIsAppThemed(void) { HMODULE hUxTheme = GetModuleHandleA("uxtheme.dll"); FARPROC p = GetProcAddress(hUxTheme, "IsAppThemed"); if (!p || ALF_DllGetVersion("comctl32.dll") < 0x60000) p = (FARPROC)ALF_Compat_fallbackIsAppThemed; InterlockedCompareExchangePointer((void**)&ALF_Compat_IsAppThemed, (void*)p, (void*)ALF_Compat_loadIsAppThemed); return ALF_Compat_IsAppThemed(); } static UINT WINAPI ALF_Compat_loadGetDpiForWindow(HWND window) { FARPROC p = GetProcAddress(GetModuleHandleA("user32.dll"), "GetDpiForWindow"); if (!p) p = (FARPROC)(void*)ALF_Compat_fallbackGetDpiForWindow; InterlockedCompareExchangePointer((void**)&ALF_Compat_GetDpiForWindow, (void*)p, (void*)ALF_Compat_loadGetDpiForWindow); return ALF_Compat_GetDpiForWindow(window); } static BOOL WINAPI ALF_Compat_loadAdjustWindowRectExForDpi(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWORD dwExStyle, UINT dpi) { FARPROC p = GetProcAddress(GetModuleHandleA("user32.dll"), "AdjustWindowRectExForDpi"); if (!p) p = (FARPROC)(void*)ALF_Compat_fallbackAdjustWindowRectExForDpi; InterlockedCompareExchangePointer((void**)&ALF_Compat_AdjustWindowRectExForDpi, (void*)p, (void*)ALF_Compat_loadAdjustWindowRectExForDpi); return ALF_Compat_AdjustWindowRectExForDpi(lpRect, dwStyle, bMenu, dwExStyle, dpi); } static int WINAPI ALF_Compat_loadGetSystemMetricsForDpi(int nIndex, UINT dpi) { void *p = (void*)GetProcAddress(GetModuleHandleA("user32.dll"), "GetSystemMetricsForDpi"); if (!p) p = (void*)ALF_Compat_fallbackGetSystemMetricsForDpi; InterlockedCompareExchangePointer((void**)&ALF_Compat_GetSystemMetricsForDpi, p, (void*)ALF_Compat_loadGetSystemMetricsForDpi); return ALF_Compat_GetSystemMetricsForDpi(nIndex, dpi); } static BOOL WINAPI ALF_Compat_loadSetWindowSubclass(HWND hwnd, ALF_COMPAT_SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass, DWORD_PTR dwRefData) { HMODULE comctl32 = GetModuleHandleA("comctl32.dll"); void *p = (void*)GetProcAddress(comctl32, "SetWindowSubclass"); if (!p) { p = (void*)GetProcAddress(comctl32, (char*)410); if (!p) { p = (void*)ALF_Compat_fallbackSetWindowSubclass; } } InterlockedCompareExchangePointer((void**)&ALF_Compat_SetWindowSubclass, p, (void*)ALF_Compat_loadSetWindowSubclass); return ALF_Compat_SetWindowSubclass(hwnd, pfnSubclass, uIdSubclass, dwRefData); } static BOOL WINAPI ALF_Compat_loadRemoveWindowSubclass(HWND hwnd, ALF_COMPAT_SUBCLASSPROC pfnSubclass, UINT_PTR uIdSubclass) { HMODULE comctl32 = GetModuleHandleA("comctl32.dll"); void *p = (void*)GetProcAddress(comctl32, "RemoveWindowSubclass"); if (!p) { p = (void*)GetProcAddress(comctl32, (char*)412); if (!p) { p = (void*)ALF_Compat_fallbackRemoveWindowSubclass; } } InterlockedCompareExchangePointer((void**)&ALF_Compat_RemoveWindowSubclass, p, (void*)ALF_Compat_loadRemoveWindowSubclass); return ALF_Compat_RemoveWindowSubclass(hwnd, pfnSubclass, uIdSubclass); } static LRESULT WINAPI ALF_Compat_loadDefSubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HMODULE comctl32 = GetModuleHandleA("comctl32.dll"); void *p = (void*)GetProcAddress(comctl32, "DefSubclassProc"); if (!p) { p = (void*)GetProcAddress(comctl32, (char*)413); if (!p) { p = (void*)ALF_Compat_fallbackDefSubclassProc; } } InterlockedCompareExchangePointer((void**)&ALF_Compat_DefSubclassProc, p, (void*)ALF_Compat_loadDefSubclassProc); return ALF_Compat_DefSubclassProc(hwnd, uMsg, wParam, lParam); } static BOOL WINAPI ALF_Compat_loadSystemParametersInfoForDpi(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni, UINT dpi) { void *p = (void*)GetProcAddress(GetModuleHandleA("user32.dll"), "SystemParametersInfoForDpi"); if (!p) p = (void*)ALF_Compat_fallbackSystemParametersInfoForDpi; InterlockedCompareExchangePointer((void**)&ALF_Compat_SystemParametersInfoForDpi, p, (void*)ALF_Compat_loadSystemParametersInfoForDpi); 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; BOOL (WINAPI *ALF_Compat_AdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT) = ALF_Compat_loadAdjustWindowRectExForDpi; int (WINAPI *ALF_Compat_GetSystemMetricsForDpi)(int, UINT) = ALF_Compat_loadGetSystemMetricsForDpi; BOOL (WINAPI *ALF_Compat_SetWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR, DWORD_PTR) = ALF_Compat_loadSetWindowSubclass; LRESULT (WINAPI *ALF_Compat_DefSubclassProc)(HWND, UINT, WPARAM, LPARAM) = ALF_Compat_loadDefSubclassProc; BOOL (WINAPI *ALF_Compat_RemoveWindowSubclass)(HWND, ALF_COMPAT_SUBCLASSPROC, UINT_PTR) = ALF_Compat_loadRemoveWindowSubclass; // FIXME! do Unicode properly for SystemParametersInfoForDpi #ifdef UNICODE BOOL (WINAPI *ALF_Compat_SystemParametersInfoForDpi)(UINT,UINT,PVOID,UINT,UINT) = ALF_Compat_loadSystemParametersInfoForDpi; #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;