diff options
Diffstat (limited to 'src/nativewindow/native/win32/WindowsDWM.c')
-rw-r--r-- | src/nativewindow/native/win32/WindowsDWM.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/nativewindow/native/win32/WindowsDWM.c b/src/nativewindow/native/win32/WindowsDWM.c new file mode 100644 index 000000000..cc9ed6d8c --- /dev/null +++ b/src/nativewindow/native/win32/WindowsDWM.c @@ -0,0 +1,95 @@ + +#include "WindowsDWM.h" + +#include <stdlib.h> +#include <stdio.h> + +// #define VERBOSE_ON 1 + +#ifdef VERBOSE_ON + #define DBG_PRINT(args...) fprintf(stderr, args); +#else + #define DBG_PRINT(args...) +#endif + +/* GetProcAddress doesn't exist in A/W variants under desktop Windows */ +#ifndef UNDER_CE +#define GetProcAddressA GetProcAddress +#endif + +typedef HRESULT (WINAPI *DwmEnableCompositionPROCADDR)(UINT uCompositionAction); +typedef HRESULT (WINAPI *DwmIsCompositionEnabledPROCADDR)(BOOL * pfEnabled); +typedef HRESULT (WINAPI *DwmEnableBlurBehindWindowPROCADDR)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind); +typedef HRESULT (WINAPI *DwmExtendFrameIntoClientAreaPROCADDR)(HWND hwnd, const MARGINS *pMarInset); + +static int _init = 0; // 1: init, 2: has DWM extension +static DwmEnableCompositionPROCADDR _DwmEnableComposition = NULL; +static DwmIsCompositionEnabledPROCADDR _DwmIsCompositionEnabled = NULL; +static DwmEnableBlurBehindWindowPROCADDR _DwmEnableBlurBehindWindow = NULL; +static DwmExtendFrameIntoClientAreaPROCADDR _DwmExtendFrameIntoClientArea = NULL; + +static int initWindowsDWM() { + if(0 == _init) { + _init = 1; + HANDLE shell = LoadLibrary(TEXT("dwmapi.dll")); + if (shell) { + _DwmEnableComposition = (DwmEnableCompositionPROCADDR) GetProcAddressA (shell, "DwmEnableComposition"); + _DwmIsCompositionEnabled = (DwmIsCompositionEnabledPROCADDR) GetProcAddressA (shell, "DwmIsCompositionEnabled"); + _DwmEnableBlurBehindWindow = (DwmEnableBlurBehindWindowPROCADDR) GetProcAddressA (shell, "DwmEnableBlurBehindWindow"); + _DwmExtendFrameIntoClientArea = (DwmExtendFrameIntoClientAreaPROCADDR) GetProcAddressA (shell, "DwmExtendFrameIntoClientArea"); + if(NULL != _DwmEnableComposition && NULL != _DwmIsCompositionEnabled && + NULL != _DwmEnableBlurBehindWindow && NULL != _DwmExtendFrameIntoClientArea) { + _init = 2; + } + } + // FreeLibrary (shell); + DBG_PRINT("DWM - initWindowsDWM: %d - s %p, e %p, c %p\n", _init, shell, _DwmEnableBlurBehindWindow, _DwmExtendFrameIntoClientArea); + } + return _init; +} + +BOOL DwmIsExtensionAvailable() { + return (2 == initWindowsDWM()) ? TRUE : FALSE; +} + +BOOL DwmIsCompositionEnabled( ) { + if(2 == initWindowsDWM()) { + BOOL fEnabled = FALSE; + if( 0 == _DwmIsCompositionEnabled(&fEnabled) ) { + DBG_PRINT("DWM - DwmIsCompositionEnabled: %d\n", fEnabled); + return fEnabled; + } + } + DBG_PRINT("DWM - DwmIsCompositionEnabled failed\n"); + return FALSE; +} + +BOOL DwmEnableComposition( UINT uCompositionAction ) { + if(2 == initWindowsDWM()) { + return 0 == _DwmEnableComposition(uCompositionAction) ? TRUE : FALSE; + } + return FALSE; +} + +BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind) { + if(2 == initWindowsDWM()) { + _DwmEnableBlurBehindWindow(hwnd, pBlurBehind); + DBG_PRINT("DWM - DwmEnableBlurBehindWindow: hwnd %p, f %d, on %d, %p\n", + (void *)hwnd, + (int) pBlurBehind->dwFlags, + (int) pBlurBehind->fEnable, + (void *)pBlurBehind->hRgnBlur); + return TRUE; + } + DBG_PRINT("DWM - DwmEnableBlurBehindWindow: n/a\n"); + return FALSE; +} + +BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset) { + if(2 == initWindowsDWM()) { + _DwmExtendFrameIntoClientArea(hwnd, pMarInset); + return TRUE; + } + return FALSE; +} + |