summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <[email protected]>2013-07-18 14:13:38 +0200
committerraveit65 <[email protected]>2017-09-06 18:25:34 +0200
commit205542523f2927972757996f50e0ade2b71fa3ae (patch)
tree4b0f0d7c5a9eb7703dd52a3c38fc102b9475bfe3
parent03d0d638eeb5c0258839b4efb9ae5f2e1f7d0b12 (diff)
downloadatril-205542523f2927972757996f50e0ade2b71fa3ae.tar.bz2
atril-205542523f2927972757996f50e0ade2b71fa3ae.tar.xz
libview: do not redraw the whole view when caret cursor moves
Invalidate the previous and new regions instead. origin commit: https://git.gnome.org/browse/evince/commit/?h=gnome-3-10&id=e39ac99
-rw-r--r--libview/ev-view.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 5146d6cc..9a81ce46 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -4343,9 +4343,14 @@ position_caret_cursor_at_location (EvView *view,
static gboolean
position_caret_cursor_for_event (EvView *view,
- GdkEventButton *event)
+ GdkEventButton *event,
+ gboolean redraw)
{
GdkRectangle area;
+ GdkRectangle prev_area = { 0, 0, 0, 0 };
+
+ if (redraw)
+ get_caret_cursor_area (view, view->cursor_page, view->cursor_offset, &prev_area);
if (!position_caret_cursor_at_location (view, event->x, event->y))
return FALSE;
@@ -4357,6 +4362,16 @@ position_caret_cursor_for_event (EvView *view,
g_signal_emit (view, signals[SIGNAL_CURSOR_MOVED], 0, view->cursor_page, view->cursor_offset);
+ if (redraw) {
+ cairo_region_t *damage_region;
+
+ damage_region = cairo_region_create_rectangle (&prev_area);
+ cairo_region_union_rectangle (damage_region, &area);
+ gdk_window_invalidate_region (gtk_widget_get_window (GTK_WIDGET (view)),
+ damage_region, TRUE);
+ cairo_region_destroy (damage_region);
+ }
+
return TRUE;
}
@@ -4413,7 +4428,7 @@ ev_view_button_press_event (GtkWidget *widget,
view->selection_info.in_drag = TRUE;
} else {
start_selection_for_event (view, event);
- if (position_caret_cursor_for_event (view, event)) {
+ if (position_caret_cursor_for_event (view, event, TRUE)) {
view->cursor_blink_time = 0;
ev_view_pend_cursor_blink (view);
}
@@ -4447,11 +4462,9 @@ ev_view_button_press_event (GtkWidget *widget,
if (EV_IS_SELECTION (view->document))
start_selection_for_event (view, event);
- if (position_caret_cursor_for_event (view, event)) {
+ if (position_caret_cursor_for_event (view, event, TRUE)) {
view->cursor_blink_time = 0;
ev_view_pend_cursor_blink (view);
-
- gtk_widget_queue_draw (widget);
}
}
}
@@ -4917,7 +4930,7 @@ ev_view_button_release_event (GtkWidget *widget,
clear_link_selected (view);
ev_view_update_primary_selection (view);
- position_caret_cursor_for_event (view, event);
+ position_caret_cursor_for_event (view, event, FALSE);
if (view->selection_info.in_drag)
clear_selection (view);
@@ -5322,10 +5335,12 @@ ev_view_move_cursor (EvView *view,
gint count,
gboolean extend_selection)
{
- GdkRectangle rect;
- gint prev_offset;
- gint prev_page;
- gboolean clear_selections = FALSE;
+ GdkRectangle rect;
+ GdkRectangle prev_rect;
+ gint prev_offset;
+ gint prev_page;
+ cairo_region_t *damage_region;
+ gboolean clear_selections = FALSE;
if (!view->caret_enabled || view->rotation != 0)
return FALSE;
@@ -5410,6 +5425,10 @@ ev_view_move_cursor (EvView *view,
view->cursor_line_offset = rect.x;
}
+ damage_region = cairo_region_create_rectangle (&rect);
+ if (get_caret_cursor_area (view, prev_page, prev_offset, &prev_rect))
+ cairo_region_union_rectangle (damage_region, &prev_rect);
+
rect.x += view->scroll_x;
rect.y += view->scroll_y;
@@ -5418,14 +5437,14 @@ ev_view_move_cursor (EvView *view,
g_signal_emit (view, signals[SIGNAL_CURSOR_MOVED], 0, view->cursor_page, view->cursor_offset);
+ gdk_window_invalidate_region (gtk_widget_get_window (GTK_WIDGET (view)),
+ damage_region, TRUE);
+ cairo_region_destroy (damage_region);
+
/* Select text */
if (extend_selection && EV_IS_SELECTION (view->document)) {
- GdkRectangle prev_rect;
GdkPoint start_point, end_point;
- if (!get_caret_cursor_area (view, prev_page, prev_offset, &prev_rect))
- return TRUE;
-
start_point.x = prev_rect.x + view->scroll_x;
start_point.y = prev_rect.y + (prev_rect.height / 2) + view->scroll_y;
@@ -5436,8 +5455,6 @@ ev_view_move_cursor (EvView *view,
} else if (clear_selections)
clear_selection (view);
- gtk_widget_queue_draw (GTK_WIDGET (view));
-
return TRUE;
}