diff options
author | Peter de Ridder <peter@xfce.org> | 2011-04-15 21:02:25 +0200 |
---|---|---|
committer | Peter de Ridder <peter@xfce.org> | 2011-04-15 21:02:25 +0200 |
commit | f272406bd900b5d3f5ef91a258fe01705dc70ef9 (patch) | |
tree | f2666abbda9d7db4d1328aadb92ab65283e78132 | |
parent | 7aabfb06eca7731ac5e6c318ae1f7055a3622d0b (diff) | |
download | gtk-xfce-engine-f272406bd900b5d3f5ef91a258fe01705dc70ef9.tar.gz |
Rewritten drawing routines to use cairo
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/cairo-support.c | 54 | ||||
-rw-r--r-- | src/cairo-support.h | 34 | ||||
-rw-r--r-- | src/ge-support.h | 32 | ||||
-rw-r--r-- | src/general-support.h | 50 | ||||
-rw-r--r-- | src/gradient_draw.c | 114 | ||||
-rw-r--r-- | src/gradient_draw.h | 9 | ||||
-rw-r--r-- | 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@earthlink.net> + * Copyright (C) 2006 Thomas Wood <thos@gnome.org> + * Copyright (C) 2006-2007 Benjamin Berg <benjamin@sipsolutions.net> + * Copyright (C) 2007 Andrea Cimitan <andrea.cimitan@gmail.com> + * Copyright (C) 2011 Peter de Ridder <peter@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@earthlink.net> + * Written by Benjamin Berg <benjamin@sipsolutions.net> + * Written by Thomas Wood <thos@gnome.org> + * modified by Andrea Cimitan <andrea.cimitan@gmail.com> + * modified by Peter de Ridder <peter@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@earthlink.net> + * Copyright (C) 2006 Thomas Wood <thos@gnome.org> + * Copyright (C) 2006-2007 Benjamin Berg <benjamin@sipsolutions.net> + * Copyright (C) 2007 Andrea Cimitan <andrea.cimitan@gmail.com> + * Copyright (C) 2011 Peter de Ridder <peter@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@earthlink.net> + * Written by Benjamin Berg <benjamin@sipsolutions.net> + * Written by Thomas Wood <thos@gnome.org> + * modified by Andrea Cimitan <andrea.cimitan@gmail.com> + * modified by Peter de Ridder <peter@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@sipsolutions.net> + * Copyright (C) 2011 Peter de Ridder <peter@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@sipsolutions.net> + * modified by Peter de Ridder <peter@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@earthlink.net> + * Copyright (C) 2006-2007 Benjamin Berg <benjamin@sipsolutions.net> + * Copyright (C) 2011 Peter de Ridder <peter@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@earthlink.net> + * Written by Benjamin Berg <benjamin@sipsolutions.net> + * modified by Peter de Ridder <peter@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@xfce.org) + * Copyright (C) 2011 Peter de Ridder <peter@xfce.org> * * Portions based Thinice port by * Tim Gerla <timg@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@xfce.org) + * Copyright (C) 2011 Peter de Ridder <peter@xfce.org> * * Portions based Thinice port by * Tim Gerla <timg@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) |