From f64954b18913261a91fd4ee75b2f07e8733d67c8 Mon Sep 17 00:00:00 2001
From: neldoreth <mail@pwmt.org>
Date: Sat, 2 Jan 2010 00:45:16 +0100
Subject: [PATCH] Lock each page

---
 zathura.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/zathura.c b/zathura.c
index 5629493..a735922 100644
--- a/zathura.c
+++ b/zathura.c
@@ -443,6 +443,7 @@ draw(int page_id)
   int rotate = Zathura.PDF.rotate;
   pthread_mutex_unlock(&(Zathura.Lock.rotate_lock));
 
+  pthread_mutex_lock(&(Zathura.PDF.pages[page_id]->lock));
   Page *current_page = Zathura.PDF.pages[page_id];
 
   if(current_page->surface)
@@ -505,6 +506,7 @@ draw(int page_id)
 
   gtk_widget_set_size_request(current_page->drawing_area, width, height);
   gtk_widget_queue_draw(current_page->drawing_area);
+  pthread_mutex_unlock(&(Zathura.PDF.pages[page_id]->lock));
 }
 
 void
@@ -658,7 +660,9 @@ set_page(int page)
 
   Zathura.PDF.page_number = page;
   Zathura.State.pages = g_strdup_printf("[%i/%i]", page + 1, Zathura.PDF.number_of_pages);
+  pthread_mutex_lock(&(Zathura.PDF.pages[page]->lock));
   switch_view(Zathura.PDF.pages[page]->drawing_area);
+  pthread_mutex_unlock(&(Zathura.PDF.pages[page]->lock));
 }
 
 void
@@ -865,7 +869,9 @@ sc_toggle_index(Argument* argument)
   }
   else
   {
+    pthread_mutex_lock(&(Zathura.PDF.pages[Zathura.PDF.page_number]->lock));
     switch_view( Zathura.PDF.pages[Zathura.PDF.page_number]->drawing_area );
+    pthread_mutex_unlock(&(Zathura.PDF.pages[Zathura.PDF.page_number]->lock));
   }
 
   hide = !hide;
@@ -1737,7 +1743,9 @@ gboolean cb_draw(GtkWidget* widget, GdkEventExpose* expose, gpointer data)
   double scale = ((double) Zathura.PDF.scale / 100.0);
   pthread_mutex_unlock(&(Zathura.Lock.scale_lock));
 
+  pthread_mutex_lock(&(Zathura.PDF.pages[page_id]->lock));
   poppler_page_get_size(Zathura.PDF.pages[page_id]->page, &page_width, &page_height);
+  pthread_mutex_unlock(&(Zathura.PDF.pages[page_id]->lock));
 
   pthread_mutex_lock(&(Zathura.Lock.rotate_lock));
   if(Zathura.PDF.rotate == 0 || Zathura.PDF.rotate == 180)
@@ -1767,7 +1775,10 @@ gboolean cb_draw(GtkWidget* widget, GdkEventExpose* expose, gpointer data)
   else
     offset_y = 0;
 
+
+  pthread_mutex_lock(&(Zathura.PDF.pages[page_id]->lock));
   cairo_set_source_surface(cairo, Zathura.PDF.pages[page_id]->surface, offset_x, offset_y);
+  pthread_mutex_unlock(&(Zathura.PDF.pages[page_id]->lock));
   cairo_paint(cairo);
   cairo_destroy(cairo);