diff options
Diffstat (limited to 'libview')
| -rw-r--r-- | libview/ev-view.c | 49 | 
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;  } | 
