]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Fix flickering on resizing
[evince.git] / shell / ev-view.c
index 3da8d138fed932334dc6f52eb2786c79c60a0d92..d9dddaf24e61c304635f5d9f6f4af6c34cf571a1 100644 (file)
@@ -149,6 +149,7 @@ struct _EvView {
        EvSizingMode sizing_mode;
        
        PendingScroll pending_scroll;
+       gboolean pending_resize;
 };
 
 struct _EvViewClass {
@@ -376,9 +377,12 @@ view_update_adjustments (EvView *view)
        } else {
                view->scroll_y = 0;
        }
-               
-       //      gtk_widget_queue_draw (GTK_WIDGET (view));
-       gdk_window_scroll (GTK_WIDGET (view)->window, dx, dy);
+       
+       
+       if (view->pending_resize)       
+               gtk_widget_queue_draw (GTK_WIDGET (view));
+       else
+               gdk_window_scroll (GTK_WIDGET (view)->window, dx, dy);
 
 
        if (view->document)
@@ -537,7 +541,7 @@ view_scroll_to_page (EvView *view, gint new_page)
        EvPageCache *page_cache = view->page_cache;
        int old_width, old_height;
        int new_width, new_height;
-       int max_height, n_rows;
+       int max_height, max_width, n_rows;
 
        ev_page_cache_get_size (page_cache,
                                view->current_page,
@@ -556,11 +560,11 @@ view_scroll_to_page (EvView *view, gint new_page)
        else
                gtk_widget_queue_draw (GTK_WIDGET (view));
        
-       if (view->continuous) {
+       get_bounding_box_size (view, &max_width, &max_height);
+       
+       if (view->continuous && view->vadjustment) {
                
                n_rows = view->dual_page ? new_page / 2 : new_page;
-               
-               get_bounding_box_size (view, NULL, &max_height);
 
                gtk_adjustment_clamp_page(view->vadjustment,
                                          (max_height + view->spacing) * n_rows, 
@@ -570,6 +574,20 @@ view_scroll_to_page (EvView *view, gint new_page)
                gtk_adjustment_set_value (view->vadjustment,
                                          view->vadjustment->lower);
        }
+       
+       if (view->dual_page && view->hadjustment) {
+               if (new_page % 2 == 0) {
+                       gtk_adjustment_set_value (view->hadjustment,
+                                                 view->hadjustment->lower);
+               } else {
+                       gtk_adjustment_clamp_page (view->hadjustment,
+                                                  view->hadjustment->lower + 
+                                                  max_width + view->spacing, 
+                                                  view->hadjustment->lower +
+                                                  max_width + view->spacing +
+                                                  view->hadjustment->page_size);
+               }
+       }
 
        view->current_page = new_page;
        view_update_range_and_current_page (view);
@@ -1172,9 +1190,6 @@ ev_view_size_request (GtkWidget      *widget,
 {
        EvView *view = EV_VIEW (widget);
 
-       if (!GTK_WIDGET_REALIZED (widget))
-               return;
-
        if (view->document == NULL) {
                requisition->width = 1;
                requisition->height = 1;
@@ -1215,6 +1230,7 @@ ev_view_size_allocate (GtkWidget      *widget,
        view_set_adjustment_values (view, GTK_ORIENTATION_VERTICAL);
 
        view->pending_scroll = SCROLL_TO_KEEP_POSITION;
+       view->pending_resize = FALSE;
 
        if (view->document)
                view_update_range_and_current_page (view);              
@@ -1260,15 +1276,6 @@ ev_view_realize (GtkWidget *widget)
                gdk_window_set_background (widget->window, &widget->style->black);
        else
                gdk_window_set_background (widget->window, &widget->style->mid [GTK_STATE_NORMAL]);
-
-       if (view->document) {
-               /* We can't get page size without a target, so we have to
-                * queue a size request at realization. Could be fixed
-                * with EvDocument changes to allow setting a GdkScreen
-                * without setting a target.
-                */
-               gtk_widget_queue_resize (widget);
-       }
 }
 
 static void
@@ -1902,7 +1909,13 @@ page_changed_cb (EvPageCache *page_cache,
 {
        if (view->current_page != new_page) {
 
-               view_scroll_to_page (view, new_page);
+               if (view->pending_scroll != SCROLL_TO_CURRENT_PAGE) {
+                       /* Should scroll right now */
+                       view_scroll_to_page (view, new_page);
+               } else {        
+                       /* We'll scroll to new page on allocate */
+                       view->current_page = new_page;
+               }
 
                if (EV_IS_DOCUMENT_FIND (view->document)) {
                        view->find_page = new_page;
@@ -1987,6 +2000,7 @@ ev_view_set_zoom (EvView   *view,
        if (ABS (view->scale - scale) < EPSILON)
                return;
        view->scale = scale;
+       view->pending_resize = TRUE;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
 }