diff options
author | Matthias Clasen <mclasen@redhat.com> | 2015-11-10 21:18:10 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2015-11-10 21:18:10 -0500 |
commit | bb786ac2404e99bfd14097006724dde177e0220d (patch) | |
tree | 0b872e1f38cce006299a456dfa03218d10e1ea42 | |
parent | 735a71da112cbf3cc6ae0cce8ea2147db510d109 (diff) | |
download | gtk+-bb786ac2404e99bfd14097006724dde177e0220d.tar.gz |
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.
-rw-r--r-- | gtk/gtktextdisplay.c | 16 | ||||
-rw-r--r-- | gtk/gtktextview.c | 33 |
2 files changed, 37 insertions, 12 deletions
diff --git a/gtk/gtktextdisplay.c b/gtk/gtktextdisplay.c index 6b5dbf4190..24372d2bd8 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 773a87f2cf..b2db5ce59f 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); } |