Provide a better R/W base PixelBuffer class

Clearly separates the read API from the write API
and also from actual implementation.
diff --git a/vncviewer/CConn.cxx b/vncviewer/CConn.cxx
index db1a08a..c78bb89 100644
--- a/vncviewer/CConn.cxx
+++ b/vncviewer/CConn.cxx
@@ -470,7 +470,7 @@
   return desktop->getBufferRW(r, stride);
 }
 void CConn::releaseRawBuffer(const rfb::Rect& r) {
-  desktop->damageRect(r);
+  desktop->commitBufferRW(r);
 }
 
 
diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx
index 3e9b57e..a64f02a 100644
--- a/vncviewer/DesktopWindow.cxx
+++ b/vncviewer/DesktopWindow.cxx
@@ -232,8 +232,8 @@
   return viewport->getBufferRW(r, stride);
 }
 
-void DesktopWindow::damageRect(const rfb::Rect& r) {
-  viewport->damageRect(r);
+void DesktopWindow::commitBufferRW(const rfb::Rect& r) {
+  viewport->commitBufferRW(r);
 }
 
 
diff --git a/vncviewer/DesktopWindow.h b/vncviewer/DesktopWindow.h
index 08a6652..83a8c76 100644
--- a/vncviewer/DesktopWindow.h
+++ b/vncviewer/DesktopWindow.h
@@ -55,7 +55,7 @@
   void copyRect(const rfb::Rect& r, int srcX, int srcY);
 
   rdr::U8* getBufferRW(const rfb::Rect& r, int* stride);
-  void damageRect(const rfb::Rect& r);
+  void commitBufferRW(const rfb::Rect& r);
 
   void resizeFramebuffer(int new_w, int new_h);
 
diff --git a/vncviewer/Viewport.cxx b/vncviewer/Viewport.cxx
index d1d5162..70964b7 100644
--- a/vncviewer/Viewport.cxx
+++ b/vncviewer/Viewport.cxx
@@ -229,6 +229,7 @@
     pixelTrans->translateRect(pixels, r.width(),
                               rfb::Rect(0, 0, r.width(), r.height()),
                               buffer, stride, rfb::Point(0, 0));
+    frameBuffer->commitBufferRW(r);
   } else {
     frameBuffer->imageRect(r, pixels);
   }
@@ -244,6 +245,11 @@
   return frameBuffer->getBufferRW(r, stride);
 }
 
+void Viewport::commitBufferRW(const rfb::Rect& r) {
+  frameBuffer->commitBufferRW(r);
+  damageRect(r);
+}
+
 void Viewport::damageRect(const rfb::Rect& r) {
   damage.assign_union(rfb::Region(r));
   if (!Fl::has_timeout(handleUpdateTimeout, this))
diff --git a/vncviewer/Viewport.h b/vncviewer/Viewport.h
index bd17655..e112efd 100644
--- a/vncviewer/Viewport.h
+++ b/vncviewer/Viewport.h
@@ -56,8 +56,7 @@
   void copyRect(const rfb::Rect& r, int srcX, int srcY);
 
   rdr::U8* getBufferRW(const rfb::Rect& r, int* stride);
-
-  void damageRect(const rfb::Rect& r);
+  void commitBufferRW(const rfb::Rect& r);
 
   void setCursor(int width, int height, const rfb::Point& hotspot,
                  void* data, void* mask);
@@ -72,6 +71,8 @@
 
 private:
 
+  void damageRect(const rfb::Rect& r);
+
   PlatformPixelBuffer* createFramebuffer(int w, int h);
 
   static void handleUpdateTimeout(void *data);