Index: remoting/host/screen_recorder.cc |
diff --git a/remoting/host/screen_recorder.cc b/remoting/host/screen_recorder.cc |
index ab96a53708cf35a6c6db14f1e7d1fea6ef8635ff..330d66cc132160702633117504c44f709541cc1d 100644 |
--- a/remoting/host/screen_recorder.cc |
+++ b/remoting/host/screen_recorder.cc |
@@ -16,8 +16,10 @@ |
#include "base/time.h" |
#include "remoting/base/capture_data.h" |
#include "remoting/proto/control.pb.h" |
+#include "remoting/proto/internal.pb.h" |
#include "remoting/proto/video.pb.h" |
#include "remoting/protocol/client_stub.h" |
+#include "remoting/protocol/cursor_shape_stub.h" |
#include "remoting/protocol/connection_to_client.h" |
#include "remoting/protocol/message_decoder.h" |
#include "remoting/protocol/util.h" |
@@ -142,7 +144,9 @@ void ScreenRecorder::DoStart() { |
return; |
} |
- capturer()->Start(); |
+ capturer()->Start( |
+ base::Bind(&ScreenRecorder::CursorShapeChangedCallback, this)); |
+ |
capture_timer_.reset(new base::OneShotTimer<ScreenRecorder>()); |
// Capture first frame immedately. |
@@ -214,6 +218,18 @@ void ScreenRecorder::CaptureDoneCallback( |
FROM_HERE, base::Bind(&ScreenRecorder::DoEncode, this, capture_data)); |
} |
+void ScreenRecorder::CursorShapeChangedCallback( |
+ scoped_ptr<protocol::CursorShapeInfo> cursor_data) { |
+ DCHECK_EQ(capture_loop_, MessageLoop::current()); |
+ |
+ if (!is_recording()) |
+ return; |
+ |
+ encode_loop_->PostTask( |
+ FROM_HERE, base::Bind(&ScreenRecorder::DoEncodeCursorShape, |
Wez
2012/05/29 18:02:54
You can skip directly to DoSendCursorShape here ..
garykac
2012/05/30 23:22:45
Done.
|
+ this, base::Passed(cursor_data.Pass()))); |
+} |
+ |
void ScreenRecorder::DoFinishOneRecording() { |
DCHECK_EQ(capture_loop_, MessageLoop::current()); |
@@ -281,6 +297,18 @@ void ScreenRecorder::DoStopOnNetworkThread(const base::Closure& done_task) { |
this, done_task)); |
} |
+void ScreenRecorder::DoSendCursorShape( |
+ scoped_ptr<protocol::CursorShapeInfo> cursor_shape) { |
+ DCHECK(network_loop_->BelongsToCurrentThread()); |
+ |
+ if (network_stopped_ || connections_.empty()) |
+ return; |
+ |
+ // TODO(sergeyu): Currently we send the data only to the first |
+ // connection. Send it to all connections if necessary. |
+ connections_.front()->cursor_shape_stub()->SetCursorShape(*cursor_shape); |
+} |
+ |
// Encoder thread -------------------------------------------------------------- |
void ScreenRecorder::DoEncode( |
@@ -307,6 +335,15 @@ void ScreenRecorder::DoEncode( |
base::Bind(&ScreenRecorder::EncodedDataAvailableCallback, this)); |
} |
+void ScreenRecorder::DoEncodeCursorShape( |
Wez
2012/05/29 18:02:54
... and remove this method entirely. :)
garykac
2012/05/30 23:22:45
Done.
|
+ scoped_ptr<protocol::CursorShapeInfo> cursor) { |
+ DCHECK_EQ(encode_loop_, MessageLoop::current()); |
+ |
+ network_loop_->PostTask( |
+ FROM_HERE, base::Bind(&ScreenRecorder::DoSendCursorShape, this, |
+ base::Passed(cursor.Pass()))); |
+} |
+ |
void ScreenRecorder::DoStopOnEncodeThread(const base::Closure& done_task) { |
DCHECK_EQ(encode_loop_, MessageLoop::current()); |