[mingw-gtk2: 36/65] Re-enable the WIMP theme now that upstream has provided a fix for it (RHBZ #608911, GNOME BZ #59

epienbro epienbro at fedoraproject.org
Tue Mar 6 20:03:13 UTC 2012


commit 322dedaf51a6837a62a295f0869af2918f96502b
Author: epienbro <epienbro at fedoraproject.org>
Date:   Sun Jul 4 15:57:00 2010 +0000

    Re-enable the WIMP theme now that upstream has provided a fix for it (RHBZ
        #608911, GNOME BZ #598299)

 gtk+-2.20.1-xptheme.patch |  844 +++++++++++++++++++++++++++++++++++++++++++++
 mingw32-gtk2.spec         |    7 +
 2 files changed, 851 insertions(+), 0 deletions(-)
---
diff --git a/gtk+-2.20.1-xptheme.patch b/gtk+-2.20.1-xptheme.patch
new file mode 100644
index 0000000..401066d
--- /dev/null
+++ b/gtk+-2.20.1-xptheme.patch
@@ -0,0 +1,844 @@
+--- gtk+-2.20.1/gdk/gdkinternals.h	2010-04-10 04:19:53.000000000 +0200
++++ gtk+-2.20.1/gdk/gdkinternals.h	2010-06-21 22:13:17.000000000 +0200
+@@ -423,6 +423,14 @@
+ 					     gboolean reset_origin);
+ GdkSubwindowMode _gdk_gc_get_subwindow (GdkGC *gc);
+ 
++GdkDrawable *_gdk_drawable_begin_direct_draw (GdkDrawable *drawable,
++					      GdkGC *gc,
++					      gpointer *priv_data,
++					      gint *x_offset_out,
++					      gint *y_offset_out);
++void         _gdk_drawable_end_direct_draw (gpointer priv_data);
++
++
+ /*****************************************
+  * Interfaces provided by windowing code *
+  *****************************************/
+--- gtk+-2.20.1/gdk/gdk.symbols	2010-05-03 01:33:18.000000000 +0200
++++ gtk+-2.20.1/gdk/gdk.symbols	2010-06-21 22:14:19.000000000 +0200
+@@ -1148,6 +1148,14 @@
+ 
+ #ifdef GDK_WINDOWING_WIN32
+ #if IN_HEADER(__GDK_WIN32_H__)
++#if IN_FILE(__GDK_WINDOW_WIN32_C__)
++gdk_win32_window_is_win32
++gdk_win32_begin_direct_draw_libgtk_only
++gdk_win32_end_direct_draw_libgtk_only
++#endif
++#endif
++
++#if IN_HEADER(__GDK_WIN32_H__)
+ #if IN_FILE(__GDK_WIN32ID_C__)
+ gdk_win32_handle_table_lookup
+ #endif
+--- gtk+-2.20.1/gdk/gdkwindow.c	2010-05-03 01:33:18.000000000 +0200
++++ gtk+-2.20.1/gdk/gdkwindow.c	2010-06-21 22:13:17.000000000 +0200
+@@ -3636,6 +3636,111 @@
+      }                                                      \
+   }
+ 
++#define BEGIN_DRAW_MACRO \
++  {
++
++#define END_DRAW_MACRO \
++  }
++
++typedef struct
++{
++  GdkDrawable *drawable;
++  GdkGC *gc;
++
++  gint x_offset;
++  gint y_offset;
++
++  gint clip_x;
++  gint clip_y;
++  gint ts_x;
++  gint ts_y;
++} DirectDrawInfo;
++
++GdkDrawable *
++_gdk_drawable_begin_direct_draw (GdkDrawable *drawable,
++				 GdkGC *gc,
++				 gpointer *priv_data,
++				 gint *x_offset_out,
++				 gint *y_offset_out)
++{
++  g_return_val_if_fail (priv_data != NULL, NULL);
++
++  GdkDrawable *out_impl = NULL;
++
++  *priv_data = NULL;
++
++  if (GDK_IS_PIXMAP (drawable))
++    {
++      /* We bypass the GdkPixmap functions, so do this ourself */
++      _gdk_gc_remove_drawable_clip (gc);
++
++      out_impl = drawable;
++
++      *x_offset_out = 0;
++      *y_offset_out = 0;
++    }
++  else
++    {
++      if (GDK_WINDOW_DESTROYED (drawable))
++        return NULL;
++
++      BEGIN_DRAW;
++
++      if (impl == NULL)
++        return NULL;
++
++      out_impl = impl;
++
++      *x_offset_out = x_offset;
++      *y_offset_out = y_offset;
++
++      DirectDrawInfo *priv = g_new (DirectDrawInfo, 1);
++
++      priv->drawable = impl;
++      priv->gc = gc;
++
++      priv->x_offset = x_offset;
++      priv->y_offset = y_offset;
++      priv->clip_x = old_clip_x;
++      priv->clip_y = old_clip_y;
++      priv->ts_x = old_ts_x;
++      priv->ts_y = old_ts_y;
++
++      *priv_data = (gpointer) priv;
++
++      END_DRAW_MACRO;
++    }
++
++  return out_impl;
++}
++
++void
++_gdk_drawable_end_direct_draw (gpointer priv_data)
++{
++  /* Its a GdkPixmap or the call to _gdk_drawable_begin_direct_draw failed. */
++  if (priv_data == NULL)
++    return;
++
++  DirectDrawInfo *priv = priv_data;
++  GdkGC *gc = priv->gc;
++
++  /* This is only for GdkWindows - if GdkPixmaps need any handling here in
++   * the future, then we should keep track of what type of drawable it is in
++   * DirectDrawInfo. */
++  BEGIN_DRAW_MACRO;
++
++  gint x_offset = priv->x_offset;
++  gint y_offset = priv->y_offset;
++  gint old_clip_x = priv->clip_x;
++  gint old_clip_y = priv->clip_y;
++  gint old_ts_x = priv->ts_x;
++  gint old_ts_y = priv->ts_y;
++
++  END_DRAW;
++
++  g_free (priv_data);
++}
++
+ static GdkGC *
+ gdk_window_create_gc (GdkDrawable     *drawable,
+ 		      GdkGCValues     *values,
+--- gtk+-2.20.1/gdk/win32/gdkwin32.h	2010-04-09 04:29:56.000000000 +0200
++++ gtk+-2.20.1/gdk/win32/gdkwin32.h	2010-06-21 22:14:19.000000000 +0200
+@@ -75,6 +75,9 @@
+ #endif
+ 
+ 
++/* Return true if the GdkWindow is a win32 implemented window */
++gboolean      gdk_win32_window_is_win32 (GdkWindow *window);
++
+ /* Return the Gdk* for a particular HANDLE */
+ gpointer      gdk_win32_handle_table_lookup (GdkNativeWindow handle);
+ 
+@@ -107,6 +110,14 @@
+ HICON         gdk_win32_pixbuf_to_hicon_libgtk_only (GdkPixbuf *pixbuf);
+ void          gdk_win32_set_modal_dialog_libgtk_only (HWND window);
+ 
++GdkDrawable  *gdk_win32_begin_direct_draw_libgtk_only (GdkDrawable *drawable,
++						       GdkGC *gc,
++						       gpointer *priv_data,
++						       gint *x_offset_out,
++						       gint *y_offset_out);
++void          gdk_win32_end_direct_draw_libgtk_only (gpointer priv_data);
++
++
+ G_END_DECLS
+ 
+ #endif /* __GDK_WIN32_H__ */
+--- gtk+-2.20.1/gdk/win32/gdkwindow-win32.c	2010-04-09 06:06:59.000000000 +0200
++++ gtk+-2.20.1/gdk/win32/gdkwindow-win32.c	2010-06-21 22:14:19.000000000 +0200
+@@ -3545,3 +3545,33 @@
+   iface->input_window_destroy = _gdk_input_window_destroy;
+   iface->input_window_crossing = _gdk_input_crossing_event;
+ }
++
++gboolean
++gdk_win32_window_is_win32 (GdkWindow *window)
++{
++  return GDK_WINDOW_IS_WIN32 (window);
++}
++
++GdkDrawable *
++gdk_win32_begin_direct_draw_libgtk_only (GdkDrawable *drawable,
++					 GdkGC *gc,
++					 gpointer *priv_data,
++					 gint *x_offset_out,
++					 gint *y_offset_out)
++{
++  GdkDrawable *impl;
++
++  impl = _gdk_drawable_begin_direct_draw (drawable,
++					  gc,
++					  priv_data,
++					  x_offset_out,
++					  y_offset_out);
++
++  return impl;
++}
++
++void
++gdk_win32_end_direct_draw_libgtk_only (gpointer priv_data)
++{
++  _gdk_drawable_end_direct_draw (priv_data);
++}
+--- gtk+-2.20.1/modules/engines/ms-windows/msw_style.c	2010-04-10 04:20:05.000000000 +0200
++++ gtk+-2.20.1/modules/engines/ms-windows/msw_style.c	2010-06-21 22:13:17.000000000 +0200
+@@ -47,12 +47,6 @@
+ #include "gdk/win32/gdkwin32.h"
+ #endif
+ 
+-static HDC get_window_dc (GtkStyle *style, GdkWindow *window,
+-			  GtkStateType state_type, gint x, gint y, gint width,
+-			  gint height, RECT *rect);
+-static void release_window_dc (GtkStyle *style, GdkWindow *window,
+-			       GtkStateType state_type);
+-
+ 
+ /* Default values, not normally used
+  */
+@@ -1113,8 +1107,9 @@
+       DWORD border;
+       RECT rect;
+       HDC dc;
++      XpDCInfo dc_info;
+ 
+-      dc = get_window_dc (style, window, state, area->x, area->y, area->width,
++      dc = get_window_dc (style, window, state, &dc_info, area->x, area->y, area->width,
+ 			  area->height, &rect);
+       border = (GTK_TOGGLE_BUTTON (widget->parent)->
+ 		active ? DFCS_PUSHED | DFCS_FLAT : 0);
+@@ -1122,7 +1117,7 @@
+       InflateRect (&rect, 1, 1);
+       DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLDOWN | border);
+ 
+-      release_window_dc (style, window, state);
++      release_window_dc (&dc_info);
+ 
+       return TRUE;
+     }
+@@ -1270,8 +1265,9 @@
+       RECT rect;
+       HPEN pen;
+       HGDIOBJ old_pen;
++      XpDCInfo dc_info;
+ 
+-      dc = get_window_dc (style, window, state, x, y, expander_size,
++      dc = get_window_dc (style, window, state, &dc_info, x, y, expander_size,
+ 			  expander_size, &rect);
+       FrameRect (dc, &rect, GetSysColorBrush (COLOR_GRAYTEXT));
+       InflateRect (&rect, -1, -1);
+@@ -1297,7 +1293,7 @@
+ 
+       SelectObject (dc, old_pen);
+       DeleteObject (pen);
+-      release_window_dc (style, window, state);
++      release_window_dc (&dc_info);
+     }
+ 
+   if (area)
+@@ -1510,6 +1506,7 @@
+   const gchar *name;
+   HDC dc;
+   RECT rect;
++  XpDCInfo dc_info;
+ 
+   name = gtk_widget_get_name (widget);
+ 
+@@ -1601,13 +1598,13 @@
+ 	    {
+ 	      sanitize_size (window, &width, &height);
+ 
+-	      dc = get_window_dc (style, window, state,
++	      dc = get_window_dc (style, window, state, &dc_info,
+ 				  box_x, box_y, box_width, box_height, &rect);
+ 	      DrawFrameControl (dc, &rect, DFC_SCROLL,
+ 				btn_type | (shadow ==
+ 					    GTK_SHADOW_IN ? (DFCS_PUSHED |
+ 							     DFCS_FLAT) : 0));
+-	      release_window_dc (style, window, state);
++	      release_window_dc (&dc_info);
+ 	    }
+ 	}
+     }
+@@ -1716,50 +1713,6 @@
+   return FALSE;
+ }
+ 
+-HDC
+-get_window_dc (GtkStyle *style, GdkWindow *window, GtkStateType state_type,
+-	       gint x, gint y, gint width, gint height, RECT *rect)
+-{
+-  int xoff, yoff;
+-  GdkDrawable *drawable;
+-
+-  if (!GDK_IS_WINDOW (window))
+-    {
+-      xoff = 0;
+-      yoff = 0;
+-      drawable = window;
+-    }
+-  else
+-    {
+-      gdk_window_get_internal_paint_info (window, &drawable, &xoff, &yoff);
+-    }
+-
+-  rect->left = x - xoff;
+-  rect->top = y - yoff;
+-  rect->right = rect->left + width;
+-  rect->bottom = rect->top + height;
+-
+-  return gdk_win32_hdc_get (drawable, style->dark_gc[state_type], 0);
+-}
+-
+-void
+-release_window_dc (GtkStyle *style, GdkWindow *window,
+-		   GtkStateType state_type)
+-{
+-  GdkDrawable *drawable;
+-
+-  if (!GDK_IS_WINDOW (window))
+-    {
+-      drawable = window;
+-    }
+-  else
+-    {
+-      gdk_window_get_internal_paint_info (window, &drawable, NULL, NULL);
+-    }
+-
+-  gdk_win32_hdc_release (drawable, style->dark_gc[state_type], 0);
+-}
+-
+ static HPEN
+ get_light_pen ()
+ {
+@@ -1823,6 +1776,7 @@
+   GtkMenuShell *bar;
+   HDC dc;
+   RECT rect;
++  XpDCInfo dc_info;
+ 
+   if (xp_theme_is_active ())
+     {
+@@ -1835,14 +1789,14 @@
+     {
+       bar = GTK_MENU_SHELL (parent);
+ 
+-      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+       if (state_type == GTK_STATE_PRELIGHT)
+ 	{
+ 	  draw_3d_border (dc, &rect, bar->active);
+ 	}
+ 
+-      release_window_dc (style, window, state_type);
++      release_window_dc (&dc_info);
+ 
+       return TRUE;
+     }
+@@ -1883,6 +1837,7 @@
+ {
+   HDC dc;
+   RECT rect;
++  XpDCInfo dc_info;
+   gboolean is_toggled = FALSE;
+ 
+   if (xp_theme_is_active ())
+@@ -1905,7 +1860,7 @@
+       return FALSE;
+     }
+ 
+-  dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+   if (state_type == GTK_STATE_PRELIGHT)
+     {
+       if (is_toggled)
+@@ -1927,7 +1882,7 @@
+       draw_3d_border (dc, &rect, TRUE);
+     }
+ 
+-  release_window_dc (style, window, state_type);
++  release_window_dc (&dc_info);
+ 
+   return TRUE;
+ }
+@@ -1939,8 +1894,9 @@
+ {
+   HDC dc;
+   RECT rect;
++  XpDCInfo dc_info;
+ 
+-  dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+   if (GTK_IS_TOGGLE_BUTTON (widget))
+     {
+@@ -1980,7 +1936,7 @@
+       DrawFrameControl (dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH);
+     }
+ 
+-  release_window_dc (style, window, state_type);
++  release_window_dc (&dc_info);
+ }
+ 
+ static void
+@@ -1995,15 +1951,16 @@
+   if (is_combo_box_child (widget) && detail && !strcmp (detail, "button"))
+     {
+       RECT rect;
++      XpDCInfo dc_info;
+       DWORD border;
+       HDC dc;
+       int cx;
+ 
+       border = (GTK_TOGGLE_BUTTON (widget)->active ? DFCS_PUSHED | DFCS_FLAT : 0);
+ 
+-      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+       DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLDOWN | border);
+-      release_window_dc (style, window, state_type);
++      release_window_dc (&dc_info);
+ 
+       if (xp_theme_is_active ()
+ 	  && xp_theme_draw (window, XP_THEME_ELEMENT_COMBOBUTTON, style, x, y,
+@@ -2014,9 +1971,9 @@
+       width = cx;
+ 
+ 
+-      dc = get_window_dc (style, window, state_type, x, y, width - cx, height, &rect);
++      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width - cx, height, &rect);
+       FillRect (dc, &rect, GetSysColorBrush (COLOR_WINDOW));
+-      release_window_dc (style, window, state_type);
++      release_window_dc (&dc_info);
+       return;
+ 	}
+     }
+@@ -2036,13 +1993,14 @@
+ 	    {
+ 	      HDC dc;
+ 	      RECT rect;
+-	      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++	      XpDCInfo dc_info;
++	      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+ 	      DrawFrameControl (dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH |
+ 				(state_type ==
+ 				 GTK_STATE_ACTIVE ? (DFCS_PUSHED | DFCS_FLAT)
+ 				 : 0));
+-	      release_window_dc (style, window, state_type);
++	      release_window_dc (&dc_info);
+ 	    }
+ 	}
+       else if (is_toolbar_child (widget->parent)
+@@ -2092,14 +2050,15 @@
+ 			  style, x, y, width, height, state_type, area))
+ 	{
+ 	  RECT rect;
++	  XpDCInfo dc_info;
+ 	  HDC dc;
+ 
+-	  dc = get_window_dc (style, window, state_type,
++	  dc = get_window_dc (style, window, state_type, &dc_info,
+ 			      x, y, width, height, &rect);
+ 	  DrawEdge (dc, &rect,
+ 		    state_type ==
+ 		    GTK_STATE_ACTIVE ? EDGE_SUNKEN : EDGE_RAISED, BF_RECT);
+-	  release_window_dc (style, window, state_type);
++	  release_window_dc (&dc_info);
+ 	}
+       return;
+     }
+@@ -2208,15 +2167,16 @@
+ 	    {
+ 	      HDC dc;
+ 	      RECT rect;
++	      XpDCInfo dc_info;
+ 
+ 	      sanitize_size (window, &width, &height);
+-	      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++	      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+ 	      SetTextColor (dc, GetSysColor (COLOR_3DHILIGHT));
+ 	      SetBkColor (dc, GetSysColor (COLOR_BTNFACE));
+ 	      FillRect (dc, &rect, get_dither_brush ());
+ 
+-	      release_window_dc (style, window, state_type);
++	      release_window_dc (&dc_info);
+ 
+ 	      return;
+ 	    }
+@@ -2326,9 +2286,10 @@
+ 	    {
+ 	      HBRUSH brush;
+ 	      RECT rect;
++	      XpDCInfo dc_info;
+ 	      HDC hdc;
+ 
+-	      hdc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++	      hdc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+ 	      brush = GetSysColorBrush (COLOR_3DDKSHADOW);
+ 
+@@ -2340,7 +2301,7 @@
+ 	      InflateRect (&rect, -1, -1);
+ 	      FillRect (hdc, &rect, (HBRUSH) (COLOR_INFOBK + 1));
+ 
+-	      release_window_dc (style, window, state_type);
++	      release_window_dc (&dc_info);
+ 
+ 	      return;
+ 	    }
+@@ -2771,10 +2732,11 @@
+     {
+       /* experimental tab-drawing code from mozilla */
+       RECT rect;
++      XpDCInfo dc_info;
+       HDC dc;
+       gint32 aPosition;
+ 
+-      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+       if (gap_side == GTK_POS_TOP)
+ 	aPosition = BF_TOP;
+@@ -2797,7 +2759,7 @@
+       if (area)
+ 	gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
+ 
+-      release_window_dc (style, window, state_type);
++      release_window_dc (&dc_info);
+       return TRUE;
+     }
+ 
+@@ -2949,9 +2911,10 @@
+ 		  gint x, gint y, gint width, gint height)
+ {
+   RECT rect;
++  XpDCInfo dc_info;
+   HDC dc;
+ 
+-  dc = get_window_dc (style, win, GTK_STATE_NORMAL, x, y, width, height, &rect);
++  dc = get_window_dc (style, win, GTK_STATE_NORMAL, &dc_info, x, y, width, height, &rect);
+ 
+   if (!dc)
+     return FALSE;
+@@ -2965,7 +2928,7 @@
+       DrawEdge (dc, &rect, EDGE_RAISED, BF_RECT);
+     }
+ 
+-  release_window_dc (style, win, GTK_STATE_NORMAL);
++  release_window_dc (&dc_info);
+ 
+   return TRUE;
+ }
+@@ -2987,10 +2950,11 @@
+ 
+       HDC dc;
+       RECT rect;
++      XpDCInfo dc_info;
+ 
+ 
+ 
+-      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+       if (is_combo_box_child (widget))
+         {
+           FillRect (dc, &rect, GetSysColorBrush (COLOR_WINDOW));
+@@ -3028,7 +2992,7 @@
+ 	    }
+ 	}
+ 
+-      release_window_dc (style, window, state_type);
++      release_window_dc (&dc_info);
+ 
+       return;
+     }
+@@ -3042,12 +3006,13 @@
+ 	{
+ 	  HDC dc;
+ 	  RECT rect;
++	  XpDCInfo dc_info;
+ 
+-	  dc = get_window_dc (style, window, state_type,
++	  dc = get_window_dc (style, window, state_type, &dc_info,
+ 			      x, y, width, height, &rect);
+ 
+ 	  DrawEdge (dc, &rect, EDGE_SUNKEN, BF_RECT);
+-	  release_window_dc (style, window, state_type);
++	  release_window_dc (&dc_info);
+ 	}
+ 
+       return;
+@@ -3090,6 +3055,7 @@
+ 	{
+ 	  HDC dc;
+ 	  RECT rect;
++	  XpDCInfo dc_info;
+ 	  HGDIOBJ old_pen = NULL;
+ 	  GtkPositionType pos;
+ 
+@@ -3142,7 +3108,7 @@
+ 		}
+ 	    }
+ 
+-	  dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++	  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+ 	  if (pos != GTK_POS_LEFT)
+ 	    {
+@@ -3170,7 +3136,7 @@
+ 	    }
+ 	  if (old_pen)
+ 	    SelectObject (dc, old_pen);
+-	  release_window_dc (style, window, state_type);
++	  release_window_dc (&dc_info);
+ 	}
+ 
+       return;
+@@ -3322,13 +3288,14 @@
+       else
+ 	{
+ 	  RECT rect;
+-	  HDC dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++	  XpDCInfo dc_info;
++	  HDC dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+ 	  if (area)
+ 	    gdk_gc_set_clip_rectangle (style->dark_gc[state_type], area);
+ 
+ 	  DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
+-	  release_window_dc (style, window, state_type);
++	  release_window_dc (&dc_info);
+ 
+ 	  if (area)
+ 	    gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
+@@ -3354,6 +3321,7 @@
+ {
+   HDC dc;
+   RECT rect;
++  XpDCInfo dc_info;
+ 
+   if (is_toolbar_child (widget))
+     {
+@@ -3387,7 +3355,7 @@
+ 	  return;
+ 	}
+ 
+-      dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+ 
+       if (orientation == GTK_ORIENTATION_VERTICAL)
+ 	{
+@@ -3405,7 +3373,7 @@
+ 	}
+ 
+       draw_3d_border (dc, &rect, FALSE);
+-      release_window_dc (style, window, state_type);
++      release_window_dc (&dc_info);
+       return;
+     }
+ 
+@@ -3478,6 +3446,7 @@
+ {
+   HDC dc;
+   RECT rect;
++  XpDCInfo dc_info;
+ 
+   if (!gtk_widget_get_can_focus (widget))
+     {
+@@ -3495,9 +3464,9 @@
+       return;
+     }
+ 
+-  dc = get_window_dc (style, window, state_type, x, y, width, height, &rect);
++  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+   DrawFocusRect (dc, &rect);
+-  release_window_dc (style, window, state_type);
++  release_window_dc (&dc_info);
+ /*
+     parent_class->draw_focus (style, window, state_type,
+ 						     area, widget, detail, x, y, width, height);
+--- gtk+-2.20.1/modules/engines/ms-windows/xp_theme.c	2010-04-09 04:29:59.000000000 +0200
++++ gtk+-2.20.1/modules/engines/ms-windows/xp_theme.c	2010-06-21 22:14:19.000000000 +0200
+@@ -849,6 +849,47 @@
+   return ret;
+ }
+ 
++HDC
++get_window_dc (GtkStyle *style,
++	       GdkWindow *window,
++	       GtkStateType state_type,
++	       XpDCInfo *dc_info_out,
++	       gint x, gint y, gint width, gint height,
++	       RECT *rect_out)
++{
++  GdkDrawable *drawable = NULL;
++  GdkGC *gc = style->dark_gc[state_type];
++  gint x_offset, y_offset;
++  
++  dc_info_out->data = NULL;
++  
++  drawable = gdk_win32_begin_direct_draw_libgtk_only (window,
++						      gc, &dc_info_out->data,
++						      &x_offset, &y_offset);
++  if (!drawable)
++    return NULL;
++
++  rect_out->left = x - x_offset;
++  rect_out->top = y - y_offset;
++  rect_out->right = rect_out->left + width;
++  rect_out->bottom = rect_out->top + height;
++  
++  dc_info_out->drawable = drawable;
++  dc_info_out->gc = gc;
++  dc_info_out->x_offset = x_offset;
++  dc_info_out->y_offset = y_offset;
++  
++  return gdk_win32_hdc_get (drawable, gc, 0);
++}
++
++void
++release_window_dc (XpDCInfo *dc_info)
++{
++  gdk_win32_hdc_release (dc_info->drawable, dc_info->gc, 0);
++
++  gdk_win32_end_direct_draw_libgtk_only (dc_info->data);
++}
++
+ gboolean
+ xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
+ 	       int x, int y, int width, int height,
+@@ -856,9 +897,8 @@
+ {
+   HTHEME theme;
+   RECT rect, clip, *pClip;
+-  int xoff, yoff;
+   HDC dc;
+-  GdkDrawable *drawable;
++  XpDCInfo dc_info;
+   int part_state;
+ 
+   if (!xp_theme_is_drawable (element))
+@@ -869,28 +909,19 @@
+     return FALSE;
+ 
+   /* FIXME: Recheck its function */
++  if (GDK_IS_WINDOW (win) && gdk_win32_window_is_win32 (win))
+   enable_theme_dialog_texture_func (GDK_WINDOW_HWND (win), ETDT_ENABLETAB);
+ 
+-  if (!GDK_IS_WINDOW (win))
+-    {
+-      xoff = 0;
+-      yoff = 0;
+-      drawable = win;
+-    }
+-  else
+-    {
+-      gdk_window_get_internal_paint_info (win, &drawable, &xoff, &yoff);
+-    }
+-
+-  rect.left = x - xoff;
+-  rect.top = y - yoff;
+-  rect.right = rect.left + width;
+-  rect.bottom = rect.top + height;
++  dc = get_window_dc (style, win, state_type, &dc_info,
++		      x, y, width, height,
++		      &rect);
++  if (!dc)
++    return FALSE;
+ 
+   if (area)
+     {
+-      clip.left = area->x - xoff;
+-      clip.top = area->y - yoff;
++      clip.left = area->x - dc_info.x_offset;
++      clip.top = area->y - dc_info.y_offset;
+       clip.right = clip.left + area->width;
+       clip.bottom = clip.top + area->height;
+ 
+@@ -901,17 +932,12 @@
+       pClip = NULL;
+     }
+ 
+-  gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
+-  dc = gdk_win32_hdc_get (drawable, style->dark_gc[state_type], 0);
+-  if (!dc)
+-    return FALSE;
+-
+   part_state = xp_theme_map_gtk_state (element, state_type);
+ 
+   draw_theme_background_func (theme, dc, element_part_map[element],
+ 			      part_state, &rect, pClip);
+ 
+-  gdk_win32_hdc_release (drawable, style->dark_gc[state_type], 0);
++  release_window_dc (&dc_info);
+ 
+   return TRUE;
+ }
+@@ -919,9 +945,6 @@
+ gboolean
+ xp_theme_is_active (void)
+ {
+-  /* Workaround for bug #598299 */
+-  return FALSE;
+-
+   return use_xp_theme;
+ }
+ 
+--- gtk+-2.20.1/modules/engines/ms-windows/xp_theme.h	2010-04-09 04:29:59.000000000 +0200
++++ gtk+-2.20.1/modules/engines/ms-windows/xp_theme.h	2010-06-21 22:13:17.000000000 +0200
+@@ -113,6 +113,26 @@
+   XP_THEME_FONT_MESSAGE
+ } XpThemeFont;
+ 
++typedef struct
++{
++  GdkDrawable *drawable;
++  GdkGC *gc;
++  
++  gint x_offset;
++  gint y_offset;
++  
++  /*< private >*/
++  gpointer data;
++} XpDCInfo;
++
++HDC get_window_dc (GtkStyle *style,
++		   GdkWindow *window,
++		   GtkStateType state_type,
++		   XpDCInfo *dc_info_out,
++		   gint x, gint y, gint width, gint height,
++		   RECT *rect_out);
++void release_window_dc (XpDCInfo *dc_info);
++
+ void xp_theme_init (void);
+ void xp_theme_reset (void);
+ void xp_theme_exit (void);
diff --git a/mingw32-gtk2.spec b/mingw32-gtk2.spec
index 33cb469..07f6c36 100644
--- a/mingw32-gtk2.spec
+++ b/mingw32-gtk2.spec
@@ -33,6 +33,9 @@ Patch1001:      mingw32-gtk2-enable_static_build.patch
 # Some Fedora-MinGW-specific changes are required by mingw32-libjpeg 7
 Patch1002:      mingw32-gtk2-libjpeg7-compatibility.patch
 
+# Upstream patch which fixes the WIMP theme
+Patch1003:      gtk+-2.20.1-xptheme.patch
+
 BuildArch:      noarch
 
 BuildRequires:  mingw32-filesystem >= 49
@@ -89,6 +92,7 @@ Static version of the MinGW Windows Gtk2 library.
 %patch1000 -p1
 %patch1001 -p0
 %patch1002 -p0
+%patch1003 -p1
 
 
 %build
@@ -341,6 +345,9 @@ rm -rf $RPM_BUILD_ROOT
 
 
 %changelog
+* Sun Jul  4 2010 Erik van Pienbroek <epienbro at fedoraproject.org> - 2.20.1-2
+- Re-enable the WIMP theme now that upstream has provided a fix for it (RHBZ #608911, GNOME BZ #598299)
+
 * Fri Jun 11 2010 Erik van Pienbroek <epienbro at fedoraproject.org> - 2.20.1-1
 - Update to 2.20.1
 


More information about the scm-commits mailing list