+static void
+update_view_size (EvWindow *window)
+{
+ int width, height;
+ GtkRequisition vsb_requisition;
+ int scrollbar_spacing;
+
+ width = window->priv->scrolled_window->allocation.width;
+ height = window->priv->scrolled_window->allocation.height;
+
+ /* the scrolled window has a GTK_SHADOW_IN */
+ width -= 2 * window->priv->view->style->xthickness;
+ height -= 2 * window->priv->view->style->ythickness;
+
+ if (window->priv->sizing_mode == EV_SIZING_BEST_FIT) {
+ ev_view_set_size (EV_VIEW (window->priv->view),
+ MAX (1, width), MAX (1, height));
+ } else if (window->priv->sizing_mode == EV_SIZING_FIT_WIDTH) {
+ gtk_widget_size_request (GTK_SCROLLED_WINDOW (window->priv->scrolled_window)->vscrollbar,
+ &vsb_requisition);
+ gtk_widget_style_get (window->priv->scrolled_window,
+ "scrollbar_spacing", &scrollbar_spacing,
+ NULL);
+ ev_view_set_size (EV_VIEW (window->priv->view),
+ width - vsb_requisition.width - scrollbar_spacing, -1);
+ }
+}
+
+static void
+size_allocate_cb (GtkWidget *scrolled_window,
+ GtkAllocation *allocation,
+ EvWindow *window)
+{
+ update_view_size (window);
+}
+
+static void
+ev_window_set_sizing_mode (EvWindow *ev_window,
+ EvSizingMode sizing_mode)
+{
+ GtkWidget *scrolled_window;
+
+ if (ev_window->priv->sizing_mode == sizing_mode)
+ return;
+
+ scrolled_window = ev_window->priv->scrolled_window;
+ ev_window->priv->sizing_mode = sizing_mode;
+
+ g_signal_handlers_disconnect_by_func (scrolled_window, size_allocate_cb, ev_window);
+
+ update_view_size (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_NEVER,
+ NULL);
+ g_signal_connect (scrolled_window, "size-allocate",
+ G_CALLBACK (size_allocate_cb),
+ 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 (scrolled_window, "size-allocate",
+ G_CALLBACK (size_allocate_cb),
+ ev_window);
+ break;
+ case EV_SIZING_FREE:
+ g_object_set (G_OBJECT (scrolled_window),
+ "hscrollbar-policy", GTK_POLICY_AUTOMATIC,
+ "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
+ NULL);
+ break;
+ }
+
+ update_sizing_buttons (ev_window);
+}
+