summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <[email protected]>2013-06-14 18:11:27 +0200
committerraveit65 <[email protected]>2017-09-06 18:25:34 +0200
commitb062ae0ca9eeb927a111a92bb9d41f3a77630f71 (patch)
tree3dc8d01989ac78681f8505c6b0a0bf191feb4107
parentb346e03c34b05f8607b7802f0f40b7f0b96e6916 (diff)
downloadatril-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
-rw-r--r--libview/ev-view.c82
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