diff options
author | Jonathan 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) |
commit | 80a9ffebfe5125584341d4fb005ee1a29219c970 (patch) | |
tree | 0d0f5808410af30a61a44b0de2317affad2bb547 /shell/ev-window.c | |
parent | 3ca7f5212877878bc98c8a05354df0d65f2e36a8 (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.c | 43 |
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), |