]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Fix flickering on resizing
[evince.git] / shell / ev-window.c
index 65b8812560d158212532f02a56ed7fdd1c590963..2a3783476e71fd723fb4284997cc5cbf854efa2d 100644 (file)
@@ -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),
@@ -2325,10 +2368,10 @@ static const GtkActionEntry entries[] = {
           G_CALLBACK (ev_window_cmd_view_reload) },
 
         /* Go menu */
-        { "GoPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "Page_Up",
+        { "GoPreviousPage", GTK_STOCK_GO_BACK, N_("_Previous Page"), "<control>Page_Up",
           N_("Go to the previous page"),
           G_CALLBACK (ev_window_cmd_go_previous_page) },
-        { "GoNextPage", GTK_STOCK_GO_FORWARD, N_("_Next Page"), "Page_Down",
+        { "GoNextPage", GTK_STOCK_GO_FORWARD, N_("_Next Page"), "<control>Page_Down",
           N_("Go to the next page"),
           G_CALLBACK (ev_window_cmd_go_next_page) },
         { "GoFirstPage", GTK_STOCK_GOTO_FIRST, N_("_First Page"), "<control>Home",
@@ -2358,6 +2401,12 @@ static const GtkActionEntry entries[] = {
         { "Slash", GTK_STOCK_FIND, NULL, "slash",
           N_("Find a word or phrase in the document"),
           G_CALLBACK (ev_window_cmd_edit_find) },
+        { "PageDown", NULL, "", "Page_Down",
+          N_("Scroll one page forward"),
+          G_CALLBACK (ev_window_cmd_scroll_forward) },
+        { "PageUp", NULL, "", "Page_Up",
+          N_("Scroll one page backward"),
+          G_CALLBACK (ev_window_cmd_scroll_backward) },
         { "Space", NULL, "", "space",
           N_("Scroll one page forward"),
           G_CALLBACK (ev_window_cmd_scroll_forward) },
@@ -2605,6 +2654,8 @@ static void
 set_view_actions_sensitivity (EvWindow *window, gboolean sensitive)
 {
        if (window->priv->action_group) {
+               set_action_sensitive (window, "PageDown", sensitive);
+               set_action_sensitive (window, "PageUp", sensitive);
                set_action_sensitive (window, "Space", sensitive);
                set_action_sensitive (window, "ShiftSpace", sensitive);
                set_action_sensitive (window, "BackSpace", sensitive);
@@ -2873,8 +2924,8 @@ ev_window_init (EvWindow *ev_window)
                          G_CALLBACK (find_bar_search_changed_cb),
                          ev_window);
 
-       /* Give focus to the scrolled window */
-       gtk_widget_grab_focus (ev_window->priv->scrolled_window);
+       /* Give focus to the document view */
+       gtk_widget_grab_focus (ev_window->priv->view);
 
        /* Drag and Drop */
        gtk_drag_dest_unset (GTK_WIDGET (ev_window));