Blank session frame when the session stopped.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@233 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfbplayer/rfbplayer.cxx b/rfbplayer/rfbplayer.cxx
index e96cd39..a8c4e38 100644
--- a/rfbplayer/rfbplayer.cxx
+++ b/rfbplayer/rfbplayer.cxx
@@ -226,7 +226,8 @@
   seekMode(false), fileName(_fileName), lastPos(0), timeStatic(0), 
   speedEdit(0), posTrackBar(0), speedUpDown(0), acceptBell(_acceptBell), 
   rfbReader(0), sessionTimeMs(0), sliderDraging(false), sliderStepMs(0), 
-  loopPlayback(false), imageDataStartTime(0), rewindFlag(false) {
+  loopPlayback(false), imageDataStartTime(0), rewindFlag(false),
+  stopped(false) {
 
   CTRL_BAR_HEIGHT = 28;
 
@@ -806,6 +807,10 @@
 }
 
 void RfbPlayer::processMsg() {
+  // Perform return if waitWhilePaused processed because 
+  // rfbReader thread could receive the signal to close
+  if (waitWhilePaused()) return;
+  
   static long update_time = GetTickCount();
   try {
     if ((!isSeeking()) && ((GetTickCount() - update_time) > 250)
@@ -829,7 +834,8 @@
       rewindFlag = true; 
       long seekOffset = max(getSeekOffset(), imageDataStartTime);
       rewind();
-      setPos(seekOffset);
+      if (!stopped) setPos(seekOffset);
+      else stopped = false;
       updatePos(seekOffset);
       rewindFlag = false;
     } else {
@@ -948,6 +954,15 @@
   return true;
 }
 
+bool RfbPlayer::waitWhilePaused() {
+  bool result = false;
+  while(isPaused() && !isSeeking()) {
+    Sleep(20);
+    result = true;
+  }
+  return result;
+}
+
 long RfbPlayer::calculateSessionTime(char *filename) {
   FbsInputStream sessionFile(filename);
   sessionFile.setTimeOffset(100000000);
@@ -1054,8 +1069,9 @@
 }
 
 void RfbPlayer::stopPlayback() {
-  setPos(0);
+  stopped = true;
   if (is) is->pausePlayback();
+  setPos(0);
   tb.checkButton(ID_STOP, true);
   tb.checkButton(ID_PLAY, false);
   tb.checkButton(ID_PAUSE, false);