summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-01-24 00:24:12 -0500
committerMatthias Clasen <mclasen@redhat.com>2011-01-24 00:24:12 -0500
commitb42b47e7d37411d7410113aa8156146d35dfde43 (patch)
treeb3a604ef16c45292cdf3d629834466e401e2e3e7 /gtk
parent6619aa58b10de5abe503675e34d8e312fb066c06 (diff)
downloadgtk+-b42b47e7d37411d7410113aa8156146d35dfde43.tar.gz
Port gtk_draw_insertion_cursor to GtkStyleContext
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkentry.c1
-rw-r--r--gtk/gtkstyle.c123
-rw-r--r--gtk/gtkstyle.h3
-rw-r--r--gtk/gtktextdisplay.c2
-rw-r--r--gtk/gtkwidgetprivate.h23
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