[Xfce4-commits] <gtk-xfce-engine:migrate-to-cairo> Rewritten drawing routines to use cairo

Peter de Ridder noreply at xfce.org
Fri Apr 15 21:14:02 CEST 2011


Updating branch refs/heads/migrate-to-cairo
         to f272406bd900b5d3f5ef91a258fe01705dc70ef9 (commit)
       from 7aabfb06eca7731ac5e6c318ae1f7055a3622d0b (commit)

commit f272406bd900b5d3f5ef91a258fe01705dc70ef9
Author: Peter de Ridder <peter at xfce.org>
Date:   Fri Apr 15 21:02:25 2011 +0200

    Rewritten drawing routines to use cairo

 src/Makefile.am       |    4 +
 src/cairo-support.c   |   54 ++
 src/cairo-support.h   |   34 ++
 src/ge-support.h      |   32 +
 src/general-support.h |   50 ++
 src/gradient_draw.c   |  114 +---
 src/gradient_draw.h   |    9 +-
 src/xfce_theme_draw.c | 1544 ++++++++++++++++++++++++++++---------------------
 8 files changed, 1088 insertions(+), 753 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index fd8752f..d81392e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -9,6 +9,10 @@ enginedir = $(libdir)/gtk-2.0/$(GTK_BINARY_VERSION)/engines
 engine_LTLIBRARIES = libxfce.la
 
 libxfce_la_SOURCES = \
+	cairo-support.c	 \
+	cairo-support.h \
+	ge-support.h \
+	general-support.h \
 	gradient_draw.c	 \
 	gradient_draw.h \
 	xfce_theme_draw.c \
diff --git a/src/cairo-support.c b/src/cairo-support.c
new file mode 100644
index 0000000..3171146
--- /dev/null
+++ b/src/cairo-support.c
@@ -0,0 +1,54 @@
+/*  Helper functions for gtk-engines
+ *
+ *  Copyright (C) 2006 Andrew Johnson <acjgenius at earthlink.net>
+ *  Copyright (C) 2006 Thomas Wood <thos at gnome.org>
+ *  Copyright (C) 2006-2007 Benjamin Berg <benjamin at sipsolutions.net>
+ *  Copyright (C) 2007 Andrea Cimitan <andrea.cimitan at gmail.com>
+ *  Copyright (C) 2011 Peter de Ridder <peter at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Written by Andrew Johnson <acjgenius at earthlink.net>
+ *  Written by Benjamin Berg <benjamin at sipsolutions.net>
+ *  Written by Thomas Wood <thos at gnome.org>
+ *  modified by Andrea Cimitan <andrea.cimitan at gmail.com>
+ *  modified by Peter de Ridder <peter at xfce.org>
+ *
+ */
+
+#include "general-support.h"
+#include "cairo-support.h"
+
+cairo_t * 
+ge_gdk_drawable_to_cairo (GdkDrawable  *window, GdkRectangle *area)
+{
+	cairo_t *cr;
+
+	g_return_val_if_fail (window != NULL, NULL);
+
+	cr = (cairo_t*) gdk_cairo_create (window);
+	cairo_set_line_width (cr, 1.0);
+	cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE);
+	cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER);
+
+	if (area)
+	{
+		gdk_cairo_rectangle (cr, area);
+		cairo_clip (cr);
+	}
+
+	return cr;
+}
diff --git a/src/cairo-support.h b/src/cairo-support.h
new file mode 100644
index 0000000..c64024a
--- /dev/null
+++ b/src/cairo-support.h
@@ -0,0 +1,34 @@
+/*  Helper functions for gtk-engines
+ *
+ *  Copyright (C) 2006 Andrew Johnson <acjgenius at earthlink.net>
+ *  Copyright (C) 2006 Thomas Wood <thos at gnome.org>
+ *  Copyright (C) 2006-2007 Benjamin Berg <benjamin at sipsolutions.net>
+ *  Copyright (C) 2007 Andrea Cimitan <andrea.cimitan at gmail.com>
+ *  Copyright (C) 2011 Peter de Ridder <peter at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Written by Andrew Johnson <acjgenius at earthlink.net>
+ *  Written by Benjamin Berg <benjamin at sipsolutions.net>
+ *  Written by Thomas Wood <thos at gnome.org>
+ *  modified by Andrea Cimitan <andrea.cimitan at gmail.com>
+ *  modified by Peter de Ridder <peter at xfce.org>
+ *
+ */
+
+#include <gtk/gtk.h>
+
+G_GNUC_INTERNAL cairo_t * ge_gdk_drawable_to_cairo (GdkDrawable  *window, GdkRectangle *area);
diff --git a/src/ge-support.h b/src/ge-support.h
new file mode 100644
index 0000000..6b9e34d
--- /dev/null
+++ b/src/ge-support.h
@@ -0,0 +1,32 @@
+/*  Helper functions for gtk-engines
+ *
+ *  Copyright (C) 2006 Benjamin Berg <benjamin at sipsolutions.net>
+ *  Copyright (C) 2011 Peter de Ridder <peter at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Written by Benjamin Berg <benjamin at sipsolutions.net>
+ *  modified by Peter de Ridder <peter at xfce.org>
+ *
+ */
+
+#ifndef GE_SUPPORT_H
+#define GE_SUPPORT_H
+
+#include "general-support.h"
+#include "cairo-support.h"
+
+#endif /* GE_SUPPORT_H */
diff --git a/src/general-support.h b/src/general-support.h
new file mode 100644
index 0000000..5011c12
--- /dev/null
+++ b/src/general-support.h
@@ -0,0 +1,50 @@
+/*  Helper functions for gtk-engines
+ *
+ *  Copyright (C) 2006 Andrew Johnson <acjgenius at earthlink.net>
+ *  Copyright (C) 2006-2007 Benjamin Berg <benjamin at sipsolutions.net>
+ *  Copyright (C) 2011 Peter de Ridder <peter at xfce.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ *
+ *  Written by Andrew Johnson <acjgenius at earthlink.net>
+ *  Written by Benjamin Berg <benjamin at sipsolutions.net>
+ *  modified by Peter de Ridder <peter at xfce.org>
+ *
+ */
+
+#ifndef __GENERAL_SUPPORT_H
+#define __GENERAL_SUPPORT_H
+
+/* macros to make sure that things are sane ... */
+
+#define CHECK_DETAIL(detail, value) ((detail) && (!strcmp(value, detail)))
+
+#define CHECK_ARGS					\
+  g_return_if_fail (window != NULL);			\
+  g_return_if_fail (style != NULL);
+
+#define SANITIZE_SIZE					\
+  g_return_if_fail (width  >= -1);			\
+  g_return_if_fail (height >= -1);			\
+                                                        \
+  if ((width == -1) && (height == -1))			\
+    gdk_drawable_get_size (window, &width, &height);	\
+  else if (width == -1)					\
+    gdk_drawable_get_size (window, &width, NULL);	\
+  else if (height == -1)				\
+    gdk_drawable_get_size (window, NULL, &height);
+
+#endif /* __GENERAL_SUPPORT_H */
diff --git a/src/gradient_draw.c b/src/gradient_draw.c
index f51246f..02deb88 100644
--- a/src/gradient_draw.c
+++ b/src/gradient_draw.c
@@ -15,6 +15,7 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  *
  *  Copyright (C) 1999-2004 Olivier Fourdan (fourdan at xfce.org)
+ *  Copyright (C) 2011 Peter de Ridder <peter at xfce.org>
  *
  *  Portions based Thinice port by
  *                       Tim Gerla <timg at rrv.net>,
@@ -214,7 +215,7 @@ static void gradient_hls_to_rgb(gdouble * h, gdouble * l, gdouble * s)
     }
 }
 
-void gradient_shade(GdkColor * a, GdkColor * b, gdouble k)
+static void gradient_add_stop_color_shaded(cairo_pattern_t *gradient, gdouble offset, const GdkColor * a, gdouble k)
 {
     gdouble red = (gdouble) a->red / 65535.0;
     gdouble green = (gdouble) a->green / 65535.0;
@@ -230,114 +231,51 @@ void gradient_shade(GdkColor * a, GdkColor * b, gdouble k)
 
     gradient_hls_to_rgb(&red, &green, &blue);
 
-    b->red = red * 65535.0;
-    b->green = green * 65535.0;
-    b->blue = blue * 65535.0;
+    cairo_pattern_add_color_stop_rgb(gradient, offset, red, green, blue);
 }
 
