582
582
view->jump_to_find_result = FALSE;
584
if (view->presentation) {
584
if (view->presentation || view->sizing_mode == EV_SIZING_BEST_FIT) {
585
585
switch (scroll) {
586
586
case EV_SCROLL_PAGE_BACKWARD:
587
587
case EV_SCROLL_STEP_BACKWARD:
1055
get_doc_point_from_offset (EvView *view,
1065
ev_page_cache_get_size (view->page_cache, page,
1070
x_offset = x_offset / view->scale;
1071
y_offset = y_offset / view->scale;
1073
if (view->rotation == 0) {
1076
} else if (view->rotation == 90) {
1078
y = width - x_offset;
1079
} else if (view->rotation == 180) {
1080
x = width - x_offset;
1081
y = height - y_offset;
1082
} else if (view->rotation == 270) {
1083
x = height - y_offset;
1086
g_assert_not_reached ();
1054
1095
/*** Hyperref ***/
1055
1096
static EvLink *
1056
1097
ev_view_get_link_at_location (EvView *view,
1069
1111
if (page == -1)
1115
if (get_doc_point_from_offset (view, page, x_offset,
1116
y_offset, &x_new, &y_new) == FALSE)
1072
1119
link_mapping = ev_pixbuf_cache_get_link_mapping (view->pixbuf_cache, page);
1074
1121
if (link_mapping)
1075
return ev_link_mapping_find (link_mapping, x_offset / view->scale, y_offset / view->scale);
1122
return ev_link_mapping_find (link_mapping, x_new, y_new);
1790
draw_end_presentation_page (EvView *view,
1791
GdkRectangle *page_area)
1793
PangoLayout *layout;
1794
PangoFontDescription *font_desc;
1796
const gchar *text = _("End of presentation. Press Escape to exit.");
1798
if (view->presentation_state != EV_PRESENTATION_END)
1801
layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), NULL);
1802
markup = g_strdup_printf ("<span foreground=\"white\">%s</span>", text);
1803
pango_layout_set_markup (layout, markup, -1);
1806
font_desc = pango_font_description_new ();
1807
pango_font_description_set_size (font_desc, 16 * PANGO_SCALE);
1808
pango_layout_set_font_description (layout, font_desc);
1810
gtk_paint_layout (GTK_WIDGET (view)->style,
1811
GTK_WIDGET (view)->window,
1812
GTK_WIDGET_STATE (view),
1821
pango_font_description_free (font_desc);
1822
g_object_unref (layout);
1742
1825
static gboolean
1743
1826
ev_view_expose_event (GtkWidget *widget,
1744
1827
GdkEventExpose *event)
1746
1829
EvView *view = EV_VIEW (widget);
1832
if (view->presentation) {
1833
switch (view->presentation_state) {
1834
case EV_PRESENTATION_END: {
1835
GdkRectangle area = {0};
1837
area.width = widget->allocation.width;
1838
area.height = widget->allocation.height;
1840
draw_end_presentation_page (view, &area);
1843
case EV_PRESENTATION_BLACK:
1844
case EV_PRESENTATION_WHITE:
1846
case EV_PRESENTATION_NORMAL:
1749
1852
if (view->loading) {
1750
1853
GdkRectangle area = {0};
2014
/* For the Evince 0.4.x release, we limit links to un-rotated documents
2017
} else if (view->pressed_button <= 0 &&
2018
view->rotation == 0) {
2117
} else if (view->pressed_button <= 0) {
2019
2118
handle_link_over_xy (view, x, y);
2180
ev_view_key_press_event (GtkWidget *widget,
2183
EvView *view = EV_VIEW (widget);
2184
EvPresentationState current;
2186
if (!view->presentation ||
2187
view->presentation_state == EV_PRESENTATION_END)
2188
return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
2191
current = view->presentation_state;
2193
switch (event->keyval) {
2196
view->presentation_state =
2197
(view->presentation_state == EV_PRESENTATION_BLACK) ?
2198
EV_PRESENTATION_NORMAL : EV_PRESENTATION_BLACK;
2202
view->presentation_state =
2203
(view->presentation_state == EV_PRESENTATION_WHITE) ?
2204
EV_PRESENTATION_NORMAL : EV_PRESENTATION_WHITE;
2207
if (view->presentation_state == EV_PRESENTATION_BLACK ||
2208
view->presentation_state == EV_PRESENTATION_WHITE) {
2209
view->presentation_state = EV_PRESENTATION_NORMAL;
2213
if (current == view->presentation_state)
2214
return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
2216
switch (view->presentation_state) {
2217
case EV_PRESENTATION_NORMAL:
2218
case EV_PRESENTATION_BLACK:
2219
gdk_window_set_background (widget->window,
2220
&widget->style->black);
2222
case EV_PRESENTATION_WHITE:
2223
gdk_window_set_background (widget->window,
2224
&widget->style->white);
2227
return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
2230
gtk_widget_queue_draw (widget);
2081
2235
ev_view_focus_in (GtkWidget *widget,
2082
2236
GdkEventFocus *event)
2228
2382
double real_scale;
2229
2383
int target_width;
2385
/* Don't annoy users with loading messages during presentations.
2386
* FIXME: Temporary "workaround" for
2387
* http://bugzilla.gnome.org/show_bug.cgi?id=320352 */
2388
if (view->presentation)
2231
2391
const char *loading_text = _("Loading...");
2393
ev_document_fc_mutex_lock ();
2233
2395
layout = gtk_widget_create_pango_layout (GTK_WIDGET (view), loading_text);
2235
2397
font_desc = pango_font_description_new ();
2552
2716
widget_class->button_press_event = ev_view_button_press_event;
2553
2717
widget_class->motion_notify_event = ev_view_motion_notify_event;
2554
2718
widget_class->button_release_event = ev_view_button_release_event;
2719
widget_class->key_press_event = ev_view_key_press_event;
2555
2720
widget_class->focus_in_event = ev_view_focus_in;
2556
2721
widget_class->focus_out_event = ev_view_focus_out;
2557
2722
widget_class->get_accessible = ev_view_get_accessible;
2725
2890
view->continuous = TRUE;
2726
2891
view->dual_page = FALSE;
2727
2892
view->presentation = FALSE;
2893
view->presentation_state = EV_PRESENTATION_NORMAL;
2728
2894
view->fullscreen = FALSE;
2729
2895
view->sizing_mode = EV_SIZING_FIT_WIDTH;
2730
2896
view->pending_scroll = SCROLL_TO_KEEP_POSITION;
3014
3180
if (view->presentation == presentation)
3184
view->presentation_state = EV_PRESENTATION_NORMAL;
3017
3186
view->presentation = presentation;
3018
3187
view->pending_scroll = SCROLL_TO_PAGE_POSITION;
3019
3188
gtk_widget_queue_resize (GTK_WIDGET (view));
4125
4293
ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
4297
ev_view_reset_presentation_state (EvView *view)
4299
if (!view->presentation ||
4300
view->presentation_state == EV_PRESENTATION_NORMAL)
4303
view->presentation_state = EV_PRESENTATION_NORMAL;
4304
gdk_window_set_background (GTK_WIDGET (view)->window,
4305
>K_WIDGET (view)->style->black);
4306
gtk_widget_queue_draw (GTK_WIDGET (view));
4129
4310
ev_view_next_page (EvView *view)
4133
4314
g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
4135
4316
if (!view->page_cache)
4319
ev_view_reset_presentation_state (view);
4138
4321
page = ev_page_cache_get_current_page (view->page_cache);
4322
n_pages = ev_page_cache_get_n_pages (view->page_cache);
4140
4324
if (view->dual_page && !view->presentation)
4141
4325
page = page + 2;
4143
4327
page = page + 1;
4145
if (page < ev_page_cache_get_n_pages (view->page_cache)) {
4329
if (page < n_pages) {
4146
4330
ev_page_cache_set_current_page (view->page_cache, page);
4148
} else if (ev_view_get_dual_page (view) && page == ev_page_cache_get_n_pages (view->page_cache)) {
4332
} else if (view->presentation && page == n_pages) {
4333
view->presentation_state = EV_PRESENTATION_END;
4334
gtk_widget_queue_draw (GTK_WIDGET (view));
4336
} else if (view->dual_page && page == n_pages) {
4149
4337
ev_page_cache_set_current_page (view->page_cache, page - 1);
4163
4351
if (!view->page_cache)
4354
if (view->presentation &&
4355
view->presentation_state == EV_PRESENTATION_END) {
4356
ev_view_reset_presentation_state (view);
4360
ev_view_reset_presentation_state (view);
4166
4362
page = ev_page_cache_get_current_page (view->page_cache);
4168
4364
if (view->dual_page && !view->presentation)