diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c index 76b1b43616..e032242a3b 100644 --- a/gtk/gtktextlayout.c +++ b/gtk/gtktextlayout.c @@ -4100,6 +4100,7 @@ gtk_text_layout_snapshot (GtkTextLayout *layout, GtkWidget *widget, GtkSnapshot *snapshot, const GdkRectangle *clip, + gboolean selection_style_changed, float cursor_alpha) { GtkTextLayoutPrivate *priv; @@ -4237,6 +4238,12 @@ gtk_text_layout_snapshot (GtkTextLayout *layout, { if (line_display->has_block_cursor && gtk_widget_has_focus (widget)) g_clear_pointer (&line_display->node, gsk_render_node_unref); + + if (selection_style_changed && + (selection_start_index != -1 || selection_end_index != -1)) + { + g_clear_pointer (&line_display->node, gsk_render_node_unref); + } } if (line_display->node == NULL && diff --git a/gtk/gtktextlayoutprivate.h b/gtk/gtktextlayoutprivate.h index 7f24a375fc..e48f5ca487 100644 --- a/gtk/gtktextlayoutprivate.h +++ b/gtk/gtktextlayoutprivate.h @@ -376,6 +376,7 @@ void gtk_text_layout_snapshot (GtkTextLayout *layout, GtkWidget *widget, GtkSnapshot *snapshot, const GdkRectangle *clip, + gboolean selection_style_changed, float cursor_alpha); void gtk_text_layout_set_mru_size (GtkTextLayout *layout, diff --git a/gtk/gtktextutil.c b/gtk/gtktextutil.c index 5d3146b786..7488476fb0 100644 --- a/gtk/gtktextutil.c +++ b/gtk/gtktextutil.c @@ -286,7 +286,7 @@ gtk_text_util_create_rich_drag_icon (GtkWidget *widget, gtk_css_style_snapshot_background (&boxes, snapshot); } - gtk_text_layout_snapshot (layout, widget, snapshot, &(GdkRectangle) { 0, 0, layout_width, layout_height }, 1.0); + gtk_text_layout_snapshot (layout, widget, snapshot, &(GdkRectangle) { 0, 0, layout_width, layout_height }, FALSE, 1.0); g_object_unref (layout); g_object_unref (new_buffer); diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 82256dc67c..b81e8d6b22 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -303,6 +303,8 @@ struct _GtkTextViewPrivate guint vscroll_policy : 1; guint cursor_handle_dragged : 1; guint selection_handle_dragged : 1; + + guint selection_style_changed : 1; }; struct _GtkTextPendingScroll @@ -840,6 +842,19 @@ gtk_text_view_notify (GObject *object, G_OBJECT_CLASS (gtk_text_view_parent_class)->notify (object, pspec); } +static void +selection_style_changed_cb (GtkCssNode *node, + GtkCssStyleChange *change, + GtkTextView *self) +{ + if (gtk_css_style_change_affects (change, GTK_CSS_AFFECTS_REDRAW)) + { + GtkTextViewPrivate *priv = self->priv; + priv->selection_style_changed = TRUE; + gtk_widget_queue_draw (GTK_WIDGET (self)); + } +} + static void gtk_text_view_class_init (GtkTextViewClass *klass) { @@ -2041,6 +2056,8 @@ gtk_text_view_init (GtkTextView *text_view) gtk_css_node_set_state (priv->selection_node, gtk_css_node_get_state (priv->text_window->css_node) & ~GTK_STATE_FLAG_DROP_ACTIVE); gtk_css_node_set_visible (priv->selection_node, FALSE); + g_signal_connect (priv->selection_node, "style-changed", + G_CALLBACK (selection_style_changed_cb), text_view); g_object_unref (priv->selection_node); gtk_widget_action_set_enabled (GTK_WIDGET (text_view), "text.can-redo", FALSE); @@ -5922,9 +5939,12 @@ gtk_text_view_paint (GtkWidget *widget, gtk_widget_get_width (widget), gtk_widget_get_height (widget) }, + priv->selection_style_changed, priv->cursor_alpha); gtk_snapshot_restore (snapshot); + + priv->selection_style_changed = FALSE; } static void