enum {
SIGNAL_BINDING_ACTIVATED,
SIGNAL_ZOOM_INVALID,
+ SIGNAL_HANDLE_LINK,
SIGNAL_EXTERNAL_LINK,
SIGNAL_POPUP_MENU,
N_SIGNALS,
view->current_page);
}
-void
+static void
ev_view_goto_dest (EvView *view, EvLinkDest *dest)
{
EvLinkDestType type;
action = ev_link_get_action (link);
if (!action)
return;
-
+
type = ev_link_action_get_action_type (action);
switch (type) {
case EV_LINK_ACTION_TYPE_GOTO_DEST: {
EvLinkDest *dest;
+ g_signal_emit (view, signals[SIGNAL_HANDLE_LINK], 0, link);
+
dest = ev_link_action_get_dest (action);
ev_view_goto_dest (view, dest);
}
}
}
-static gchar *
-page_label_from_dest (EvView *view, EvLinkDest *dest)
+gchar *
+ev_view_page_label_from_dest (EvView *view, EvLinkDest *dest)
{
EvLinkDestType type;
gchar *msg = NULL;
}
break;
+ case EV_LINK_DEST_TYPE_PAGE_LABEL: {
+ msg = g_strdup (ev_link_dest_get_page_label (dest));
+ }
+ break;
default:
msg = ev_page_cache_get_page_label (view->page_cache,
ev_link_dest_get_page (dest));
switch (type) {
case EV_LINK_ACTION_TYPE_GOTO_DEST:
- page_label = page_label_from_dest (view,
- ev_link_action_get_dest (action));
+ page_label = ev_view_page_label_from_dest (view,
+ ev_link_action_get_dest (action));
msg = g_strdup_printf (_("Go to page %s"), page_label);
g_free (page_label);
break;
view->cursor == EV_VIEW_CURSOR_IBEAM)
ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
}
- return;
}
/*** Images ***/
GdkEventButton *event)
{
EvView *view = EV_VIEW (widget);
+
+ if (!view->document)
+ return FALSE;
if (!GTK_WIDGET_HAS_FOCUS (widget)) {
gtk_widget_grab_focus (widget);
}
gtk_widget_queue_draw (widget);
- } else if ((image = ev_view_get_image_at_location (view, 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)
g_object_unref (view->image_dnd_info.image);
view->image_dnd_info.image = g_object_ref (image);
ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
}
- if (view->document && view->pressed_button == 1) {
+ if (view->document && view->pressed_button != 3) {
link = ev_view_get_link_at_location (view, event->x, event->y);
} else {
link = NULL;
view->selection_info.in_drag = FALSE;
} else if (link) {
- ev_view_handle_link (view, link);
+ if (event->button == 2) {
+ EvLinkAction *action;
+ EvLinkActionType type;
+
+ action = ev_link_get_action (link);
+ if (!action)
+ return FALSE;
+
+ type = ev_link_action_get_action_type (action);
+ if (type == EV_LINK_ACTION_TYPE_GOTO_DEST) {
+ g_signal_emit (view,
+ signals[SIGNAL_EXTERNAL_LINK],
+ 0, action);
+ }
+ } else {
+ ev_view_handle_link (view, link);
+ }
} else if (view->presentation) {
switch (event->button) {
case 1:
case GDK_Return:
case GDK_KP_Enter:
case GDK_ISO_Enter:
+ case GDK_BackSpace:
+ case GDK_Delete:
return FALSE;
default:
if (!key_is_numeric (event->keyval))
EvView *view = EV_VIEW (widget);
EvPresentationState current;
+ if (!view->document)
+ return FALSE;
+
if (!view->presentation ||
view->presentation_state == EV_PRESENTATION_END)
return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
ev_document_fc_mutex_unlock ();
}
- width = cairo_image_surface_get_width (view->loading_text) / 2;
+ width = (page_area->width - cairo_image_surface_get_width (view->loading_text)) / 2;
height = (page_area->height - cairo_image_surface_get_height (view->loading_text)) / 2;
cr = gdk_cairo_create (GTK_WIDGET (view)->window);
NULL, NULL,
ev_marshal_VOID__VOID,
G_TYPE_NONE, 0, G_TYPE_NONE);
+ signals[SIGNAL_HANDLE_LINK] = g_signal_new ("handle-link",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (EvViewClass, handle_link),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ G_TYPE_OBJECT);
signals[SIGNAL_EXTERNAL_LINK] = g_signal_new ("external-link",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
EvView *view)
{
if (view->current_page != new_page) {
+ gint x, y;
+
view->current_page = new_page;
view->pending_scroll = SCROLL_TO_PAGE_POSITION;
+
if (view->presentation)
ev_view_presentation_transition_start (view);
+
+ gtk_widget_get_pointer (GTK_WIDGET (view), &x, &y);
+ handle_link_over_xy (view, x, y);
+
gtk_widget_queue_resize (GTK_WIDGET (view));
} else {
gtk_widget_queue_draw (GTK_WIDGET (view));
}
}
-static void on_adjustment_value_changed (GtkAdjustment *adjustment,
- EvView *view)
+static void
+on_adjustment_value_changed (GtkAdjustment *adjustment,
+ EvView *view)
{
int dx = 0, dy = 0;
+ gint x, y;
if (! GTK_WIDGET_REALIZED (view))
return;
view->scroll_y = 0;
}
-
if (view->pending_resize)
gtk_widget_queue_draw (GTK_WIDGET (view));
else
gdk_window_scroll (GTK_WIDGET (view)->window, dx, dy);
-
+ gtk_widget_get_pointer (GTK_WIDGET (view), &x, &y);
+ handle_link_over_xy (view, x, y);
+
if (view->document)
view_update_range_and_current_page (view);
}
g_signal_connect (view->page_cache, "page-changed", G_CALLBACK (page_changed_cb), view);
view->pixbuf_cache = ev_pixbuf_cache_new (GTK_WIDGET (view), view->document);
g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
+ page_changed_cb (view->page_cache,
+ ev_page_cache_get_current_page (view->page_cache),
+ view);
}
static void
{
g_return_if_fail (view->sizing_mode == EV_SIZING_FREE);
+ if (view->presentation)
+ return;
+
view->pending_scroll = SCROLL_TO_CENTER;
ev_view_set_zoom (view, ZOOM_IN_FACTOR, TRUE);
}
{
g_return_if_fail (view->sizing_mode == EV_SIZING_FREE);
+ if (view->presentation)
+ return;
+
view->pending_scroll = SCROLL_TO_CENTER;
ev_view_set_zoom (view, ZOOM_OUT_FACTOR, TRUE);
}
}
text = get_selected_text (ev_view);
- gtk_selection_data_set_text (selection_data, text, -1);
- g_free (text);
+ if (text) {
+ gtk_selection_data_set_text (selection_data, text, -1);
+ g_free (text);
+ }
}
static void
if (!view->page_cache)
return FALSE;
+ if (view->presentation &&
+ (view->presentation_state == EV_PRESENTATION_BLACK ||
+ view->presentation_state == EV_PRESENTATION_WHITE)) {
+ ev_view_reset_presentation_state (view);
+ return FALSE;
+ }
+
ev_view_presentation_transition_stop (view);
ev_view_reset_presentation_state (view);
return TRUE;
}
+ if (view->presentation &&
+ (view->presentation_state == EV_PRESENTATION_BLACK ||
+ view->presentation_state == EV_PRESENTATION_WHITE)) {
+ ev_view_reset_presentation_state (view);
+ return FALSE;
+ }
+
ev_view_reset_presentation_state (view);
page = ev_page_cache_get_current_page (view->page_cache);