From b42b47e7d37411d7410113aa8156146d35dfde43 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 24 Jan 2011 00:24:12 -0500 Subject: [PATCH] Port gtk_draw_insertion_cursor to GtkStyleContext --- gtk/gtkentry.c | 1 + gtk/gtkstyle.c | 131 +++++++++++++++-------------------------- gtk/gtkstyle.h | 3 - gtk/gtktextdisplay.c | 2 + gtk/gtkwidgetprivate.h | 23 ++++---- 5 files changed, 63 insertions(+), 97 deletions(-) diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 43c13940a3..38dbe9d1a7 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -65,6 +65,7 @@ #include "gtktooltip.h" #include "gtkiconfactory.h" #include "gtkicontheme.h" +#include "gtkwidgetprivate.h" /** diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c index 954cfacd57..bf3a711533 100644 --- a/gtk/gtkstyle.c +++ b/gtk/gtkstyle.c @@ -3971,102 +3971,58 @@ gtk_paint_spinner (GtkStyle *style, cairo_restore (cr); } -typedef struct _CursorInfo CursorInfo; - -struct _CursorInfo -{ - GType for_type; - GdkColor primary; - GdkColor secondary; -}; - static void -cursor_info_free (gpointer data) -{ - g_slice_free (CursorInfo, data); -} - -static const GdkColor * -get_insertion_cursor_color (GtkWidget *widget, - gboolean is_primary) -{ - CursorInfo *cursor_info; - GtkStyle *style; - GdkColor *cursor_color; - - style = gtk_widget_get_style (widget); - - cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info"); - if (!cursor_info) - { - cursor_info = g_slice_new (CursorInfo); - g_object_set_data_full (G_OBJECT (style), I_("gtk-style-cursor-info"), - cursor_info, cursor_info_free); - cursor_info->for_type = G_TYPE_INVALID; - } - - /* We have to keep track of the type because gtk_widget_style_get() - * can return different results when called on the same property and - * same style but for different widgets. :-(. That is, - * GtkEntry::cursor-color = "red" in a style will modify the cursor - * color for entries but not for text view. - */ - if (cursor_info->for_type != G_OBJECT_TYPE (widget)) - { - cursor_info->for_type = G_OBJECT_TYPE (widget); - - /* Cursors in text widgets are drawn only in NORMAL state, - * so we can use text[GTK_STATE_NORMAL] as text color here - */ - gtk_widget_style_get (widget, "cursor-color", &cursor_color, NULL); - if (cursor_color) - { - cursor_info->primary = *cursor_color; - gdk_color_free (cursor_color); - } - else - { - cursor_info->primary = style->text[GTK_STATE_NORMAL]; - } - - gtk_widget_style_get (widget, "secondary-cursor-color", &cursor_color, NULL); - if (cursor_color) - { - cursor_info->secondary = *cursor_color; - gdk_color_free (cursor_color); - } - else - { - /* text_aa is the average of text and base colors, - * in usual black-on-white case it's grey. */ - cursor_info->secondary = style->text_aa[GTK_STATE_NORMAL]; - } - } - - if (is_primary) - return &cursor_info->primary; - else - return &cursor_info->secondary; -} - -void -_gtk_widget_get_cursor_color (GtkWidget *widget, - GdkColor *color) +get_cursor_color (GtkWidget *widget, + gboolean primary, + GdkColor *color) { + GtkStyleContext *context; GdkColor *style_color; g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (color != NULL); - gtk_widget_style_get (widget, "cursor-color", &style_color, NULL); + context = gtk_widget_get_style_context (widget); + + gtk_style_context_get_style (context, + primary ? "cursor-color" : "secondary-cursor-color", + &style_color, + NULL); if (style_color) { *color = *style_color; gdk_color_free (style_color); } + else if (primary) + { + GdkRGBA fg; + + gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); + + color->red = fg.red * 65535; + color->green = fg.green * 65535; + color->blue = fg.blue * 65535; + } else - *color = gtk_widget_get_style (widget)->text[GTK_STATE_NORMAL]; + { + GdkRGBA fg; + GdkRGBA bg; + + gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); + gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg); + + color->red = (fg.red + bg.red) * 0.5 * 65535; + color->green = (fg.green + bg.green) * 0.5 * 65535; + color->blue = (fg.blue + bg.green) * 0.5 * 65535; + } +} + +void +_gtk_widget_get_cursor_color (GtkWidget *widget, + GdkColor *color) +{ + get_cursor_color (widget, TRUE, color); } /** @@ -4098,19 +4054,26 @@ gtk_draw_insertion_cursor (GtkWidget *widget, gint x, y; gfloat cursor_aspect_ratio; gint offset; + GtkStyleContext *context; + GdkColor color; g_return_if_fail (GTK_IS_WIDGET (widget)); g_return_if_fail (cr != NULL); g_return_if_fail (location != NULL); g_return_if_fail (direction != GTK_TEXT_DIR_NONE); - gdk_cairo_set_source_color (cr, get_insertion_cursor_color (widget, is_primary)); + context = gtk_widget_get_style_context (widget); + + get_cursor_color (widget, is_primary, &color); + gdk_cairo_set_source_color (cr, &color); /* When changing the shape or size of the cursor here, * propagate the changes to gtktextview.c:text_window_invalidate_cursors(). */ - gtk_widget_style_get (widget, "cursor-aspect-ratio", &cursor_aspect_ratio, NULL); + gtk_style_context_get_style (context, + "cursor-aspect-ratio", &cursor_aspect_ratio, + NULL); stem_width = location->height * cursor_aspect_ratio + 1; arrow_width = stem_width + 1; diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h index 7aec22d88e..5396b2674f 100644 --- a/gtk/gtkstyle.h +++ b/gtk/gtkstyle.h @@ -641,15 +641,12 @@ void _gtk_style_shade (const GdkColor *a, GdkColor *b, gdouble k); - void gtk_draw_insertion_cursor (GtkWidget *widget, cairo_t *cr, const GdkRectangle *location, gboolean is_primary, GtkTextDirection direction, gboolean draw_arrow); -void _gtk_widget_get_cursor_color (GtkWidget *widget, - GdkColor *color); gboolean gtk_style_has_context (GtkStyle *style); diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c index 7ea85f7d72..7af3857d6c 100644 --- a/gtk/gtktextdisplay.c +++ b/gtk/gtktextdisplay.c @@ -77,7 +77,9 @@ #define GTK_TEXT_USE_INTERNAL_UNSUPPORTED_API #include "config.h" #include "gtktextdisplay.h" +#include "gtkwidgetprivate.h" #include "gtkintl.h" + /* DO NOT go putting private headers in here. This file should only * use the semi-public headers, as with gtktextview.c. */ diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h index c5666468f3..4ba0f66ba1 100644 --- a/gtk/gtkwidgetprivate.h +++ b/gtk/gtkwidgetprivate.h @@ -8,7 +8,7 @@ * * This library 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 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public @@ -80,18 +80,21 @@ void _gtk_widget_set_height_request_needed (GtkWidget *widget, gboolean height_request_needed); void _gtk_widget_override_size_request (GtkWidget *widget, - int width, - int height, - int *old_width, - int *old_height); + int width, + int height, + int *old_width, + int *old_height); void _gtk_widget_restore_size_request (GtkWidget *widget, - int old_width, - int old_height); + int old_width, + int old_height); gboolean _gtk_widget_get_translation_to_window (GtkWidget *widget, - GdkWindow *window, - int *x, - int *y); + GdkWindow *window, + int *x, + int *y); + +void _gtk_widget_get_cursor_color (GtkWidget *widget, + GdkColor *color); G_END_DECLS