From c8e147620c55ff16e9d687bb36a4374e97e82176 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Sun, 4 Sep 2011 10:51:16 +0200 Subject: Complete translucency support for Win32 - tested w/ NEWT https://jogamp.org/bugzilla/show_bug.cgi?id=517 - Adding some Windows DWM entries to GDI (manual) for translucency support - Add translucency setting in WindowsWGLGraphicsConfiguration* --- src/nativewindow/native/windows/WindowsDWM.c | 94 ++++++++++++++++++++++++++++ src/nativewindow/native/windows/WindowsDWM.h | 40 ++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 src/nativewindow/native/windows/WindowsDWM.c create mode 100644 src/nativewindow/native/windows/WindowsDWM.h (limited to 'src/nativewindow') diff --git a/src/nativewindow/native/windows/WindowsDWM.c b/src/nativewindow/native/windows/WindowsDWM.c new file mode 100644 index 000000000..4240e50a8 --- /dev/null +++ b/src/nativewindow/native/windows/WindowsDWM.c @@ -0,0 +1,94 @@ + +#include "WindowsDWM.h" + +#include +#include + +// #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 != _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; +} + diff --git a/src/nativewindow/native/windows/WindowsDWM.h b/src/nativewindow/native/windows/WindowsDWM.h new file mode 100644 index 000000000..742db1628 --- /dev/null +++ b/src/nativewindow/native/windows/WindowsDWM.h @@ -0,0 +1,40 @@ +#ifndef _WINDOWS_DWM_H_ +#define _WINDOWS_DWM_H_ + + #include + + #define DWM_BB_ENABLE 0x00000001 // fEnable has been specified + #define DWM_EC_DISABLECOMPOSITION 0 + #define DWM_EC_ENABLECOMPOSITION 1 + + typedef struct _DWM_BLURBEHIND + { + DWORD dwFlags; + BOOL fEnable; + HRGN hRgnBlur; + BOOL fTransitionOnMaximized; + } DWM_BLURBEHIND, *PDWM_BLURBEHIND; + + typedef struct _MARGINS + { + int cxLeftWidth; // width of left border that retains its size + int cxRightWidth; // width of right border that retains its size + int cyTopHeight; // height of top border that retains its size + int cyBottomHeight; // height of bottom border that retains its size + } MARGINS, *PMARGINS; + + BOOL DwmIsExtensionAvailable(); + BOOL DwmIsCompositionEnabled(); + BOOL DwmEnableComposition( UINT uCompositionAction ); + BOOL DwmEnableBlurBehindWindow(HWND hwnd, const DWM_BLURBEHIND* pBlurBehind); + BOOL DwmExtendFrameIntoClientArea(HWND hwnd, const MARGINS *pMarInset); + + /* + DWM_BLURBEHIND bb = {0}; + bb.dwFlags = DWM_BB_ENABLE; + bb.fEnable = true; + bb.hRgnBlur = NULL; + DwmEnableBlurBehindWindow(hWnd, &bb); + */ + +#endif /* _WINDOWS_DWM_H_ */ -- cgit v1.2.3