-void gradient_alloc_color(GdkColor * color, GdkColormap * colormap, GdkColor light, GdkColor dark, gint position, gint steps)
+void gradient_draw_shaded(cairo_t *cr, gint x, gint y, gint width, gint height, const GdkColor * color, gfloat shine_value, gfloat gradient_shade_value, GradientType gradient_style)
 {
-    gfloat delta;
-    /* delta = i/steps */
-    delta = ((float)position / (float)steps);
-    color->red = light.red + (float)((dark.red - light.red)) * delta;
-    color->green = light.green + (float)((dark.green - light.green)) * delta;
-    color->blue = light.blue + (float)((dark.blue - light.blue)) * delta;
-    gdk_colormap_alloc_color(colormap, color, FALSE, TRUE);
-}
-
-void gradient_draw(GdkWindow * window, GdkGC * gc, GdkColormap * colormap, GdkRectangle * area, gint x, gint y, gint width, gint height, GdkColor light, GdkColor dark, GradientType gradient_style, gboolean noclip)
-{
-    GdkRectangle clip;
-    GdkColor color;
-    gint i, steps = 0;
+    cairo_pattern_t *gradient;
     gboolean horizontal = (gradient_style == GRADIENT_HORIZONTAL);
     gboolean northern = (gradient_style == GRADIENT_NORTHERN_DIAGONAL);
     gboolean diagonal = ((gradient_style == GRADIENT_NORTHERN_DIAGONAL) || (gradient_style == GRADIENT_SOUTHERN_DIAGONAL));
 
-    clip.x = x;
-    clip.y = y;
-    clip.width = width;
-    clip.height = height;
-
-    g_return_if_fail(window != NULL);
-    g_return_if_fail(colormap != NULL);
-    g_return_if_fail(gc != NULL);
-
     if(diagonal)
     {
-        steps = width + height - 1;
-    }
-    else if(horizontal)
-    {
-        steps = width;
-    }
-    else
-    {
-        steps = height;
-    }
+        gdouble size = (width + height) / 2.0;
+        gdouble xx = (width - height)/4.0 + x;
+        gdouble yy = (height - width)/4.0 + y;
 
-    if(!noclip)
-    {
-        if(area)
+        if(northern)
         {
-            GdkRectangle clip2;
-            if(gdk_rectangle_intersect(area, &clip, &clip2))
-            {
-                gdk_gc_set_clip_rectangle(gc, &clip2);
-            }
-            else
-            {
-                gdk_gc_set_clip_rectangle(gc, area);
-            }
+            gradient = cairo_pattern_create_linear(xx, yy, xx + size, yy + size);
         }
         else
         {
-            gdk_gc_set_clip_rectangle(gc, &clip);
+            gradient = cairo_pattern_create_linear(xx + size, yy, xx, yy + size);
         }
     }
-
-    for(i = 0; i < steps; i++)
+    else if(horizontal)
     {
-        gradient_alloc_color(&color, colormap, light, dark, i, steps);
-        gdk_gc_set_foreground(gc, &color);
-        if(diagonal)
-        {
-            if(northern)
-            {
-                gdk_draw_line(window, gc, x + i, y, x, y + i);
-            }
-            else
-            {
-                gdk_draw_line(window, gc, x + width - 1 - i, y, x + width - 1, y + i);
-            }
-        }
-        else
-        {
-            if(horizontal)
-            {
-                gdk_draw_line(window, gc, x + i, y, x + i, y + height);
-            }
-            else
-            {
-                gdk_draw_line(window, gc, x, y + i, x + width, y + i);
-            }
-        }
-        gdk_colormap_free_colors(colormap, &color, 1);
+        gradient = cairo_pattern_create_linear(x, y, x + width, y);
     }
-
-    if(!noclip)
+    else
     {
-        gdk_gc_set_clip_rectangle(gc, NULL);
+        gradient = cairo_pattern_create_linear(x, y, x, y + height);
     }
-}
 
-void gradient_draw_shaded(GdkWindow * window, GdkGC * gc, GdkColormap * colormap, GdkRectangle * area, gint x, gint y, gint width, gint height, GdkColor color, gfloat shine_value, gfloat gradient_shade_value, GradientType gradient_style, gboolean noclip)
-{
-    GdkColor light, dark;
+    gradient_add_stop_color_shaded(gradient, 0, color, shine_value);
+    gradient_add_stop_color_shaded(gradient, 1, color, gradient_shade_value);
+
+    cairo_save(cr);
+
+    cairo_set_source(cr, gradient);
+    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+
+    cairo_rectangle(cr, x, y, width, height);
 
-    gradient_shade(&color, &dark, gradient_shade_value);
-    gradient_shade(&color, &light, shine_value);
+    cairo_fill (cr);
 
-    gradient_draw(window, gc, colormap, area, x, y, width, height, light, dark, gradient_style, noclip);
+    cairo_restore(cr);
 }
diff --git a/src/gradient_draw.h b/src/gradient_draw.h
index 10bdf99..fc7f859 100644
--- a/src/gradient_draw.h
+++ b/src/gradient_draw.h
@@ -15,6 +15,7 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  *
  *  Copyright (C) 1999-2004 Olivier Fourdan (fourdan at xfce.org)
+ *  Copyright (C) 2011 Peter de Ridder <peter at xfce.org>
  *
  *  Portions based Thinice port by 
  *                       Tim Gerla <timg at rrv.net>,
@@ -51,12 +52,6 @@ typedef enum
 #define GRADIENT(horizontal) (horizontal ? GRADIENT_HORIZONTAL : GRADIENT_VERTICAL)
 #define DIAGONALGRADIENT(northern) (northern ? GRADIENT_NORTHERN_DIAGONAL : GRADIENT_SOUTHERN_DIAGONAL)
 
-void gradient_alloc_color(GdkColor * color, GdkColormap * colormap, GdkColor light, GdkColor dark, gint position, gint steps);
-
-void gradient_shade(GdkColor * a, GdkColor * b, gdouble k);
-
-void gradient_draw(GdkWindow * window, GdkGC * gc, GdkColormap * colormap, GdkRectangle * area, gint x, gint y, gint width, gint height, GdkColor light, GdkColor dark, GradientType gradient_style, gboolean noclip);
-
-void gradient_draw_shaded(GdkWindow * window, GdkGC * gc, GdkColormap * colormap, GdkRectangle * area, gint x, gint y, gint width, gint height, GdkColor color, gfloat shine_value, gfloat shade_value, GradientType gradient_style, gboolean noclip);
+void gradient_draw_shaded(cairo_t * cr, gint x, gint y, gint width, gint height, const GdkColor * color, gfloat shine_value, gfloat shade_value, GradientType gradient_style);
 
 #endif /* INC_GRADIENT_DRAW_H */
diff --git a/src/xfce_theme_draw.c b/src/xfce_theme_draw.c
index 922e3a0..4635a1a 100644
--- a/src/xfce_theme_draw.c
+++ b/src/xfce_theme_draw.c
@@ -48,6 +48,7 @@
 
 #include "xfce_style.h"
 #include "xfce_rc_style.h"
+#include "ge-support.h"
 #include "gradient_draw.h"
 
 #define DETAIL(s)   ((detail) && (!strcmp(s, detail)))
@@ -76,65 +77,51 @@ Part;
 
 #define PART_SIZE 13
 
-static const guchar check_light_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
-    0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0xfc, 0x0f,
-    0x00, 0x00,
+static const guint32 check_light_bits[] = {
+    0x0000, 0x0000, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800,
+    0x0800, 0x0800, 0x0ffc, 0x0000,
 };
