From 47565f7ff3bbb1d56e2a7851c44ae10981c229ac Mon Sep 17 00:00:00 2001 From: Nickolay V. Shmyrev Date: Wed, 28 Dec 2005 13:37:40 +0000 Subject: Fix for the bug #325067 with more intelligent selection of current link in * backend/ev-link.c: (ev_link_get_page), (ev_link_init): * shell/ev-page-action.c: (build_new_tree_cb): * shell/ev-sidebar-links.c: (links_page_num_func), (update_page_callback_foreach), (update_page_callback): * shell/ev-view.c: (scroll_to_current_page): Fix for the bug #325067 with more intelligent selection of current link in sidebar. Make sidebar handle links of FITR-like type more correctly. * dvi/pixbuf-device.c: (dvi_pixbuf_draw_rule), (dvi_pixbuf_put_pixel): Fix memory consumtion with disabled alpha channel. --- diff --git a/ChangeLog b/ChangeLog index 44f695d..051e3a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,22 @@ 2005-12-28 Nickolay V. Shmyrev + * backend/ev-link.c: (ev_link_get_page), (ev_link_init): + * shell/ev-page-action.c: (build_new_tree_cb): + * shell/ev-sidebar-links.c: (links_page_num_func), + (update_page_callback_foreach), (update_page_callback): + * shell/ev-view.c: (scroll_to_current_page): + + Fix for the bug #325067 with more intelligent selection + of current link in sidebar. Make sidebar handle links + of FITR-like type more correctly. + + * dvi/pixbuf-device.c: (dvi_pixbuf_draw_rule), + (dvi_pixbuf_put_pixel): + + Fix memory consumtion with disabled alpha channel. + +2005-12-28 Nickolay V. Shmyrev + * data/evince-ui.xml: * shell/ev-window.c: (view_menu_popup_cb), (ev_popup_cmd_open_link), (ev_window_init): diff --git a/backend/ev-link.c b/backend/ev-link.c index b8721d9..a325c35 100644 --- a/backend/ev-link.c +++ b/backend/ev-link.c @@ -120,7 +120,7 @@ ev_link_get_link_type (EvLink *self) int ev_link_get_page (EvLink *self) { - g_return_val_if_fail (EV_IS_LINK (self), 0); + g_return_val_if_fail (EV_IS_LINK (self), -1); return self->priv->page; } @@ -316,7 +316,7 @@ static void ev_link_init (EvLink *ev_link) { ev_link->priv = EV_LINK_GET_PRIVATE (ev_link); - + ev_link->priv->page = -1; ev_link->priv->type = EV_LINK_TYPE_TITLE; } diff --git a/dvi/pixbuf-device.c b/dvi/pixbuf-device.c index 1a81c01..1ef4365 100644 --- a/dvi/pixbuf-device.c +++ b/dvi/pixbuf-device.c @@ -70,25 +70,22 @@ static void dvi_pixbuf_draw_rule(DviContext *dvi, int x, int y, Uint w, Uint h, return; rowstride = gdk_pixbuf_get_rowstride (c_device->pixbuf); - p = gdk_pixbuf_get_pixels (c_device->pixbuf) + rowstride * y + 4 * x; + p = gdk_pixbuf_get_pixels (c_device->pixbuf) + rowstride * y + 3 * x; for (i = 0; i < h; i++) { if (i == 0 || i == h - 1 || fill) { for (j = 0; j < w; j++) { - p[j * 4] = red; - p[j * 4 + 1] = green; - p[j * 4 + 2] = blue; - p[j * 4 + 3] = 0xff; + p[j * 3] = red; + p[j * 3 + 1] = green; + p[j * 3 + 2] = blue; } } else { p[0] = red; p[1] = green; p[2] = blue; - p[3] = 0xff; - p[(w - 1) * 4] = red; - p[(w - 1) * 4 + 1] = green; - p[(w - 1) * 4 + 2] = blue; - p[(w - 1) * 4 + 3] = 0xff; + p[(w - 1) * 3] = red; + p[(w - 1) * 3 + 1] = green; + p[(w - 1) * 3 + 2] = blue; } p += rowstride; } @@ -142,12 +139,11 @@ static void dvi_pixbuf_put_pixel(void *image, int x, int y, Ulong color) { guchar *p; - p = gdk_pixbuf_get_pixels (GDK_PIXBUF(image)) + y * gdk_pixbuf_get_rowstride(GDK_PIXBUF(image)) + x * 4; + p = gdk_pixbuf_get_pixels (GDK_PIXBUF(image)) + y * gdk_pixbuf_get_rowstride(GDK_PIXBUF(image)) + x * 3; p[0] = (color >> 16) & 0xff; p[1] = (color >> 8) & 0xff; p[2] = color & 0xff; - p[3] = (color >> 24) & 0xff; } static void dvi_pixbuf_set_color(void *device_data, Ulong fg, Ulong bg) diff --git a/shell/ev-page-action.c b/shell/ev-page-action.c index 73152b4..fc81cb7 100644 --- a/shell/ev-page-action.c +++ b/shell/ev-page-action.c @@ -298,7 +298,7 @@ build_new_tree_cb (GtkTreeModel *model, EV_DOCUMENT_LINKS_COLUMN_LINK, &link, -1); - if (link && ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) { + if (link && ev_link_get_page (link) >= 0) { GtkTreeIter filter_iter; gtk_list_store_append (GTK_LIST_STORE (filter_model), &filter_iter); diff --git a/shell/ev-sidebar-links.c b/shell/ev-sidebar-links.c index 4107063..60d4134 100644 --- a/shell/ev-sidebar-links.c +++ b/shell/ev-sidebar-links.c @@ -446,7 +446,7 @@ links_page_num_func (GtkTreeViewColumn *tree_column, -1); if (link != NULL && - ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) { + ev_link_get_page (link) >= 0) { gchar *page_label; gchar *page_string; @@ -495,7 +495,7 @@ update_page_callback_foreach (GtkTreeModel *model, EV_DOCUMENT_LINKS_COLUMN_LINK, &link, -1); - if (link && ev_link_get_link_type (link) == EV_LINK_TYPE_PAGE) { + if (link) { int current_page; current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache); @@ -503,17 +503,14 @@ update_page_callback_foreach (GtkTreeModel *model, GtkTreeSelection *selection; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view)); - gtk_tree_selection_select_path (selection, path); - g_object_unref (link); + return TRUE; } + g_object_unref (link); } - if (link) - g_object_unref (link); - return FALSE; } @@ -523,19 +520,37 @@ update_page_callback (EvPageCache *page_cache, EvSidebarLinks *sidebar_links) { GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view)); + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + EvLink *link; + + gtk_tree_model_get (model, &iter, + EV_DOCUMENT_LINKS_COLUMN_LINK, &link, + -1); + if (link) { + gint current_page; + current_page = ev_page_cache_get_current_page (sidebar_links->priv->page_cache); + if (ev_link_get_page (link) == current_page) { + g_object_unref (link); + return; + } + g_object_unref (link); + } + } + /* We go through the tree linearly looking for the first page that * matches. This is pretty inefficient. We can do something neat with * a GtkTreeModelSort here to make it faster, if it turns out to be * slow. */ - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sidebar_links->priv->tree_view)); - g_signal_handler_block (selection, sidebar_links->priv->selection_id); g_signal_handler_block (sidebar_links->priv->tree_view, sidebar_links->priv->row_activated_id); - gtk_tree_selection_unselect_all (selection); - gtk_tree_model_foreach (sidebar_links->priv->model, + gtk_tree_model_foreach (model, update_page_callback_foreach, sidebar_links); diff --git a/shell/ev-view.c b/shell/ev-view.c index b1e9733..f0a371c 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -329,7 +329,7 @@ scroll_to_current_page (EvView *view, GtkOrientation orientation) if (orientation == GTK_ORIENTATION_VERTICAL) { if (view->continuous) { gtk_adjustment_clamp_page (view->vadjustment, - view_point.y - view->spacing, + view_point.y - view->spacing / 2, view_point.y + view->vadjustment->page_size); } else { gtk_adjustment_set_value (view->vadjustment, -- cgit v0.9.1