diff options
author | Carlos Garcia Campos <[email protected]> | 2013-06-14 18:11:27 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2017-09-06 18:25:34 +0200 |
commit | b062ae0ca9eeb927a111a92bb9d41f3a77630f71 (patch) | |
tree | 3dc8d01989ac78681f8505c6b0a0bf191feb4107 /libview | |
parent | b346e03c34b05f8607b7802f0f40b7f0b96e6916 (diff) | |
download | atril-b062ae0ca9eeb927a111a92bb9d41f3a77630f71.tar.bz2 atril-b062ae0ca9eeb927a111a92bb9d41f3a77630f71.tar.xz |
libview: Fix the damage area used to redraw the caret cursor
Move to a helper function the code to get the exact area where the caret
should be drawn and use it to draw the care cursor and to invalidate the
area when blinking.
origin commit:
https://git.gnome.org/browse/evince/commit/?h=gnome-3-10&id=f5e7eb4
Diffstat (limited to 'libview')
-rw-r--r-- | libview/ev-view.c | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/libview/ev-view.c b/libview/ev-view.c index 7184cab1..50838662 100644 --- a/libview/ev-view.c +++ b/libview/ev-view.c @@ -3329,6 +3329,29 @@ get_caret_cursor_rect_from_offset (EvView *view, return TRUE; } +static gboolean +get_caret_cursor_area (EvView *view, + GdkRectangle *area) +{ + gfloat cursor_aspect_ratio; + gint stem_width; + + if (!get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->cursor_page, area)) + return FALSE; + + area->x = area->x - view->scroll_x; + area->y = area->y - view->scroll_y; + + gtk_style_context_get_style (gtk_widget_get_style_context (GTK_WIDGET (view)), + "cursor-aspect-ratio", &cursor_aspect_ratio, + NULL); + stem_width = area->height * cursor_aspect_ratio + 1; + area->x = area->x - (stem_width / 2); + area->width = stem_width; + + return TRUE; +} + static void show_cursor (EvView *view) { @@ -3340,11 +3363,10 @@ show_cursor (EvView *view) widget = GTK_WIDGET (view); view->cursor_visible = TRUE; - if (gtk_widget_has_focus (widget) - && get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->current_page, &view_rect)) { - view_rect.x = view_rect.x - view->scroll_x; - view_rect.y = view_rect.y - view->scroll_y; - gtk_widget_queue_draw_area (widget, view_rect.x, view_rect.y, view_rect.width, view_rect.height); + if (gtk_widget_has_focus (widget) && get_caret_cursor_area (view, &view_rect)) { + gtk_widget_queue_draw_area (widget, + view_rect.x, view_rect.y, + view_rect.width, view_rect.height); } } @@ -3359,11 +3381,10 @@ hide_cursor (EvView *view) widget = GTK_WIDGET (view); view->cursor_visible = FALSE; - if (gtk_widget_has_focus (widget) - && get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->current_page, &view_rect)) { - view_rect.x = view_rect.x - view->scroll_x; - view_rect.y = view_rect.y - view->scroll_y; - gtk_widget_queue_draw_area (widget, view_rect.x, view_rect.y, view_rect.width, view_rect.height); + if (gtk_widget_has_focus (widget) && get_caret_cursor_area (view, &view_rect)) { + gtk_widget_queue_draw_area (widget, + view_rect.x, view_rect.y, + view_rect.width, view_rect.height); } } @@ -3920,47 +3941,24 @@ get_cursor_color (GtkStyleContext *context, } } -/* This is a clone of the deprecated function gtk_draw_insertion_cursor. */ -static void -render_cursor (GtkWidget *widget, - cairo_t *cr, - GdkRectangle *rect) -{ - - GtkStyleContext *context; - GdkRGBA cursor_color; - gfloat cursor_aspect_ratio; - gint stem_width; - - context = gtk_widget_get_style_context (widget); - get_cursor_color (context, &cursor_color); - - gtk_style_context_get_style (context, - "cursor-aspect-ratio", &cursor_aspect_ratio, - NULL); - - stem_width = rect->height * cursor_aspect_ratio + 1; - - cairo_save (cr); - gdk_cairo_set_source_rgba (cr, &cursor_color); - cairo_rectangle (cr, rect->x - (stem_width / 2), rect->y, stem_width, rect->height); - cairo_fill (cr); - cairo_restore (cr); -} - +/* This is based on the deprecated function gtk_draw_insertion_cursor. */ static void draw_caret_cursor (EvView *view, cairo_t *cr) { GdkRectangle view_rect; + GdkRGBA cursor_color; - if (!get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->cursor_page, &view_rect)) + if (!get_caret_cursor_area (view, &view_rect)) return; - view_rect.x = view_rect.x - view->scroll_x; - view_rect.y = view_rect.y - view->scroll_y; + get_cursor_color (gtk_widget_get_style_context (GTK_WIDGET (view)), &cursor_color); - render_cursor (GTK_WIDGET (view), cr, &view_rect); + cairo_save (cr); + gdk_cairo_set_source_rgba (cr, &cursor_color); + cairo_rectangle (cr, view_rect.x, view_rect.y, view_rect.width, view_rect.height); + cairo_fill (cr); + cairo_restore (cr); } static void |