-static const guchar check_dark_bits[] = {
-    0x00, 0x00, 0xfe, 0x0f, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
-    0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00,
-    0x00, 0x00,
+static const guint32 check_dark_bits[] = {
+    0x0000, 0x0ffe, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+    0x0002, 0x0002, 0x0002, 0x0000,
 };
-static const guchar check_base_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xfc, 0x07, 0xfc, 0x07, 0xfc, 0x07,
-    0xfc, 0x07, 0xfc, 0x07, 0xfc, 0x07, 0xfc, 0x07, 0xfc, 0x07, 0x00, 0x00,
-    0x00, 0x00,
+static const guint32 check_base_bits[] = {
+    0x0000, 0x0000, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fc,
+    0x07fc, 0x07fc, 0x0000, 0x0000,
 };
-static const guchar check_text_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x0f, 0x80, 0x03, 0xc0, 0x01,
-    0xe0, 0x00, 0x73, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x1c, 0x00, 0x18, 0x00,
-    0x08, 0x00
+static const guint32 check_text_bits[] = {
+    0x0000, 0x0000, 0x1c00, 0x0f00, 0x0380, 0x01c0, 0x00e0, 0x0073, 0x003f,
+    0x003e, 0x001c, 0x0018, 0x0008
 };
-static const guchar check_cross_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0xd8, 0x01,
-    0xf8, 0x00, 0x78, 0x00, 0x38, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00,
+static const guint32 check_cross_bits[] = {
+    0x0000, 0x0000, 0x0000, 0x0300, 0x0380, 0x01d8, 0x00f8, 0x0078, 0x0038,
+    0x0018, 0x0000, 0x0000, 0x0000,
 };
-static const guchar check_dash_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x03,
-    0xf8, 0x03, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00,
+static const guint32 check_dash_bits[] = {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03f8, 0x03f8, 0x03f8, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000,
 };
-static const guchar radio_light_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08,
-    0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x04, 0x08, 0x02, 0xf0, 0x01,
-    0x00, 0x00,
+static const guint32 radio_light_bits[] = {
+    0x0000, 0x0000, 0x0000, 0x0400, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800,
+    0x0400, 0x0208, 0x01f0, 0x0000,
 };
-static const guchar radio_dark_bits[] = {
-    0x00, 0x00, 0xf0, 0x01, 0x08, 0x02, 0x04, 0x00, 0x02, 0x00, 0x02, 0x00,
-    0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00,
+static const guint32 radio_dark_bits[] = {
+    0x0000, 0x01f0, 0x0208, 0x0004, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002,
+    0x0004, 0x0000, 0x0000, 0x0000,
 };
-static const guchar radio_base_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0xf8, 0x03, 0xfc, 0x07, 0xfc, 0x07,
-    0xfc, 0x07, 0xfc, 0x07, 0xfc, 0x07, 0xf8, 0x03, 0xf0, 0x01, 0x00, 0x00,
-    0x00, 0x00,
+static const guint32 radio_base_bits[] = {
+    0x0000, 0x0000, 0x01f0, 0x03f8, 0x07fc, 0x07fc, 0x07fc, 0x07fc, 0x07fc,
+    0x03f8, 0x01f0, 0x0000, 0x0000,
 };
-static const guchar radio_text_bits[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xf0, 0x01,
-    0xf0, 0x01, 0xf0, 0x01, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00,
+static const guint32 radio_text_bits[] = {
+    0x0000, 0x0000, 0x0000, 0x0000, 0x00e0, 0x01f0, 0x01f0, 0x01f0, 0x00e0,
+    0x0000, 0x0000, 0x0000, 0x0000,
 };
 
 static struct
 {
-    const guchar *bits;
-#if GTK_CHECK_VERSION(2, 2, 0)
-    GList *bmap_list; /* list of GdkBitmap */
-#else
-    GdkBitmap *bmap;
-#endif
+    const guint32 *bits;
+    cairo_surface_t *bmap;
 }
 parts[] =
 {
@@ -169,22 +156,10 @@ static void draw_handle(GtkStyle * style, GdkWindow * window, GtkStateType state
 
 static void xfce_fill_background(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height)
 {
-    GdkRectangle clip_area;
     GradientType gradient_style = GRADIENT_VERTICAL;
     gfloat shade_start = 1.0, shade_end = 1.0;
     gboolean draw_flat = FALSE;
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
-
-    clip_area.x = x;
-    clip_area.y = y;
-    clip_area.width = width;
-    clip_area.height = height;
+    cairo_t *cr;
 
     /* Spin buttons are a special case */
     if (widget && GTK_IS_SPIN_BUTTON (widget))
@@ -198,10 +173,10 @@ static void xfce_fill_background(GtkStyle * style, GdkWindow * window, GtkStateT
         }
     }
 
+    cr = ge_gdk_drawable_to_cairo(window, area);
+
     if ((!draw_flat) && (XFCE_RC_STYLE(style->rc_style)->gradient))
     {
-        GdkGC *gc = gdk_gc_new(window);
-        GdkGCValues gc_values;
         switch (XFCE_RC_STYLE(style->rc_style)->gradient_style)
         {
             case XFCE_RC_GRADIENT_HORIZONTAL:
@@ -246,62 +221,33 @@ static void xfce_fill_background(GtkStyle * style, GdkWindow * window, GtkStateT
             shade_start = XFCE_RC_STYLE(style->rc_style)->shade_start;
             shade_end = XFCE_RC_STYLE(style->rc_style)->shade_end;
         }
-        gdk_gc_get_values(style->bg_gc[state_type], &gc_values);
-        gdk_gc_set_function(gc, GDK_COPY);
-        gdk_gc_set_line_attributes(gc, 1, GDK_LINE_SOLID, gc_values.cap_style, gc_values.join_style);
 
-        if (area)
-        {
-            gdk_gc_set_clip_rectangle(gc, area);
-        }
-        gradient_draw_shaded(window, gc, style->colormap, area, x, y, width, height, style->bg[state_type], shade_start, shade_end, gradient_style, FALSE);
-        if (area)
-        {
-            gdk_gc_set_clip_rectangle(gc, NULL);
-        }
-        g_object_unref (G_OBJECT(gc));
+        gradient_draw_shaded(cr, x, y, width, height, &style->bg[state_type], shade_start, shade_end, gradient_style);
     }
     else
     {
-        if (area)
-        {
-            gdk_gc_set_clip_rectangle(style->bg_gc[state_type], area);
-        }
-        gdk_draw_rectangle(window, style->bg_gc[state_type], TRUE, x, y, width, height);
-        if (area)
-        {
-            gdk_gc_set_clip_rectangle(style->bg_gc[state_type], NULL);
-        }
+        gdk_cairo_set_source_color(cr, &style->bg[state_type]); 
+        cairo_rectangle(cr, x, y, width, height);
+        cairo_fill(cr);
     }
+
+    cairo_destroy(cr);
 }
 
 static void xfce_draw_grip_rough (GtkStyle * style, GdkWindow * window, GtkStateType state_type, GdkRectangle * area, GtkWidget * widget, gint x, gint y, gint width, gint height, GtkOrientation orientation)
 {
     gint xx, yy;
     gint xthick, ythick;
-    GdkGC *light_gc, *dark_gc;
-    GdkRectangle dest;
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
-
-    light_gc = style->light_gc[state_type];
-    dark_gc = style->dark_gc[state_type];
+    cairo_t *cr;
+    GdkColor *light, *dark;
 
     xthick = style->xthickness;
     ythick = style->ythickness;
 
-    dest.x = x + xthick;
-    dest.y = y + ythick;
-    dest.width = width - (xthick * 2);
-    dest.height = height - (ythick * 2);
+    light = &style->light[state_type];
+    dark = &style->dark[state_type];
 
-    gdk_gc_set_clip_rectangle(light_gc, &dest);
-    gdk_gc_set_clip_rectangle(dark_gc, &dest);
+    cr = ge_gdk_drawable_to_cairo(window, area);
 
     if (orientation == GTK_ORIENTATION_HORIZONTAL)
     {
@@ -312,8 +258,14 @@ static void xfce_draw_grip_rough (GtkStyle * style, GdkWindow * window, GtkState
             yy = y + (height - len) / 2;
             for(xx = 0; xx < 10; xx += 2)
             {
-                gdk_draw_line(window, dark_gc, xx + delta, yy, xx + delta, yy + len - 1);
-                gdk_draw_line(window, light_gc, xx + delta + 1, yy, xx + delta + 1, yy + len - 1);
+                gdk_cairo_set_source_color(cr, dark);   
+                cairo_move_to(cr, xx + delta + 0.5, yy + 0.5);
+                cairo_line_to(cr, xx + delta + 0.5, yy + len - 0.5);
+                cairo_stroke(cr);
+                gdk_cairo_set_source_color(cr, light);  
+                cairo_move_to(cr, xx + delta + 1.5, yy + 0.5);
+                cairo_line_to(cr, xx + delta + 1.5, yy + len - 0.5);
+                cairo_stroke(cr);
             }
         }
     }
@@ -326,14 +278,19 @@ static void xfce_draw_grip_rough (GtkStyle * style, GdkWindow * window, GtkState
             xx = x + (width - len) / 2;
             for(yy = 0; yy < 10; yy += 2)
             {
-                gdk_draw_line(window, dark_gc, xx, yy + delta, xx + len - 1, yy + delta);
-                gdk_draw_line(window, light_gc, xx, yy + delta + 1, xx + len - 1, yy + delta + 1);
+                gdk_cairo_set_source_color(cr, dark);   
+                cairo_move_to(cr, xx + 0.5, yy + delta + 0.5);
+                cairo_line_to(cr, xx + len - 0.5, yy + delta + 0.5);
+                cairo_stroke(cr);
+                gdk_cairo_set_source_color(cr, light);  
+                cairo_move_to(cr, xx + 0.5, yy + delta + 1.5);
+                cairo_line_to(cr, xx + len - 0.5, yy + delta + 1.5);
+                cairo_stroke(cr);
             }
         }
     }
 
-    gdk_gc_set_clip_rectangle(light_gc, NULL);
-    gdk_gc_set_clip_rectangle(dark_gc, NULL);
+    cairo_destroy(cr);
 }
 
 
@@ -341,33 +298,16 @@ static void xfce_draw_grip_slide (GtkStyle * style, GdkWindow * window, GtkState
 {
     gint xthick, ythick;
     gint gx, gy, gwidth, gheight;
-    GdkGC *light_gc, *dark_gc, *mid_gc, *bg_gc;
-    GdkRectangle dest;
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
-
-    light_gc = style->light_gc[state_type];
-    dark_gc = style->dark_gc[state_type];
-    mid_gc = style->mid_gc[state_type];
-    bg_gc = style->base_gc[GTK_STATE_SELECTED];
+    cairo_t *cr;
+    GdkColor *light, *dark, *mid, *bg;
 
     xthick = style->xthickness;
     ythick = style->ythickness;
 
-    dest.x = x + xthick;
-    dest.y = y + ythick;
-    dest.width = width - (xthick * 2);
-    dest.height = height - (ythick * 2);
-
-    gdk_gc_set_clip_rectangle(light_gc, &dest);
-    gdk_gc_set_clip_rectangle(dark_gc, &dest);
-    gdk_gc_set_clip_rectangle(mid_gc, &dest);
-    gdk_gc_set_clip_rectangle(bg_gc, &dest);
+    light = &style->light[state_type];
+    dark = &style->dark[state_type];
+    mid = &style->mid[state_type];
+    bg = &style->base[GTK_STATE_SELECTED];
 
     gx = gy = gwidth = gheight = 0;
 
@@ -388,35 +328,41 @@ static void xfce_draw_grip_slide (GtkStyle * style, GdkWindow * window, GtkState
         gheight = height - 2 * delta - 1;
     }
 
+    cr = ge_gdk_drawable_to_cairo(window, area);
+
     if ((gheight > 1) && (gwidth > 1))
     {
-        gdk_draw_rectangle(window, bg_gc, TRUE, gx, gy, gwidth, gheight);
-
-        gdk_draw_line(window, dark_gc, gx, gy, gx + gwidth, gy);
-        gdk_draw_line(window, dark_gc, gx, gy, gx, gy + gheight);
-
-        gdk_draw_line(window, light_gc, gx, gy + gheight, gx + gwidth, gy + gheight);
-        gdk_draw_line(window, light_gc, gx + gwidth, gy, gx + gwidth, gy + gheight);
-
-        gdk_draw_point(window, mid_gc, gx, gy);
-        gdk_draw_point(window, mid_gc, gx + gwidth, gy);
-        gdk_draw_point(window, mid_gc, gx, gy + gheight);
-        gdk_draw_point(window, mid_gc, gx + gwidth, gy + gheight);
+        gdk_cairo_set_source_color(cr, bg);     
+        cairo_rectangle(cr, gx + 1, gy + 1, gwidth - 1, gheight - 1);
+        cairo_fill(cr);
+
+        gdk_cairo_set_source_color(cr, dark);   
+        cairo_move_to(cr, gx + 0.5, gy + gheight + 0.5);
+        cairo_line_to(cr, gx + 0.5, gy + 0.5);
+        cairo_line_to(cr, gx + gwidth + 0.5, gy + 0.5);
+        cairo_stroke(cr);
+
+        gdk_cairo_set_source_color(cr, light);  
+        cairo_move_to(cr, gx + 0.5, gy + gheight + 0.5);
+        cairo_line_to(cr, gx + gwidth + 0.5, gy + gheight + 0.5);
+        cairo_line_to(cr, gx + gwidth + 0.5, gy + 0.5);
+        cairo_stroke(cr);
+
+        gdk_cairo_set_source_color(cr, mid);    
+        cairo_rectangle(cr, gx, gy, 1, 1);
+        cairo_rectangle(cr, gx + gwidth, gy, 1, 1);
+        cairo_rectangle(cr, gx, gy + gheight, 1, 1);
+        cairo_rectangle(cr, gx + gwidth, gy + gheight, 1, 1);
+        cairo_fill(cr);
     }
 
-    gdk_gc_set_clip_rectangle(light_gc, NULL);
-    gdk_gc_set_clip_rectangle(dark_gc, NULL);
-    gdk_gc_set_clip_rectangle(mid_gc, NULL);
-    gdk_gc_set_clip_rectangle(bg_gc, NULL);
+    cairo_destroy(cr);
 }
 
 static void xfce_draw_grips(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GdkRectangle * area, GtkWidget * widget, gint x, gint y, gint width, gint height, GtkOrientation orientation)
 {
     XfceRcStyle *rc_style;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
-
     rc_style = XFCE_RC_STYLE(style->rc_style);
 
     if (rc_style)
@@ -436,82 +382,81 @@ static void draw_hline(GtkStyle * style, GdkWindow * window, GtkStateType state_
 {
     gint thickness_light;
     gint thickness_dark;
-    gint i;
+    cairo_t *cr;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
+    CHECK_ARGS;
 
     thickness_light = style->ythickness / 2;
     thickness_dark = style->ythickness - thickness_light;
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(style->light_gc[state_type], area);
-        gdk_gc_set_clip_rectangle(style->dark_gc[state_type], area);
-    }
+    cr = ge_gdk_drawable_to_cairo(window, area);
 
-    for(i = 0; i < thickness_dark; i++)
-    {
-        gdk_draw_line(window, style->dark_gc[state_type], x2 - i - 1, y + i, x2, y + i);
-        gdk_draw_line(window, style->dark_gc[state_type], x1, y + i, x2 - i - 1, y + i);
-    }
+    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+
+    x2 += 1;
+
+    cairo_set_line_width (cr, thickness_dark);
+    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+    cairo_move_to(cr, x1, y + (thickness_dark / 2.0));
+    cairo_line_to(cr, x2, y + (thickness_dark / 2.0));
+    cairo_stroke(cr);
 
     y += thickness_dark;
-    for(i = 0; i < thickness_light; i++)
-    {
-        gdk_draw_line(window, style->light_gc[state_type], x1, y + i, x1 + thickness_light - i - 1, y + i);
-        gdk_draw_line(window, style->light_gc[state_type], x1 + thickness_light - i - 1, y + i, x2, y + i);
-    }
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(style->light_gc[state_type], NULL);
-        gdk_gc_set_clip_rectangle(style->dark_gc[state_type], NULL);
-    }
+    cairo_set_line_width (cr, thickness_light);
+    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+    cairo_move_to(cr, x1, y + (thickness_light / 2.0));
+    cairo_line_to(cr, x2, y + (thickness_light / 2.0));
+    cairo_stroke(cr);
+
+    cairo_destroy(cr);
 }
 
 static void draw_vline(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint y_1, gint y_2, gint x)
 {
     gint thickness_light;
     gint thickness_dark;
-    gint i;
+    cairo_t *cr;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
+    CHECK_ARGS;
 
     thickness_light = style->xthickness / 2;
     thickness_dark = style->xthickness - thickness_light;
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(style->light_gc[state_type], area);
-        gdk_gc_set_clip_rectangle(style->dark_gc[state_type], area);
-    }
-    for(i = 0; i < thickness_dark; i++)
-    {
-        gdk_draw_line(window, style->dark_gc[state_type], x + i, y_2 - i - 1, x + i, y_2);
-        gdk_draw_line(window, style->dark_gc[state_type], x + i, y_1, x + i, y_2 - i - 1);
-    }
+    cr = ge_gdk_drawable_to_cairo(window, area);
+
+    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
+
+    y_2 += 1;
+
+    cairo_set_line_width (cr, thickness_dark);
+    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+    cairo_move_to(cr, x + (thickness_dark / 2.0), y_1);
+    cairo_line_to(cr, x + (thickness_dark / 2.0), y_2);
+    cairo_stroke(cr);
 
     x += thickness_dark;
-    for(i = 0; i < thickness_light; i++)
-    {
-        gdk_draw_line(window, style->light_gc[state_type], x + i, y_1, x + i, y_1 + thickness_light - i);
-        gdk_draw_line(window, style->light_gc[state_type], x + i, y_1 + thickness_light - i, x + i, y_2);
-    }
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(style->light_gc[state_type], NULL);
-        gdk_gc_set_clip_rectangle(style->dark_gc[state_type], NULL);
-    }
+
+    cairo_set_line_width (cr, thickness_light);
+    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+    cairo_move_to(cr, x + (thickness_light / 2.0), y_1);
+    cairo_line_to(cr, x + (thickness_light / 2.0), y_2);
+    cairo_stroke(cr);
+
+    cairo_destroy(cr);
 }
 
 static void draw_shadow(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height)
 {
     gint xt, yt;
+    cairo_t *cr;
+
+    CHECK_ARGS;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
+    if (shadow_type == GTK_SHADOW_NONE)
+        return;
+
+    SANITIZE_SIZE;
 
     /* Spin buttons are a special case */
     if (widget && GTK_IS_SPIN_BUTTON (widget))
@@ -530,24 +475,7 @@ static void draw_shadow(GtkStyle * style, GdkWindow * window, GtkStateType state
         }
     }
 
-    if (shadow_type == GTK_SHADOW_NONE)
-        return;
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
-
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(style->light_gc[state_type], area);
-        gdk_gc_set_clip_rectangle(style->dark_gc[state_type], area);
-        gdk_gc_set_clip_rectangle(style->mid_gc[state_type], area);
-        gdk_gc_set_clip_rectangle(style->black_gc, area);
-        gdk_gc_set_clip_rectangle(style->bg_gc[state_type], area);
-    }
+    cr = ge_gdk_drawable_to_cairo(window, area);
 
     xt = MIN(style->xthickness, width - 1);
     yt = MIN(style->ythickness, height - 1);
@@ -559,49 +487,69 @@ static void draw_shadow(GtkStyle * style, GdkWindow * window, GtkStateType state
         case GTK_SHADOW_ETCHED_IN:
             if ((xt > 1) && (yt > 1))
             {
-                gdk_draw_line(window, style->light_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
-                gdk_draw_line(window, style->light_gc[state_type], x + width - 1, y, x + width - 1, y + height - 1);
-
-                gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 2, y);
-                gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 2);
-
-                gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + width - 2, y + 1);
-                gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + 1, y + height - 2);
-
-                gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 2, x + width - 2, y + height - 2);
-                gdk_draw_line(window, style->dark_gc[state_type], x + width - 2, y + 1, x + width - 2, y + height - 2);
+                gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                cairo_stroke(cr);
+
+                gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                cairo_move_to(cr, x + width - 1.5, y + 0.5);
+                cairo_line_to(cr, x + 0.5, y + 0.5);
+                cairo_line_to(cr, x + 0.5, y + height - 1.5);
+                cairo_stroke(cr);
+
+                gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                cairo_line_to(cr, x + 1.5, y + 1.5);
+                cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                cairo_stroke(cr);
+
+                gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                cairo_move_to(cr, x + 1.5, y + height - 1.5);
+                cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                cairo_stroke(cr);
             }
             else if ((xt > 0) && (yt > 0))
             {
-                gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
-                gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y, x + width - 1, y + height - 1);
-
-                gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
+                gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                cairo_rectangle(cr, x + 0.5, y + 0.5, width - 1, height - 1);
+                cairo_stroke(cr);
             }
             break;
         case GTK_SHADOW_ETCHED_OUT:
             if ((xt > 1) && (yt > 1))
             {
-                gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
-                gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y, x + width - 1, y + height - 1);
-
-                gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 2, y);
-                gdk_draw_line(window, style->light_gc[state_type], x, y, x, y + height - 2);
-
-                gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + 1, x + width - 2, y + 1);
-                gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + 1, x + 1, y + height - 2);
-
-                gdk_draw_line(window, style->light_gc[state_type], x + 1, y + height - 2, x + width - 2, y + height - 2);
-                gdk_draw_line(window, style->light_gc[state_type], x + width - 2, y + 1, x + width - 2, y + height - 2);
+                gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                cairo_stroke(cr);
+
+                gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                cairo_move_to(cr, x + width - 1.5, y + 0.5);
+                cairo_line_to(cr, x + 0.5, y + 0.5);
+                cairo_line_to(cr, x + 0.5, y + height - 1.5);
+                cairo_stroke(cr);
+
+                gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                cairo_line_to(cr, x + 1.5, y + 1.5);
+                cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                cairo_stroke(cr);
+
+                gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                cairo_move_to(cr, x + 1.5, y + height - 1.5);
+                cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                cairo_stroke(cr);
             }
             else if ((xt > 0) && (yt > 0))
             {
-                gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + width - 2, y + 1);
-                gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + 1, y + height - 2);
-
-                gdk_draw_line(window, style->light_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                gdk_draw_line(window, style->light_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                cairo_rectangle(cr, x + 0.5, y + 0.5, width - 1, height - 1);
+                cairo_stroke(cr);
             }
             break;
         case GTK_SHADOW_IN:
@@ -609,81 +557,120 @@ static void draw_shadow(GtkStyle * style, GdkWindow * window, GtkStateType state
             {
                 if (DETAIL("trough"))
                 {
-                    gdk_draw_line(window, style->bg_gc[GTK_STATE_NORMAL], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->bg_gc[GTK_STATE_NORMAL], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->bg_gc[GTK_STATE_NORMAL], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->bg_gc[GTK_STATE_NORMAL], x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x, y);
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x + width - 1, y);
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x, y + height - 1);
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->bg[GTK_STATE_NORMAL]);
+                    cairo_rectangle(cr, x + 0.5, y + 0.5, width - 1, height - 1);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->mid[GTK_STATE_NORMAL]);
+                    cairo_rectangle(cr, x, y, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y, 1, 1);
+                    cairo_rectangle(cr, x, y + height - 1, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y + height - 1, 1, 1);
+                    cairo_fill(cr);
                 }
                 else if ((xt > 1) && (yt > 1))
                 {
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 1, y, x + width - 2, y);
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y + 1, x, y + height - 2);
-
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 2, y + height - 1);
-                    gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 2);
-
-                    gdk_draw_line(window, style->mid_gc[state_type], x + 1, y + 1, x + width - 2, y + 1);
-                    gdk_draw_line(window, style->mid_gc[state_type], x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, style->light_gc[state_type], x + 2, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, style->light_gc[state_type], x + width - 2, y + 2, x + width - 2, y + height - 2);
-
-                    gdk_draw_point(window, style->mid_gc[state_type], x, y);
-                    gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y);
-                    gdk_draw_point(window, style->mid_gc[state_type], x, y + height - 1);
-                    gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + 1.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 0.5);
+                    cairo_move_to(cr, x + 0.5, y + 1.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 1.5);
+
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 0.5);
+                    cairo_move_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                    cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                    cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 2.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                    cairo_rectangle(cr, x, y, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y, 1, 1);
+                    cairo_rectangle(cr, x, y + height - 1, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y + height - 1, 1, 1);
+                    cairo_fill(cr);
                 }
                 else if ((xt > 0) && (yt > 0))
                 {
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 1, y, x + width - 1, y);
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y + 1, x, y + height - 1);
-
-                    gdk_draw_line(window, style->light_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->light_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                    gdk_draw_point(window, style->mid_gc[state_type], x, y);
-                    gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y);
-                    gdk_draw_point(window, style->mid_gc[state_type], x, y + height - 1);
-                    gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + 1.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_move_to(cr, x + 0.5, y + 1.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                    cairo_rectangle(cr, x, y, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y, 1, 1);
+                    cairo_rectangle(cr, x, y + height - 1, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y + height - 1, 1, 1);
+                    cairo_fill(cr);
                 }
             }
             else
             {
                 if (DETAIL("trough"))
                 {
-                    gdk_draw_line(window, style->dark_gc[GTK_STATE_ACTIVE], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->dark_gc[GTK_STATE_ACTIVE], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->dark_gc[GTK_STATE_ACTIVE], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->dark_gc[GTK_STATE_ACTIVE], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->dark[GTK_STATE_ACTIVE]);
+                    cairo_rectangle(cr, x + 0.5, y + 0.5, width - 1, height - 1);
+                    cairo_stroke(cr);
                 }
                 else if ((xt > 1) && (yt > 1))
                 {
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->light_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->light_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                    gdk_draw_line(window, style->black_gc, x + 1, y + 1, x + width - 2, y + 1);
-                    gdk_draw_line(window, style->black_gc, x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 2, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, style->dark_gc[state_type], x + width - 2, y + 2, x + width - 2, y + height - 2);
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->black);
+                    cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 2.5);
+                    cairo_stroke(cr);
                 }
                 else if ((xt > 0) && (yt > 0))
                 {
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->light_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->light_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_stroke(cr);
                 }
             }
             break;
