X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-view.c;h=bc2196692ba468d9084a1ebd9ed890a020a7a994;hb=00a3581bfaaf0d5f825820c68b515415fe510b66;hp=49b0be61aaacbb15277a91244419cd7a6d418365;hpb=4942d62b873cfac27dc8e4bf3c800f22e0890d0c;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index 49b0be61..bc219669 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -247,7 +247,9 @@ static EvLink* get_link_at_location (EvView gdouble y); static char* tip_from_link (EvView *view, EvLink *link); - +static void handle_link_over_xy (EvView *view, + gint x, + gint y); /*** GtkWidget implementation ***/ static void ev_view_size_request_continuous_dual_page (EvView *view, GtkRequisition *requisition); @@ -273,6 +275,8 @@ static gboolean ev_view_motion_notify_event (GtkWidget GdkEventMotion *event); static gboolean ev_view_button_release_event (GtkWidget *widget, GdkEventButton *event); +static gboolean ev_view_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event); static gboolean ev_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event); static void ev_view_style_set (GtkWidget *widget, @@ -540,6 +544,8 @@ view_update_range_and_current_page (EvView *view) view->start_page = view->current_page; if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache)) view->end_page = view->start_page + 1; + else + view->end_page = view->start_page; } else { view->start_page = view->current_page - 1; view->end_page = view->current_page; @@ -683,10 +689,10 @@ ev_view_binding_activated (EvView *view, if (view->presentation) { switch (scroll) { case GTK_SCROLL_STEP_BACKWARD: - ev_page_cache_prev_page (view->page_cache); + ev_view_previous_page (view); break; case GTK_SCROLL_STEP_FORWARD: - ev_page_cache_next_page (view->page_cache); + ev_view_next_page (view); break; default: break; @@ -1091,16 +1097,25 @@ get_link_at_location (EvView *view, } static void -scroll_to_xyz_link (EvView *view, EvLink *link) +goto_xyz_link (EvView *view, EvLink *link) { GdkPoint view_point; EvPoint doc_point; + int height, page; + double zoom; - doc_point.x = ev_link_get_left (link); - doc_point.y = ev_link_get_top (link); + zoom = ev_link_get_zoom (link); + page = ev_link_get_page (link); + ev_page_cache_get_size (view->page_cache, page, 0, 1.0, NULL, &height); - doc_point_to_view_point (view, ev_link_get_page (link), - &doc_point, &view_point); + ev_view_set_sizing_mode (view, EV_SIZING_FREE); + if (zoom != 0) { + ev_view_set_zoom (view, zoom, FALSE); + } + + doc_point.x = ev_link_get_left (link); + doc_point.y = height - ev_link_get_top (link); + doc_point_to_view_point (view, page, &doc_point, &view_point); gtk_adjustment_set_value (view->hadjustment, view_point.x); gtk_adjustment_set_value (view->vadjustment, view_point.y); @@ -1123,7 +1138,7 @@ ev_view_goto_link (EvView *view, EvLink *link) ev_page_cache_set_current_page (view->page_cache, page); break; case EV_LINK_TYPE_PAGE_XYZ: - scroll_to_xyz_link (view, link); + goto_xyz_link (view, link); break; case EV_LINK_TYPE_EXTERNAL_URI: uri = ev_link_get_uri (link); @@ -1162,6 +1177,41 @@ tip_from_link (EvView *view, EvLink *link) return msg; } +static void +handle_link_over_xy (EvView *view, gint x, gint y) +{ + EvLink *link; + + link = get_link_at_location (view, x + view->scroll_x, y + view->scroll_y); + + if (view->link_tooltip == NULL) { + view->link_tooltip = ev_tooltip_new (GTK_WIDGET (view)); + } + + if (view->hovered_link != link) { + view->hovered_link = link; + ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip)); + } + + if (link) { + char *msg = tip_from_link (view, link); + + ev_tooltip_set_position (EV_TOOLTIP (view->link_tooltip), x, y); + ev_tooltip_set_text (EV_TOOLTIP (view->link_tooltip), msg); + ev_tooltip_activate (EV_TOOLTIP (view->link_tooltip)); + g_free (msg); + + ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK); + } else if (location_in_text (view, x + view->scroll_x, y + view->scroll_y)) { + ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM); + } else { + ev_view_set_status (view, NULL); + if (view->cursor == EV_VIEW_CURSOR_LINK || + view->cursor == EV_VIEW_CURSOR_IBEAM) + ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); + } + return; +} /*** GtkWidget implementation ***/ @@ -1363,6 +1413,7 @@ ev_view_realize (GtkWidget *widget) GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK | GDK_POINTER_MOTION_MASK | + GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), @@ -1583,36 +1634,7 @@ ev_view_motion_notify_event (GtkWidget *widget, */ } else if (view->pressed_button <= 0 && view->rotation == 0) { - EvLink *link; - - link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y); - - if (view->link_tooltip == NULL) { - view->link_tooltip = ev_tooltip_new (GTK_WIDGET (view)); - } - - if (view->hovered_link != link) { - view->hovered_link = link; - ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip)); - } - - if (link) { - char *msg = tip_from_link (view, link); - - ev_tooltip_set_position (EV_TOOLTIP (view->link_tooltip), event->x, event->y); - ev_tooltip_set_text (EV_TOOLTIP (view->link_tooltip), msg); - ev_tooltip_activate (EV_TOOLTIP (view->link_tooltip)); - g_free (msg); - - ev_view_set_cursor (view, EV_VIEW_CURSOR_LINK); - } else if (location_in_text (view, event->x + view->scroll_x, event->y + view->scroll_y)) { - ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM); - } else { - ev_view_set_status (view, NULL); - if (view->cursor == EV_VIEW_CURSOR_LINK || - view->cursor == EV_VIEW_CURSOR_IBEAM) - ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); - } + handle_link_over_xy (view, event->x, event->y); return TRUE; } @@ -1679,6 +1701,21 @@ ev_view_leave_notify_event (GtkWidget *widget, GdkEventCrossing *event) view->cursor == EV_VIEW_CURSOR_IBEAM) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); + if (view->link_tooltip) { + view->hovered_link = NULL; + ev_tooltip_deactivate (EV_TOOLTIP (view->link_tooltip)); + } + + return FALSE; +} + +static gboolean +ev_view_enter_notify_event (GtkWidget *widget, GdkEventCrossing *event) +{ + EvView *view = EV_VIEW (widget); + + handle_link_over_xy (view, event->x, event->y); + return FALSE; } @@ -2063,6 +2100,7 @@ ev_view_class_init (EvViewClass *class) widget_class->realize = ev_view_realize; widget_class->unrealize = ev_view_unrealize; widget_class->scroll_event = ev_view_scroll_event; + widget_class->enter_notify_event = ev_view_enter_notify_event; widget_class->leave_notify_event = ev_view_leave_notify_event; widget_class->style_set = ev_view_style_set; gtk_object_class->destroy = ev_view_destroy; @@ -3531,6 +3569,42 @@ ev_view_show_cursor (EvView *view) ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL); } +gboolean +ev_view_next_page (EvView *view) +{ + int page; + + g_return_val_if_fail (EV_IS_VIEW (view), FALSE); + + page = ev_page_cache_get_current_page (view->page_cache); + page = ev_view_get_dual_page (view) ? page + 2 : page + 1; + + if (page < ev_page_cache_get_n_pages (view->page_cache)) { + ev_page_cache_set_current_page (view->page_cache, page); + return TRUE; + } else { + return FALSE; + } +} + +gboolean +ev_view_previous_page (EvView *view) +{ + int page; + + g_return_val_if_fail (EV_IS_VIEW (view), FALSE); + + page = ev_page_cache_get_current_page (view->page_cache); + page = ev_view_get_dual_page (view) ? page - 2 : page - 1; + + if (page >= 0) { + ev_page_cache_set_current_page (view->page_cache, page); + return TRUE; + } else { + return FALSE; + } +} + /*** Enum description for usage in signal ***/ GType @@ -3548,4 +3622,3 @@ ev_sizing_mode_get_type (void) } return etype; } -