File 0001-Save-Windows-XP-compatibility.patch of Package mingw64-gtk3

From f9e841af3fb0c33043adf4fcf3f026c883585af0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fridrich=20=C5=A0trba?= <fridrich.strba@bluewin.ch>
Date: Tue, 20 Oct 2015 10:35:06 +0200
Subject: [PATCH] Save Windows XP compatibility

---
 configure.ac                |  2 +-
 gdk/Makefile.am             |  2 +-
 gdk/win32/gdkscreen-win32.c | 26 +++++++++++++++++++++++++-
 gdk/win32/gdkwindow-win32.c | 23 ++++++++++++++++++++++-
 4 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/configure.ac b/configure.ac
index 09b464d..4c3829f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -384,7 +384,7 @@ if test "$enable_win32_backend" = "yes"; then
   backend_immodules="$backend_immodules,ime"
   GDK_WINDOWING="$GDK_WINDOWING
 #define GDK_WINDOWING_WIN32"
-  GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi"
+  GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm"
   AM_CONDITIONAL(USE_WIN32, true)
   PANGO_PACKAGES="pangowin32 pangocairo"
 else
diff --git a/gdk/Makefile.am b/gdk/Makefile.am
index dea10d1..5841585 100644
--- a/gdk/Makefile.am
+++ b/gdk/Makefile.am
@@ -195,7 +195,7 @@ libgdk_3_la_LIBADD += quartz/libgdk-quartz.la
 endif # USE_QUARTZ
 
 if USE_WIN32
-libgdk_3_la_LIBADD += win32/libgdk-win32.la
+libgdk_3_la_LIBADD += win32/libgdk-win32.la $(GLIB_LIBS)
 libgdk_3_la_DEPENDENCIES = win32/libgdk-win32.la win32/rc/gdk-win32-res.o
 libgdk_3_la_LDFLAGS += -Wl,win32/rc/gdk-win32-res.o
 endif # USE_WIN32
diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c
index c637b95..497f570 100644
--- a/gdk/win32/gdkscreen-win32.c
+++ b/gdk/win32/gdkscreen-win32.c
@@ -22,6 +22,7 @@
 #include "gdkwin32screen.h"
 
 #include <dwmapi.h>
+#include <gmodule.h>
 
 struct _GdkWin32Screen
 {
@@ -189,6 +190,9 @@ gdk_win32_screen_get_window_stack (GdkScreen *screen)
 static gboolean
 gdk_win32_screen_is_composited (GdkScreen *screen)
 {
+  GModule *dwmapi_module = NULL;
+  typedef HRESULT (*tDwmIsCompositionEnabled)(BOOL*);
+  static tDwmIsCompositionEnabled pDwmIsCompositionEnabled = NULL;
   gboolean is_composited;
   g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
 
@@ -197,8 +201,28 @@ gdk_win32_screen_is_composited (GdkScreen *screen)
     return TRUE;
   else
     {
-      if (DwmIsCompositionEnabled (&is_composited) != S_OK)
+      dwmapi_module = g_module_open ("dwmapi.dll", G_MODULE_BIND_LAZY);
+      if (dwmapi_module == NULL)
         return FALSE;
+
+      if (! g_module_symbol (dwmapi_module, "DwmIsCompositionEnabled", (gpointer)pDwmIsCompositionEnabled))
+      {
+        g_module_close(dwmapi_module);
+        return FALSE;
+      }
+
+      if (pDwmIsCompositionEnabled == NULL)
+      {
+        g_module_close(dwmapi_module);
+        return FALSE;
+      }
+
+      if (pDwmIsCompositionEnabled (&is_composited) != S_OK)
+      {
+        g_module_close(dwmapi_module);
+        return FALSE;
+      }
+      g_module_close(dwmapi_module);
       return is_composited;
     }
 }
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 67519aa..e0926ac 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -42,6 +42,7 @@
 
 #include <cairo-win32.h>
 #include <dwmapi.h>
+#include <gmodule.h>
 
 static void gdk_window_impl_win32_init       (GdkWindowImplWin32      *window);
 static void gdk_window_impl_win32_class_init (GdkWindowImplWin32Class *klass);
@@ -242,6 +243,9 @@ _gdk_windowing_window_init (GdkScreen *screen)
 gboolean
 _gdk_win32_window_enable_transparency (GdkWindow *window)
 {
+  GModule *dwmapi_module = NULL;
+  typedef HRESULT (*tDwmEnableBlurBehindWindow)(HWND,const DWM_BLURBEHIND*);
+  static tDwmEnableBlurBehindWindow pDwmEnableBlurBehindWindow = NULL;
   DWM_BLURBEHIND blur_behind;
   HRGN empty_region;
   HRESULT call_result;
@@ -256,6 +260,22 @@ _gdk_win32_window_enable_transparency (GdkWindow *window)
   if (window == _gdk_root)
     return FALSE;
 
+  dwmapi_module = g_module_open ("dwmapi.dll", G_MODULE_BIND_LAZY);
+  if (dwmapi_module == NULL)
+    return FALSE;
+
+  if (! g_module_symbol (dwmapi_module, "DwmEnableBlurBehindWindow", (gpointer)pDwmEnableBlurBehindWindow))
+  {
+    g_module_close(dwmapi_module);
+    return FALSE;
+  }
+
+  if (pDwmEnableBlurBehindWindow == NULL)
+  {
+    g_module_close(dwmapi_module);
+    return FALSE;
+  }
+
   thiswindow = GDK_WINDOW_HWND (window);
 
   /* Blurbehind only works on toplevel windows */
@@ -273,7 +293,7 @@ _gdk_win32_window_enable_transparency (GdkWindow *window)
   blur_behind.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
   blur_behind.hRgnBlur = empty_region;
   blur_behind.fEnable = TRUE;
-  call_result = DwmEnableBlurBehindWindow (thiswindow, &blur_behind);
+  call_result = pDwmEnableBlurBehindWindow (thiswindow, &blur_behind);
 
   if (!SUCCEEDED (call_result))
     g_warning ("%s: %s (%p) failed: %" G_GINT32_MODIFIER "x",
@@ -281,6 +301,7 @@ _gdk_win32_window_enable_transparency (GdkWindow *window)
 
   DeleteObject (empty_region);
 
+  g_module_close(dwmapi_module);
   return SUCCEEDED (call_result);
 }
 
-- 
2.6.0

openSUSE Build Service is sponsored by