diff options
Diffstat (limited to 'src')
5 files changed, 176 insertions, 1 deletions
diff --git a/src/jogl/classes/jogamp/opengl/GLGraphicsConfigurationUtil.java b/src/jogl/classes/jogamp/opengl/GLGraphicsConfigurationUtil.java index 19a664071..cc7a578cd 100644 --- a/src/jogl/classes/jogamp/opengl/GLGraphicsConfigurationUtil.java +++ b/src/jogl/classes/jogamp/opengl/GLGraphicsConfigurationUtil.java @@ -145,4 +145,17 @@ public class GLGraphicsConfigurationUtil { return capsRequested; } + public static GLCapabilitiesImmutable fixOpaqueGLCapabilities(GLCapabilitiesImmutable capsRequested, boolean isOpaque) + { + GLCapabilities caps2 = null; + + if( capsRequested.isBackgroundOpaque() != isOpaque) { + // fix caps .. + caps2 = (GLCapabilities) capsRequested.cloneMutable(); + caps2.setBackgroundOpaque(isOpaque); + return caps2; + } + return capsRequested; + } + } diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java index a82a7a38c..989906514 100644 --- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java +++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfiguration.java @@ -48,7 +48,9 @@ import javax.media.opengl.GLException; import javax.media.opengl.GLPbuffer; import javax.media.opengl.GLProfile; +import jogamp.nativewindow.windows.DWM_BLURBEHIND; import jogamp.nativewindow.windows.GDI; +import jogamp.nativewindow.windows.MARGINS; import jogamp.nativewindow.windows.PIXELFORMATDESCRIPTOR; import jogamp.opengl.GLGraphicsConfigurationUtil; @@ -164,9 +166,27 @@ public class WindowsWGLGraphicsConfiguration extends DefaultGraphicsConfiguratio " for device context " + toHexString(hdc) + ": error code " + GDI.GetLastError()); } + if(!caps.isBackgroundOpaque()) { + final long hwnd = GDI.WindowFromDC(hdc); + DWM_BLURBEHIND bb = DWM_BLURBEHIND.create(); + bb.setDwFlags(GDI.DWM_BB_ENABLE); + bb.setFEnable(1); + boolean ok = GDI.DwmEnableBlurBehindWindow(hwnd, bb); + if(ok) { + MARGINS m = MARGINS.create(); + m.setCxLeftWidth(-1); + m.setCxRightWidth(-1); + m.setCyBottomHeight(-1); + m.setCyTopHeight(-1); + ok = GDI.DwmExtendFrameIntoClientArea(hwnd, m); + } + if(DEBUG) { + System.err.println("!!! translucency enabled on wnd: 0x"+Long.toHexString(hwnd)+" - ok: "+ok); + } + } if (DEBUG) { System.err.println("!!! setPixelFormat (ARB): hdc "+toHexString(hdc) +", "+caps); - } + } setCapsPFD(caps); } diff --git a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java index 1c607d2c7..178f2777c 100644 --- a/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java +++ b/src/jogl/classes/jogamp/opengl/windows/wgl/WindowsWGLGraphicsConfigurationFactory.java @@ -42,6 +42,7 @@ import javax.media.nativewindow.GraphicsConfigurationFactory; import javax.media.nativewindow.CapabilitiesImmutable; import javax.media.nativewindow.NativeSurface; import javax.media.nativewindow.NativeWindowFactory; +import javax.media.opengl.GLCapabilities; import javax.media.opengl.GLCapabilitiesImmutable; import javax.media.opengl.GLCapabilitiesChooser; import javax.media.opengl.GLContext; @@ -298,9 +299,14 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat } GLCapabilitiesImmutable capsChosen = (GLCapabilitiesImmutable) config.getChosenCapabilities(); + boolean isOpaque = capsChosen.isBackgroundOpaque() && GDI.DwmIsCompositionEnabled(); boolean onscreen = capsChosen.isOnscreen(); boolean usePBuffer = capsChosen.isPBuffer(); GLProfile glProfile = capsChosen.getGLProfile(); + + if(DEBUG) { + System.err.println("!!! translucency requested: "+(!capsChosen.isBackgroundOpaque())+", compositioning enabled: "+GDI.DwmIsCompositionEnabled()+" -> translucency "+(!isOpaque)); + } WGLGLCapabilities pixelFormatCaps = null; // chosen or preset PFD ID's caps boolean pixelFormatSet = false; // indicates a preset PFD ID [caps] @@ -316,6 +322,7 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat } pixelFormatSet = true; pixelFormatCaps = WindowsWGLGraphicsConfiguration.wglARBPFID2GLCapabilities(sharedResource, hdc, presetPFDID, glProfile, onscreen, usePBuffer); + pixelFormatCaps = (WGLGLCapabilities) GLGraphicsConfigurationUtil.fixOpaqueGLCapabilities(pixelFormatCaps, isOpaque); } else { int recommendedIndex = -1; // recommended index @@ -393,6 +400,7 @@ public class WindowsWGLGraphicsConfigurationFactory extends GLGraphicsConfigurat " chosen pfdID: native recommended "+ (recommendedIndex+1) + " chosen idx "+chosenIndex); } + pixelFormatCaps = (WGLGLCapabilities) GLGraphicsConfigurationUtil.fixOpaqueGLCapabilities(pixelFormatCaps, isOpaque); if (DEBUG) { System.err.println("!!! chosen pfdID (ARB): native recommended "+ (recommendedIndex+1) + " chosen "+pixelFormatCaps); 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 <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 != _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 <windows.h> + + #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_ */ |