void cb_refresh_view(GtkWidget* GIRARA_UNUSED(view), gpointer data) { zathura_t* zathura = data; if (zathura == NULL || zathura->document == NULL) { return; } unsigned int page_id = zathura_document_get_current_page_number(zathura->document); zathura_page_t* page = zathura_document_get_page(zathura->document, page_id); if (page == NULL) { return; } GtkAdjustment* vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view)); GtkAdjustment* hadj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view)); double position_x = zathura_document_get_position_x(zathura->document); double position_y = zathura_document_get_position_y(zathura->document); zathura_adjustment_set_value_from_ratio(vadj, position_y); zathura_adjustment_set_value_from_ratio(hadj, position_x); statusbar_page_number_update(zathura); }
static void cb_view_adjustment_changed(GtkAdjustment* adjustment, zathura_t* zathura, bool width) { /* Do nothing in index mode */ if (girara_mode_get(zathura->ui.session) == zathura->modes.index) { return; } const zathura_adjust_mode_t adjust_mode = zathura_document_get_adjust_mode(zathura->document); /* Don't scroll, we're focusing the inputbar. */ if (adjust_mode == ZATHURA_ADJUST_INPUTBAR) { return; } /* Save the viewport size */ unsigned int size = (unsigned int)floor(gtk_adjustment_get_page_size(adjustment)); if (width == true) { zathura_document_set_viewport_width(zathura->document, size); } else { zathura_document_set_viewport_height(zathura->document, size); } /* reset the adjustment, in case bounds have changed */ const double ratio = width == true ? zathura_document_get_position_x(zathura->document) : zathura_document_get_position_y(zathura->document); zathura_adjustment_set_value_from_ratio(adjustment, ratio); }
void cb_view_vadjustment_value_changed(GtkAdjustment* adjustment, gpointer data) { zathura_t* zathura = data; if (zathura == NULL || zathura->document == NULL) { return; } /* Do nothing in index mode */ if (girara_mode_get(zathura->ui.session) == zathura->modes.index) { return; } update_visible_pages(zathura); double position_x = zathura_document_get_position_x(zathura->document); double position_y = zathura_adjustment_get_ratio(adjustment); unsigned int page_id = position_to_page_number(zathura->document, position_x, position_y); zathura_document_set_position_x(zathura->document, position_x); zathura_document_set_position_y(zathura->document, position_y); zathura_document_set_current_page_number(zathura->document, page_id); statusbar_page_number_update(zathura); }
bool page_is_visible(zathura_document_t *document, unsigned int page_number) { g_return_val_if_fail(document != NULL, false); /* position at the center of the viewport */ double pos_x = zathura_document_get_position_x(document); double pos_y = zathura_document_get_position_y(document); /* get the center of page page_number */ double page_x, page_y; page_number_to_position(document, page_number, 0.5, 0.5, &page_x, &page_y); unsigned int cell_width, cell_height; zathura_document_get_cell_size(document, &cell_height, &cell_width); unsigned int doc_width, doc_height; zathura_document_get_document_size(document, &doc_height, &doc_width); unsigned int view_width, view_height; zathura_document_get_viewport_size(document, &view_height, &view_width); return ( fabs(pos_x - page_x) < 0.5 * (double)(view_width + cell_width) / (double)doc_width && fabs(pos_y - page_y) < 0.5 * (double)(view_height + cell_height) / (double)doc_height); }
zathura_bookmark_t* zathura_bookmark_add(zathura_t* zathura, const gchar* id, unsigned int page) { g_return_val_if_fail(zathura && zathura->document && zathura->bookmarks.bookmarks, NULL); g_return_val_if_fail(id, NULL); double position_x = zathura_document_get_position_x(zathura->document); double position_y = zathura_document_get_position_y(zathura->document); zathura_bookmark_t* old = zathura_bookmark_get(zathura, id); if (old != NULL) { old->page = page; old->x = position_x; old->y = position_y; if (zathura->database != NULL) { const char* path = zathura_document_get_path(zathura->document); if (zathura_db_remove_bookmark(zathura->database, path, old->id) == false) { girara_warning("Failed to remove old bookmark from database."); } if (zathura_db_add_bookmark(zathura->database, path, old) == false) { girara_warning("Failed to add new bookmark to database."); } } return old; } zathura_bookmark_t* bookmark = g_try_malloc0(sizeof(zathura_bookmark_t)); if (bookmark == NULL) { return NULL; } bookmark->id = g_strdup(id); bookmark->page = page; bookmark->x = position_x; bookmark->y = position_y; girara_list_append(zathura->bookmarks.bookmarks, bookmark); if (zathura->database != NULL) { const char* path = zathura_document_get_path(zathura->document); if (zathura_db_add_bookmark(zathura->database, path, bookmark) == false) { girara_warning("Failed to add bookmark to database."); } } return bookmark; }
bool sc_jumplist(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); zathura_t* zathura = session->global.data; g_return_val_if_fail(argument != NULL, false); g_return_val_if_fail(zathura->document != NULL, false); /* if no jumps in the jumplist */ if (zathura->jumplist.size == 0) { return true; } double x = zathura_document_get_position_x(zathura->document); double y = zathura_document_get_position_y(zathura->document); zathura_jump_t* jump = NULL; zathura_jump_t* prev_jump = zathura_jumplist_current(zathura); bool go_to_current = false; if (zathura_jumplist_has_next(zathura) == false || zathura_jumplist_has_previous(zathura) == false) { if (x == prev_jump->x && y == prev_jump->y) { go_to_current = false; } else { go_to_current = true; } } switch(argument->n) { case FORWARD: if (go_to_current == true && zathura_jumplist_has_previous(zathura) == false) { jump = zathura_jumplist_current(zathura); } else { zathura_jumplist_forward(zathura); jump = zathura_jumplist_current(zathura); } break; case BACKWARD: if (go_to_current == true && zathura_jumplist_has_next(zathura) == false) { jump = zathura_jumplist_current(zathura); } else { zathura_jumplist_backward(zathura); jump = zathura_jumplist_current(zathura); } break; } if (jump == prev_jump) { if ((zathura_jumplist_has_previous(zathura) == false && argument->n == BACKWARD) || (zathura_jumplist_has_next(zathura) == false && argument->n == FORWARD)) { jump = NULL; } } if (jump != NULL) { page_set(zathura, jump->page); position_set(zathura, jump->x, jump->y); } return false; }
bool sc_scroll(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->global.data != NULL, false); zathura_t* zathura = session->global.data; g_return_val_if_fail(argument != NULL, false); if (zathura->document == NULL) { return false; } /* if TOP or BOTTOM, go there and we are done */ if (argument->n == TOP) { position_set(zathura, -1, 0); return false; } else if (argument->n == BOTTOM) { position_set(zathura, -1, 1.0); return false; } /* Retrieve current page and position */ const unsigned int page_id = zathura_document_get_current_page_number(zathura->document); double pos_x = zathura_document_get_position_x(zathura->document); double pos_y = zathura_document_get_position_y(zathura->document); /* If PAGE_TOP or PAGE_BOTTOM, go there and we are done */ if (argument->n == PAGE_TOP) { double dontcare = 0.5; page_number_to_position(zathura->document, page_id, dontcare, 0.0, &dontcare, &pos_y); position_set(zathura, pos_x, pos_y); return false; } else if (argument->n == PAGE_BOTTOM) { double dontcare = 0.5; page_number_to_position(zathura->document, page_id, dontcare, 1.0, &dontcare, &pos_y); position_set(zathura, pos_x, pos_y); return false; } if (t == 0) { t = 1; } unsigned int view_width = 0; unsigned int view_height = 0; zathura_document_get_viewport_size(zathura->document, &view_height, &view_width); unsigned int doc_width = 0; unsigned int doc_height = 0; zathura_document_get_document_size(zathura->document, &doc_height, &doc_width); float scroll_step = 40; girara_setting_get(session, "scroll-step", &scroll_step); float scroll_hstep = -1; girara_setting_get(session, "scroll-hstep", &scroll_hstep); if (scroll_hstep < 0) { scroll_hstep = scroll_step; } float scroll_full_overlap = 0.0; girara_setting_get(session, "scroll-full-overlap", &scroll_full_overlap); bool scroll_page_aware = false; girara_setting_get(session, "scroll-page-aware", &scroll_page_aware); bool scroll_wrap = false; girara_setting_get(session, "scroll-wrap", &scroll_wrap); /* compute the direction of scrolling */ double direction = 1.0; if ((argument->n == LEFT) || (argument->n == FULL_LEFT) || (argument->n == HALF_LEFT) || (argument->n == UP) || (argument->n == FULL_UP) || (argument->n == HALF_UP)) { direction = -1.0; } const double vstep = (double)view_height / (double)doc_height; const double hstep = (double)view_width / (double)doc_width; /* compute new position */ switch (argument->n) { case FULL_UP: case FULL_DOWN: pos_y += direction * (1.0 - scroll_full_overlap) * vstep; break; case FULL_LEFT: case FULL_RIGHT: pos_x += direction * (1.0 - scroll_full_overlap) * hstep; break; case HALF_UP: case HALF_DOWN: pos_y += direction * 0.5 * vstep; break; case HALF_LEFT: case HALF_RIGHT: pos_x += direction * 0.5 * hstep; break; case UP: case DOWN: pos_y += direction * t * scroll_step / (double)doc_height; break; case LEFT: case RIGHT: pos_x += direction * t * scroll_hstep / (double)doc_width; break; case BIDIRECTIONAL: { pos_x += event->x * t * scroll_hstep / (double)doc_width; pos_y += event->y * t * scroll_step / (double)doc_height; break; } } /* handle boundaries */ const double end_x = 0.5 * (double)view_width / (double)doc_width; const double end_y = 0.5 * (double)view_height / (double)doc_height; const double new_x = scroll_wrap ? 1.0 - end_x : end_x; const double new_y = scroll_wrap ? 1.0 - end_y : end_y; if (pos_x < end_x) { pos_x = new_x; } else if (pos_x > 1.0 - end_x) { pos_x = 1 - new_x; } if (pos_y < end_y) { pos_y = new_y; } else if (pos_y > 1.0 - end_y) { pos_y = 1 - new_y; } /* snap to the border if we change page */ const unsigned int new_page_id = position_to_page_number(zathura->document, pos_x, pos_y); if (scroll_page_aware == true && page_id != new_page_id) { double dummy = 0.0; switch(argument->n) { case FULL_LEFT: case HALF_LEFT: page_number_to_position(zathura->document, new_page_id, 1.0, 0.0, &pos_x, &dummy); break; case FULL_RIGHT: case HALF_RIGHT: page_number_to_position(zathura->document, new_page_id, 0.0, 0.0, &pos_x, &dummy); break; case FULL_UP: case HALF_UP: page_number_to_position(zathura->document, new_page_id, 0.0, 1.0, &dummy, &pos_y); break; case FULL_DOWN: case HALF_DOWN: page_number_to_position(zathura->document, new_page_id, 0.0, 0.0, &dummy, &pos_y); break; } } position_set(zathura, pos_x, pos_y); return false; }