[gtk+] W32: RGBA GDK backend (broken)
- From: Руслан Ижбулатов <ruslanizhb src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] W32: RGBA GDK backend (broken)
- Date: Thu, 10 Apr 2014 17:50:28 +0000 (UTC)
commit f89d38bc2d139ae1baab5c25e1d6ac451a2d5a5e
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date: Sat Mar 29 21:28:33 2014 +0000
W32: RGBA GDK backend (broken)
https://bugzilla.gnome.org/show_bug.cgi?id=727316
configure.ac | 19 ++++++++++++++++++
gdk/win32/gdkscreen-win32.c | 2 +-
gdk/win32/gdkvisual-win32.c | 1 -
gdk/win32/gdkwindow-win32.c | 44 ++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 63 insertions(+), 3 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 462bcca..0556016 100644
--- a/configure.ac
+++ b/configure.ac
@@ -363,6 +363,25 @@ fi
AC_SUBST(ENABLE_ON_X11)
if test "$enable_win32_backend" = "yes"; then
+ AC_MSG_CHECKING([for DWM])
+ AC_LINK_IFELSE([
+ AC_LANG_PROGRAM([[
+ #include <windows.h>
+ #include <dwmapi.h>
+ ]],
+ [[
+ DWM_BLURBEHIND bb;
+ memset (&bb, 0, sizeof (bb));
+ bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
+ ]]
+ )],
+ [dwm_ok=yes], [dwm_ok=no]
+ )
+ AC_MSG_RESULT($dwm_ok)
+ if test "$dwm_ok" = "yes"; then
+ AC_DEFINE([HAVE_W32_DWM], [1], [Define if W32 DWM API is available])
+ fi
+
cairo_backends="$cairo_backends cairo-win32"
GDK_BACKENDS="$GDK_BACKENDS win32"
backend_immodules="$backend_immodules,ime"
diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c
index 8cab471..d2c2dea 100644
--- a/gdk/win32/gdkscreen-win32.c
+++ b/gdk/win32/gdkscreen-win32.c
@@ -211,7 +211,7 @@ gdk_win32_screen_class_init (GdkWin32ScreenClass *klass)
screen_class->get_monitor_geometry = gdk_win32_screen_get_monitor_geometry;
screen_class->get_monitor_workarea = gdk_win32_screen_get_monitor_geometry;
screen_class->get_system_visual = _gdk_win32_screen_get_system_visual;
- screen_class->get_rgba_visual = gdk_win32_screen_get_rgba_visual;
+ screen_class->get_rgba_visual = _gdk_win32_screen_get_system_visual;
screen_class->is_composited = gdk_win32_screen_is_composited;
screen_class->make_display_name = gdk_win32_screen_make_display_name;
screen_class->get_active_window = gdk_win32_screen_get_active_window;
diff --git a/gdk/win32/gdkvisual-win32.c b/gdk/win32/gdkvisual-win32.c
index 34ee434..6f84db3 100644
--- a/gdk/win32/gdkvisual-win32.c
+++ b/gdk/win32/gdkvisual-win32.c
@@ -194,7 +194,6 @@ _gdk_visual_init (GdkScreen *screen)
}
else if (bitspixel == 24 || bitspixel == 32)
{
- bitspixel = 24;
system_visual->type = GDK_VISUAL_TRUE_COLOR;
system_visual->red_mask = 0x00FF0000;
system_visual->green_mask = 0x0000FF00;
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index aa8f591..307a1fb 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -38,6 +38,9 @@
#include "gdkdisplayprivate.h"
#include "gdkvisualprivate.h"
#include "gdkwin32window.h"
+#ifdef HAVE_W32_DWM
+#include <dwmapi.h>
+#endif
#include <cairo-win32.h>
@@ -684,6 +687,45 @@ _gdk_win32_display_create_window_impl (GdkDisplay *display,
if (attributes_mask & GDK_WA_CURSOR)
gdk_window_set_cursor (window, attributes->cursor);
+
+/* 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 only non-XP
+ * function we need here at runtime.
+ */
+#ifdef HAVE_W32_DWM
+ {
+ typedef HRESULT (WINAPI *PFN_DwmEnableBlurBehindWindow)(HWND,
+ const DWM_BLURBEHIND *);
+ HMODULE dwmdll;
+ PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow = NULL;
+
+ dwmdll = GetModuleHandle ("dwmapi.dll");
+ dwmEnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow)
+ GetProcAddress (dwmdll, "DwmEnableBlurBehindWindow");
+
+ if (dwmEnableBlurBehindWindow)
+ {
+ /* Enable blurbehind, but give it an empty region, leaving us
+ with all the transparency with none of the blur */
+ DWM_BLURBEHIND bb;
+ HRGN hRgn;
+ hRgn = CreateRectRgn (0, 0, -1, -1);
+ if (hRgn != NULL)
+ {
+ HRESULT hr;
+ memset (&bb, 0, sizeof (bb));
+ bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION;
+ bb.hRgnBlur = hRgn;
+ bb.fEnable = TRUE;
+ hr = dwmEnableBlurBehindWindow (GDK_WINDOW_HWND (window), &bb);
+ if (S_OK != hr)
+ g_warning ("%s: %s failed: %" G_GINT64_MODIFIER "x", G_STRLOC,
+ "DwmEnableBlurBehindWindow", (guint64) hr);
+ DeleteObject (hRgn);
+ }
+ }
+ }
+#endif
}
GdkWindow *
@@ -3387,7 +3429,7 @@ gdk_win32_ref_cairo_surface (GdkWindow *window)
if (!hdc)
return NULL;
- impl->cairo_surface = cairo_win32_surface_create (hdc);
+ impl->cairo_surface = cairo_win32_surface_create_with_alpha (hdc);
cairo_surface_set_user_data (impl->cairo_surface, &gdk_win32_cairo_key,
impl, gdk_win32_cairo_surface_destroy);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]