@@ -696,137 +683,218 @@ static void draw_shadow(GtkStyle * style, GdkWindow * window, GtkStateType state
                 }
                 else if (DETAIL("bar"))
                 {
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x, y);
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x + width - 1, y);
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x, y + height - 1);
-                    gdk_draw_point(window, style->mid_gc[GTK_STATE_NORMAL], x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_rectangle(cr, x + 0.5, y + 0.5, width - 1, height - 1);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->mid[GTK_STATE_NORMAL]);
+                    cairo_rectangle(cr, x, y, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y, 1, 1);
+                    cairo_rectangle(cr, x, y + height - 1, 1, 1);
+                    cairo_rectangle(cr, x + width - 1, y + height - 1, 1, 1);
+                    cairo_fill(cr);
                 }
                 else if (DETAIL("menu"))
                 {
                     if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_rectangle(cr, x + 0.5, y + 0.5, width - 1, height - 1);
+                        cairo_stroke(cr);
                     }
                 }
                 else if (DETAIL("menubar"))
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->mid_gc[state_type], x , y + height - 2, x + width - 1, y + height - 2);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                 }
                 else if (DETAIL ("dockitem_bin") || DETAIL ("dockitem") || DETAIL ("toolbar"))
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->mid_gc[state_type], x , y + height - 2, x + width - 1, y + height - 2);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_move_to(cr, x + 0.5 , y + height - 1.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                 }
                 else if (DETAIL("vscrollbar") || DETAIL("hscrollbar") || DETAIL("bar") || DETAIL("slider") || DETAIL("vscale") || DETAIL("hscale"))
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                        gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + width - 3, y + 1);
-                        gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + 1, y + height - 3);
-
-                        gdk_draw_line(window, style->mid_gc[state_type], x + 1, y + height - 2, x + width - 2, y + height - 2);
-                        gdk_draw_line(window, style->mid_gc[state_type], x + width - 2, y + 1, x + width - 2, y + height - 2);
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + height - 0.5);
+
+                        cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + width - 2.5, y + 1.5);
+                        cairo_line_to(cr, x + 1.5, y + 1.5);
+                        cairo_line_to(cr, x + 1.5, y + height - 2.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                        cairo_stroke(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x, y + height - 1);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                        cairo_stroke(cr);
                     }
                 }
                 else if (DETAIL("menubar") || DETAIL("frame") || DETAIL("dockitem") || DETAIL("dockitem_bin") || DETAIL("menu") || DETAIL("toolbar"))
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 2, y);
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x, y + height - 2);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y, x + width - 1, y + height - 1);
-
-                        gdk_draw_line(window, style->bg_gc[state_type], x + 1, y + 1, x + width - 2, y + 1);
-                        gdk_draw_line(window, style->bg_gc[state_type], x + 1, y + 1, x + 1, y + height - 2);
-
-                        gdk_draw_line(window, style->bg_gc[state_type], x + 2, y + height - 2, x + width - 2, y + height - 2);
-                        gdk_draw_line(window, style->bg_gc[state_type], x + width - 2, y + 2, x + width - 2, y + height - 2);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + width - 1.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + height - 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->bg[state_type]);
+                        cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                        cairo_line_to(cr, x + 1.5, y + 1.5);
+                        cairo_line_to(cr, x + 1.5, y + height - 1.5);
+
+                        cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1.5, y + 2.5);
+                        cairo_stroke(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x, y + height - 1);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                        cairo_stroke(cr);
                     }
                 }
                 else
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y, x + width - 2, y);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + 1, x, y + height - 2);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 2, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 2);
-
-                        gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + width - 3, y + 1);
-                        gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + 1, y + height - 3);
-
-                        gdk_draw_line(window, style->mid_gc[state_type], x + 1, y + height - 2, x + width - 2, y + height - 2);
-                        gdk_draw_line(window, style->mid_gc[state_type], x + width - 2, y + 1, x + width - 2, y + height - 2);
-
-                        gdk_draw_point(window, style->mid_gc[state_type], x, y);
-                        gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y);
-                        gdk_draw_point(window, style->mid_gc[state_type], x, y + height - 1);
-                        gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + 0.5);
+                        cairo_line_to(cr, x + width - 1.5, y + 0.5);
+                        cairo_move_to(cr, x + 0.5, y + 1.5);
+                        cairo_line_to(cr, x + 0.5, y + height - 1.5);
+
+                        cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 1.5, y + height - 0.5);
+                        cairo_move_to(cr, x + width - 0.5, y + 1.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + width - 2.5, y + 1.5);
+                        cairo_line_to(cr, x + 1.5, y + 1.5);
+                        cairo_line_to(cr, x + 1.5, y + height - 2.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_rectangle(cr, x, y, 1, 1);
+                        cairo_rectangle(cr, x + width - 1, y, 1, 1);
+                        cairo_rectangle(cr, x, y + height - 1, 1, 1);
+                        cairo_rectangle(cr, x + width - 1, y + height - 1, 1, 1);
+                        cairo_fill(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x + 1, y, x + width - 1, y);
-                        gdk_draw_line(window, style->light_gc[state_type], x, y + 1, x, y + height - 1);
-
-                        gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                        gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                        gdk_draw_point(window, style->mid_gc[state_type], x, y);
-                        gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y);
-                        gdk_draw_point(window, style->mid_gc[state_type], x, y + height - 1);
-                        gdk_draw_point(window, style->mid_gc[state_type], x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_move_to(cr, x + 0.5, y + 1.5);
+                        cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_rectangle(cr, x, y, 1, 1);
+                        cairo_rectangle(cr, x + width - 1, y, 1, 1);
+                        cairo_rectangle(cr, x, y + height - 1, 1, 1);
+                        cairo_rectangle(cr, x + width - 1, y + height - 1, 1, 1);
+                        cairo_fill(cr);
                     }
                 }
             }
@@ -840,74 +908,107 @@ static void draw_shadow(GtkStyle * style, GdkWindow * window, GtkStateType state
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->mid_gc[state_type], x , y + height - 2, x + width - 1, y + height - 2);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                 }
                 else if (DETAIL ("dockitem_bin") || DETAIL ("dockitem") || DETAIL ("toolbar"))
                 {
                     if ((xt > 1) && (yt > 1))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->mid_gc[state_type], x , y + height - 2, x + width - 1, y + height - 2);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->mid[state_type]);
+                        cairo_move_to(cr, x + 0.5 , y + height - 1.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                     else if ((xt > 0) && (yt > 0))
                     {
-                        gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                        gdk_draw_line(window, style->dark_gc[state_type], x, y + height - 1, x + width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                        cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                 }
                 else if ((xt > 1) && (yt > 1))
                 {
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->dark_gc[state_type], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->black_gc, x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->black_gc, x + width - 1, y + 1, x + width - 1, y + height - 1);
-
-                    gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + width - 2, y + 1);
-                    gdk_draw_line(window, style->light_gc[state_type], x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 2, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, style->dark_gc[state_type], x + width - 2, y + 2, x + width - 2, y + height - 2);
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->black);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                    cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 2.5);
+                    cairo_stroke(cr);
                 }
                 else if ((xt > 0) && (yt > 0))
                 {
-                    gdk_draw_line(window, style->light_gc[state_type], x, y, x + width - 1, y);
-                    gdk_draw_line(window, style->light_gc[state_type], x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, style->dark_gc[state_type], x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, style->dark_gc[state_type], x + width - 1, y + 1, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, &style->light[state_type]);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, &style->dark[state_type]);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_stroke(cr);
                 }
             }
             break;
     }
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(style->light_gc[state_type], NULL);
-        gdk_gc_set_clip_rectangle(style->dark_gc[state_type], NULL);
-        gdk_gc_set_clip_rectangle(style->mid_gc[state_type], NULL);
-        gdk_gc_set_clip_rectangle(style->black_gc, NULL);
-        gdk_gc_set_clip_rectangle(style->bg_gc[state_type], NULL);
-    }
+
+    cairo_destroy(cr);
 }
 
 static void draw_box(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height)
 {
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
+    CHECK_ARGS;
+    SANITIZE_SIZE;
 
     if (!style->bg_pixmap[state_type])
     {
@@ -920,60 +1021,33 @@ static void draw_box(GtkStyle * style, GdkWindow * window, GtkStateType state_ty
     draw_shadow(style, window, state_type, shadow_type, area, widget, detail, x, y, width, height);
 }
 
-static GdkBitmap *get_part_bmap (GdkDrawable *drawable, Part part)
+static cairo_surface_t *get_part_bmap (Part part)
 {
-#if GTK_CHECK_VERSION(2, 2, 0)
-    GdkScreen *screen = gdk_drawable_get_screen (drawable);
-    GdkBitmap *bitmap;
-    GList *tmp_list;
-
-    tmp_list = parts[part].bmap_list;
-    while (tmp_list)
-    {
-        bitmap = tmp_list->data;
-        if (gdk_drawable_get_screen (bitmap) == screen)
-        {
-            return bitmap;
-        }
-        tmp_list = tmp_list->next;
-    }
-
-    bitmap = gdk_bitmap_create_from_data (drawable, (gchar *)parts[part].bits, PART_SIZE, PART_SIZE);
-    parts[part].bmap_list = g_list_prepend (parts[part].bmap_list, bitmap);
-
-    return bitmap;
-#else
     if (!parts[part].bmap)
     {
-        parts[part].bmap = gdk_bitmap_create_from_data(drawable, parts[part].bits, PART_SIZE, PART_SIZE);
+        parts[part].bmap = cairo_image_surface_create_for_data((guchar*)parts[part].bits, CAIRO_FORMAT_A1, PART_SIZE, PART_SIZE, sizeof(guint32));
     }
     return parts[part].bmap;
-#endif
 }
 
-static void draw_part(GdkDrawable * drawable, GdkGC * gc, GdkRectangle * area, gint x, gint y, Part part)
+static void draw_part(GdkDrawable * drawable, GdkColor * c, GdkRectangle * area, gint x, gint y, Part part)
 {
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(gc, area);
-    }
+    cairo_t *cr;
 
-    gdk_gc_set_ts_origin(gc, x, y);
-    gdk_gc_set_stipple(gc, get_part_bmap (drawable, part));
-    gdk_gc_set_fill(gc, GDK_STIPPLED);
+    cr = ge_gdk_drawable_to_cairo(drawable, area);
 
-    gdk_draw_rectangle(drawable, gc, TRUE, x, y, PART_SIZE, PART_SIZE);
+    gdk_cairo_set_source_color(cr, c);
 
-    gdk_gc_set_fill(gc, GDK_SOLID);
+    cairo_mask_surface(cr, get_part_bmap (part), x, y);
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(gc, NULL);
-    }
+    cairo_destroy(cr);
 }
 
 static void draw_check(GtkStyle * style, GdkWindow * window, GtkStateType state, GtkShadowType shadow, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height)
 {
+    CHECK_ARGS;
+    SANITIZE_SIZE;
+
     x -= (1 + PART_SIZE - width) / 2;
     y -= (1 + PART_SIZE - height) / 2;
 
@@ -982,37 +1056,40 @@ static void draw_check(GtkStyle * style, GdkWindow * window, GtkStateType state,
 #if 0
         draw_part(window, style->bg_gc[state], area, x, y, CHECK_BASE);
 #endif
-        draw_part(window, style->dark_gc[state], area, x, y, CHECK_LIGHT);
-        draw_part(window, style->dark_gc[state], area, x, y, CHECK_DARK);
+        draw_part(window, &style->dark[state], area, x, y, CHECK_LIGHT);
+        draw_part(window, &style->dark[state], area, x, y, CHECK_DARK);
 
         if (shadow == GTK_SHADOW_IN)
         {
-            draw_part(window, style->fg_gc[state], area, x, y, CHECK_CROSS);
+            draw_part(window, &style->fg[state], area, x, y, CHECK_CROSS);
         }
         else if (shadow == GTK_SHADOW_ETCHED_IN)
         {
-            draw_part(window, style->fg_gc[state], area, x, y, CHECK_DASH);
+            draw_part(window, &style->fg[state], area, x, y, CHECK_DASH);
         }
     }
     else
     {
-        draw_part(window, style->base_gc[state], area, x, y, CHECK_BASE);
-        draw_part(window, style->dark_gc[state], area, x, y, CHECK_LIGHT);
-        draw_part(window, style->dark_gc[state], area, x, y, CHECK_DARK);
+        draw_part(window, &style->base[state], area, x, y, CHECK_BASE);
+        draw_part(window, &style->dark[state], area, x, y, CHECK_LIGHT);
+        draw_part(window, &style->dark[state], area, x, y, CHECK_DARK);
 
         if (shadow == GTK_SHADOW_IN)
         {
-            draw_part(window, style->text_gc[state], area, x, y, CHECK_CROSS);
+            draw_part(window, &style->text[state], area, x, y, CHECK_CROSS);
         }
         else if (shadow == GTK_SHADOW_ETCHED_IN)
         {
-            draw_part(window, style->fg_gc[state], area, x, y, CHECK_DASH);
+            draw_part(window, &style->fg[state], area, x, y, CHECK_DASH);
         }
     }
 }
 
 static void draw_option(GtkStyle * style, GdkWindow * window, GtkStateType state, GtkShadowType shadow, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height)
 {
+    CHECK_ARGS;
+    SANITIZE_SIZE;
+
     x -= (1 + PART_SIZE - width) / 2;
     y -= (1 + PART_SIZE - height) / 2;
 
@@ -1021,23 +1098,23 @@ static void draw_option(GtkStyle * style, GdkWindow * window, GtkStateType state
 #if 0
         draw_part(window, style->bg_gc[state], area, x, y, RADIO_BASE);
 #endif
-        draw_part(window, style->dark_gc[state], area, x, y, RADIO_LIGHT);
-        draw_part(window, style->dark_gc[state], area, x, y, RADIO_DARK);
+        draw_part(window, &style->dark[state], area, x, y, RADIO_LIGHT);
+        draw_part(window, &style->dark[state], area, x, y, RADIO_DARK);
 
         if (shadow == GTK_SHADOW_IN)
         {
-            draw_part(window, style->fg_gc[state], area, x, y, RADIO_TEXT);
+            draw_part(window, &style->fg[state], area, x, y, RADIO_TEXT);
         }
     }
     else
     {
-        draw_part(window, style->base_gc[state], area, x, y, RADIO_BASE);
-        draw_part(window, style->dark_gc[state], area, x, y, RADIO_LIGHT);
-        draw_part(window, style->dark_gc[state], area, x, y, RADIO_DARK);
+        draw_part(window, &style->base[state], area, x, y, RADIO_BASE);
+        draw_part(window, &style->dark[state], area, x, y, RADIO_LIGHT);
+        draw_part(window, &style->dark[state], area, x, y, RADIO_DARK);
 
         if (shadow == GTK_SHADOW_IN)
         {
-            draw_part(window, style->text_gc[state], area, x, y, RADIO_TEXT);
+            draw_part(window, &style->text[state], area, x, y, RADIO_TEXT);
         }
     }
 }
