Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(412)

Unified Diff: remoting/host/input_injector_mac.cc

Issue 422503004: Adding ability to stream windows and inject events to them (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: uploaded to remove lint errors Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/host/input_injector_mac.cc
diff --git a/remoting/host/input_injector_mac.cc b/remoting/host/input_injector_mac.cc
index c5e870026e3deff4e3e9205e2a6902b76f579821..240a6cf4bca000db92c6b2d1d2f0be649f06a113 100644
--- a/remoting/host/input_injector_mac.cc
+++ b/remoting/host/input_injector_mac.cc
@@ -60,6 +60,7 @@ class InputInjectorMac : public InputInjector {
public:
explicit InputInjectorMac(
scoped_refptr<base::SingleThreadTaskRunner> task_runner);
+
virtual ~InputInjectorMac();
// ClipboardStub interface.
@@ -73,8 +74,15 @@ class InputInjectorMac : public InputInjector {
// InputInjector interface.
virtual void Start(
scoped_ptr<protocol::ClipboardStub> client_clipboard) OVERRIDE;
+ // TODO(sidj, sskhandp) Remove these methods and use
+ // WindowInputInjectorMac instead.
+ virtual void SetWindowId(webrtc::WindowId windowId);
Lambros 2014/07/30 00:14:48 Do these need to be virtual?
ronakvora do not use 2014/07/30 20:55:36 Nope, changed.
+ virtual void SetEnableWindowCapture(bool enable_window_capture);
Lambros 2014/07/30 00:14:48 Don't say "Capture" here. Maybe replace these meth
ronakvora do not use 2014/07/30 20:55:36 Done.
private:
+ // TODO(sidj, sskhandp) put these inside of WindowInputInjectorMac.
Lambros 2014/07/30 00:14:49 Remove TODO - I don't think it's worth defining a
ronakvora do not use 2014/07/30 20:55:36 Done.
+ CGWindowID windowId_input_injector_mac_;
Lambros 2014/07/30 00:14:49 nit: window_id_
ronakvora do not use 2014/07/30 20:55:36 Done.
+ bool enable_window_capture_injector_mac_;
Lambros 2014/07/30 00:14:48 nit: window_injection_enabled_ - don't use "captur
ronakvora do not use 2014/07/30 20:55:36 Done.
// The actual implementation resides in InputInjectorMac::Core class.
class Core : public base::RefCountedThreadSafe<Core> {
public:
@@ -91,11 +99,17 @@ class InputInjectorMac : public InputInjector {
// Mirrors the InputInjector interface.
void Start(scoped_ptr<protocol::ClipboardStub> client_clipboard);
+ // TODO(sidj, sskhandp) Remove these methods and use
Lambros 2014/07/30 00:14:48 Remove TODO.
ronakvora do not use 2014/07/30 20:55:36 Done.
+ // WindowInputInjectorMac instead.
+ void SetWindowId(CGWindowID windowId);
+ void SetEnableWindowCapture(bool enable_window_capture);
+
void Stop();
private:
friend class base::RefCountedThreadSafe<Core>;
virtual ~Core();
+ CGRect FindCGRectOfWindow(webrtc::MacDesktopConfiguration desktop_config);
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
webrtc::DesktopVector mouse_pos_;
@@ -103,6 +117,9 @@ class InputInjectorMac : public InputInjector {
scoped_ptr<Clipboard> clipboard_;
CGEventFlags left_modifiers_;
CGEventFlags right_modifiers_;
+ // TODO(sidj, sskhandp) put these inside of WindowInputInjectorMac.
Lambros 2014/07/30 00:14:48 Remove TODO.
ronakvora do not use 2014/07/30 20:55:36 Done.
+ CGWindowID windowId_core_;
+ bool enable_window_capture_core_;
DISALLOW_COPY_AND_ASSIGN(Core);
};
@@ -142,6 +159,16 @@ void InputInjectorMac::Start(
core_->Start(client_clipboard.Pass());
}
+void InputInjectorMac::SetWindowId(webrtc::WindowId windowId) {
+ windowId_input_injector_mac_ = (CGWindowID) windowId;
+ core_->SetWindowId(windowId_input_injector_mac_);
+}
+
+void InputInjectorMac::SetEnableWindowCapture(bool enable_window_capture) {
+ enable_window_capture_injector_mac_ = enable_window_capture;
+ core_->SetEnableWindowCapture(enable_window_capture_injector_mac_);
+}
+
InputInjectorMac::Core::Core(
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: task_runner_(task_runner),
@@ -163,6 +190,13 @@ InputInjectorMac::Core::Core(
#pragma clang diagnostic pop
}
+void InputInjectorMac::Core::SetWindowId(CGWindowID windowId) {
+ windowId_core_ = windowId;
+}
+void InputInjectorMac::Core::SetEnableWindowCapture
+ (bool enable_window_capture) {
+ enable_window_capture_core_ = enable_window_capture;
+}
void InputInjectorMac::Core::InjectClipboardEvent(const ClipboardEvent& event) {
if (!task_runner_->BelongsToCurrentThread()) {
task_runner_->PostTask(
@@ -228,6 +262,39 @@ void InputInjectorMac::Core::InjectTextEvent(const TextEvent& event) {
CreateAndPostKeyEvent(kVK_Space, false, 0, text);
}
+CGRect InputInjectorMac::Core::FindCGRectOfWindow(
+ webrtc::MacDesktopConfiguration desktop_config) {
+ CGRect rect;
+ CGWindowID ids[1] = {windowId_core_};
+ CFArrayRef window_id_array =
+ CFArrayCreate(NULL, reinterpret_cast<const void **>(&ids), 1, NULL);
+ CFArrayRef window_array =
+ CGWindowListCreateDescriptionFromArray(window_id_array);
+ if (window_array == NULL || 0 == CFArrayGetCount(window_array)) {
+ // Could not find the window. It might have been closed.
+ LOG(ERROR) << "Specified window to stream not found for id: "
+ << windowId_core_;
+ CFRelease(window_id_array);
Lambros 2014/07/30 00:14:49 Use ScopedCFTypeRef from base/mac/scoped_cftyperef
ronakvora do not use 2014/07/30 20:55:36 I've been a bit confused on the scoped_X types. Do
+ CFRelease(window_array);
+ return CGRectNull;
+ }
+ CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
+ CFArrayGetValueAtIndex(window_array, 0));
+
+ if (CFDictionaryContainsKey(window, kCGWindowBounds)) {
+ CFDictionaryRef bounds =
+ reinterpret_cast<CFDictionaryRef>
+ (CFDictionaryGetValue(window, kCGWindowBounds));
+ if (bounds) {
+ CGRectMakeWithDictionaryRepresentation(bounds, &rect);
+ }
+ }
+
+ CFRelease(window_id_array);
+ CFRelease(window_array);
+ return rect;
+}
+
void InputInjectorMac::Core::InjectMouseEvent(const MouseEvent& event) {
if (event.has_x() && event.has_y()) {
// On multi-monitor systems (0,0) refers to the top-left of the "main"
@@ -263,6 +330,20 @@ void InputInjectorMac::Core::InjectMouseEvent(const MouseEvent& event) {
mouse_pos_.set(mouse_pos_.x() / desktop_config.dip_to_pixel_scale,
mouse_pos_.y() / desktop_config.dip_to_pixel_scale);
+ // Translate the mouse position into window coordinates.
+ // TODO(sskhandp, sidj) Remove this if clause and implement
+ // functionality in WindowInputInjectorMac.
+ if (enable_window_capture_core_) {
+ CGRect windowRect = FindCGRectOfWindow(desktop_config);
+ if (CGRectEqualToRect(windowRect, CGRectNull)) {
+ LOG(ERROR) << "Can't find rectangle of window.";
+ return;
+ }
+ mouse_pos_ = mouse_pos_.add(
+ webrtc::DesktopVector(CGRectGetMinX(windowRect),
+ CGRectGetMinY(windowRect)));
+ }
+
VLOG(3) << "Moving mouse to " << mouse_pos_.x() << "," << mouse_pos_.y();
}
if (event.has_button() && event.has_button_down()) {
@@ -341,4 +422,16 @@ scoped_ptr<InputInjector> InputInjector::Create(
return scoped_ptr<InputInjector>(new InputInjectorMac(main_task_runner));
}
+// TODO(sskhandp, sidj) remove this method and make WindowInputInjector
Lambros 2014/07/30 00:14:48 Remove TODO.
ronakvora do not use 2014/07/30 20:55:36 Done.
+scoped_ptr<InputInjector> InputInjector::Create(
+ scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner,
+ webrtc::WindowId windowId,
+ bool enable_window_capture) {
+ InputInjectorMac* injector = new InputInjectorMac(main_task_runner);
Lambros 2014/07/30 00:14:49 nit: Declare |injector| as scoped_ptr instead of r
ronakvora do not use 2014/07/30 20:55:36 Done.
+ injector->SetWindowId(windowId);
+ injector->SetEnableWindowCapture(enable_window_capture);
+ return scoped_ptr<InputInjector>(injector);
+}
+
} // namespace remoting

Powered by Google App Engine
This is Rietveld 408576698