[gtk+] textview: Use a CSS node for selection rendering
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] textview: Use a CSS node for selection rendering
- Date: Wed, 11 Nov 2015 03:01:25 +0000 (UTC)
commit bb786ac2404e99bfd14097006724dde177e0220d
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Nov 10 21:18:10 2015 -0500
textview: Use a CSS node for selection rendering
Use a CSS node with name selection, like we do for entries
and labels. Unlike those widgets, we currently don't user
gtk_render_background, but just use the background color.
That will require more effort.
gtk/gtktextdisplay.c | 16 +++++++---------
gtk/gtktextview.c | 33 ++++++++++++++++++++++++++++++---
2 files changed, 37 insertions(+), 12 deletions(-)
---
diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c
index 6b5dbf4..24372d2 100644
--- a/gtk/gtktextdisplay.c
+++ b/gtk/gtktextdisplay.c
@@ -596,6 +596,8 @@ get_selected_clip (GtkTextRenderer *text_renderer,
return clip_region;
}
+extern GtkCssNode *gtk_text_view_get_selection_node (GtkTextView *text_view);
+
static void
render_para (GtkTextRenderer *text_renderer,
GtkTextLineDisplay *line_display,
@@ -603,7 +605,6 @@ render_para (GtkTextRenderer *text_renderer,
int selection_end_index)
{
GtkStyleContext *context;
- GtkStateFlags state;
PangoLayout *layout = line_display->layout;
int byte_offset = 0;
PangoLayoutIter *iter;
@@ -611,6 +612,7 @@ render_para (GtkTextRenderer *text_renderer,
int screen_width;
GdkRGBA selection;
gboolean first = TRUE;
+ GtkCssNode *selection_node;
iter = pango_layout_get_iter (layout);
@@ -624,14 +626,11 @@ render_para (GtkTextRenderer *text_renderer,
screen_width = line_display->total_width;
context = gtk_widget_get_style_context (text_renderer->widget);
- gtk_style_context_save (context);
-
- state = gtk_style_context_get_state (context);
- state |= GTK_STATE_FLAG_SELECTED;
- gtk_style_context_set_state (context, state);
+ selection_node = gtk_text_view_get_selection_node ((GtkTextView*)text_renderer->widget);
+ gtk_style_context_save_to_node (context, selection_node);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- gtk_style_context_get_background_color (context, state, &selection);
+ gtk_style_context_get_background_color (context, gtk_style_context_get_state (context), &selection);
G_GNUC_END_IGNORE_DEPRECATIONS
gtk_style_context_restore (context);
@@ -825,9 +824,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
{
GdkRGBA color;
- state = gtk_style_context_get_state (context);
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- gtk_style_context_get_background_color (context, state, &color);
+ gtk_style_context_get_background_color (context, gtk_style_context_get_state (context),
&color);
G_GNUC_END_IGNORE_DEPRECATIONS
gdk_cairo_set_source_rgba (cr, &color);
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 773a87f..b2db5ce 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -233,6 +233,8 @@ struct _GtkTextViewPrivate
GtkGesture *multipress_gesture;
GtkGesture *drag_gesture;
+ GtkCssNode *selection_node;
+
/* Default style settings */
gint pixels_above_lines;
gint pixels_below_lines;
@@ -1737,6 +1739,18 @@ gtk_text_view_init (GtkTextView *text_view)
g_signal_connect (priv->drag_gesture, "drag-end",
G_CALLBACK (gtk_text_view_drag_gesture_end),
widget);
+
+ priv->selection_node = gtk_css_node_new ();
+ gtk_css_node_set_name (priv->selection_node, I_("selection"));
+ gtk_css_node_set_parent (priv->selection_node, priv->text_window->css_node);
+ gtk_css_node_set_state (priv->selection_node, gtk_css_node_get_state (priv->text_window->css_node));
+ g_object_unref (priv->selection_node);
+}
+
+GtkCssNode *
+gtk_text_view_get_selection_node (GtkTextView *text_view)
+{
+ return text_view->priv->selection_node;
}
static void
@@ -4838,6 +4852,7 @@ gtk_text_view_state_flags_changed (GtkWidget *widget,
GtkStateFlags previous_state)
{
GtkTextView *text_view = GTK_TEXT_VIEW (widget);
+ GtkTextViewPrivate *priv = text_view->priv;
GdkCursor *cursor;
if (gtk_widget_get_realized (widget))
@@ -4847,12 +4862,12 @@ gtk_text_view_state_flags_changed (GtkWidget *widget,
else
cursor = NULL;
- gdk_window_set_cursor (text_view->priv->text_window->bin_window, cursor);
+ gdk_window_set_cursor (priv->text_window->bin_window, cursor);
if (cursor)
g_object_unref (cursor);
- text_view->priv->mouse_cursor_obscured = FALSE;
+ priv->mouse_cursor_obscured = FALSE;
}
if (!gtk_widget_is_sensitive (widget))
@@ -4860,7 +4875,19 @@ gtk_text_view_state_flags_changed (GtkWidget *widget,
/* Clear any selection */
gtk_text_view_unselect (text_view);
}
-
+
+ gtk_css_node_set_state (priv->text_window->css_node, gtk_widget_get_state (widget));
+ gtk_css_node_set_state (priv->selection_node, gtk_widget_get_state (widget));
+
+ if (priv->left_window)
+ gtk_css_node_set_state (priv->left_window->css_node, gtk_widget_get_state (widget));
+ if (priv->right_window)
+ gtk_css_node_set_state (priv->right_window->css_node, gtk_widget_get_state (widget));
+ if (priv->top_window)
+ gtk_css_node_set_state (priv->top_window->css_node, gtk_widget_get_state (widget));
+ if (priv->bottom_window)
+ gtk_css_node_set_state (priv->bottom_window->css_node, gtk_widget_get_state (widget));
+
gtk_widget_queue_draw (widget);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]