]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Fix flickering on resizing
[evince.git] / shell / ev-view.c
index 04dfd73fd65e9d933d47e56f2eaa5c5c522024e3..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)
@@ -1186,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;
@@ -1229,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);              
@@ -1274,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
@@ -1916,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;
@@ -2001,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));
 }