[gtk+] Trying to fix MS Windows engine



commit 3d31254fd9703c2fcf369084e298bdd3d7c9ac36
Author: Martin Schlemmer <11285613 nwu ac za>
Date:   Thu Oct 14 14:15:06 2010 +0200

    Trying to fix MS Windows engine

 modules/engines/ms-windows/msw_style.c |  528 +++++++++++++-------------------
 modules/engines/ms-windows/xp_theme.c  |  124 +++++----
 modules/engines/ms-windows/xp_theme.h  |   16 +-
 3 files changed, 288 insertions(+), 380 deletions(-)
---
diff --git a/modules/engines/ms-windows/msw_style.c b/modules/engines/ms-windows/msw_style.c
index dacb662..9cc61f6 100755
--- a/modules/engines/ms-windows/msw_style.c
+++ b/modules/engines/ms-windows/msw_style.c
@@ -916,9 +916,9 @@ is_combo_box_child (GtkWidget *w)
 /* This function is not needed anymore */
 /* static gboolean
 combo_box_draw_arrow (GtkStyle *style,
-		      GdkWindow *window,
+		      cairo_t *cr,
 		      GtkStateType state,
-		      GdkRectangle *area, GtkWidget *widget)
+		      GtkWidget *widget)
 {
   if (xp_theme_is_active ())
     return TRUE;
@@ -930,7 +930,7 @@ combo_box_draw_arrow (GtkStyle *style,
       HDC dc;
       XpDCInfo dc_info;
 
-      dc = get_window_dc (style, window, state, &dc_info, area->x, area->y, area->width,
+      dc = get_window_dc (style, cr, state, &dc_info, area->x, area->y, area->width,
 			  area->height, &rect);
       border = (GTK_TOGGLE_BUTTON (gtk_widget_get_parent (widget))->
 		active ? DFCS_PUSHED | DFCS_FLAT : 0);
@@ -947,17 +947,9 @@ combo_box_draw_arrow (GtkStyle *style,
 }*/
 
 static void
