From 6217a89c6fad8ab77d3776210df5f6a182928f0e Mon Sep 17 00:00:00 2001 From: raveit65 Date: Fri, 9 Mar 2018 16:14:26 +0100 Subject: Save/restore context when getting colors for a different state Getting colors for a state different from the current state of the corresponding widget without saving the context might trigger an invalidation and a redraw. Because this was happening from the draw function this resulted in a redraw loop and constant high CPU usage. This could be triggered by selecting text or searching. https://bugzilla.gnome.org/show_bug.cgi?id=755442 inspired by: https://git.gnome.org/browse/evince/commit/?id=1987f04 https://github.com/linuxmint/xreader/commit/e76a18d --- libdocument/ev-document-misc.c | 2 ++ libview/ev-view.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/libdocument/ev-document-misc.c b/libdocument/ev-document-misc.c index 87364525..40d03400 100644 --- a/libdocument/ev-document-misc.c +++ b/libdocument/ev-document-misc.c @@ -161,9 +161,11 @@ ev_document_misc_paint_one_page (cairo_t *cr, GtkStateFlags state = gtk_widget_get_state_flags (widget); GdkRGBA fg, bg, shade_bg; + gtk_style_context_save (context); gtk_style_context_get_background_color (context, state, &bg); gtk_style_context_get_color (context, state, &fg); gtk_style_context_get_color (context, state, &shade_bg); + gtk_style_context_restore (context); shade_bg.alpha *= 0.5; gdk_cairo_set_source_rgba (cr, highlight ? &fg : &shade_bg); diff --git a/libview/ev-view.c b/libview/ev-view.c index 334540c6..6e02efce 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -3974,7 +3974,9 @@ get_cursor_color (GtkStyleContext *context, gdk_color_free (style_color); } else { + gtk_style_context_save (context); gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, color); + gtk_style_context_restore (context); } } @@ -5622,7 +5624,9 @@ draw_rubberband (EvView *view, GdkRGBA color; context = gtk_widget_get_style_context (GTK_WIDGET (view)); + gtk_style_context_save (context); gtk_style_context_get_background_color (context, GTK_STATE_FLAG_SELECTED, &color); + gtk_style_context_restore (context); cairo_save (cr); @@ -5811,12 +5815,15 @@ _ev_view_get_selection_colors (EvView *view, state = gtk_widget_has_focus (widget) ? GTK_STATE_FLAG_SELECTED : GTK_STATE_FLAG_ACTIVE; context = gtk_widget_get_style_context (widget); + gtk_style_context_save (context); if (bg_color) gtk_style_context_get_background_color (context, state, bg_color); if (fg_color) gtk_style_context_get_color (context, state, fg_color); + + gtk_style_context_restore (context); } static void -- cgit v1.2.1