@@ -1046,12 +1123,13 @@ static void draw_shadow_gap(GtkStyle * style, GdkWindow * window, GtkStateType s
 {
     GdkRectangle rect;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
+    CHECK_ARGS;
 
     if (shadow_type == GTK_SHADOW_NONE)
         return;
 
+    SANITIZE_SIZE;
+
     draw_shadow(style, window, state_type, shadow_type, area, widget, detail, x, y, width, height);
 
     switch (gap_side)
@@ -1087,45 +1165,33 @@ static void draw_shadow_gap(GtkStyle * style, GdkWindow * window, GtkStateType s
 
 static void draw_box_gap(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height, GtkPositionType gap_side, gint gap_x, gint gap_width)
 {
-    GdkGC *gc1 = NULL;
-    GdkGC *gc2 = NULL;
-    GdkGC *gc3 = NULL;
-    GdkGC *gc4 = NULL;
+    GdkColor *c1;
+    GdkColor *c2;
+    GdkColor *c3;
+    GdkColor *c4;
+    cairo_t *cr;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
+    CHECK_ARGS;
+    SANITIZE_SIZE;
 
     gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x, y, width, height);
 
-    if (width == -1 && height == -1)
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
-
     if (XFCE_RC_STYLE(style->rc_style)->smooth_edge)
     {
-        gc1 = style->dark_gc[state_type];
-        gc2 = style->bg_gc[state_type];
-        gc3 = style->bg_gc[state_type];
-        gc4 = style->dark_gc[state_type];
+        c1 = &style->dark[state_type];
+        c2 = &style->bg[state_type];
+        c3 = &style->bg[state_type];
+        c4 = &style->dark[state_type];
     }
     else
     {
-        gc1 = style->dark_gc[state_type];
-        gc2 = style->light_gc[state_type];
-        gc3 = style->dark_gc[state_type];
-        gc4 = style->black_gc;
+        c1 = &style->dark[state_type];
+        c2 = &style->light[state_type];
+        c3 = &style->dark[state_type];
+        c4 = &style->black;
     }
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(gc1, area);
-        gdk_gc_set_clip_rectangle(gc2, area);
-        gdk_gc_set_clip_rectangle(gc3, area);
-        gdk_gc_set_clip_rectangle(gc4, area);
-    }
+    cr = ge_gdk_drawable_to_cairo(window, area);
 
     switch (shadow_type)
     {
@@ -1137,146 +1203,262 @@ static void draw_box_gap(GtkStyle * style, GdkWindow * window, GtkStateType stat
             switch (gap_side)
             {
                 case GTK_POS_TOP:
-                    gdk_draw_line(window, gc1, x, y, x, y + height - 1);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, gc3, x + 2, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, gc3, x + width - 2, y, x + width - 2, y + height - 2);
-
-                    gdk_draw_line(window, gc4, x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, gc4, x + width - 1, y, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_stroke(cr);
+
+                    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
                     if (gap_x > 0)
                     {
-                        gdk_draw_line(window, gc1, x, y, x + gap_x - 1, y);
-                        gdk_draw_line(window, gc2, x + 1, y + 1, x + gap_x - 1, y + 1);
-                        gdk_draw_line(window, gc2, x + gap_x, y, x + gap_x, y);
+                        gdk_cairo_set_source_color(cr, c1);
+                        cairo_move_to(cr, x, y + 0.5);
+                        cairo_line_to(cr, x + gap_x, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c2);
+                        cairo_move_to(cr, x + 1, y + 1.5);
+                        cairo_line_to(cr, x + gap_x, y + 1.5);
+                        cairo_stroke(cr);
+
+                        cairo_rectangle(cr, x + gap_x, y + 0.5, 1, 1);
+                        cairo_move_to(cr, x + gap_x, y);
+                        cairo_line_to(cr, x + gap_x + 1, y + 0.5);
+                        cairo_fill(cr);
                     }
                     if ((width - (gap_x + gap_width)) > 0)
                     {
-                        gdk_draw_line(window, gc1, x + gap_x + gap_width, y, x + width - 2, y);
-                        gdk_draw_line(window, gc2, x + gap_x + gap_width, y + 1, x + width - 2, y + 1);
-                        gdk_draw_line(window, gc2, x + gap_x + gap_width - 1, y, x + gap_x + gap_width - 1, y);
+                        gdk_cairo_set_source_color(cr, c1);
+                        cairo_move_to(cr, x + gap_x + gap_width, y + 0.5);
+                        cairo_line_to(cr, x + width - 1, y + 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c2);
+                        cairo_move_to(cr, x + gap_x + gap_width, y + 1.5);
+                        cairo_line_to(cr, x + width - 1, y + 1.5);
+
+                        cairo_move_to(cr, x + gap_x + gap_width - 1, y + 0.5);
+                        cairo_line_to(cr, x + gap_x + gap_width, y + 0.5);
+                        cairo_stroke(cr);
                     }
                     break;
                 case GTK_POS_BOTTOM:
-                    gdk_draw_line(window, gc1, x, y, x + width - 1, y);
-                    gdk_draw_line(window, gc1, x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + width - 2, y + 1);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + height - 1);
-
-                    gdk_draw_line(window, gc3, x + width - 2, y + 1, x + width - 2, y + height - 1);
-                    gdk_draw_line(window, gc4, x + width - 1, y, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
                     if (gap_x > 0)
                     {
-                        gdk_draw_line(window, gc4, x, y + height - 1, x + gap_x - 1, y + height - 1);
-                        gdk_draw_line(window, gc3, x + 1, y + height - 2, x + gap_x - 1, y + height - 2);
-                        gdk_draw_line(window, gc3, x + gap_x, y + height - 1, x + gap_x, y + height - 1);
+                        gdk_cairo_set_source_color(cr, c4);
+                        cairo_move_to(cr, x, y + height - 0.5);
+                        cairo_line_to(cr, x + gap_x, y + height - 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c3);
+                        cairo_move_to(cr, x + 1, y + height - 1.5);
+                        cairo_line_to(cr, x + gap_x, y + height - 1.5);
+
+                        cairo_move_to(cr, x + gap_x, y + height - 0.5);
+                        cairo_line_to(cr, x + gap_x + 1, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                     if ((width - (gap_x + gap_width)) > 0)
                     {
-                        gdk_draw_line(window, gc4, x + gap_x + gap_width, y + height - 1, x + width - 2, y + height - 1);
-                        gdk_draw_line(window, gc3, x + gap_x + gap_width, y + height - 2, x + width - 2, y + height - 2);
-                        gdk_draw_line(window, gc3, x + gap_x + gap_width - 1, y + height - 1, x + gap_x + gap_width - 1, y + height - 1);
+                        gdk_cairo_set_source_color(cr, c4);
+                        cairo_move_to(cr, x + gap_x + gap_width, y + height - 0.5);
+                        cairo_line_to(cr, x + width - 1, y + height - 0.5);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c3);
+                        cairo_move_to(cr, x + gap_x + gap_width, y + height - 1.5);
+                        cairo_line_to(cr, x + width - 1, y + height - 1.5);
+
+                        cairo_move_to(cr, x + gap_x + gap_width - 1, y + height - 0.5);
+                        cairo_line_to(cr, x + gap_x + gap_width, y + height - 0.5);
+                        cairo_stroke(cr);
                     }
                     break;
                 case GTK_POS_LEFT:
-                    gdk_draw_line(window, gc1, x, y, x + width - 1, y);
-                    gdk_draw_line(window, gc2, x, y + 1, x + width - 2, y + 1);
-
-                    gdk_draw_line(window, gc3, x, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, gc3, x + width - 2, y + 1, x + width - 2, y + height - 2);
-
-                    gdk_draw_line(window, gc4, x + 1, y + height - 1, x + width - 1, y + height - 1);
-                    gdk_draw_line(window, gc4, x + width - 1, y, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + 0.5, y + 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + 0.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_stroke(cr);
+
+                    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
                     if (gap_x > 0)
                     {
-                        gdk_draw_line(window, gc1, x, y, x, y + gap_x - 1);
-                        gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + gap_x - 1);
-                        gdk_draw_line(window, gc2, x, y + gap_x, x, y + gap_x);
+                        gdk_cairo_set_source_color(cr, c1);
+                        cairo_move_to(cr, x + 0.5, y);
+                        cairo_line_to(cr, x + 0.5, y + gap_x);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c2);
+                        cairo_move_to(cr, x + 1.5, y + 1);
+                        cairo_line_to(cr, x + 1.5, y + gap_x);
+
+                        cairo_move_to(cr, x + 0.5, y + gap_x);
+                        cairo_line_to(cr, x + 0.5, y + gap_x + 1);
+                        cairo_stroke(cr);
                     }
                     if ((width - (gap_x + gap_width)) > 0)
                     {
-                        gdk_draw_line(window, gc1, x, y + gap_x + gap_width, x, y + height - 2);
-                        gdk_draw_line(window, gc2, x + 1, y + gap_x + gap_width, x + 1, y + height - 2);
-                        gdk_draw_line(window, gc2, x, y + gap_x + gap_width - 1, x, y + gap_x + gap_width - 1);
+                        gdk_cairo_set_source_color(cr, c1);
+                        cairo_move_to(cr, x + 0.5, y + gap_x + gap_width);
+                        cairo_line_to(cr, x + 0.5, y + height - 1);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c2);
+                        cairo_move_to(cr, x + 1.5, y + gap_x + gap_width);
+                        cairo_line_to(cr, x + 1.5, y + height - 1);
+
+                        cairo_move_to(cr, x + 0.5, y + gap_x + gap_width - 1);
+                        cairo_line_to(cr, x + 0.5, y + gap_x + gap_width);
+                        cairo_stroke(cr);
                     }
                     break;
                 case GTK_POS_RIGHT:
-                    gdk_draw_line(window, gc1, x, y, x + width - 1, y);
-                    gdk_draw_line(window, gc1, x, y, x, y + height - 1);
-
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + width - 1, y + 1);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, gc3, x + 1, y + height - 2, x + width - 1, y + height - 2);
-                    gdk_draw_line(window, gc4, x + 1, y + height - 1, x + width - 1, y + height - 1);
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT);
                     if (gap_x > 0)
                     {
-                        gdk_draw_line(window, gc4, x + width - 1, y, x + width - 1, y + gap_x - 1);
-                        gdk_draw_line(window, gc3, x + width - 2, y + 1, x + width - 2, y + gap_x - 1);
-                        gdk_draw_line(window, gc3, x + width - 1, y + gap_x, x + width - 1, y + gap_x);
+                        gdk_cairo_set_source_color(cr, c4);
+                        cairo_move_to(cr, x + width - 0.5, y);
+                        cairo_line_to(cr, x + width - 0.5, y + gap_x);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c3);
+                        cairo_move_to(cr, x + width - 1.5, y + 1);
+                        cairo_line_to(cr, x + width - 1.5, y + gap_x);
+
+                        cairo_move_to(cr, x + width - 0.5, y + gap_x);
+                        cairo_line_to(cr, x + width - 0.5, y + gap_x + 1);
+                        cairo_stroke(cr);
                     }
                     if ((width - (gap_x + gap_width)) > 0)
                     {
-                        gdk_draw_line(window, gc4, x + width - 1, y + gap_x + gap_width, x + width - 1, y + height - 2);
-                        gdk_draw_line(window, gc3, x + width - 2, y + gap_x + gap_width, x + width - 2, y + height - 2);
-                        gdk_draw_line(window, gc3, x + width - 1, y + gap_x + gap_width - 1, x + width - 1, y + gap_x + gap_width - 1);
+                        gdk_cairo_set_source_color(cr, c4);
+                        cairo_move_to(cr, x + width - 0.5, y + gap_x + gap_width);
+                        cairo_line_to(cr, x + width - 0.5, y + height - 1);
+                        cairo_stroke(cr);
+
+                        gdk_cairo_set_source_color(cr, c3);
+                        cairo_move_to(cr, x + width - 1.5, y + gap_x + gap_width);
+                        cairo_line_to(cr, x + width - 1.5, y + height - 1);
+
+                        cairo_move_to(cr, x + width - 0.5, y + gap_x + gap_width - 1);
+                        cairo_line_to(cr, x + width - 0.5, y + gap_x + gap_width);
+                        cairo_stroke(cr);
                     }
                     break;
             }
     }
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(gc1, NULL);
-        gdk_gc_set_clip_rectangle(gc2, NULL);
-        gdk_gc_set_clip_rectangle(gc3, NULL);
-        gdk_gc_set_clip_rectangle(gc4, NULL);
-    }
+    cairo_destroy(cr);
 }
 
 static void draw_extension(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height, GtkPositionType gap_side)
 {
-    GdkGC *gc1 = NULL;
-    GdkGC *gc2 = NULL;
-    GdkGC *gc3 = NULL;
-    GdkGC *gc4 = NULL;
+    GdkColor *c1;
+    GdkColor *c2;
+    GdkColor *c3;
+    GdkColor *c4;
+    cairo_t *cr;
 
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
+    CHECK_ARGS;
+    SANITIZE_SIZE;
 
     gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), GTK_STATE_NORMAL, area, x, y, width, height);
 
