summaryrefslogtreecommitdiff
path: root/libview
diff options
context:
space:
mode:
Diffstat (limited to 'libview')
-rw-r--r--libview/ev-view-private.h1
-rw-r--r--libview/ev-view.c238
2 files changed, 133 insertions, 106 deletions
diff --git a/libview/ev-view-private.h b/libview/ev-view-private.h
index c286efbe..abdd43b7 100644
--- a/libview/ev-view-private.h
+++ b/libview/ev-view-private.h
@@ -217,6 +217,7 @@ struct _EvView {
/* Caret navigation */
gboolean caret_enabled;
gint cursor_offset;
+ gint cursor_page;
gboolean cursor_visible;
guint cursor_blink_timeout_id;
guint cursor_blink_time;
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 89ef5196..d2c5a807 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -3954,7 +3954,7 @@ draw_caret_cursor (EvView *view,
{
GdkRectangle view_rect;
- if (!get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->current_page, &view_rect))
+ if (!get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->cursor_page, &view_rect))
return;
view_rect.x = view_rect.x - view->scroll_x;
@@ -4030,7 +4030,7 @@ ev_view_draw (GtkWidget *widget,
draw_one_page (view, i, cr, &page_area, &border, area, &page_ready);
- if (page_ready && view->caret_enabled && view->current_page == i && view->cursor_visible)
+ if (page_ready && view->caret_enabled && view->cursor_page == i && view->cursor_visible)
draw_caret_cursor (view, cr);
if (page_ready && view->find_pages && view->highlight_find_results)
highlight_find_results (view, cr, i);
@@ -4844,6 +4844,100 @@ ev_view_forward_key_event_to_focused_child (EvView *view,
}
static gboolean
+go_to_next_page (EvView *view,
+ gint page)
+{
+ int n_pages;
+ gboolean dual_page;
+
+ if (!view->document)
+ return FALSE;
+
+ n_pages = ev_document_get_n_pages (view->document);
+
+ dual_page = is_dual_page (view, NULL);
+ page += dual_page ? 2 : 1;
+
+ if (page < n_pages)
+ ev_document_model_set_page (view->model, page);
+ else if (dual_page && page == n_pages)
+ ev_document_model_set_page (view->model, page - 1);
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+go_to_previous_page (EvView *view,
+ gint page)
+{
+ gboolean dual_page;
+
+ if (!view->document)
+ return FALSE;
+
+ dual_page = is_dual_page (view, NULL);
+ page -= dual_page ? 2 : 1;
+
+ if (page >= 0)
+ ev_document_model_set_page (view->model, page);
+ else if (dual_page && page == -1)
+ ev_document_model_set_page (view->model, 0);
+ else
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+cursor_go_to_page_start (EvView *view)
+{
+ view->cursor_offset = 0;
+
+ return TRUE;
+}
+
+static gboolean
+cursor_go_to_page_end (EvView *view)
+{
+ PangoLogAttr *log_attrs = NULL;
+ gulong n_attrs;
+
+ if (!view->page_cache)
+ return FALSE;
+
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
+ if (!log_attrs)
+ return FALSE;
+
+ view->cursor_offset = n_attrs;
+
+ return TRUE;
+}
+
+static gboolean
+cursor_go_to_next_page (EvView *view)
+{
+ if (go_to_next_page (view, view->cursor_page)) {
+ view->cursor_page = ev_document_model_get_page (view->model);
+ return cursor_go_to_page_start (view);
+ }
+
+ return FALSE;
+}
+
+static gboolean
+cursor_go_to_previous_page (EvView *view)
+{
+ if (go_to_previous_page (view, view->cursor_page)) {
+ view->cursor_page = ev_document_model_get_page (view->model);
+ return cursor_go_to_page_end (view);
+ }
+ return FALSE;
+}
+
+static gboolean
cursor_backward_char (EvView *view)
{
PangoLogAttr *log_attrs = NULL;
@@ -4852,12 +4946,12 @@ cursor_backward_char (EvView *view)
if (!view->page_cache)
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (!log_attrs)
return FALSE;
if (view->cursor_offset == 0)
- return ev_view_previous_page (view);
+ return cursor_go_to_previous_page (view);
do {
view->cursor_offset--;
@@ -4875,12 +4969,12 @@ cursor_forward_char (EvView *view)
if (!view->page_cache)
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (!log_attrs)
return FALSE;
if (view->cursor_offset >= n_attrs)
- return ev_view_next_page (view);
+ return cursor_go_to_next_page (view);
do {
view->cursor_offset++;
@@ -4899,14 +4993,14 @@ cursor_backward_word_start (EvView *view)
if (!view->page_cache)
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (!log_attrs)
return FALSE;
/* Skip current word starts */
for (i = view->cursor_offset; i >= 0 && log_attrs[i].is_word_start; i--);
if (i <= 0) {
- if (ev_view_previous_page (view))
+ if (cursor_go_to_previous_page (view))
return cursor_backward_word_start (view);
return FALSE;
}
@@ -4928,14 +5022,14 @@ cursor_forward_word_end (EvView *view)
if (!view->page_cache)
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (!log_attrs)
return FALSE;
/* Skip current current word ends */
for (i = view->cursor_offset; i < n_attrs && log_attrs[i].is_word_end; i++);
if (i >= n_attrs) {
- if (ev_view_next_page (view))
+ if (cursor_go_to_next_page (view))
return cursor_forward_word_end (view);
return FALSE;
}
@@ -4957,7 +5051,7 @@ cursor_go_to_line_start (EvView *view)
if (!view->page_cache)
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (!log_attrs)
return FALSE;
@@ -4978,9 +5072,9 @@ cursor_backward_line (EvView *view)
return FALSE;
if (view->cursor_offset == 0)
- return ev_view_previous_page (view);
+ return cursor_go_to_previous_page (view);
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
do {
view->cursor_offset--;
@@ -4999,7 +5093,7 @@ cursor_go_to_line_end (EvView *view)
if (!view->page_cache)
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (!log_attrs)
return FALSE;
@@ -5026,10 +5120,10 @@ cursor_forward_line (EvView *view)
if (!cursor_go_to_line_end (view))
return FALSE;
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
+ ev_page_cache_get_text_log_attrs (view->page_cache, view->cursor_page, &log_attrs, &n_attrs);
if (view->cursor_offset == n_attrs)
- return ev_view_next_page (view);
+ return cursor_go_to_next_page (view);
do {
view->cursor_offset++;
@@ -5039,41 +5133,21 @@ cursor_forward_line (EvView *view)
}
static gboolean
-cursor_go_to_page_start (EvView *view)
-{
- view->cursor_offset = 0;
-
- return TRUE;
-}
-
-static gboolean
-cursor_go_to_page_end (EvView *view)
-{
- PangoLogAttr *log_attrs = NULL;
- gulong n_attrs;
-
- if (!view->page_cache)
- return FALSE;
-
- ev_page_cache_get_text_log_attrs (view->page_cache, view->current_page, &log_attrs, &n_attrs);
- if (!log_attrs)
- return FALSE;
-
- view->cursor_offset = n_attrs;
-
- return TRUE;
-}
-
-static gboolean
caret_key_press_event (EvView *view,
GdkEventKey *event)
{
+ gint prev_offset;
+ gint prev_page;
+
/* Disable caret navigation on rotated pages */
if (view->rotation != 0)
return FALSE;
view->cursor_blink_time = 0;
+ prev_offset = view->cursor_offset;
+ prev_page = view->cursor_page;
+
switch (event->keyval) {
case GDK_KEY_Left:
if (event->state & GDK_CONTROL_MASK)
@@ -5105,6 +5179,18 @@ caret_key_press_event (EvView *view,
ev_view_pend_cursor_blink (view);
+ /* If the caret cursor was updated, make it visible */
+ if (prev_offset != view->cursor_offset || prev_page != view->cursor_page) {
+ GdkRectangle view_rect;
+
+ /* scroll to view the text caret */
+ if (!get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->cursor_page, &view_rect))
+ return TRUE;
+
+ ensure_rectangle_is_visible (view, &view_rect);
+ gtk_widget_queue_draw (GTK_WIDGET (view));
+ }
+
return TRUE;
}
@@ -5117,18 +5203,8 @@ ev_view_key_press_event (GtkWidget *widget,
if (!view->document)
return FALSE;
- if (view->caret_enabled && caret_key_press_event (view, event)) {
- GdkRectangle view_rect;
-
- /* scroll to view the text caret */
- if (!get_caret_cursor_rect_from_offset (view, view->cursor_offset, view->current_page, &view_rect))
- return TRUE;
-
- ensure_rectangle_is_visible (view, &view_rect);
- gtk_widget_queue_draw (GTK_WIDGET (view));
-
+ if (view->caret_enabled && caret_key_press_event (view, event))
return TRUE;
- }
if (!gtk_widget_has_focus (widget))
return ev_view_forward_key_event_to_focused_child (view, event);
@@ -5991,6 +6067,7 @@ ev_view_init (EvView *view)
view->jump_to_find_result = TRUE;
view->highlight_find_results = FALSE;
view->caret_enabled = FALSE;
+ view->cursor_page = 0;
view->zoom_center_x = -1;
view->zoom_center_y = -1;
@@ -7570,68 +7647,17 @@ ev_view_show_cursor (EvView *view)
gboolean
ev_view_next_page (EvView *view)
{
- int page, n_pages;
- gboolean dual_page;
-
g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
-
- if (!view->document)
- return FALSE;
-
- page = ev_document_model_get_page (view->model);
- n_pages = ev_document_get_n_pages (view->document);
-
- dual_page = is_dual_page (view, NULL);
- if (dual_page)
- page = page + 2;
- else
- page = page + 1;
-
- if (page < n_pages) {
- ev_document_model_set_page (view->model, page);
- } else if (dual_page && page == n_pages) {
- ev_document_model_set_page (view->model, page - 1);
- } else {
- return FALSE;
- }
-
- if (view->caret_enabled)
- cursor_go_to_page_start (view);
- return TRUE;
+ return go_to_next_page (view, view->current_page);
}
gboolean
ev_view_previous_page (EvView *view)
{
- int page;
- gboolean dual_page;
-
g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
- if (!view->document)
- return FALSE;
-
- page = ev_document_model_get_page (view->model);
-
- dual_page = is_dual_page (view, NULL);
- if (dual_page)
- page = page - 2;
- else
- page = page - 1;
-
- if (page >= 0) {
- ev_document_model_set_page (view->model, page);
- } else if (dual_page && page == -1) {
- ev_document_model_set_page (view->model, 0);
- } else {
- return FALSE;
- }
-
- if (view->caret_enabled)
- cursor_go_to_page_end (view);
-
- return TRUE;
+ return go_to_previous_page (view, view->current_page);
}
/**