Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-window.c
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2005-05-20 05:08:11 (GMT)
committer Jonathan Blandford <jrb@src.gnome.org>2005-05-20 05:08:11 (GMT)
commit80a9ffebfe5125584341d4fb005ee1a29219c970 (patch)
tree0d0f5808410af30a61a44b0de2317affad2bb547 /shell/ev-window.c
parent3ca7f5212877878bc98c8a05354df0d65f2e36a8 (diff)
Use gdk_window_scroll instead of gtk_widget_queue_draw. Massive speedups
Fri May 20 01:07:15 2005 Jonathan Blandford <jrb@redhat.com> * shell/ev-view.c (view_update_adjustments): Use gdk_window_scroll instead of gtk_widget_queue_draw. Massive speedups in scrolling. Fri May 20 01:05:10 2005 Jonathan Blandford <jrb@redhat.com> * .cvsignore: * shell/ev-view.c:(ev_view_size_allocate), (ev_view_class_init), (zoom_for_size_fit_width), (zoom_for_size_best_fit), (ev_view_zoom_for_size_presentation), (ev_view_zoom_for_size_continuous_and_dual_page), (ev_view_zoom_for_size_continuous), (ev_view_zoom_for_size_dual_page), (ev_view_zoom_for_size_single_page), (ev_view_set_zoom_for_size): * shell/ev-view.h: * shell/ev-window.c: (update_view_size), (ev_window_sizing_mode_changed_cb): Patch from Nickolay Shmyrev <nshmyrev@yandex.ru> to handle the scrollbars. It's not 100% right, but it's much closer. Kills an infinite loop, #304769
Diffstat (limited to 'shell/ev-window.c')
-rw-r--r--shell/ev-window.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c
index 6549d3f..2a37834 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1843,6 +1843,38 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window)
}
}
+static void
+update_view_size (EvView *view, EvWindow *window)
+{
+ int width, height;
+ GtkRequisition vsb_requisition;
+ GtkRequisition hsb_requisition;
+ int scrollbar_spacing;
+
+ /* Calculate the width available for the */
+ width = window->priv->scrolled_window->allocation.width;
+ height = window->priv->scrolled_window->allocation.height;
+
+ if (gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)) == GTK_SHADOW_IN) {
+ width -= 2 * window->priv->view->style->xthickness;
+ height -= 2 * window->priv->view->style->ythickness;
+ }
+
+ gtk_widget_size_request (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)->vscrollbar,
+ &vsb_requisition);
+ gtk_widget_size_request (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)->hscrollbar,
+ &hsb_requisition);
+ gtk_widget_style_get (window->priv->scrolled_window,
+ "scrollbar_spacing", &scrollbar_spacing,
+ NULL);
+
+ ev_view_set_zoom_for_size (EV_VIEW (window->priv->view),
+ MAX (1, width),
+ MAX (1, height),
+ vsb_requisition.width + scrollbar_spacing,
+ hsb_requisition.height + scrollbar_spacing);
+}
+
static void
ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
EvWindow *ev_window)
@@ -1856,18 +1888,29 @@ ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
scrolled_window = ev_window->priv->scrolled_window;
+ g_signal_handlers_disconnect_by_func (ev_window->priv->view, update_view_size, ev_window);
+
+ if (sizing_mode != EV_SIZING_FREE)
+ update_view_size (NULL, ev_window);
+
switch (sizing_mode) {
case EV_SIZING_BEST_FIT:
g_object_set (G_OBJECT (scrolled_window),
"hscrollbar-policy", GTK_POLICY_NEVER,
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
NULL);
+ g_signal_connect (ev_window->priv->view, "zoom_invalid",
+ G_CALLBACK (update_view_size),
+ ev_window);
break;
case EV_SIZING_FIT_WIDTH:
g_object_set (G_OBJECT (scrolled_window),
"hscrollbar-policy", GTK_POLICY_NEVER,
"vscrollbar-policy", GTK_POLICY_AUTOMATIC,
NULL);
+ g_signal_connect (ev_window->priv->view, "zoom_invalid",
+ G_CALLBACK (update_view_size),
+ ev_window);
break;
case EV_SIZING_FREE:
g_object_set (G_OBJECT (scrolled_window),