-    if (width == -1 && height == -1)
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
-
     if (XFCE_RC_STYLE(style->rc_style)->smooth_edge)
     {
-        gc1 = style->dark_gc[state_type];
-        gc2 = style->bg_gc[state_type];
-        gc3 = style->bg_gc[state_type];
-        gc4 = style->dark_gc[state_type];
+        c1 = &style->dark[state_type];
+        c2 = &style->bg[state_type];
+        c3 = &style->bg[state_type];
+        c4 = &style->dark[state_type];
     }
     else
     {
-        gc1 = style->dark_gc[state_type];
-        gc2 = style->light_gc[state_type];
-        gc3 = style->dark_gc[state_type];
-        gc4 = style->black_gc;
+        c1 = &style->dark[state_type];
+        c2 = &style->light[state_type];
+        c3 = &style->dark[state_type];
+        c4 = &style->black;
     }
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(gc1, area);
-        gdk_gc_set_clip_rectangle(gc2, area);
-        gdk_gc_set_clip_rectangle(gc3, area);
-        gdk_gc_set_clip_rectangle(gc4, area);
-    }
+    cr = ge_gdk_drawable_to_cairo(window, area);
 
     switch (shadow_type)
     {
@@ -1288,59 +1470,119 @@ static void draw_extension(GtkStyle * style, GdkWindow * window, GtkStateType st
             switch (gap_side)
             {
                 case GTK_POS_TOP:
-                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x + 1, y, width - 2, height - 1);
-                    gdk_draw_line(window, gc1, x, y, x, y + height - 2);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, gc3, x + 2, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, gc3, x + width - 2, y, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, gc4, x + 1, y + height - 1, x + width - 2, y + height - 1);
-                    gdk_draw_line(window, gc4, x + width - 1, y, x + width - 1, y + height - 2);
+                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x + 2, y, width - 4, height - 2);
+
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 0.5);
+                    cairo_move_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
                     break;
                 case GTK_POS_BOTTOM:
