X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-view.c;h=5944e348305db28d0e60026f86090b3a48e4969f;hb=1af6600934d1f723e5b492b8322e52a1144fb0af;hp=b3bd531f888bc29c348a1ef0ae08c42f3b57c133;hpb=39c51b63804387f5f7c0f3fce193da9eb9998774;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index b3bd531f..5944e348 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ +#include #include #include #include @@ -32,7 +33,6 @@ #include "ev-view.h" #include "ev-view-private.h" #include "ev-utils.h" -#include "ev-selection.h" #include "ev-document-links.h" #include "ev-document-images.h" #include "ev-document-find.h" @@ -315,6 +315,7 @@ static void jump_to_find_page (EvView /*** Selection ***/ static void compute_selections (EvView *view, + EvSelectionStyle style, GdkPoint *start, GdkPoint *stop); static void clear_selection (EvView *view); @@ -489,7 +490,7 @@ view_update_range_and_current_page (EvView *view) } view->end_page = i; - } else if (found) { + } else if (found && view->current_page <= view->end_page) { break; } } @@ -1154,21 +1155,26 @@ static void goto_fitr_dest (EvView *view, EvLinkDest *dest) { EvPoint doc_point; - double zoom; + gdouble zoom, left, top; + gboolean change_left, change_top; + + left = ev_link_dest_get_left (dest, &change_left); + top = ev_link_dest_get_top (dest, &change_top); - zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - ev_link_dest_get_left (dest), - ev_link_dest_get_bottom (dest) - ev_link_dest_get_top (dest), + zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - left, + ev_link_dest_get_bottom (dest) - top, ev_view_get_width (view), ev_view_get_height (view), 0, 0); ev_view_set_sizing_mode (view, EV_SIZING_FREE); ev_view_set_zoom (view, zoom, FALSE); - doc_point.x = ev_link_dest_get_left (dest); - doc_point.y = ev_link_dest_get_top (dest); + doc_point.x = change_left ? left : 0; + doc_point.y = change_top ? top : 0; view->current_page = ev_link_dest_get_page (dest); - view->pending_point = doc_point; + if (change_left || change_top) + view->pending_point = doc_point; view->pending_scroll = SCROLL_TO_PAGE_POSITION; gtk_widget_queue_resize (GTK_WIDGET (view)); @@ -1179,12 +1185,14 @@ goto_fitv_dest (EvView *view, EvLinkDest *dest) { EvPoint doc_point; int doc_width, doc_height, page; - double zoom; + double zoom, left; + gboolean change_left; page = ev_link_dest_get_page (dest); ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height); - doc_point.x = ev_link_dest_get_left (dest); + left = ev_link_dest_get_left (dest, &change_left); + doc_point.x = change_left ? left : 0; doc_point.y = 0; zoom = zoom_for_size_fit_height (doc_width - doc_point.x , doc_height, @@ -1195,7 +1203,8 @@ goto_fitv_dest (EvView *view, EvLinkDest *dest) ev_view_set_zoom (view, zoom, FALSE); view->current_page = page; - view->pending_point = doc_point; + if (change_left) + view->pending_point = doc_point; view->pending_scroll = SCROLL_TO_PAGE_POSITION; gtk_widget_queue_resize (GTK_WIDGET (view)); @@ -1206,15 +1215,18 @@ goto_fith_dest (EvView *view, EvLinkDest *dest) { EvPoint doc_point; int doc_width, doc_height, page; - double zoom; + gdouble zoom, top; + gboolean change_top; page = ev_link_dest_get_page (dest); ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height); + top = ev_link_dest_get_top (dest, &change_top); + doc_point.x = 0; - doc_point.y = ev_link_dest_get_top (dest); + doc_point.y = change_top ? top : 0; - zoom = zoom_for_size_fit_width (doc_width, ev_link_dest_get_top (dest), + zoom = zoom_for_size_fit_width (doc_width, top, ev_view_get_width (view), ev_view_get_height (view), 0); @@ -1222,7 +1234,8 @@ goto_fith_dest (EvView *view, EvLinkDest *dest) ev_view_set_zoom (view, zoom, FALSE); view->current_page = page; - view->pending_point = doc_point; + if (change_top) + view->pending_point = doc_point; view->pending_scroll = SCROLL_TO_PAGE_POSITION; gtk_widget_queue_resize (GTK_WIDGET (view)); @@ -1255,21 +1268,26 @@ goto_xyz_dest (EvView *view, EvLinkDest *dest) { EvPoint doc_point; gint page; - double zoom; + gdouble zoom, left, top; + gboolean change_zoom, change_left, change_top; - zoom = ev_link_dest_get_zoom (dest); + zoom = ev_link_dest_get_zoom (dest, &change_zoom); page = ev_link_dest_get_page (dest); - if (zoom > 1) { + if (change_zoom && zoom > 1) { ev_view_set_sizing_mode (view, EV_SIZING_FREE); ev_view_set_zoom (view, zoom, FALSE); } - doc_point.x = ev_link_dest_get_left (dest); - doc_point.y = ev_link_dest_get_top (dest); + left = ev_link_dest_get_left (dest, &change_left); + top = ev_link_dest_get_top (dest, &change_top); + + doc_point.x = change_left ? left : 0; + doc_point.y = change_top ? top : 0; view->current_page = page; - view->pending_point = doc_point; + if (change_left || change_top) + view->pending_point = doc_point; view->pending_scroll = SCROLL_TO_PAGE_POSITION; gtk_widget_queue_resize (GTK_WIDGET (view)); @@ -1498,6 +1516,18 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) if (view->cursor == EV_VIEW_CURSOR_HIDDEN) return; + + if (view->drag_info.in_drag) { + if (view->cursor != EV_VIEW_CURSOR_DRAG) + ev_view_set_cursor (view, EV_VIEW_CURSOR_DRAG); + return; + } + + if (view->scroll_info.autoscrolling) { + if (view->cursor != EV_VIEW_CURSOR_AUTOSCROLL) + ev_view_set_cursor (view, EV_VIEW_CURSOR_AUTOSCROLL); + return; + } link = ev_view_get_link_at_location (view, x, y); @@ -1531,7 +1561,8 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) } else if ((field = ev_view_get_form_field_at_location (view, x, y))) { if (field->is_read_only) { if (view->cursor == EV_VIEW_CURSOR_LINK || - view->cursor == EV_VIEW_CURSOR_IBEAM) + view->cursor == EV_VIEW_CURSOR_IBEAM || + view->cursor == EV_VIEW_CURSOR_DRAG) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); } else if (EV_IS_FORM_FIELD_TEXT (field)) { ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM); @@ -1542,7 +1573,8 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y) ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM); } else { if (view->cursor == EV_VIEW_CURSOR_LINK || - view->cursor == EV_VIEW_CURSOR_IBEAM) + view->cursor == EV_VIEW_CURSOR_IBEAM || + view->cursor == EV_VIEW_CURSOR_DRAG) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); } } @@ -2594,6 +2626,32 @@ ev_view_query_tooltip (GtkWidget *widget, } #endif /* GTK_CHECK_VERSION (2, 11, 7) */ +static void +start_selection_for_event (EvView *view, + GdkEventButton *event) +{ + EvSelectionStyle style; + + clear_selection (view); + + view->selection_info.start.x = event->x + view->scroll_x; + view->selection_info.start.y = event->y + view->scroll_y; + + switch (event->type) { + case GDK_2BUTTON_PRESS: + style = EV_SELECTION_STYLE_WORD; + break; + case GDK_3BUTTON_PRESS: + style = EV_SELECTION_STYLE_LINE; + break; + default: + style = EV_SELECTION_STYLE_GLYPH; + break; + } + + view->selection_info.style = style; +} + static gboolean ev_view_button_press_event (GtkWidget *widget, GdkEventButton *event) @@ -2612,22 +2670,30 @@ ev_view_button_press_event (GtkWidget *widget, switch (event->button) { case 1: { + + if (view->scroll_info.autoscrolling == TRUE) { + view->scroll_info.autoscrolling = FALSE; + return TRUE; + } + EvImage *image; EvFormField *field; - if (view->selection_info.selections) { - if (location_in_selected_text (view, + if (EV_IS_SELECTION (view->document) && view->selection_info.selections) { + if (event->type == GDK_3BUTTON_PRESS) { + start_selection_for_event (view, event); + } else if (location_in_selected_text (view, event->x + view->scroll_x, event->y + view->scroll_y)) { view->selection_info.in_drag = TRUE; } else { - clear_selection (view); - - view->selection_info.start.x = event->x + view->scroll_x; - view->selection_info.start.y = event->y + view->scroll_y; + start_selection_for_event (view, event); } - + gtk_widget_queue_draw (widget); + } else if ((field = ev_view_get_form_field_at_location (view, event->x, event->y))) { + ev_view_remove_all (view); + ev_view_handle_form_field (view, field, event->x, event->y); } else if (!location_in_text (view, event->x + view->scroll_x, event->y + view->scroll_y) && (image = ev_view_get_image_at_location (view, event->x, event->y))) { if (view->image_dnd_info.image) @@ -2637,19 +2703,21 @@ ev_view_button_press_event (GtkWidget *widget, view->image_dnd_info.start.x = event->x + view->scroll_x; view->image_dnd_info.start.y = event->y + view->scroll_y; - } else if ((field = ev_view_get_form_field_at_location (view, event->x, event->y))) { - ev_view_remove_all (view); - ev_view_handle_form_field (view, field, event->x, event->y); } else { ev_view_remove_all (view); - view->selection_info.start.x = event->x + view->scroll_x; - view->selection_info.start.y = event->y + view->scroll_y; + + if (EV_IS_SELECTION (view->document)) + start_selection_for_event (view, event); } } return TRUE; case 2: /* use root coordinates as reference point because * scrolling changes window relative coordinates */ + if (view->scroll_info.autoscrolling == TRUE) { + view->scroll_info.autoscrolling = FALSE; + return TRUE; + } view->drag_info.start.x = event->x_root; view->drag_info.start.y = event->y_root; view->drag_info.hadj = gtk_adjustment_get_value (view->hadjustment); @@ -2659,6 +2727,8 @@ ev_view_button_press_event (GtkWidget *widget, return TRUE; case 3: + if (!view->scroll_info.autoscrolling) + view->scroll_info.start_y = event->y; return ev_view_do_popup_menu (view, event->x, event->y); } @@ -2690,16 +2760,14 @@ ev_view_drag_data_get (GtkWidget *widget, switch (info) { case TARGET_DND_TEXT: - if (view->selection_info.selections && - ev_document_can_get_text (view->document)) { + if (EV_IS_SELECTION (view->document) && + view->selection_info.selections) { gchar *text; text = get_selected_text (view); - gtk_selection_data_set_text (selection_data, text, strlen (text)); - g_free (text); } break; @@ -2780,7 +2848,10 @@ ev_view_drag_data_received (GtkWidget *widget, static gboolean selection_update_idle_cb (EvView *view) { - compute_selections (view, &view->selection_info.start, &view->motion); + compute_selections (view, + view->selection_info.style, + &view->selection_info.start, + &view->motion); view->selection_update_id = 0; return FALSE; } @@ -2822,6 +2893,66 @@ selection_scroll_timeout_cb (EvView *view) return TRUE; } +static gboolean +ev_view_drag_update_momentum (EvView *view) +{ + int i; + if (!view->drag_info.in_drag) + return FALSE; + + for (i = DRAG_HISTORY - 1; i > 0; i--) { + view->drag_info.buffer[i].x = view->drag_info.buffer[i-1].x; + view->drag_info.buffer[i].y = view->drag_info.buffer[i-1].y; + } + + /* Momentum is a moving average of 10ms granularity over + * the last 100ms with each 10ms stored in buffer. + */ + + view->drag_info.momentum.x = (view->drag_info.buffer[DRAG_HISTORY - 1].x - view->drag_info.buffer[0].x); + view->drag_info.momentum.y = (view->drag_info.buffer[DRAG_HISTORY - 1].y - view->drag_info.buffer[0].y); + + return TRUE; +} + +static gboolean +ev_view_scroll_drag_release (EvView *view) +{ + gdouble dhadj_value, dvadj_value; + gdouble oldhadjustment, oldvadjustment; + + view->drag_info.momentum.x /= 1.2; + view->drag_info.momentum.y /= 1.2; /* Alter these constants to change "friction" */ + + dhadj_value = view->hadjustment->page_size * + (gdouble)view->drag_info.momentum.x / GTK_WIDGET (view)->allocation.width; + dvadj_value = view->vadjustment->page_size * + (gdouble)view->drag_info.momentum.y / GTK_WIDGET (view)->allocation.height; + + oldhadjustment = gtk_adjustment_get_value (view->hadjustment); + oldvadjustment = gtk_adjustment_get_value (view->vadjustment); + + if (((oldhadjustment + dhadj_value) > (view->hadjustment->upper - view->hadjustment->page_size)) || + ((oldhadjustment + dhadj_value) < 0)) + view->drag_info.momentum.x *= -0.5; /* 0.5 rather than 1 means the edges absorb some momentum */ + if (((oldvadjustment + dvadj_value) > (view->vadjustment->upper - view->vadjustment->page_size)) || + ((oldvadjustment + dvadj_value) < 0)) + view->drag_info.momentum.y *= -0.5; + + gtk_adjustment_set_value (view->hadjustment, + MIN (oldhadjustment + dhadj_value, + view->hadjustment->upper - view->hadjustment->page_size)); + gtk_adjustment_set_value (view->vadjustment, + MIN (oldvadjustment + dvadj_value, + view->vadjustment->upper - view->vadjustment->page_size)); + + if (((view->drag_info.momentum.x < 1) && (view->drag_info.momentum.x > -1)) && + ((view->drag_info.momentum.y < 1) && (view->drag_info.momentum.y > -1))) + return FALSE; + else + return TRUE; +} + static gboolean ev_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) @@ -2831,6 +2962,7 @@ ev_view_motion_notify_event (GtkWidget *widget, if (!view->document) return FALSE; + if (event->is_hint || event->window != view->layout.bin_window) { gtk_widget_get_pointer (widget, &x, &y); @@ -2839,6 +2971,10 @@ ev_view_motion_notify_event (GtkWidget *widget, y = event->y; } + if (view->scroll_info.autoscrolling) { + view->scroll_info.last_y = y; + } + if (view->selection_info.in_drag) { if (gtk_drag_check_threshold (widget, view->selection_info.start.x, @@ -2908,6 +3044,7 @@ ev_view_motion_notify_event (GtkWidget *widget, } else if (view->pressed_button == 2) { if (!view->drag_info.in_drag) { gboolean start; + int i; start = gtk_drag_check_threshold (widget, view->drag_info.start.x, @@ -2915,12 +3052,25 @@ ev_view_motion_notify_event (GtkWidget *widget, event->x_root, event->y_root); view->drag_info.in_drag = start; + view->drag_info.drag_timeout_id = g_timeout_add (10, + (GSourceFunc)ev_view_drag_update_momentum, view); + /* Set 100 to choose how long it takes to build up momentum */ + /* Clear out previous momentum info: */ + for (i = 0; i < DRAG_HISTORY; i++) { + view->drag_info.buffer[i].x = event->x; + view->drag_info.buffer[i].y = event->y; + } + view->drag_info.momentum.x = 0; + view->drag_info.momentum.y = 0; } if (view->drag_info.in_drag) { int dx, dy; gdouble dhadj_value, dvadj_value; + view->drag_info.buffer[0].x = event->x; + view->drag_info.buffer[0].y = event->y; + dx = event->x_root - view->drag_info.start.x; dy = event->y_root - view->drag_info.start.y; @@ -2954,21 +3104,23 @@ ev_view_button_release_event (GtkWidget *widget, GdkEventButton *event) { EvView *view = EV_VIEW (widget); - EvLink *link; + EvLink *link = NULL; + + view->drag_info.in_drag = FALSE; + view->image_dnd_info.in_drag = FALSE; + + view->drag_info.release_timeout_id = g_timeout_add (20, + (GSourceFunc)ev_view_scroll_drag_release, view); if (view->pressed_button == 2) { - ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); + ev_view_handle_cursor_over_xy (view, event->x, event->y); } if (view->document && view->pressed_button != 3) { link = ev_view_get_link_at_location (view, event->x, event->y); - } else { - link = NULL; } view->pressed_button = -1; - view->drag_info.in_drag = FALSE; - view->image_dnd_info.in_drag = FALSE; if (view->selection_scroll_id) { g_source_remove (view->selection_scroll_id); @@ -2979,6 +3131,14 @@ ev_view_button_release_event (GtkWidget *widget, view->selection_update_id = 0; } + if (!view->selection_info.in_selection && + view->selection_info.style != EV_SELECTION_STYLE_GLYPH) { + compute_selections (view, + view->selection_info.style, + &(view->selection_info.start), + &(view->selection_info.start)); + } + if (view->selection_info.selections) { ev_view_update_primary_selection (view); @@ -3322,9 +3482,8 @@ static gboolean ev_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event) { EvView *view = EV_VIEW (widget); - - if (view->cursor == EV_VIEW_CURSOR_LINK || - view->cursor == EV_VIEW_CURSOR_IBEAM) + + if (view->cursor != EV_VIEW_CURSOR_NORMAL) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); #if !GTK_CHECK_VERSION (2, 11, 7) @@ -3679,6 +3838,21 @@ ev_view_destroy (GtkObject *object) view->loading_text = NULL; } + if (view->scroll_info.timeout_id) { + g_source_remove (view->scroll_info.timeout_id); + view->scroll_info.timeout_id = 0; + } + + if (view->drag_info.drag_timeout_id) { + g_source_remove (view->drag_info.drag_timeout_id); + view->drag_info.drag_timeout_id = 0; + } + + if (view->drag_info.release_timeout_id) { + g_source_remove (view->drag_info.release_timeout_id); + view->drag_info.release_timeout_id = 0; + } + ev_view_presentation_transition_stop (view); ev_view_set_scroll_adjustments (GTK_LAYOUT (view), NULL, NULL); @@ -3984,6 +4158,7 @@ ev_view_init (EvView *view) view->pressed_button = -1; view->cursor = EV_VIEW_CURSOR_NORMAL; view->drag_info.in_drag = FALSE; + view->scroll_info.autoscrolling = FALSE; view->selection_info.selections = NULL; view->selection_info.in_selection = FALSE; view->selection_info.in_drag = FALSE; @@ -4164,6 +4339,45 @@ ev_view_set_loading (EvView *view, gtk_widget_queue_draw (GTK_WIDGET (view)); } +static gboolean ev_view_autoscroll_cb (EvView *view) +{ + gdouble speed, value; + + /* If the user stops autoscrolling, autoscrolling will be + * set to false but the timeout will continue; stop the timeout: */ + if (!view->scroll_info.autoscrolling) { + view->scroll_info.timeout_id = 0; + return FALSE; + } + + if (view->scroll_info.last_y > view->scroll_info.start_y && + (view->scroll_info.last_y < view->scroll_info.start_y)) + return TRUE; + + /* Replace 100 with your speed of choice: The lower the faster. + * Replace 3 with another speed of choice: The higher, the faster it accelerated + * based on the distance of the starting point from the mouse + * (All also effected by the timeout interval of this callback) */ + + if (view->scroll_info.start_y > view->scroll_info.last_y) + speed = -pow ((((gdouble)view->scroll_info.start_y - view->scroll_info.last_y) / 100), 3); + else + speed = pow ((((gdouble)view->scroll_info.last_y - view->scroll_info.start_y) / 100), 3); + + value = gtk_adjustment_get_value (view->vadjustment); + value = CLAMP (value + speed, 0, view->vadjustment->upper - view->vadjustment->page_size); + gtk_adjustment_set_value (view->vadjustment, value); + + return TRUE; + +} + +void ev_view_autoscroll(EvView *view) +{ + view->scroll_info.autoscrolling = TRUE; + view->scroll_info.timeout_id = g_timeout_add (20, (GSourceFunc)(ev_view_autoscroll_cb), view); +} + void ev_view_set_document (EvView *view, EvDocument *document) @@ -4218,7 +4432,9 @@ ev_view_set_zoom (EvView *view, else scale = factor; - scale = CLAMP (scale, view->min_scale, view->max_scale); + scale = CLAMP (scale, + view->sizing_mode == EV_SIZING_FREE ? view->min_scale : 0, + view->max_scale); if (ABS (view->scale - scale) < EPSILON) return; @@ -5061,9 +5277,10 @@ gdk_rectangle_point_in (GdkRectangle *rectangle, } static GList * -compute_new_selection_text (EvView *view, - GdkPoint *start, - GdkPoint *stop) +compute_new_selection_text (EvView *view, + EvSelectionStyle style, + GdkPoint *start, + GdkPoint *stop) { int n_pages, i, first, last; GList *list = NULL; @@ -5118,6 +5335,7 @@ compute_new_selection_text (EvView *view, selection = g_new0 (EvViewSelection, 1); selection->page = i; + selection->style = style; selection->rect.x1 = selection->rect.y1 = 0; selection->rect.x2 = width; selection->rect.y2 = height; @@ -5275,16 +5493,17 @@ merge_selection_region (EvView *view, } static void -compute_selections (EvView *view, - GdkPoint *start, - GdkPoint *stop) +compute_selections (EvView *view, + EvSelectionStyle style, + GdkPoint *start, + GdkPoint *stop) { GList *list; if (view->selection_mode == EV_VIEW_SELECTION_RECTANGLE) list = compute_new_selection_rect (view, start, stop); else - list = compute_new_selection_text (view, start, stop); + list = compute_new_selection_text (view, style, start, stop); merge_selection_region (view, list); } @@ -5309,10 +5528,10 @@ clear_selection (EvView *view) g_object_notify (G_OBJECT (view), "has-selection"); } - void ev_view_select_all (EvView *view) { + GList *selections = NULL; int n_pages, i; /* Disable selection on rotated pages for the 0.4.0 series */ @@ -5320,7 +5539,7 @@ ev_view_select_all (EvView *view) return; clear_selection (view); - + n_pages = ev_page_cache_get_n_pages (view->page_cache); for (i = 0; i < n_pages; i++) { int width, height; @@ -5333,15 +5552,15 @@ ev_view_select_all (EvView *view) selection = g_new0 (EvViewSelection, 1); selection->page = i; + selection->style = EV_SELECTION_STYLE_GLYPH; selection->rect.x1 = selection->rect.y1 = 0; selection->rect.x2 = width; selection->rect.y2 = height; - view->selection_info.selections = g_list_append (view->selection_info.selections, selection); + selections = g_list_append (selections, selection); } - ev_pixbuf_cache_set_selection_list (view->pixbuf_cache, view->selection_info.selections); - g_object_notify (G_OBJECT (view), "has-selection"); + merge_selection_region (view, selections); gtk_widget_queue_draw (GTK_WIDGET (view)); } @@ -5352,29 +5571,35 @@ ev_view_get_has_selection (EvView *view) } static char * -get_selected_text (EvView *ev_view) +get_selected_text (EvView *view) { GString *text; GList *l; gchar *normalized_text; + EvRenderContext *rc; text = g_string_new (NULL); + rc = ev_render_context_new (view->rotation, 1, view->scale); ev_document_doc_mutex_lock (); - for (l = ev_view->selection_info.selections; l != NULL; l = l->next) { + for (l = view->selection_info.selections; l != NULL; l = l->next) { EvViewSelection *selection = (EvViewSelection *)l->data; - char *tmp; + gchar *tmp; + + ev_render_context_set_page (rc, selection->page); + tmp = ev_selection_get_selected_text (EV_SELECTION (view->document), + rc, selection->style, + &(selection->rect)); - tmp = ev_document_get_text (ev_view->document, - selection->page, - &selection->rect); g_string_append (text, tmp); g_free (tmp); } ev_document_doc_mutex_unlock (); + g_object_unref (rc); + normalized_text = g_utf8_normalize (text->str, text->len, G_NORMALIZE_NFKC); g_string_free (text, TRUE); return normalized_text; @@ -5386,9 +5611,8 @@ ev_view_copy (EvView *ev_view) GtkClipboard *clipboard; char *text; - if (!ev_document_can_get_text (ev_view->document)) { + if (!EV_IS_SELECTION (ev_view->document)) return; - } text = get_selected_text (ev_view); clipboard = gtk_widget_get_clipboard (GTK_WIDGET (ev_view), @@ -5406,9 +5630,8 @@ ev_view_primary_get_cb (GtkClipboard *clipboard, EvView *ev_view = EV_VIEW (data); char *text; - if (!ev_document_can_get_text (ev_view->document)) { + if (!EV_IS_SELECTION (ev_view->document)) return; - } text = get_selected_text (ev_view); if (text) { @@ -5496,6 +5719,9 @@ ev_view_set_cursor (EvView *view, EvViewCursor new_cursor) case EV_VIEW_CURSOR_DRAG: cursor = gdk_cursor_new_for_display (display, GDK_FLEUR); break; + case EV_VIEW_CURSOR_AUTOSCROLL: + cursor = gdk_cursor_new_for_display (display, GDK_DOUBLE_ARROW); + break; } if (cursor) {