From: Nickolay V. Shmyrev Date: Sun, 25 Dec 2005 13:27:51 +0000 (+0000) Subject: Small cleanup and autoscrolling during selection. Thanks to Ricardo X-Git-Tag: EVINCE_0_5_0~50 X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=0fc3e8a303bdbee7e6a3431b9c5443648571fb25;p=evince.git Small cleanup and autoscrolling during selection. Thanks to Ricardo * shell/ev-view-private.h: * shell/ev-view.c: (ev_view_realize), (selection_update_idle_cb), (selection_scroll_timeout_cb), (ev_view_motion_notify_event), (ev_view_button_release_event), (ev_view_destroy): Small cleanup and autoscrolling during selection. Thanks to Ricardo Markiewicz . --- diff --git a/ChangeLog b/ChangeLog index ca3fa3ba..16bb6adb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2005-12-25 Nickolay V. Shmyrev + + * shell/ev-view-private.h: + * shell/ev-view.c: (ev_view_realize), (selection_update_idle_cb), + (selection_scroll_timeout_cb), (ev_view_motion_notify_event), + (ev_view_button_release_event), (ev_view_destroy): + + Small cleanup and autoscrolling during selection. Thanks to + Ricardo Markiewicz . + 2005-12-22 Jani Monoses * configure.ac: diff --git a/shell/ev-view-private.h b/shell/ev-view-private.h index 9cd4a74e..9a0c7731 100644 --- a/shell/ev-view-private.h +++ b/shell/ev-view-private.h @@ -35,9 +35,9 @@ typedef struct { /* Information for handling selection */ typedef struct { - gboolean in_selection; gboolean in_drag; GdkPoint start; + gboolean in_selection; GList *selections; } SelectionInfo; @@ -63,45 +63,33 @@ struct _EvView { char *status; char *find_status; + int find_result; + + EvPageCache *page_cache; + EvPixbufCache *pixbuf_cache; + EvViewCursor cursor; + EvJobRender *current_job; /* Scrolling */ GtkAdjustment *hadjustment; GtkAdjustment *vadjustment; gint scroll_x; - gint scroll_y; - - /* Information for middle clicking and dragging around. */ - DragInfo drag_info; + gint scroll_y; - /* Selection */ - gint motion_x; - gint motion_y; - guint selection_update_id; - - EvViewSelectionMode selection_mode; - SelectionInfo selection_info; - - int pressed_button; - EvViewCursor cursor; - GtkWidget *link_tooltip; - EvLink *hovered_link; - - EvPageCache *page_cache; - EvPixbufCache *pixbuf_cache; + PendingScroll pending_scroll; + gboolean pending_resize; + /* Current geometry */ + gint start_page; gint end_page; gint current_page; - - EvJobRender *current_job; - - int find_page; - int find_result; - int spacing; + gint find_page; int rotation; double scale; + int spacing; gboolean continuous; gboolean dual_page; @@ -109,8 +97,23 @@ struct _EvView { gboolean presentation; EvSizingMode sizing_mode; - PendingScroll pending_scroll; - gboolean pending_resize; + /* Common for button press handling */ + int pressed_button; + + /* Information for middle clicking and dragging around. */ + DragInfo drag_info; + + /* Selection */ + GdkPoint motion; + guint selection_update_id; + guint selection_scroll_id; + + EvViewSelectionMode selection_mode; + SelectionInfo selection_info; + + /* Links */ + GtkWidget *link_tooltip; + EvLink *hovered_link; }; struct _EvViewClass { diff --git a/shell/ev-view.c b/shell/ev-view.c index a9418dac..be6f2950 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -95,6 +95,8 @@ typedef enum { #define MIN_SCALE 0.05409 #define MAX_SCALE 4.0 +#define SCROLL_TIME 150 + /*** Scrolling ***/ static void scroll_to_current_page (EvView *view, GtkOrientation orientation); @@ -1487,6 +1489,7 @@ ev_view_realize (GtkWidget *widget) GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK | GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK; @@ -1680,29 +1683,56 @@ ev_view_drag_data_get (GtkWidget *widget, static gboolean selection_update_idle_cb (EvView *view) { - GdkPoint point; - point.x = view->motion_x; - point.y = view->motion_y; - compute_selections (view, &view->selection_info.start, &point); - + compute_selections (view, &view->selection_info.start, &view->motion); view->selection_update_id = 0; return FALSE; } +static gboolean +selection_scroll_timeout_cb (EvView *view) +{ + gint y, shift = 0; + GtkWidget *widget = GTK_WIDGET (view); + + gtk_widget_get_pointer (widget, NULL, &y); + + if (y > widget->allocation.height) { + shift = (y - widget->allocation.height) / 2; + } else if (y < 0) { + shift = y / 2; + } + + if (shift) + gtk_adjustment_set_value (view->vadjustment, + CLAMP (view->vadjustment->value + shift, + view->vadjustment->lower, + view->vadjustment->upper - + view->vadjustment->page_size)); + return TRUE; +} + static gboolean ev_view_motion_notify_event (GtkWidget *widget, GdkEventMotion *event) { EvView *view = EV_VIEW (widget); + gint x, y; if (!view->document) return FALSE; + + if (event->is_hint || event->window != widget->window) { + gtk_widget_get_pointer (widget, &x, &y); + } else { + x = event->x; + y = event->y; + } if (view->selection_info.in_drag) { if (gtk_drag_check_threshold (widget, view->selection_info.start.x, view->selection_info.start.y, - event->x, event->y)) { + x, y)) { GdkDragContext *context; GtkTargetList *target_list = gtk_target_list_new (NULL, 0); @@ -1724,16 +1754,24 @@ ev_view_motion_notify_event (GtkWidget *widget, * documents only. */ if (view->pressed_button == 1 && view->rotation == 0) { + + /* Schedule timeout to scroll during selection and additionally + * scroll once to allow arbitrary speed. */ + if (!view->selection_scroll_id) + view->selection_scroll_id = g_timeout_add (SCROLL_TIME, (GSourceFunc)selection_scroll_timeout_cb, view); + else + selection_scroll_timeout_cb (view); + view->selection_info.in_selection = TRUE; - view->motion_x = event->x + view->scroll_x; - view->motion_y = event->y + view->scroll_y; + view->motion.x = x + view->scroll_x; + view->motion.y = y + view->scroll_y; /* Queue an idle to handle the motion. We do this because * handling any selection events in the motion could be slower * than new motion events reach us. We always put it in the * idle to make sure we catch up and don't visibly lag the * mouse. */ - if (! view->selection_update_id) + if (!view->selection_update_id) view->selection_update_id = g_idle_add ((GSourceFunc)selection_update_idle_cb, view); return TRUE; @@ -1778,7 +1816,7 @@ ev_view_motion_notify_event (GtkWidget *widget, */ } else if (view->pressed_button <= 0 && view->rotation == 0) { - handle_link_over_xy (view, event->x, event->y); + handle_link_over_xy (view, x, y); return TRUE; } @@ -1806,6 +1844,15 @@ ev_view_button_release_event (GtkWidget *widget, view->pressed_button = -1; view->drag_info.in_drag = FALSE; + if (view->selection_scroll_id) { + g_source_remove (view->selection_scroll_id); + view->selection_scroll_id = 0; + } + if (view->selection_update_id) { + g_source_remove (view->selection_update_id); + view->selection_update_id = 0; + } + if (view->selection_info.selections) { ev_view_update_primary_selection (view); @@ -2156,6 +2203,16 @@ ev_view_destroy (GtkObject *object) gtk_widget_destroy (view->link_tooltip); } + if (view->selection_scroll_id) { + g_source_remove (view->selection_scroll_id); + view->selection_scroll_id = 0; + } + + if (view->selection_update_id) { + g_source_remove (view->selection_update_id); + view->selection_update_id = 0; + } + ev_view_set_scroll_adjustments (view, NULL, NULL); GTK_OBJECT_CLASS (ev_view_parent_class)->destroy (object);