- gdk_draw_rectangle (drawable,
- highlight ?
- widget->style->text_gc[widget->state] : widget->style->dark_gc[widget->state],
- TRUE,
- area->x,
- area->y,
- area->width,
- area->height);
- gdk_draw_rectangle (drawable,
- widget->style->white_gc,
- TRUE,
- area->x + border->left,
- area->y + border->top,
- area->width - (border->left + border->right),
- area->height - (border->top + border->bottom));
- gdk_draw_rectangle (drawable,
- widget->style->mid_gc[widget->state],
- TRUE,
- area->x,
- area->y + area->height - (border->bottom - border->top),
- border->bottom - border->top,
- border->bottom - border->top);
- gdk_draw_rectangle (drawable,
- widget->style->mid_gc[widget->state],
- TRUE,
- area->x + area->width - (border->right - border->left),
- area->y,
- border->right - border->left,
- border->right - border->left);
-
+ GtkStyleContext *context = gtk_widget_get_style_context (widget);
+ GtkStateFlags state = gtk_widget_get_state_flags (widget);
+ GdkRGBA fg, bg, shade_bg;
+ GtkSymbolicColor *c1, *c2;
+
+ gtk_style_context_get_background_color (context, state, &bg);
+ gtk_style_context_get_color (context, state, &fg);
+
+ // FIXME: should we cache the shade_bg?
+ c1 = gtk_symbolic_color_new_literal (&bg);
+ c2 = gtk_symbolic_color_new_shade (c1, 0.7);
+ gtk_symbolic_color_resolve (c2, NULL, &shade_bg);
+ gtk_symbolic_color_unref (c1);
+ gtk_symbolic_color_unref (c2);
+
+ gdk_cairo_set_source_rgba (cr, highlight ? &fg : &shade_bg);
+ gdk_cairo_rectangle (cr, area);
+ cairo_fill (cr);
+
+ if (inverted_colors)
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ else
+ cairo_set_source_rgb (cr, 1, 1, 1);
+ cairo_rectangle (cr,
+ area->x + border->left,
+ area->y + border->top,
+ area->width - (border->left + border->right),
+ area->height - (border->top + border->bottom));
+ cairo_fill (cr);
+
+ gdk_cairo_set_source_rgba (cr, &bg);
+ cairo_rectangle (cr,
+ area->x,
+ area->y + area->height - (border->bottom - border->top),
+ border->bottom - border->top,
+ border->bottom - border->top);
+ cairo_fill (cr);
+
+ cairo_rectangle (cr,
+ area->x + area->width - (border->right - border->left),
+ area->y,
+ border->right - border->left,
+ border->right - border->left);
+ cairo_fill (cr);