From 57291989c501f3bf71e0c84ccc5de5b6be90aae0 Mon Sep 17 00:00:00 2001 From: Sebastian Ramacher Date: Tue, 7 Feb 2012 14:56:58 +0100 Subject: [PATCH] calculate visible pages and update current page number --- callbacks.c | 52 ++++++++++++++++++++++++++++++++-------------- page_view_widget.c | 25 +++++++++++++++++++++- shortcuts.c | 16 ++++++++++++++ utils.c | 22 ++++---------------- utils.h | 2 +- zathura.c | 10 ++++----- 6 files changed, 85 insertions(+), 42 deletions(-) diff --git a/callbacks.c b/callbacks.c index 5b29da3..0af6c48 100644 --- a/callbacks.c +++ b/callbacks.c @@ -40,41 +40,61 @@ buffer_changed(girara_session_t* session) } void -cb_view_vadjustment_value_changed(GtkAdjustment *adjustment, gpointer data) +cb_view_vadjustment_value_changed(GtkAdjustment* GIRARA_UNUSED(adjustment), gpointer data) { zathura_t* zathura = data; if (!zathura || !zathura->document || !zathura->document->pages || !zathura->ui.page_view) { return; } - /* get current adjustment values */ - gdouble lower = gtk_adjustment_get_value(adjustment); - gdouble upper = lower + gtk_adjustment_get_page_size(adjustment); + GtkAdjustment* view_vadjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view)); + GtkAdjustment* view_hadjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view)); + GdkRectangle view_rect; + /* get current adjustment values */ + view_rect.y = gtk_adjustment_get_value(view_vadjustment); + view_rect.height = gtk_adjustment_get_page_size(view_vadjustment); + view_rect.x = gtk_adjustment_get_value(view_hadjustment); + view_rect.width = gtk_adjustment_get_page_size(view_hadjustment); + + int page_padding = 1; + girara_setting_get(zathura->ui.session, "page-padding", &page_padding); + + GdkRectangle center; + center.x = view_rect.x + (view_rect.width + 1) / 2; + center.y = view_rect.y + (view_rect.height + 1) / 2; + center.height = center.width = 2*page_padding + 1; + + bool updated = false; /* find page that fits */ for (unsigned int page_id = 0; page_id < zathura->document->number_of_pages; page_id++) { zathura_page_t* page = zathura->document->pages[page_id]; - page_offset_t* offset = page_calculate_offset(page); - if (offset == NULL) { - continue; - } + page_offset_t offset; + page_calculate_offset(page, &offset); - double begin = offset->y; - double end = offset->y + page->height * zathura->document->scale; + GdkRectangle page_rect; + page_rect.x = offset.x; + page_rect.y = offset.y; + page_rect.width = page->width * zathura->document->scale; + page_rect.height = page->height * zathura->document->scale; - if ( ( (begin >= lower) && (end <= upper) ) /* [> page is in viewport <]*/ - || ( (begin <= lower) && (end >= lower) && (end <= upper) ) /* [> end of the page is in viewport <] */ - || ( (begin >= lower) && (end >= upper) && (begin <= upper) ) /* [> begin of the page is in viewport <] */ - ) { + if (gdk_rectangle_intersect(&view_rect, &page_rect, NULL) == TRUE) { page->visible = true; + girara_info("page %d visible", page_id); + + if (updated == false && gdk_rectangle_intersect(¢er, &page_rect, NULL) == TRUE) { + zathura->document->current_page_number = page_id; + updated = true; + } } else { page->visible = false; + girara_info("page %d not visible", page_id); } - - free(offset); } + + statusbar_page_number_update(zathura); } void diff --git a/page_view_widget.c b/page_view_widget.c index e1808cd..c5a76b4 100644 --- a/page_view_widget.c +++ b/page_view_widget.c @@ -29,6 +29,16 @@ static gboolean zathura_page_view_expose(GtkWidget* widget, GdkEventExpose* even static void zathura_page_view_finalize(GObject* object); static void zathura_page_view_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); static void zathura_page_view_size_allocate(GtkWidget* widget, GdkRectangle* allocation); +static void zathura_page_view_grab_focus(GtkWidget* widget); + +static gboolean zathura_page_view_focus_in(GtkWidget *widget, GtkDirectionType GIRARA_UNUSED(event)) +{ + ZathuraPageView* view = ZATHURA_PAGE_VIEW(widget); + zathura_page_view_private_t* priv = ZATHURA_PAGE_VIEW_GET_PRIVATE(view); + + girara_info("lala: %d", priv->page->number); + return false; +} enum properties_e { @@ -46,6 +56,8 @@ zathura_page_view_class_init(ZathuraPageViewClass* class) GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(class); widget_class->expose_event = zathura_page_view_expose; widget_class->size_allocate = zathura_page_view_size_allocate; + widget_class->grab_focus = zathura_page_view_grab_focus; + widget_class->focus = zathura_page_view_focus_in; GObjectClass* object_class = G_OBJECT_CLASS(class); object_class->finalize = zathura_page_view_finalize; @@ -67,7 +79,9 @@ zathura_page_view_init(ZathuraPageView* widget) /* we want mouse events */ gtk_widget_add_events(GTK_WIDGET(widget), - GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_FOCUS_CHANGE_MASK); + /* widgets can focus */ + gtk_widget_set_can_focus(GTK_WIDGET(widget), TRUE); } GtkWidget* @@ -286,3 +300,12 @@ zathura_page_view_clear_rectangles(ZathuraPageView* widget) GIRARA_LIST_FOREACH_END(priv->rectangles, pv_rect_t*, iter, rect); girara_list_clear(priv->rectangles); } + +static void +zathura_page_view_grab_focus(GtkWidget* widget) +{ + ZathuraPageView* view = ZATHURA_PAGE_VIEW(widget); + zathura_page_view_private_t* priv = ZATHURA_PAGE_VIEW_GET_PRIVATE(view); + + girara_info("lala: %d", priv->page->number); +} diff --git a/shortcuts.c b/shortcuts.c index bc8d85c..4712a2b 100644 --- a/shortcuts.c +++ b/shortcuts.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "callbacks.h" @@ -18,7 +19,20 @@ bool sc_abort(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { + girara_info("in sc_abort"); + g_return_val_if_fail(session != NULL, false); + g_return_val_if_fail(session->global.data != NULL, false); + zathura_t* zathura = session->global.data; + + for (unsigned int page_id = 0; page_id < zathura->document->number_of_pages; ++page_id) { + zathura_page_t* page = zathura->document->pages[page_id]; + if (page == NULL) { + continue; + } + + zathura_page_view_clear_rectangles(ZATHURA_PAGE_VIEW(page->drawing_area)); + } girara_mode_set(session, session->modes.normal); @@ -314,6 +328,8 @@ sc_search(girara_session_t* session, girara_argument_t* argument, zathura_t* zathura = session->global.data; g_return_val_if_fail(argument != NULL, false); g_return_val_if_fail(zathura->document != NULL, false); + + girara_info("in sc_search"); return false; } diff --git a/utils.c b/utils.c index cdd9909..920c2dc 100644 --- a/utils.c +++ b/utils.c @@ -178,28 +178,14 @@ document_index_build(GtkTreeModel* model, GtkTreeIter* parent, GIRARA_LIST_FOREACH_END(list, gchar*, iter, name); } -page_offset_t* -page_calculate_offset(zathura_page_t* page) +void +page_calculate_offset(zathura_page_t* page, page_offset_t* offset) { - if (page == NULL || page->document == NULL || page->document->zathura == NULL) { - return NULL; - } - - page_offset_t* offset = malloc(sizeof(page_offset_t)); - - if (offset == NULL) { - return NULL; - } - + g_return_if_fail(page != NULL && page->document != NULL && page->document->zathura != NULL && offset != NULL); zathura_document_t* document = page->document; zathura_t* zathura = document->zathura; - if (gtk_widget_translate_coordinates(page->drawing_area, zathura->ui.page_view, 0, 0, &(offset->x), &(offset->y)) == false) { - free(offset); - return NULL; - } - - return offset; + g_return_if_fail(gtk_widget_translate_coordinates(page->drawing_area, zathura->ui.page_view, 0, 0, &(offset->x), &(offset->y)) == true); } zathura_rectangle_t diff --git a/utils.h b/utils.h index 733f833..e94613f 100644 --- a/utils.h +++ b/utils.h @@ -69,7 +69,7 @@ void document_index_build(GtkTreeModel* model, GtkTreeIter* parent, girara_tree_ * @param page The Page * @return The calculated offset or NULL if an error occured */ -page_offset_t* page_calculate_offset(zathura_page_t* page); +void page_calculate_offset(zathura_page_t* page, page_offset_t* offset); /** * Calculates the new coordinates based on the rotation and scale level of the diff --git a/zathura.c b/zathura.c index 08765cd..9481d55 100644 --- a/zathura.c +++ b/zathura.c @@ -568,15 +568,13 @@ page_set(zathura_t* zathura, unsigned int page_id) goto error_out; } - page_offset_t* offset = page_calculate_offset(page); - if (offset == NULL) { - goto error_out; - } + page_offset_t offset; + page_calculate_offset(page, &offset); GtkAdjustment* view_vadjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view)); GtkAdjustment* view_hadjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(zathura->ui.session->gtk.view)); - gtk_adjustment_set_value(view_hadjustment, offset->x); - gtk_adjustment_set_value(view_vadjustment, offset->y); + gtk_adjustment_set_value(view_hadjustment, offset.x); + gtk_adjustment_set_value(view_vadjustment, offset.y); /* update page number */ zathura->document->current_page_number = page_id;