-draw_part (GdkDrawable *drawable,
-           GdkColor *gc, GdkRectangle *area, gint x, gint y, Part part)
+draw_part (cairo_t *cr,
+           GdkColor *gc, gint x, gint y, Part part)
 {
-  cairo_t *cr = gdk_cairo_create (drawable);
-
-  if (area)
-    {
-      gdk_cairo_rectangle (cr, area);
-      cairo_clip (cr);
-    }
-
   if (!parts[part].bmap)
     {
       parts[part].bmap = cairo_image_surface_create_for_data ((unsigned char *)parts[part].bits,
@@ -967,16 +959,13 @@ draw_part (GdkDrawable *drawable,
 
   gdk_cairo_set_source_color (cr, gc);
   cairo_mask_surface (cr, parts[part].bmap, x, y);
-
-  cairo_destroy(cr);
 }
 
 static void
 draw_check (GtkStyle *style,
-	    GdkWindow *window,
+	    cairo_t *cr,
 	    GtkStateType state,
 	    GtkShadowType shadow,
-	    GdkRectangle *area,
 	    GtkWidget *widget,
 	    const gchar *detail, gint x, gint y, gint width, gint height)
 {
@@ -987,8 +976,8 @@ draw_check (GtkStyle *style,
     {
       if (shadow == GTK_SHADOW_IN)
 	{
-          draw_part (window, &style->black, area, x, y, CHECK_TEXT);
-          draw_part (window, &style->dark[state], area, x, y, CHECK_AA);
+          draw_part (cr, &style->black, x, y, CHECK_TEXT);
+          draw_part (cr, &style->dark[state], x, y, CHECK_AA);
 	}
     }
   else
@@ -1008,31 +997,27 @@ draw_check (GtkStyle *style,
 	  break;
 	}
 
-      if (!xp_theme_draw (window, theme_elt,
-			  style, x, y, width, height, state, area))
+      if (!xp_theme_draw (cr, theme_elt,
+			  style, x, y, width, height, state))
 	{
 	  if (detail && !strcmp (detail, "cellcheck"))
 	    state = GTK_STATE_NORMAL;
 
-          draw_part (window, &style->black, area, x, y, CHECK_BLACK);
-          draw_part (window, &style->dark[state], area, x, y, CHECK_DARK);
-          draw_part (window, &style->mid[state], area, x, y, CHECK_MID);
-          draw_part (window, &style->light[state], area, x, y, CHECK_LIGHT);
-          draw_part (window, &style->base[state], area, x, y, CHECK_BASE);
+          draw_part (cr, &style->black, x, y, CHECK_BLACK);
+          draw_part (cr, &style->dark[state], x, y, CHECK_DARK);
+          draw_part (cr, &style->mid[state], x, y, CHECK_MID);
+          draw_part (cr, &style->light[state], x, y, CHECK_LIGHT);
+          draw_part (cr, &style->base[state], x, y, CHECK_BASE);
 
 	  if (shadow == GTK_SHADOW_IN)
 	    {
-              draw_part (window, &style->text[state], area, x,
-			 y, CHECK_TEXT);
-              draw_part (window, &style->text_aa[state], area,
-			 x, y, CHECK_AA);
+              draw_part (cr, &style->text[state], x, y, CHECK_TEXT);
+              draw_part (cr, &style->text_aa[state], x, y, CHECK_AA);
 	    }
 	  else if (shadow == GTK_SHADOW_ETCHED_IN)
 	    {
-              draw_part (window, &style->text[state], area, x, y,
-			 CHECK_INCONSISTENT);
-              draw_part (window, &style->text_aa[state], area, x, y,
-			 CHECK_AA);
+              draw_part (cr, &style->text[state], x, y, CHECK_INCONSISTENT);
+              draw_part (cr, &style->text_aa[state], x, y, CHECK_AA);
 	    }
 	}
     }
@@ -1040,15 +1025,12 @@ draw_check (GtkStyle *style,
 
 static void
 draw_expander (GtkStyle *style,
-	       GdkWindow *window,
+	       cairo_t *cr,
 	       GtkStateType state,
-	       GdkRectangle *area,
 	       GtkWidget *widget,
 	       const gchar *detail,
 	       gint x, gint y, GtkExpanderStyle expander_style)
 {
-  cairo_t *cr = gdk_cairo_create (window);
-
   gint expander_size;
   gint expander_semi_size;
   XpThemeElement xp_expander;
@@ -1073,19 +1055,16 @@ draw_expander (GtkStyle *style,
   if (expander_size > 2)
     expander_size -= 2;
 
-  if (area)
-    {
-      gdk_cairo_rectangle (cr, area);
-      cairo_clip (cr);
+/* FIXME: wtf?
       gdk_cairo_set_source_color (cr, &style->fg[state]);
-    }
+ */
 
   expander_semi_size = expander_size / 2;
   x -= expander_semi_size;
   y -= expander_semi_size;
 
-  if (!xp_theme_draw (window, xp_expander, style,
-		      x, y, expander_size, expander_size, state, area))
+  if (!xp_theme_draw (cr, xp_expander, style,
+		      x, y, expander_size, expander_size, state))
     {
       HDC dc;
       RECT rect;
@@ -1093,7 +1072,7 @@ draw_expander (GtkStyle *style,
       HGDIOBJ old_pen;
       XpDCInfo dc_info;
 
-      dc = get_window_dc (style, window, state, &dc_info, x, y, expander_size,
+      dc = get_window_dc (style, cr, state, &dc_info, x, y, expander_size,
 			  expander_size, &rect);
       FrameRect (dc, &rect, GetSysColorBrush (COLOR_GRAYTEXT));
       InflateRect (&rect, -1, -1);
@@ -1121,16 +1100,13 @@ draw_expander (GtkStyle *style,
       DeleteObject (pen);
       release_window_dc (&dc_info);
     }
-
-  cairo_destroy(cr);
 }
 
 static void
 draw_option (GtkStyle *style,
-	     GdkWindow *window,
+	     cairo_t *cr,
 	     GtkStateType state,
 	     GtkShadowType shadow,
-	     GdkRectangle *area,
 	     GtkWidget *widget,
 	     const gchar *detail, gint x, gint y, gint width, gint height)
 {
@@ -1141,15 +1117,15 @@ draw_option (GtkStyle *style,
     {
       if (shadow == GTK_SHADOW_IN)
 	{
-          draw_part (window, &style->fg[state], area, x, y, RADIO_TEXT);
+          draw_part (cr, &style->fg[state], x, y, RADIO_TEXT);
 	}
     }
   else
     {
-      if (xp_theme_draw (window, shadow == GTK_SHADOW_IN
+      if (xp_theme_draw (cr, shadow == GTK_SHADOW_IN
 			 ? XP_THEME_ELEMENT_PRESSED_RADIO_BUTTON
 			 : XP_THEME_ELEMENT_RADIO_BUTTON,
-			 style, x, y, width, height, state, area))
+			 style, x, y, width, height, state))
 	{
 	}
       else
@@ -1157,37 +1133,27 @@ draw_option (GtkStyle *style,
 	  if (detail && !strcmp (detail, "cellradio"))
 	    state = GTK_STATE_NORMAL;
 
-          draw_part (window, &style->black, area, x, y, RADIO_BLACK);
-          draw_part (window, &style->dark[state], area, x, y, RADIO_DARK);
-          draw_part (window, &style->mid[state], area, x, y, RADIO_MID);
-          draw_part (window, &style->light[state], area, x, y, RADIO_LIGHT);
-          draw_part (window, &style->base[state], area, x, y, RADIO_BASE);
+          draw_part (cr, &style->black, x, y, RADIO_BLACK);
+          draw_part (cr, &style->dark[state], x, y, RADIO_DARK);
+          draw_part (cr, &style->mid[state], x, y, RADIO_MID);
+          draw_part (cr, &style->light[state], x, y, RADIO_LIGHT);
+          draw_part (cr, &style->base[state], x, y, RADIO_BASE);
 
 	  if (shadow == GTK_SHADOW_IN)
-            draw_part (window, &style->text[state], area, x, y, RADIO_TEXT);
+            draw_part (cr, &style->text[state], x, y, RADIO_TEXT);
 	}
     }
 }
 
 static void
-draw_varrow (GdkWindow *window,
+draw_varrow (cairo_t *cr,
              GdkColor *gc,
 	     GtkShadowType shadow_type,
-	     GdkRectangle *area,
 	     GtkArrowType arrow_type, gint x, gint y, gint width, gint height)
 {
   gint steps, extra;
   gint y_start, y_increment;
   gint i;
-  cairo_t *cr;
-  
-  cr = gdk_cairo_create (window);
-
-  if (area)
-    {
-       gdk_cairo_rectangle (cr, area);
-       cairo_clip (cr);
-    }
 
   width = width + width % 2 - 1;	/* Force odd */
   steps = 1 + width / 2;
@@ -1210,29 +1176,17 @@ draw_varrow (GdkWindow *window,
 		     x + (i - extra), y_start + i * y_increment,
 		     x + width - (i - extra) - 1, y_start + i * y_increment);
     }
-
-  cairo_destroy(cr);
 }
 
 static void
-draw_harrow (GdkWindow *window,
+draw_harrow (cairo_t *cr,
              GdkColor *gc,
 	     GtkShadowType shadow_type,
-	     GdkRectangle *area,
 	     GtkArrowType arrow_type, gint x, gint y, gint width, gint height)
 {
   gint steps, extra;
   gint x_start, x_increment;
   gint i;
-  cairo_t *cr;
-  
-  cr = gdk_cairo_create (window);
-
-  if (area)
-    {
-       gdk_cairo_rectangle (cr, area);
-       cairo_clip (cr);
-    }
 
   height = height + height % 2 - 1;	/* Force odd */
   steps = 1 + height / 2;
@@ -1255,8 +1209,6 @@ draw_harrow (GdkWindow *window,
 		     x_start + i * x_increment, y + (i - extra),
 		     x_start + i * x_increment, y + height - (i - extra) - 1);
     }
-
-  cairo_destroy(cr);
 }
 
 /* This function makes up for some brokeness in gtkrange.c
@@ -1328,10 +1280,9 @@ to_xp_arrow (GtkArrowType arrow_type)
 
 static void
 draw_arrow (GtkStyle *style,
-	    GdkWindow *window,
+	    cairo_t *cr,
 	    GtkStateType state,
 	    GtkShadowType shadow,
-	    GdkRectangle *area,
 	    GtkWidget *widget,
 	    const gchar *detail,
 	    GtkArrowType arrow_type,
@@ -1366,7 +1317,7 @@ draw_arrow (GtkStyle *style,
 	  ++y;
 	}
 
-      draw_varrow (window, &style->fg[state], shadow, area,
+      draw_varrow (cr, &style->fg[state], shadow,
 		   arrow_type, x, y, width, height);
 
       return;
@@ -1393,8 +1344,8 @@ draw_arrow (GtkStyle *style,
 	  is_disabled = TRUE;
 	}
 
-      if (xp_theme_draw (window, to_xp_arrow (arrow_type), style, box_x, box_y,
-			 box_width, box_height, state, area))
+      if (xp_theme_draw (cr, to_xp_arrow (arrow_type), style, box_x, box_y,
+			 box_width, box_height, state))
 	{
 	}
       else
@@ -1428,7 +1379,7 @@ draw_arrow (GtkStyle *style,
 
 	  if (widget)
 	    {
-	      dc = get_window_dc (style, window, state, &dc_info,
+	      dc = get_window_dc (style, cr, state, &dc_info,
 				  box_x, box_y, box_width, box_height, &rect);
 	      DrawFrameControl (dc, &rect, DFC_SCROLL,
 				btn_type | (shadow ==
@@ -1444,8 +1395,8 @@ draw_arrow (GtkStyle *style,
       if (name && !strcmp (name, "gtk-toolbar-arrow"))
 	{
 	  if (xp_theme_draw
-	      (window, XP_THEME_ELEMENT_REBAR_CHEVRON, style, x, y,
-	       width, height, state, area))
+	      (cr, XP_THEME_ELEMENT_REBAR_CHEVRON, style, x, y,
+	       width, height, state))
 	    {
 	      return;
 	    }
@@ -1458,9 +1409,9 @@ draw_arrow (GtkStyle *style,
 
 	  gtk_widget_get_allocation (widget, &allocation);
 	  if (xp_theme_draw
-	      (window, XP_THEME_ELEMENT_COMBOBUTTON, style, x - 3,
+	      (cr, XP_THEME_ELEMENT_COMBOBUTTON, style, x - 3,
 	       allocation.y + 1, width + 5,
-	       allocation.height - 4, state, area))
+	       allocation.height - 4, state))
 	    {
 	      return;
 	    }
@@ -1471,7 +1422,7 @@ draw_arrow (GtkStyle *style,
 	  x += (width - 7) / 2;
 	  y += (height - 5) / 2;
 
-          draw_varrow (window, &style->fg[state], shadow, area,
+          draw_varrow (cr, &style->fg[state], shadow,
 		       arrow_type, x, y, 7, 5);
 	}
       else
@@ -1479,7 +1430,7 @@ draw_arrow (GtkStyle *style,
 	  x += (width - 5) / 2;
 	  y += (height - 7) / 2;
 
-          draw_harrow (window, &style->fg[state], shadow, area,
+          draw_harrow (cr, &style->fg[state], shadow,
 		       arrow_type, x, y, 5, 7);
 	}
     }
@@ -1601,9 +1552,9 @@ draw_3d_border (HDC hdc, RECT *rc, gboolean sunken)
 }
 
 static gboolean
-draw_menu_item (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+draw_menu_item (cairo_t *cr, GtkWidget *widget, GtkStyle *style,
 		gint x, gint y, gint width, gint height,
-		GtkStateType state_type, GdkRectangle *area)
+		GtkStateType state_type)
 {
   GtkWidget *parent;
   GtkMenuShell *bar;
@@ -1613,8 +1564,8 @@ draw_menu_item (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
 
   if (xp_theme_is_active ())
     {
-      return (xp_theme_draw (window, XP_THEME_ELEMENT_MENU_ITEM, style,
-                             x, y, width, height, state_type, area));
+      return (xp_theme_draw (cr, XP_THEME_ELEMENT_MENU_ITEM, style,
+                             x, y, width, height, state_type));
     }
 
   if ((parent = gtk_widget_get_parent (widget))
@@ -1622,7 +1573,7 @@ draw_menu_item (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
     {
       bar = GTK_MENU_SHELL (parent);
 
-      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
       if (state_type == GTK_STATE_PRELIGHT)
 	{
@@ -1664,9 +1615,9 @@ get_dither_brush (void)
 }
 
 static gboolean
-draw_tool_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+draw_tool_button (cairo_t *cr, GtkWidget *widget, GtkStyle *style,
 		  gint x, gint y, gint width, gint height,
-		  GtkStateType state_type, GdkRectangle *area)
+		  GtkStateType state_type)
 {
   HDC dc;
   RECT rect;
@@ -1675,8 +1626,8 @@ draw_tool_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
 
   if (xp_theme_is_active ())
     {
-      return (xp_theme_draw (window, XP_THEME_ELEMENT_TOOLBAR_BUTTON, style,
-			     x, y, width, height, state_type, area));
+      return (xp_theme_draw (cr, XP_THEME_ELEMENT_TOOLBAR_BUTTON, style,
+			     x, y, width, height, state_type));
     }
 
   if (GTK_IS_TOGGLE_BUTTON (widget))
@@ -1693,7 +1644,7 @@ draw_tool_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
       return FALSE;
     }
 
-  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+  dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
   if (state_type == GTK_STATE_PRELIGHT)
     {
       if (is_toggled)
@@ -1721,7 +1672,7 @@ draw_tool_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
 }
 
 static void
-draw_push_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
+draw_push_button (cairo_t *cr, GtkWidget *widget, GtkStyle *style,
 		  gint x, gint y, gint width, gint height,
 		  GtkStateType state_type, gboolean is_default)
 {
@@ -1729,7 +1680,7 @@ draw_push_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
   RECT rect;
   XpDCInfo dc_info;
 
-  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+  dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
   if (GTK_IS_TOGGLE_BUTTON (widget))
     {
@@ -1774,10 +1725,9 @@ draw_push_button (GdkWindow *window, GtkWidget *widget, GtkStyle *style,
 
 static void
 draw_box (GtkStyle *style,
-	  GdkWindow *window,
+	  cairo_t *cr,
 	  GtkStateType state_type,
 	  GtkShadowType shadow_type,
-	  GdkRectangle *area,
 	  GtkWidget *widget,
 	  const gchar *detail, gint x, gint y, gint width, gint height)
 {
@@ -1791,20 +1741,20 @@ draw_box (GtkStyle *style,
 
       border = (GTK_TOGGLE_BUTTON (widget)->active ? DFCS_PUSHED | DFCS_FLAT : 0);
 
-      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
       DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLDOWN | border);
       release_window_dc (&dc_info);
 
       if (xp_theme_is_active ()
-	  && xp_theme_draw (window, XP_THEME_ELEMENT_COMBOBUTTON, style, x, y,
-			    width, height, state_type, area))
+	  && xp_theme_draw (cr, XP_THEME_ELEMENT_COMBOBUTTON, style, x, y,
+			    width, height, state_type))
 	{
       cx = GetSystemMetrics(SM_CXVSCROLL);
       x += width - cx;
       width = cx;
 
 
-      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width - cx, height, &rect);
+      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width - cx, height, &rect);
       FillRect (dc, &rect, GetSysColorBrush (COLOR_WINDOW));
       release_window_dc (&dc_info);
       return;
@@ -1817,8 +1767,8 @@ draw_box (GtkStyle *style,
       if (GTK_IS_TREE_VIEW (gtk_widget_get_parent (widget)))
       {
         if (xp_theme_draw
-	      (window, XP_THEME_ELEMENT_LIST_HEADER, style, x, y,
-	       width, height, state_type, area))
+	      (cr, XP_THEME_ELEMENT_LIST_HEADER, style, x, y,
+	       width, height, state_type))
 	    {
 	      return;
 	    }
@@ -1827,7 +1777,7 @@ draw_box (GtkStyle *style,
 	      HDC dc;
 	      RECT rect;
 	      XpDCInfo dc_info;
-	      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+	      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
 	      DrawFrameControl (dc, &rect, DFC_BUTTON, DFCS_BUTTONPUSH |
 				(state_type ==
@@ -1840,8 +1790,8 @@ draw_box (GtkStyle *style,
 	       || (!GTK_IS_BUTTON (widget) ||
 		   (GTK_RELIEF_NONE == gtk_button_get_relief (GTK_BUTTON (widget)))))
 	{
-	  if (draw_tool_button (window, widget, style, x, y,
-				width, height, state_type, area))
+	  if (draw_tool_button (cr, widget, style, x, y,
+				width, height, state_type))
 	    {
 	      return;
 	    }
@@ -1850,15 +1800,15 @@ draw_box (GtkStyle *style,
 	{
 	  gboolean is_default = gtk_widget_has_default (widget);
 	  if (xp_theme_draw
-	      (window,
+	      (cr,
 	       is_default ? XP_THEME_ELEMENT_DEFAULT_BUTTON :
 	       XP_THEME_ELEMENT_BUTTON, style, x, y, width, height,
-	       state_type, area))
+	       state_type))
 	    {
 	      return;
 	    }
 
-	  draw_push_button (window, widget, style,
+	  draw_push_button (cr, widget, style,
 			    x, y, width, height, state_type, is_default);
 
 	  return;
@@ -1876,17 +1826,17 @@ draw_box (GtkStyle *style,
   else if (detail && (!strcmp (detail, "spinbutton_up")
 		      || !strcmp (detail, "spinbutton_down")))
     {
-      if (!xp_theme_draw (window,
+      if (!xp_theme_draw (cr,
 			  (!strcmp (detail, "spinbutton_up"))
 			  ? XP_THEME_ELEMENT_SPIN_BUTTON_UP
 			  : XP_THEME_ELEMENT_SPIN_BUTTON_DOWN,
-			  style, x, y, width, height, state_type, area))
+			  style, x, y, width, height, state_type))
 	{
 	  RECT rect;
 	  XpDCInfo dc_info;
 	  HDC dc;
 
-	  dc = get_window_dc (style, window, state_type, &dc_info,
+	  dc = get_window_dc (style, cr, state_type, &dc_info,
 			      x, y, width, height, &rect);
 	  DrawEdge (dc, &rect,
 		    state_type ==
@@ -1902,11 +1852,11 @@ draw_box (GtkStyle *style,
 	  GtkScrollbar *scrollbar = GTK_SCROLLBAR (widget);
 	  gboolean is_v = GTK_IS_VSCROLLBAR (widget);
 
-	  if (xp_theme_draw (window,
+	  if (xp_theme_draw (cr,
 			     is_v
 			     ? XP_THEME_ELEMENT_SCROLLBAR_V
 			     : XP_THEME_ELEMENT_SCROLLBAR_H,
-			     style, x, y, width, height, state_type, area))
+			     style, x, y, width, height, state_type))
 	    {
 	      XpThemeElement gripper =
 		(is_v ? XP_THEME_ELEMENT_SCROLLBAR_GRIPPER_V :
@@ -1925,8 +1875,8 @@ draw_box (GtkStyle *style,
 		  return;
 		}
 
-	      xp_theme_draw (window, gripper, style, x, y,
-			     width, height, state_type, area);
+	      xp_theme_draw (cr, gripper, style, x, y,
+			     width, height, state_type);
 	      return;
 	    }
 	  else
@@ -1948,8 +1898,8 @@ draw_box (GtkStyle *style,
 	  XpThemeElement xp_progress_bar =
 	    map_gtk_progress_bar_to_xp (progress_bar, FALSE);
 
-	  if (xp_theme_draw (window, xp_progress_bar, style, x, y,
-			     width, height, state_type, area))
+	  if (xp_theme_draw (cr, xp_progress_bar, style, x, y,
+			     width, height, state_type))
 	    {
 	      return;
 	    }
@@ -1960,8 +1910,8 @@ draw_box (GtkStyle *style,
   else if (detail && strcmp (detail, "menuitem") == 0)
     {
       shadow_type = GTK_SHADOW_NONE;
-      if (draw_menu_item (window, widget, style,
-			  x, y, width, height, state_type, area))
+      if (draw_menu_item (cr, widget, style,
+			  x, y, width, height, state_type))
 	{
 	  return;
 	}
@@ -1974,8 +1924,8 @@ draw_box (GtkStyle *style,
 	  XpThemeElement xp_progress_bar =
 	    map_gtk_progress_bar_to_xp (progress_bar, TRUE);
 	  if (xp_theme_draw
-	      (window, xp_progress_bar, style, x, y, width, height,
-	       state_type, area))
+	      (cr, xp_progress_bar, style, x, y, width, height,
+	       state_type))
 	    {
 	      return;
 	    }
@@ -1988,11 +1938,11 @@ draw_box (GtkStyle *style,
 	{
 	  gboolean is_vertical = GTK_IS_VSCROLLBAR (widget);
 
-	  if (xp_theme_draw (window,
+	  if (xp_theme_draw (cr,
 			     is_vertical
 			     ? XP_THEME_ELEMENT_TROUGH_V
 			     : XP_THEME_ELEMENT_TROUGH_H,
-			     style, x, y, width, height, state_type, area))
+			     style, x, y, width, height, state_type))
 	    {
 	      return;
 	    }
@@ -2002,7 +1952,7 @@ draw_box (GtkStyle *style,
 	      RECT rect;
 	      XpDCInfo dc_info;
 
-	      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+	      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
 	      SetTextColor (dc, GetSysColor (COLOR_3DHILIGHT));
 	      SetBkColor (dc, GetSysColor (COLOR_BTNFACE));
@@ -2019,39 +1969,39 @@ draw_box (GtkStyle *style,
 
 	  if (!xp_theme_is_active ())
 	    {
-	      parent_class->draw_box (style, window, state_type,
-				      GTK_SHADOW_NONE, area,
+	      parent_class->draw_box (style, cr, state_type,
+				      GTK_SHADOW_NONE,
 				      widget, detail, x, y, width, height);
 	    }
 
 	  if (is_vertical)
 	    {
 	      if (xp_theme_draw
-		  (window, XP_THEME_ELEMENT_SCALE_TROUGH_V,
+		  (cr, XP_THEME_ELEMENT_SCALE_TROUGH_V,
 		   style, (2 * x + width) / 2, y, 2, height,
-		   state_type, area))
+		   state_type))
 		{
 		  return;
 		}
 
-	      parent_class->draw_box (style, window, state_type,
+	      parent_class->draw_box (style, cr, state_type,
 				      GTK_SHADOW_ETCHED_IN,
-				      area, NULL, NULL,
+				      NULL, NULL,
 				      (2 * x + width) / 2, y, 1, height);
 	    }
 	  else
 	    {
 	      if (xp_theme_draw
-		  (window, XP_THEME_ELEMENT_SCALE_TROUGH_H,
+		  (cr, XP_THEME_ELEMENT_SCALE_TROUGH_H,
 		   style, x, (2 * y + height) / 2, width, 2,
-		   state_type, area))
+		   state_type))
 		{
 		  return;
 		}
 
-	      parent_class->draw_box (style, window, state_type,
+	      parent_class->draw_box (style, cr, state_type,
 				      GTK_SHADOW_ETCHED_IN,
-				      area, NULL, NULL, x,
+				      NULL, NULL, x,
 				      (2 * y + height) / 2, width, 1);
 	    }
 
@@ -2060,8 +2010,8 @@ draw_box (GtkStyle *style,
     }
   else if (detail && strcmp (detail, "optionmenu") == 0)
     {
-      if (xp_theme_draw (window, XP_THEME_ELEMENT_EDIT_TEXT,
-			 style, x, y, width, height, state_type, area))
+      if (xp_theme_draw (cr, XP_THEME_ELEMENT_EDIT_TEXT,
+			 style, x, y, width, height, state_type))
 	{
 	  return;
 	}
@@ -2077,8 +2027,8 @@ draw_box (GtkStyle *style,
 	       || strcmp (detail, "toolbar") == 0
 	       || strcmp (detail, "menubar") == 0))
     {
-      if (xp_theme_draw (window, XP_THEME_ELEMENT_REBAR,
-			 style, x, y, width, height, state_type, area))
+      if (xp_theme_draw (cr, XP_THEME_ELEMENT_REBAR,
+			 style, x, y, width, height, state_type))
 	{
 	  return;
 	}
@@ -2092,8 +2042,8 @@ draw_box (GtkStyle *style,
     }
   else if (detail && !strcmp (detail, "notebook") && GTK_IS_NOTEBOOK (widget))
     {
-      if (xp_theme_draw (window, XP_THEME_ELEMENT_TAB_PANE, style,
-			 x, y, width, height, state_type, area))
+      if (xp_theme_draw (cr, XP_THEME_ELEMENT_TAB_PANE, style,
+			 x, y, width, height, state_type))
 	{
 	  return;
 	}
@@ -2106,8 +2056,8 @@ draw_box (GtkStyle *style,
       if (name && !strcmp (name, "gtk-tooltips"))
 	{
 	  if (xp_theme_draw
-	      (window, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width,
-	       height, state_type, area))
+	      (cr, XP_THEME_ELEMENT_TOOLTIP, style, x, y, width,
+	       height, state_type))
 	    {
 	      return;
 	    }
@@ -2118,7 +2068,7 @@ draw_box (GtkStyle *style,
 	      XpDCInfo dc_info;
 	      HDC hdc;
 
-	      hdc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+	      hdc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
 	      brush = GetSysColorBrush (COLOR_3DDKSHADOW);
 
@@ -2137,7 +2087,7 @@ draw_box (GtkStyle *style,
 	}
     }
 
-  parent_class->draw_box (style, window, state_type, shadow_type, area,
+  parent_class->draw_box (style, cr, state_type, shadow_type,
 			  widget, detail, x, y, width, height);
 
   if (detail && strcmp (detail, "optionmenu") == 0)
@@ -2160,7 +2110,7 @@ draw_box (GtkStyle *style,
 				 indicator_spacing.left +
 				 indicator_spacing.right) - style->xthickness;
 
-	  parent_class->draw_vline (style, window, state_type, area, widget,
+	  parent_class->draw_vline (style, cr, state_type, widget,
 				    detail,
 				    y + style->ythickness + 1,
 				    y + height - style->ythickness - 3, vline_x);
@@ -2170,10 +2120,9 @@ draw_box (GtkStyle *style,
 
 static void
 draw_tab (GtkStyle *style,
-	  GdkWindow *window,
+	  cairo_t *cr,
 	  GtkStateType state,
 	  GtkShadowType shadow,
-	  GdkRectangle *area,
 	  GtkWidget *widget,
 	  const gchar *detail, gint x, gint y, gint width, gint height)
 {
@@ -2183,17 +2132,17 @@ draw_tab (GtkStyle *style,
   gint arrow_height;
 
   g_return_if_fail (style != NULL);
-  g_return_if_fail (window != NULL);
+  g_return_if_fail (cr != NULL);
 
   if (detail && !strcmp (detail, "optionmenutab"))
     {
       GtkAllocation allocation;
 
       gtk_widget_get_allocation (widget, &allocation);
-      if (xp_theme_draw (window, XP_THEME_ELEMENT_COMBOBUTTON,
+      if (xp_theme_draw (cr, XP_THEME_ELEMENT_COMBOBUTTON,
 			 style, x - 5, allocation.y + 1,
 			 width + 10, allocation.height - 2,
-			 state, area))
+			 state))
 	{
 	  return;
 	}
@@ -2206,7 +2155,7 @@ draw_tab (GtkStyle *style,
 
   y += (height - arrow_height) / 2;
 
-  draw_varrow (window, &style->black, shadow, area, GTK_ARROW_DOWN,
+  draw_varrow (cr, &style->black, shadow, GTK_ARROW_DOWN,
 	       x, y, indicator_size.width, arrow_height);
 }
 
@@ -2324,19 +2273,20 @@ DrawTab (HDC hdc, const RECT R, gint32 aPosition, gboolean aSelected,
 
 static gboolean
 draw_themed_tab_button (GtkStyle *style,
-			GdkWindow *window,
+			cairo_t *cr,
 			GtkStateType state_type,
 			GtkNotebook *notebook,
 			gint x, gint y,
 			gint width, gint height, gint gap_side)
 {
+/* FIXME: poop
   GdkPixmap *pixmap = NULL;
+ */
   gint border_width =
     gtk_container_get_border_width (GTK_CONTAINER (notebook));
   GtkWidget *widget = GTK_WIDGET (notebook);
-  GdkRectangle draw_rect, clip_rect;
+  GdkRectangle draw_rect;
   GdkPixbufRotation rotation = GDK_PIXBUF_ROTATE_NONE;
-  cairo_t *cr;
   GtkAllocation allocation;
 
   gtk_widget_get_allocation (widget, &allocation);
@@ -2352,8 +2302,9 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.width = width + 2;
 	  draw_rect.height = height;
 
-	  clip_rect = draw_rect;
+/* FIXME: wtf?
 	  clip_rect.height--;
+ */
 	}
       else
 	{
@@ -2361,7 +2312,6 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.y = y;
 	  draw_rect.width = width - 2;
 	  draw_rect.height = height - 2;
-	  clip_rect = draw_rect;
 	}
 
       /* If we are currently drawing the right-most tab, and if that tab is the selected tab... */
@@ -2369,7 +2319,7 @@ draw_themed_tab_button (GtkStyle *style,
 
       if (draw_rect.x + draw_rect.width >= widget_right)
 	{
-	  draw_rect.width = clip_rect.width = widget_right - draw_rect.x;
+	  draw_rect.width = widget_right - draw_rect.x;
 	}
     }
   if (gap_side == GTK_POS_BOTTOM)
@@ -2382,8 +2332,6 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.y = y;
 	  draw_rect.width = width + 2;
 	  draw_rect.height = height;
-
-	  clip_rect = draw_rect;
 	}
       else
 	{
@@ -2391,7 +2339,6 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.y = y + 2;
 	  draw_rect.width = width - 2;
 	  draw_rect.height = height - 2;
-	  clip_rect = draw_rect;
 	}
 
       /* If we are currently drawing the right-most tab, and if that tab is the selected tab... */
@@ -2399,7 +2346,7 @@ draw_themed_tab_button (GtkStyle *style,
 
       if (draw_rect.x + draw_rect.width >= widget_right)
 	{
-	  draw_rect.width = clip_rect.width = widget_right - draw_rect.x;
+	  draw_rect.width = widget_right - draw_rect.x;
 	}
 
       rotation = GDK_PIXBUF_ROTATE_UPSIDEDOWN;
@@ -2415,8 +2362,9 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.width = width;
 	  draw_rect.height = height + 2;
 
-	  clip_rect = draw_rect;
+/* FIXME: wtf?
 	  clip_rect.width--;
+ */
 	}
       else
 	{
@@ -2424,7 +2372,6 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.y = y + 2;
 	  draw_rect.width = width - 2;
 	  draw_rect.height = height - 2;
-	  clip_rect = draw_rect;
 	}
 
       /* If we are currently drawing the bottom-most tab, and if that tab is the selected tab... */
@@ -2432,7 +2379,7 @@ draw_themed_tab_button (GtkStyle *style,
 
       if (draw_rect.y + draw_rect.height >= widget_bottom)
 	{
-	  draw_rect.height = clip_rect.height = widget_bottom - draw_rect.y;
+	  draw_rect.height = widget_bottom - draw_rect.y;
 	}
 
       rotation = GDK_PIXBUF_ROTATE_COUNTERCLOCKWISE;
@@ -2448,8 +2395,9 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.width = width;
 	  draw_rect.height = height + 2;
 
-	  clip_rect = draw_rect;
+/* FIXME: wtf?
 	  clip_rect.width--;
+ */
 	}
       else
 	{
@@ -2457,7 +2405,6 @@ draw_themed_tab_button (GtkStyle *style,
 	  draw_rect.y = y + 2;
 	  draw_rect.width = width - 2;
 	  draw_rect.height = height - 2;
-	  clip_rect = draw_rect;
 	}
 
       /* If we are currently drawing the bottom-most tab, and if that tab is the selected tab... */
@@ -2465,7 +2412,7 @@ draw_themed_tab_button (GtkStyle *style,
 
       if (draw_rect.y + draw_rect.height >= widget_bottom)
 	{
-	  draw_rect.height = clip_rect.height = widget_bottom - draw_rect.y;
+	  draw_rect.height = widget_bottom - draw_rect.y;
 	}
 
       rotation = GDK_PIXBUF_ROTATE_CLOCKWISE;
@@ -2473,10 +2420,10 @@ draw_themed_tab_button (GtkStyle *style,
 
   if (gap_side == GTK_POS_TOP)
     {
-      if (!xp_theme_draw (window, XP_THEME_ELEMENT_TAB_ITEM, style,
+      if (!xp_theme_draw (cr, XP_THEME_ELEMENT_TAB_ITEM, style,
 			  draw_rect.x, draw_rect.y,
 			  draw_rect.width, draw_rect.height,
-			  state_type, &clip_rect))
+			  state_type))
 	{
 	  return FALSE;
 	}
@@ -2486,12 +2433,15 @@ draw_themed_tab_button (GtkStyle *style,
       GdkPixbuf *pixbuf;
       GdkPixbuf *rotated;
 
+/* FIXME: poop */
+#if 0
       if (gap_side == GTK_POS_LEFT || gap_side == GTK_POS_RIGHT)
 	{
-	  pixmap = gdk_pixmap_new (window, clip_rect.height, clip_rect.width, -1);
+	  pixmap = gdk_pixmap_new (cr, draw_rect.height, draw_rect.width, -1);
 
 	  if (!xp_theme_draw (pixmap, XP_THEME_ELEMENT_TAB_ITEM, style,
-			      draw_rect.y - clip_rect.y, draw_rect.x - clip_rect.x,
+/* FIXME: wtf? */
+			      draw_rect.y - draw_rect.y, draw_rect.x - draw_rect.x,
 			      draw_rect.height, draw_rect.width, state_type, 0))
 	    {
 	      g_object_unref (pixmap);
@@ -2499,15 +2449,16 @@ draw_themed_tab_button (GtkStyle *style,
 	    }
 
 	  pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0,
-						 clip_rect.height, clip_rect.width);
+						 draw_rect.height, draw_rect.width);
 	  g_object_unref (pixmap);
 	}
       else
 	{
-	  pixmap = gdk_pixmap_new (window, clip_rect.width, clip_rect.height, -1);
+	  pixmap = gdk_pixmap_new (cr, draw_rect.width, draw_rect.height, -1);
 
 	  if (!xp_theme_draw (pixmap, XP_THEME_ELEMENT_TAB_ITEM, style,
-			      draw_rect.x - clip_rect.x, draw_rect.y - clip_rect.y,
+/* FIXME: wtf? */
+			      draw_rect.x - draw_rect.x, draw_rect.y - draw_rect.y,
 			      draw_rect.width, draw_rect.height, state_type, 0))
 	    {
 	      g_object_unref (pixmap);
@@ -2515,7 +2466,7 @@ draw_themed_tab_button (GtkStyle *style,
 	    }
 
 	  pixbuf = gdk_pixbuf_get_from_drawable (NULL, pixmap, NULL, 0, 0, 0, 0,
-						 clip_rect.width, clip_rect.height);
+						 draw_rect.width, draw_rect.height);
 	  g_object_unref (pixmap);
 	}
 
@@ -2543,11 +2494,10 @@ draw_themed_tab_button (GtkStyle *style,
 	    }
 	}
 
-      cr = gdk_cairo_create (window);
       gdk_cairo_set_source_pixbuf (cr, pixbuf, clip_rect.x, clip_rect.y);
       cairo_paint (cr);
-      cairo_destroy (cr);
       g_object_unref (pixbuf);
+#endif
     }
 
   return TRUE;
@@ -2555,10 +2505,9 @@ draw_themed_tab_button (GtkStyle *style,
 
 static gboolean
 draw_tab_button (GtkStyle *style,
-		 GdkWindow *window,
+		 cairo_t *cr,
 		 GtkStateType state_type,
 		 GtkShadowType shadow_type,
-		 GdkRectangle *area,
 		 GtkWidget *widget,
 		 const gchar *detail,
 		 gint x, gint y, gint width, gint height, gint gap_side)
@@ -2570,10 +2519,8 @@ draw_tab_button (GtkStyle *style,
       XpDCInfo dc_info;
       HDC dc;
       gint32 aPosition;
-	  cairo_t *cr;
 
-      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
-	  cr = gdk_cairo_create (window);
+      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
       if (gap_side == GTK_POS_TOP)
 	aPosition = BF_TOP;
@@ -2586,20 +2533,17 @@ draw_tab_button (GtkStyle *style,
 
       if (state_type == GTK_STATE_PRELIGHT)
 	state_type = GTK_STATE_NORMAL;
-      if (area)
-        {
-           gdk_cairo_rectangle (cr, area);
-           cairo_clip (cr);
+
+/* FIXME: wtf? 
            gdk_cairo_set_source_color (cr, &style->dark[state_type]);
-        }
+ */
 
       DrawTab (dc, rect, aPosition,
 	       state_type != GTK_STATE_PRELIGHT,
 	       (gap_side != GTK_POS_LEFT), (gap_side != GTK_POS_RIGHT));
 
-      cairo_destroy (cr);
-
       release_window_dc (&dc_info);
+
       return TRUE;
     }
 
@@ -2608,10 +2552,9 @@ draw_tab_button (GtkStyle *style,
 
 static void
 draw_extension (GtkStyle *style,
-		GdkWindow *window,
+		cairo_t *cr,
 		GtkStateType state_type,
 		GtkShadowType shadow_type,
-		GdkRectangle *area,
 		GtkWidget *widget,
 		const gchar *detail,
 		gint x, gint y,
@@ -2624,16 +2567,16 @@ draw_extension (GtkStyle *style,
       /* Why this differs from gap_side, I have no idea.. */
       int real_gap_side = gtk_notebook_get_tab_pos (notebook);
 
-      if (!draw_themed_tab_button (style, window, state_type,
+      if (!draw_themed_tab_button (style, cr, state_type,
 				   GTK_NOTEBOOK (widget), x, y,
 				   width, height, real_gap_side))
 	{
-	  if (!draw_tab_button (style, window, state_type,
-				shadow_type, area, widget,
+	  if (!draw_tab_button (style, cr, state_type,
+				shadow_type, widget,
 				detail, x, y, width, height, real_gap_side))
 	    {
-	      parent_class->draw_extension (style, window, state_type,
-					    shadow_type, area, widget, detail,
+	      parent_class->draw_extension (style, cr, state_type,
+					    shadow_type, widget, detail,
 					    x, y, width, height,
 					    real_gap_side);
 	    }
@@ -2642,8 +2585,8 @@ draw_extension (GtkStyle *style,
 }
 
 static void
-draw_box_gap (GtkStyle *style, GdkWindow *window, GtkStateType state_type,
-	      GtkShadowType shadow_type, GdkRectangle *area,
+draw_box_gap (GtkStyle *style, cairo_t *cr, GtkStateType state_type,
+	      GtkShadowType shadow_type,
 	      GtkWidget *widget, const gchar *detail, gint x,
 	      gint y, gint width, gint height, GtkPositionType gap_side,
 	      gint gap_x, gint gap_width)
@@ -2683,15 +2626,15 @@ draw_box_gap (GtkStyle *style, GdkWindow *window, GtkStateType state_type,
 	  h2 = height;
 	}
 
-      if (xp_theme_draw (window, XP_THEME_ELEMENT_TAB_PANE, style,
-			 x2, y2, w2, h2, state_type, area))
+      if (xp_theme_draw (cr, XP_THEME_ELEMENT_TAB_PANE, style,
+			 x2, y2, w2, h2, state_type))
 	{
 	  return;
 	}
     }
 
-  parent_class->draw_box_gap (style, window, state_type, shadow_type,
-			      area, widget, detail, x, y, width, height,
+  parent_class->draw_box_gap (style, cr, state_type, shadow_type,
+			      widget, detail, x, y, width, height,
 			      gap_side, gap_x, gap_width);
 }
 
@@ -2717,9 +2660,9 @@ is_popup_window_child (GtkWidget *widget)
 }
 
 static void
-draw_flat_box (GtkStyle *style, GdkWindow *window,
+draw_flat_box (GtkStyle *style, cairo_t *cr,
 	       GtkStateType state_type, GtkShadowType shadow_type,
-	       GdkRectangle *area, GtkWidget *widget,
+	       GtkWidget *widget,
 	       const gchar *detail, gint x, gint y, gint width, gint height)
 {
   if (detail)
@@ -2728,12 +2671,9 @@ draw_flat_box (GtkStyle *style, GdkWindow *window,
 	  (!strncmp ("cell_even", detail, 9) || !strncmp ("cell_odd", detail, 8)))
 	{
           GdkColor *gc = gtk_widget_has_focus (widget) ? &style->base[state_type] : &style->base[GTK_STATE_ACTIVE];
-          cairo_t *cr = gdk_cairo_create (window);
 
           _cairo_draw_rectangle (cr, gc, TRUE, x, y, width, height);
 
-		  cairo_destroy (cr);
-
 	  return;
 	}
       else if (!strcmp (detail, "checkbutton"))
@@ -2745,19 +2685,19 @@ draw_flat_box (GtkStyle *style, GdkWindow *window,
 	}
     }
 
-  parent_class->draw_flat_box (style, window, state_type, shadow_type,
-			       area, widget, detail, x, y, width, height);
+  parent_class->draw_flat_box (style, cr, state_type, shadow_type,
+			       widget, detail, x, y, width, height);
 }
 
 static gboolean
-draw_menu_border (GdkWindow *win, GtkStyle *style,
+draw_menu_border (cairo_t *cr, GtkStyle *style,
 		  gint x, gint y, gint width, gint height)
 {
   RECT rect;
   XpDCInfo dc_info;
   HDC dc;
 
-  dc = get_window_dc (style, win, GTK_STATE_NORMAL, &dc_info, x, y, width, height, &rect);
+  dc = get_window_dc (style, cr, GTK_STATE_NORMAL, &dc_info, x, y, width, height, &rect);
 
   if (!dc)
     return FALSE;
@@ -2778,10 +2718,9 @@ draw_menu_border (GdkWindow *win, GtkStyle *style,
 
 static void
 draw_shadow (GtkStyle *style,
-	     GdkWindow *window,
+	     cairo_t *cr,
 	     GtkStateType state_type,
 	     GtkShadowType shadow_type,
-	     GdkRectangle *area,
 	     GtkWidget *widget,
 	     const gchar *detail, gint x, gint y, gint width, gint height)
 {
@@ -2797,7 +2736,7 @@ draw_shadow (GtkStyle *style,
 
 
 
-      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
       if (is_combo_box_child (widget))
         {
           FillRect (dc, &rect, GetSysColorBrush (COLOR_WINDOW));
@@ -2844,14 +2783,14 @@ draw_shadow (GtkStyle *style,
       if (shadow_type != GTK_SHADOW_IN)
 	return;
 
-      if (!xp_theme_draw (window, XP_THEME_ELEMENT_EDIT_TEXT, style,
-			  x, y, width, height, state_type, area))
+      if (!xp_theme_draw (cr, XP_THEME_ELEMENT_EDIT_TEXT, style,
+			  x, y, width, height, state_type))
 	{
 	  HDC dc;
 	  RECT rect;
 	  XpDCInfo dc_info;
 
-	  dc = get_window_dc (style, window, state_type, &dc_info,
+	  dc = get_window_dc (style, cr, state_type, &dc_info,
 			      x, y, width, height, &rect);
 
 	  DrawEdge (dc, &rect, EDGE_SUNKEN, BF_RECT);
@@ -2862,8 +2801,8 @@ draw_shadow (GtkStyle *style,
     }
 
   if (detail && !strcmp (detail, "scrolled_window") &&
-      xp_theme_draw (window, XP_THEME_ELEMENT_EDIT_TEXT, style,
-		     x, y, width, height, state_type, area))
+      xp_theme_draw (cr, XP_THEME_ELEMENT_EDIT_TEXT, style,
+		     x, y, width, height, state_type))
     {
       return;
     }
@@ -2873,7 +2812,7 @@ draw_shadow (GtkStyle *style,
 
   if (detail && !strcmp (detail, "menu"))
     {
-      if (draw_menu_border (window, style, x, y, width, height))
+      if (draw_menu_border (cr, style, x, y, width, height))
 	{
 	  return;
 	}
@@ -2949,7 +2888,7 @@ draw_shadow (GtkStyle *style,
 		}
 	    }
 
-	  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+	  dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
 	  if (pos != GTK_POS_LEFT)
 	    {
@@ -2988,22 +2927,17 @@ draw_shadow (GtkStyle *style,
       return;
     }
 
-  parent_class->draw_shadow (style, window, state_type, shadow_type, area,
+  parent_class->draw_shadow (style, cr, state_type, shadow_type,
 			     widget, detail, x, y, width, height);
 }
 
 static void
 draw_hline (GtkStyle *style,
-	    GdkWindow *window,
+	    cairo_t *cr,
 	    GtkStateType state_type,
-	    GdkRectangle *area,
 	    GtkWidget *widget,
 	    const gchar *detail, gint x1, gint x2, gint y)
 {
-  cairo_t *cr;
-  
-  cr = gdk_cairo_create (window);
-
   if (xp_theme_is_active () && detail && !strcmp (detail, "menuitem"))
     {
       gint cx, cy;
@@ -3015,24 +2949,18 @@ draw_hline (GtkStyle *style,
 				       &cx, &cy);
 
       /* Center the separator */
-      y_offset = (area->height / 2) - (cy / 2);
-      new_y = y_offset >= 0 ? area->y + y_offset : area->y;
+      y_offset = (cy / 2) - 1;
+      new_y = (y - y_offset) >= 0 ? y - y_offset : y;
       new_height = cy;
 
       if (xp_theme_draw
-	  (window, XP_THEME_ELEMENT_MENU_SEPARATOR, style, x1, new_y, x2, new_height,
-	   state_type, area))
+	  (cr, XP_THEME_ELEMENT_MENU_SEPARATOR, style, x1, new_y, x2, new_height,
+	   state_type))
 	{
 	  return;
 	}
       else
 	{
-	  if (area)
-	    {
-              gdk_cairo_rectangle (cr, area);
-              cairo_clip (cr);
-	    }
-
           _cairo_draw_line (cr, &style->dark[state_type], x1, y, x2, y);
 
 	}
@@ -3041,12 +2969,6 @@ draw_hline (GtkStyle *style,
     {
       if (style->ythickness == 2)
 	{
-	  if (area)
-	    {
-              gdk_cairo_rectangle (cr, area);
-              cairo_clip (cr);
-	    }
-
           _cairo_draw_line (cr, &style->dark[state_type], x1, y, x2, y);
 	  ++y;
           _cairo_draw_line (cr, &style->light[state_type], x1, y, x2, y);
@@ -3054,33 +2976,21 @@ draw_hline (GtkStyle *style,
 	}
       else
 	{
-	  parent_class->draw_hline (style, window, state_type, area, widget,
+	  parent_class->draw_hline (style, cr, state_type, widget,
 				    detail, x1, x2, y);
 	}
     }
-  cairo_destroy (cr);
 }
 
 static void
 draw_vline (GtkStyle *style,
-	    GdkWindow *window,
+	    cairo_t *cr,
 	    GtkStateType state_type,
-	    GdkRectangle *area,
 	    GtkWidget *widget,
 	    const gchar *detail, gint y1, gint y2, gint x)
 {
-  cairo_t *cr;
-  
-  cr = gdk_cairo_create (window);
-
   if (style->xthickness == 2)
     {
-      if (area)
-	{
-              gdk_cairo_rectangle (cr, area);
-              cairo_clip (cr);
-	}
-
       _cairo_draw_line (cr, &style->dark[state_type], x, y1, x, y2);
       ++x;
       _cairo_draw_line (cr, &style->light[state_type], x, y1, x, y2);
@@ -3088,91 +2998,77 @@ draw_vline (GtkStyle *style,
     }
   else
     {
-      parent_class->draw_vline (style, window, state_type, area, widget,
+      parent_class->draw_vline (style, cr, state_type, widget,
 				detail, y1, y2, x);
     }
-
-  cairo_destroy (cr);
 }
 
 static void
 draw_slider (GtkStyle *style,
-	     GdkWindow *window,
+	     cairo_t *cr,
 	     GtkStateType state_type,
 	     GtkShadowType shadow_type,
-	     GdkRectangle *area,
 	     GtkWidget *widget,
 	     const gchar *detail,
 	     gint x,
 	     gint y, gint width, gint height, GtkOrientation orientation)
 {
   if (GTK_IS_SCALE (widget) &&
-      xp_theme_draw (window, ((orientation == GTK_ORIENTATION_VERTICAL) ?
+      xp_theme_draw (cr, ((orientation == GTK_ORIENTATION_VERTICAL) ?
 			      XP_THEME_ELEMENT_SCALE_SLIDER_V :
 			      XP_THEME_ELEMENT_SCALE_SLIDER_H), style, x, y, width,
-		     height, state_type, area))
+		     height, state_type))
     {
       return;
     }
 
-  parent_class->draw_slider (style, window, state_type, shadow_type, area,
+  parent_class->draw_slider (style, cr, state_type, shadow_type,
 			     widget, detail, x, y, width, height,
 			     orientation);
 }
 
 static void
 draw_resize_grip (GtkStyle *style,
-		  GdkWindow *window,
+		  cairo_t *cr,
 		  GtkStateType state_type,
-		  GdkRectangle *area,
 		  GtkWidget *widget,
 		  const gchar *detail,
 		  GdkWindowEdge edge, gint x, gint y, gint width, gint height)
 {
-  cairo_t *cr;
-  
-  cr = gdk_cairo_create (window);
-  
   if (detail && !strcmp (detail, "statusbar"))
     {
       if (xp_theme_draw
-	  (window, XP_THEME_ELEMENT_STATUS_GRIPPER, style, x, y, width,
-	   height, state_type, area))
+	  (cr, XP_THEME_ELEMENT_STATUS_GRIPPER, style, x, y, width,
+	   height, state_type))
 	{
-          cairo_destroy (cr);
 	  return;
 	}
       else
 	{
 	  RECT rect;
 	  XpDCInfo dc_info;
-	  HDC dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+	  HDC dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
-	  if (area)
-            {
-              gdk_cairo_rectangle (cr, area);
-              cairo_clip (cr);
+/* FIXME: wtf?
               gdk_cairo_set_source_color (cr, &style->dark[state_type]);
-            }
+ */
 
 	  DrawFrameControl (dc, &rect, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
 	  release_window_dc (&dc_info);
 
-          cairo_destroy (cr);
 	  return;
 	}
     }
 
-  parent_class->draw_resize_grip (style, window, state_type, area,
+  parent_class->draw_resize_grip (style, cr, state_type,
 				  widget, detail, edge, x, y, width, height);
 }
 
 static void
 draw_handle (GtkStyle *style,
-	     GdkWindow *window,
+	     cairo_t *cr,
 	     GtkStateType state_type,
 	     GtkShadowType shadow_type,
-	     GdkRectangle *area,
 	     GtkWidget *widget,
 	     const gchar *detail,
 	     gint x,
@@ -3181,9 +3077,6 @@ draw_handle (GtkStyle *style,
   HDC dc;
   RECT rect;
   XpDCInfo dc_info;
-  cairo_t *cr;
-  
-  cr = gdk_cairo_create (window);
 
   if (is_toolbar_child (widget))
     {
@@ -3209,13 +3102,13 @@ draw_handle (GtkStyle *style,
       else
 	hndl = XP_THEME_ELEMENT_REBAR_GRIPPER_H;
 
-      if (xp_theme_draw (window, hndl, style, x, y, width, height,
-			 state_type, area))
+      if (xp_theme_draw (cr, hndl, style, x, y, width, height,
+			 state_type))
 	{
 	  return;
 	}
 
-      dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+      dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
 
       if (orientation == GTK_ORIENTATION_VERTICAL)
 	{
@@ -3243,7 +3136,7 @@ draw_handle (GtkStyle *style,
       GdkColor *light, *dark, *shadow;
       GdkRectangle dest;
 
-      gtk_paint_box (style, window, state_type, shadow_type, area,
+      gtk_paint_box (style, cr, state_type, shadow_type,
 		     widget, detail, x, y, width, height);
 
       light = &style->light[state_type];
@@ -3263,9 +3156,6 @@ draw_handle (GtkStyle *style,
       else
 	dest.y += 2;
 
-      gdk_cairo_rectangle (cr, &dest);
-      cairo_clip (cr);
-
       if (dest.width < dest.height)
 	{
           _cairo_draw_line (cr, light, dest.x, dest.y, dest.x,
@@ -3286,16 +3176,13 @@ draw_handle (GtkStyle *style,
 			 dest.y + dest.height, dest.x + dest.width,
 			 dest.y + dest.height);
 	}
-
-      cairo_destroy (cr);
     }
 }
 
 static void
 draw_focus (GtkStyle *style,
-	    GdkWindow *window,
+	    cairo_t *cr,
 	    GtkStateType state_type,
-	    GdkRectangle *area,
 	    GtkWidget *widget,
 	    const gchar *detail, gint x, gint y, gint width, gint height)
 {
@@ -3318,21 +3205,20 @@ draw_focus (GtkStyle *style,
       return;
     }
 
-  dc = get_window_dc (style, window, state_type, &dc_info, x, y, width, height, &rect);
+  dc = get_window_dc (style, cr, state_type, &dc_info, x, y, width, height, &rect);
   DrawFocusRect (dc, &rect);
   release_window_dc (&dc_info);
 /*
-    parent_class->draw_focus (style, window, state_type,
-						     area, widget, detail, x, y, width, height);
+    parent_class->draw_focus (style, cr, state_type,
+						     widget, detail, x, y, width, height);
 */
 }
 
 static void
 draw_layout (GtkStyle *style,
-	     GdkWindow *window,
+	     cairo_t *cr,
 	     GtkStateType state_type,
 	     gboolean use_text,
-	     GdkRectangle *area,
 	     GtkWidget *widget,
 	     const gchar *detail,
 	     gint old_x, gint old_y, PangoLayout *layout)
@@ -3363,8 +3249,8 @@ draw_layout (GtkStyle *style,
 	}
     }
 
-  parent_class->draw_layout (style, window, state_type,
-			     use_text, area, widget, detail, x, y, layout);
+  parent_class->draw_layout (style, cr, state_type,
+			     use_text, widget, detail, x, y, layout);
 }
 
 static void
diff --git a/modules/engines/ms-windows/xp_theme.c b/modules/engines/ms-windows/xp_theme.c
index 258f418..532c862 100755
--- a/modules/engines/ms-windows/xp_theme.c
+++ b/modules/engines/ms-windows/xp_theme.c
@@ -894,69 +894,102 @@ xp_theme_map_gtk_state (XpThemeElement element, GtkStateType state)
 
 HDC
 get_window_dc (GtkStyle *style,
-	       GdkWindow *window,
+	       cairo_t *cr,
 	       GtkStateType state_type,
 	       XpDCInfo *dc_info_out,
 	       gint x, gint y, gint width, gint height,
 	       RECT *rect_out)
 {
-  cairo_t *cr;
-  cairo_surface_t *surface;
-  HDC dc;
-  gint x_offset = 0, y_offset = 0;
-  double x_off, y_off;
+  HDC hDC, hTempDC;
+  HBITMAP hBitmap, hOldBitmap;
+  cairo_surface_t *sourceCS, *tempCS;
+  cairo_t *tempCR;
+  double x_off = 0, y_off = 0;
 
-  dc_info_out->cr = NULL;
-  dc_info_out->dc = NULL;
+  dc_info_out->hdc = NULL;
   
-  cr = gdk_cairo_create (window);
-  if (!cr)
+  hDC = GetDC(NULL);
+  hTempDC = CreateCompatibleDC(hDC);
+  hBitmap = CreateCompatibleBitmap(hDC, x + width, y + height);
+  hOldBitmap = (HBITMAP)SelectObject(hTempDC, hBitmap);
+  ReleaseDC(NULL, hDC);
+
+  tempCS = cairo_win32_surface_create (hTempDC);
+  if (!tempCS)
     return NULL;
 
-  surface = cairo_get_target (cr);
-  cairo_surface_get_device_offset (surface, &x_off, &y_off);
-  cairo_surface_flush (surface);
+  sourceCS = cairo_get_target (cr);
+  tempCR = cairo_create (tempCS);
   
-  dc = cairo_win32_surface_get_dc (surface);
-  if (!dc)
-   return NULL;
+  /* FIXME: I am missing something here - why is it needed to have device
+   *        for cairo_set_source_surface() ? */
+  cairo_surface_get_device_offset (sourceCS, &x_off, &y_off);
+  cairo_set_source_surface (tempCR, sourceCS, x_off, y_off);
+  cairo_set_operator (tempCR, CAIRO_OPERATOR_OVER);
+  /* FIXME: Something is not quit right here - seems the CR or SURFACE do
+   *        not always have the correct data. Hovering on a GtkToolbar from
+   *        left to right draws the previous button over the next for ex. */
+  cairo_rectangle (tempCR, x, y, width, height);
+  cairo_fill (tempCR);
   
-  x_offset = -x_off;
-  y_offset = -y_off;
+  cairo_destroy (tempCR);
 
-  rect_out->left = x - x_offset;
-  rect_out->top = y - y_offset;
+  cairo_surface_flush (tempCS);
+  cairo_surface_destroy (tempCS);
+  
+  rect_out->left = x;
+  rect_out->top = y;
   rect_out->right = rect_out->left + width;
   rect_out->bottom = rect_out->top + height;
   
+  dc_info_out->hdc = hTempDC;
+  dc_info_out->hBitmap = hBitmap;
+  dc_info_out->hOldBitmap = hOldBitmap;
   dc_info_out->cr = cr;
-  dc_info_out->dc = dc;
-  dc_info_out->x_offset = x_offset;
-  dc_info_out->y_offset = y_offset;
+  dc_info_out->x = x;
+  dc_info_out->y = y;
+  dc_info_out->width = width;
+  dc_info_out->height = height;
   
-  return dc;
+  return hTempDC;
 }
 
 void
 release_window_dc (XpDCInfo *dc_info)
 {
-  if (!dc_info->cr || !dc_info->dc)
+  cairo_surface_t *tempCS, *target;
+
+  if (!dc_info->hdc)
     return;
 
-  ReleaseDC (NULL, dc_info->dc);
-  cairo_destroy (dc_info->cr);
+  tempCS = cairo_win32_surface_create (dc_info->hdc);
+  target = cairo_get_target (dc_info->cr);
+
+  cairo_save (dc_info->cr);
+  
+  cairo_set_source_surface (dc_info->cr, tempCS, 0, 0);
+  cairo_set_operator (dc_info->cr, CAIRO_OPERATOR_OVER);
+  cairo_rectangle (dc_info->cr, dc_info->x, dc_info->y, dc_info->width, dc_info->height);
+  cairo_fill (dc_info->cr);
+  
+  cairo_restore (dc_info->cr);
+  
+  cairo_surface_destroy (tempCS);
+
+  SelectObject(dc_info->hdc, dc_info->hOldBitmap);
+  DeleteDC(dc_info->hdc);
+  DeleteObject(dc_info->hBitmap);
   
-  dc_info->cr = NULL;
-  dc_info->dc = NULL;
+  dc_info->hdc = NULL;
 }
 
 gboolean
-xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
+xp_theme_draw (cairo_t *cr, XpThemeElement element, GtkStyle *style,
 	       int x, int y, int width, int height,
-	       GtkStateType state_type, GdkRectangle *area)
+	       GtkStateType state_type)
 {
   HTHEME theme;
-  RECT rect, clip, *pClip;
+  RECT rect;
   HDC dc;
   XpDCInfo dc_info;
   int part_state;
@@ -969,37 +1002,24 @@ xp_theme_draw (GdkWindow *win, XpThemeElement element, GtkStyle *style,
     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) && gdk_win32_window_is_win32 (win))
+//    enable_theme_dialog_texture_func (GDK_WINDOW_HWND (win), ETDT_ENABLETAB);
 
-  dc = get_window_dc (style, win, state_type, &dc_info,
+  dc = get_window_dc (style, cr, state_type, &dc_info,
 		      x, y, width, height,
 		      &rect);
   if (!dc)
     return FALSE;
 
-  if (area)
-    {
-      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;
-
-      pClip = &clip;
-    }
-  else
-    {
-      pClip = NULL;
-    }
-
   part_state = xp_theme_map_gtk_state (element, state_type);
 
   /* Support transparency */
-  if (is_theme_partially_transparent_func (theme, element_part_map[element], part_state))
-    draw_theme_parent_background_func (GDK_WINDOW_HWND (win), dc, pClip);
+//  if (is_theme_partially_transparent_func (theme, element_part_map[element], part_state))
+//    draw_theme_parent_background_func (GDK_WINDOW_HWND (win), dc, pClip);
 
+  /* FIXME: Should we get and handle clipping (check it on the CR?) ? */
   draw_theme_background_func (theme, dc, element_part_map[element],
-			      part_state, &rect, pClip);
+			      part_state, &rect, NULL);
 
   release_window_dc (&dc_info);
 
diff --git a/modules/engines/ms-windows/xp_theme.h b/modules/engines/ms-windows/xp_theme.h
index 0ee9830..bf02ad6 100755
--- a/modules/engines/ms-windows/xp_theme.h
+++ b/modules/engines/ms-windows/xp_theme.h
@@ -115,14 +115,17 @@ typedef enum
 
 typedef struct
 {
+  HDC hdc;
+  HBITMAP hBitmap, hOldBitmap;
   cairo_t *cr;
-  HDC dc;
-  gint x_offset;
-  gint y_offset;
+  gint x;
+  gint y;
+  gint width;
+  gint height;
 } XpDCInfo;
 
 HDC get_window_dc (GtkStyle *style,
-		   GdkWindow *window,
+		   cairo_t *cr,
 		   GtkStateType state_type,
 		   XpDCInfo *dc_info_out,
 		   gint x, gint y, gint width, gint height,
@@ -132,10 +135,9 @@ void release_window_dc (XpDCInfo *dc_info);
 void xp_theme_init (void);
 void xp_theme_reset (void);
 void xp_theme_exit (void);
-gboolean xp_theme_draw (GdkWindow *win, XpThemeElement element,
+gboolean xp_theme_draw (cairo_t *cr, XpThemeElement element,
                         GtkStyle *style, int x, int y, int width,
-                        int height, GtkStateType state_type,
-                        GdkRectangle *area);
+                        int height, GtkStateType state_type);
 gboolean xp_theme_is_drawable (XpThemeElement element);
 gboolean xp_theme_get_element_dimensions (XpThemeElement element,
                                           GtkStateType state_type,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]