Implemented the time position changing by trackbar.
RfbPlayer::calculateSessionTime() must calculate time in ms.
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@146 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/rfbplayer/rfbplayer.cxx b/rfbplayer/rfbplayer.cxx
index 3e739c6..aeb0b1f 100644
--- a/rfbplayer/rfbplayer.cxx
+++ b/rfbplayer/rfbplayer.cxx
@@ -204,7 +204,8 @@
autoplay(_autoplay), showControls(_showControls), buffer(0), client_size(0, 0, 32, 32),
window_size(0, 0, 32, 32), cutText(0), seekMode(false), fileName(_fileName),
serverInitTime(0), lastPos(0), timeStatic(0), speedEdit(0), posTrackBar(0),
- speedUpDown(0), acceptBell(_acceptBell), rfbReader(0) {
+ speedUpDown(0), acceptBell(_acceptBell), rfbReader(0), sessionTimeMs(0),
+ sliderDraging(false), sliderStepMs(0) {
if (showControls)
CTRL_BAR_HEIGHT = 28;
@@ -345,6 +346,33 @@
InvalidateRect(getFrameHandle(), 0, TRUE);
}
break;
+
+ // Process messages from posTrackBar
+
+ case WM_HSCROLL:
+ {
+ long Pos = SendMessage(posTrackBar, TBM_GETPOS, 0, 0);
+ Pos *= sliderStepMs;
+
+ switch (LOWORD(wParam)) {
+ case TB_PAGEUP:
+ case TB_PAGEDOWN:
+ case TB_LINEUP:
+ case TB_LINEDOWN:
+ case TB_THUMBTRACK:
+ sliderDraging = true;
+ updatePos(Pos);
+ return 0;
+ case TB_ENDTRACK:
+ setPos(Pos);
+ updatePos(Pos);
+ sliderDraging = false;
+ return 0;
+ default:
+ break;
+ }
+ }
+ break;
case WM_NOTIFY:
switch (((NMHDR*)lParam)->code) {
@@ -672,15 +700,17 @@
newSession(fileName);
skipHandshaking();
setSpeed(playbackSpeed);
- is->pausePlayback();
+ if (paused) is->pausePlayback();
+ else is->resumePlayback();
}
void RfbPlayer::processMsg() {
static long update_time = GetTickCount();
try {
- if ((!isSeeking()) && ((GetTickCount() - update_time) > 250)) {
+ if ((!isSeeking()) && ((GetTickCount() - update_time) > 250)
+ && (!sliderDraging)) {
// Update pos in the toolbar 4 times in 1 second
- updatePos();
+ updatePos(getTimeOffset());
update_time = GetTickCount();
}
RfbProto::processMsg();
@@ -688,6 +718,7 @@
if (strcmp(e.str(), "[End Of File]") == 0) {
rewind();
setPaused(true);
+ updatePos(getTimeOffset());
return;
}
// It's a special exception to perform backward seeking.
@@ -696,6 +727,7 @@
long initTime = getSeekOffset();
rewind();
setPos(initTime);
+ updatePos(getTimeOffset());
} else {
MessageBox(getMainHandle(), e.str(), e.type(), MB_OK | MB_ICONERROR);
return;
@@ -727,11 +759,14 @@
setTitle(cp.name());
// Calculate the full session time and update posTrackBar control
- long sec = calculateSessionTime(fileName);
- sprintf(fullSessionTime, "%.2um:%.2us", sec / 60, sec % 60);
- updatePos();
+ sessionTimeMs = calculateSessionTime(fileName);
+ sprintf(fullSessionTime, "%.2um:%.2us",
+ sessionTimeMs / 1000 / 60, sessionTimeMs / 1000 % 60);
SendMessage(posTrackBar, TBM_SETRANGE,
- TRUE, MAKELONG(0, min(sec, MAX_POS_TRACKBAR_RANGE)));
+ TRUE, MAKELONG(0, min(sessionTimeMs / 1000, MAX_POS_TRACKBAR_RANGE)));
+ sliderStepMs = sessionTimeMs / SendMessage(posTrackBar, TBM_GETRANGEMAX, 0, 0);
+
+ updatePos(getTimeOffset());
setPaused(!autoplay);
}
@@ -797,14 +832,14 @@
long RfbPlayer::calculateSessionTime(char *filename) {
FbsInputStream sessionFile(filename);
- sessionFile.setSpeed(1000);
+ sessionFile.setTimeOffset(100000000);
try {
while (TRUE) {
sessionFile.skip(1024);
}
} catch (rdr::Exception e) {
if (strcmp(e.str(), "[End Of File]") == 0) {
- return sessionFile.getTimeOffset() / 1000;
+ return sessionFile.getTimeOffset();
} else {
MessageBox(getMainHandle(), e.str(), e.type(), MB_OK | MB_ICONERROR);
return 0;
@@ -886,12 +921,14 @@
}
long RfbPlayer::getTimeOffset() {
- return is->getTimeOffset();
+ return max(is->getTimeOffset(), is->getSeekOffset());
}
-void RfbPlayer::updatePos() {
+void RfbPlayer::updatePos(long newPos) {
+ // Update time pos in static control
char timePos[30] = "\0";
- long newPos = is->getTimeOffset() / 1000;
+ double sliderPos = newPos;
+ newPos /= 1000;
time_pos_m = newPos / 60;
time_pos_s = newPos % 60;
if (time_pos_m < 10) {
@@ -912,6 +949,12 @@
strcat(timePos, fullSessionTime);
strcat(timePos, ")");
SetWindowText(timeStatic, timePos);
+
+ // Update the position of slider
+ if (!sliderDraging) {
+ sliderPos /= sliderStepMs;
+ SendMessage(posTrackBar, TBM_SETPOS, TRUE, sliderPos);
+ }
}
void RfbPlayer::skipHandshaking() {