Commit b42b47e7 authored by Matthias Clasen's avatar Matthias Clasen

Port gtk_draw_insertion_cursor to GtkStyleContext

parent 6619aa58
......@@ -65,6 +65,7 @@
#include "gtktooltip.h"
#include "gtkiconfactory.h"
#include "gtkicontheme.h"
#include "gtkwidgetprivate.h"
/**
......
......@@ -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;
......
......@@ -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);
......
......@@ -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.
*/
......
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment