W32: Implement composition check for GDK
Also move DWM function grabbing and make those functions available to all of GDK-Win32. https://bugzilla.gnome.org/show_bug.cgi?id=727316
This commit is contained in:
@ -48,6 +48,12 @@ static gboolean gdk_synchronize = FALSE;
|
||||
|
||||
static gboolean dummy;
|
||||
|
||||
#ifdef HAVE_W32_DWM
|
||||
static HMODULE dwmdll = NULL;
|
||||
PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow = NULL;
|
||||
PFN_DwmIsCompositionEnabled dwmIsCompositionEnabled = NULL;
|
||||
#endif
|
||||
|
||||
const GOptionEntry _gdk_windowing_args[] = {
|
||||
{ "sync", 0, 0, G_OPTION_ARG_NONE, &gdk_synchronize,
|
||||
/* Description of --sync in --help output */ N_("Don't batch GDI requests"), NULL },
|
||||
@ -132,6 +138,29 @@ _gdk_win32_windowing_init (void)
|
||||
_cf_text_html = RegisterClipboardFormat ("text/html");
|
||||
|
||||
_gdk_win32_selection_init ();
|
||||
|
||||
/* HAVE_W32_DWM means that we have necessary declarations at compile-time,
|
||||
* but we'd still like to be able to run on XP, so we'll load the functions
|
||||
* we need at runtime.
|
||||
*/
|
||||
#ifdef HAVE_W32_DWM
|
||||
if (dwmdll == NULL)
|
||||
{
|
||||
dwmdll = LoadLibraryA ("dwmapi.dll");
|
||||
if (dwmdll == NULL)
|
||||
{
|
||||
/* This will make sure that we only try this once */
|
||||
dwmdll = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
dwmEnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow)
|
||||
GetProcAddress (dwmdll, "DwmEnableBlurBehindWindow");
|
||||
dwmIsCompositionEnabled = (PFN_DwmIsCompositionEnabled)
|
||||
GetProcAddress (dwmdll, "DwmIsCompositionEnabled");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@ -41,6 +41,15 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_W32_DWM
|
||||
#include <dwmapi.h>
|
||||
typedef HRESULT (WINAPI *PFN_DwmEnableBlurBehindWindow)(HWND,
|
||||
const DWM_BLURBEHIND *);
|
||||
typedef HRESULT (WINAPI *PFN_DwmIsCompositionEnabled)(BOOL *pfEnabled);
|
||||
extern PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow;
|
||||
extern PFN_DwmIsCompositionEnabled dwmIsCompositionEnabled;
|
||||
#endif
|
||||
|
||||
/* Make up for some minor w32api or MSVC6 header lossage */
|
||||
|
||||
#ifndef PS_JOIN_MASK
|
||||
@ -496,6 +505,7 @@ gchar *_gdk_win32_display_manager_get_atom_name (GdkDisplayManager *manager,
|
||||
GdkAtom atom);
|
||||
void _gdk_win32_append_event (GdkEvent *event);
|
||||
void _gdk_win32_emit_configure_event (GdkWindow *window);
|
||||
gboolean _gdk_win32_is_desktop_composition_enabled ();
|
||||
|
||||
/* Initialization */
|
||||
void _gdk_win32_windowing_init (void);
|
||||
|
||||
@ -174,6 +174,23 @@ gdk_win32_screen_is_composited (GdkScreen *screen)
|
||||
{
|
||||
g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
|
||||
|
||||
return _gdk_win32_is_desktop_composition_enabled ();
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_win32_is_desktop_composition_enabled ()
|
||||
{
|
||||
BOOL b;
|
||||
DWORD sysver, major, minor;
|
||||
sysver = GetVersion ();
|
||||
major = (DWORD)(LOBYTE (LOWORD (sysver)));
|
||||
minor = (DWORD)(HIBYTE (LOWORD (sysver)));
|
||||
/* Composition is always enabled in W8 */
|
||||
if (major >= 6 && minor >= 2)
|
||||
return TRUE;
|
||||
|
||||
if (dwmIsCompositionEnabled && (S_OK == dwmIsCompositionEnabled (&b)))
|
||||
return b;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user