X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=shell%2Fev-view.c;h=6fb577fce3a6e4910482bcc2bbbc222e0c3bcece;hb=764a2c143a33fd3d66e5732aec404d0f3da164cc;hp=fa0f087635b922e3c720859b5342418136faa7e1;hpb=02291c7a30eed2a32470219909c8cb96735f8f27;p=evince.git diff --git a/shell/ev-view.c b/shell/ev-view.c index fa0f0876..6fb577fc 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -245,11 +245,11 @@ static void find_page_at_location (EvView static EvLink* get_link_at_location (EvView *view, gdouble x, gdouble y); -static void go_to_link (EvView *view, - EvLink *link); 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); @@ -275,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, @@ -542,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; @@ -1093,23 +1097,32 @@ 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); + + ev_view_set_sizing_mode (view, EV_SIZING_FREE); + if (zoom != 0) { + ev_view_set_zoom (view, zoom, FALSE); + } - doc_point_to_view_point (view, ev_link_get_page (link), - &doc_point, &view_point); + 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); } -static void -go_to_link (EvView *view, EvLink *link) +void +ev_view_goto_link (EvView *view, EvLink *link) { EvLinkType type; const char *uri; @@ -1125,7 +1138,7 @@ go_to_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); @@ -1164,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 ***/ @@ -1365,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), @@ -1585,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; } @@ -1641,7 +1661,7 @@ ev_view_button_release_event (GtkWidget *widget, link = get_link_at_location (view, event->x + view->scroll_x, event->y + view->scroll_y); if (link) { - go_to_link (view, link); + ev_view_goto_link (view, link); } } @@ -1681,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; } @@ -2065,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;