-                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x + style->xthickness, y + style->ythickness, width - (2 * style->xthickness), height - (style->ythickness));
-                    gdk_draw_line(window, gc1, x + 1, y, x + width - 2, y);
-                    gdk_draw_line(window, gc1, x, y + 1, x, y + height - 1);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + width - 2, y + 1);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + height - 1);
-
-                    gdk_draw_line(window, gc3, x + width - 2, y + 2, x + width - 2, y + height - 1);
-                    gdk_draw_line(window, gc4, x + width - 1, y + 1, x + width - 1, y + height - 1);
+                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x + 2, y + 2, width - 4, height - 2);
+
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + 1.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 0.5);
+                    cairo_move_to(cr, x + 0.5, y + 1.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + width - 1.5, y + 2.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
                     break;
                 case GTK_POS_LEFT:
-                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x, y + style->ythickness, width - (style->xthickness), height - (2 * style->ythickness));
-                    gdk_draw_line(window, gc1, x, y, x + width - 2, y);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + width - 2, y + 1);
-
-                    gdk_draw_line(window, gc3, x, y + height - 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, gc3, x + width - 2, y + 2, x + width - 2, y + height - 2);
-                    gdk_draw_line(window, gc4, x, y + height - 1, x + width - 2, y + height - 1);
-                    gdk_draw_line(window, gc4, x + width - 1, y + 1, x + width - 1, y + height - 2);
+                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x, y + 2, width - 2, height - 4);
+
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + 0.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 0.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + 0.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 1.5, y + 2.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + 0.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 1.5, y + height - 0.5);
+                    cairo_move_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
                     break;
                 case GTK_POS_RIGHT:
-                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x + style->xthickness, y + style->ythickness, width - (style->xthickness), height - (2 * style->ythickness));
-                    gdk_draw_line(window, gc1, x + 1, y, x + width - 1, y);
-                    gdk_draw_line(window, gc1, x, y + 1, x, y + height - 2);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + width - 1, y + 1);
-                    gdk_draw_line(window, gc2, x + 1, y + 1, x + 1, y + height - 2);
-
-                    gdk_draw_line(window, gc3, x + 2, y + height - 2, x + width - 1, y + height - 2);
-                    gdk_draw_line(window, gc4, x + 1, y + height - 1, x + width - 1, y + height - 1);
+                    gtk_style_apply_default_background(style, window, widget && !GTK_WIDGET_NO_WINDOW(widget), state_type, area, x + 2, y + 2, width - 2, height - 4);
+
+                    gdk_cairo_set_source_color(cr, c1);
+                    cairo_move_to(cr, x + 1.5, y + 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + 0.5);
+                    cairo_move_to(cr, x + 0.5, y + 1.5);
+                    cairo_line_to(cr, x + 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c2);
+                    cairo_move_to(cr, x + width - 0.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + 1.5);
+                    cairo_line_to(cr, x + 1.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c3);
+                    cairo_move_to(cr, x + 2.5, y + height - 1.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 1.5);
+                    cairo_stroke(cr);
+
+                    gdk_cairo_set_source_color(cr, c4);
+                    cairo_move_to(cr, x + 1.5, y + height - 0.5);
+                    cairo_line_to(cr, x + width - 0.5, y + height - 0.5);
+                    cairo_stroke(cr);
                     break;
             }
     }
 
-    if (area)
-    {
-        gdk_gc_set_clip_rectangle(gc1, NULL);
-        gdk_gc_set_clip_rectangle(gc2, NULL);
-        gdk_gc_set_clip_rectangle(gc3, NULL);
-        gdk_gc_set_clip_rectangle(gc4, NULL);
-    }
+    cairo_destroy(cr);
 }
 
 static void draw_focus(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height)
 {
+    CHECK_ARGS;
+
     /* Spin buttons are a special case */
     if (widget && GTK_IS_SPIN_BUTTON (widget))
     {
@@ -1362,15 +1604,8 @@ static void draw_focus(GtkStyle * style, GdkWindow * window, GtkStateType state_
 
 static void draw_slider(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height, GtkOrientation orientation)
 {
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
+    CHECK_ARGS;
+    SANITIZE_SIZE;
 
     orientation = GTK_ORIENTATION_HORIZONTAL;
     if (height > width)
@@ -1382,15 +1617,8 @@ static void draw_slider(GtkStyle * style, GdkWindow * window, GtkStateType state
 
 static void draw_handle(GtkStyle * style, GdkWindow * window, GtkStateType state_type, GtkShadowType shadow_type, GdkRectangle * area, GtkWidget * widget, const gchar * detail, gint x, gint y, gint width, gint height, GtkOrientation orientation)
 {
-    g_return_if_fail(style != NULL);
-    g_return_if_fail(window != NULL);
-
-    if ((width == -1) && (height == -1))
-        gdk_drawable_get_size(window, &width, &height);
-    else if (width == -1)
-        gdk_drawable_get_size(window, &width, NULL);
-    else if (height == -1)
-        gdk_drawable_get_size(window, NULL, &height);
+    CHECK_ARGS;
+    SANITIZE_SIZE;
 
     orientation = GTK_ORIENTATION_HORIZONTAL;
     if (height > width)



More information about the Xfce4-commits mailing list