diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-01-24 00:24:12 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-01-24 00:24:12 -0500 |
commit | b42b47e7d37411d7410113aa8156146d35dfde43 (patch) | |
tree | b3a604ef16c45292cdf3d629834466e401e2e3e7 /gtk | |
parent | 6619aa58b10de5abe503675e34d8e312fb066c06 (diff) | |
download | gtk+-b42b47e7d37411d7410113aa8156146d35dfde43.tar.gz |
Port gtk_draw_insertion_cursor to GtkStyleContext
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkentry.c | 1 | ||||
-rw-r--r-- | gtk/gtkstyle.c | 123 | ||||
-rw-r--r-- | gtk/gtkstyle.h | 3 | ||||
-rw-r--r-- | gtk/gtktextdisplay.c | 2 | ||||
-rw-r--r-- | gtk/gtkwidgetprivate.h | 23 |
5 files changed, 59 insertions, 93 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) +get_cursor_color (GtkWidget *widget, + gboolean primary, + GdkColor *color) { - g_slice_free (CursorInfo, data); -} + GtkStyleContext *context; + GdkColor *style_color; -static const GdkColor * -get_insertion_cursor_color (GtkWidget *widget, - gboolean is_primary) -{ - CursorInfo *cursor_info; - GtkStyle *style; - GdkColor *cursor_color; + g_return_if_fail (GTK_IS_WIDGET (widget)); + g_return_if_fail (color != NULL); + + context = gtk_widget_get_style_context (widget); - style = gtk_widget_get_style (widget); + gtk_style_context_get_style (context, + primary ? "cursor-color" : "secondary-cursor-color", + &style_color, + NULL); - cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info"); - if (!cursor_info) + if (style_color) { - 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; + *color = *style_color; + gdk_color_free (style_color); } - - /* 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)) + else if (primary) { - cursor_info->for_type = G_OBJECT_TYPE (widget); + GdkRGBA fg; - /* 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_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg); - 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]; - } + color->red = fg.red * 65535; + color->green = fg.green * 65535; + color->blue = fg.blue * 65535; } - - if (is_primary) - return &cursor_info->primary; else - return &cursor_info->secondary; + { + 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) { - 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); - - if (style_color) - { - *color = *style_color; - gdk_color_free (style_color); - } - else - *color = gtk_widget_get_style (widget)->text[GTK_STATE_NORMAL]; + 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 |