1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "remoting/host/single_window_desktop_environment.h" 6 7#include "base/logging.h" 8#include "base/single_thread_task_runner.h" 9#include "remoting/host/single_window_input_injector.h" 10#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h" 11#include "third_party/webrtc/modules/desktop_capture/window_capturer.h" 12 13namespace remoting { 14 15// Enables capturing and streaming of windows. 16class SingleWindowDesktopEnvironment : public BasicDesktopEnvironment { 17 18 public: 19 virtual ~SingleWindowDesktopEnvironment(); 20 21 // DesktopEnvironment interface. 22 virtual scoped_ptr<webrtc::DesktopCapturer> CreateVideoCapturer() OVERRIDE; 23 virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE; 24 25 protected: 26 friend class SingleWindowDesktopEnvironmentFactory; 27 SingleWindowDesktopEnvironment( 28 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 29 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, 30 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 31 webrtc::WindowId window_id); 32 33 private: 34 webrtc::WindowId window_id_; 35 36 DISALLOW_COPY_AND_ASSIGN(SingleWindowDesktopEnvironment); 37}; 38 39SingleWindowDesktopEnvironment::~SingleWindowDesktopEnvironment() { 40} 41 42scoped_ptr<webrtc::DesktopCapturer> 43SingleWindowDesktopEnvironment::CreateVideoCapturer() { 44 DCHECK(caller_task_runner()->BelongsToCurrentThread()); 45 46 webrtc::DesktopCaptureOptions options = 47 webrtc::DesktopCaptureOptions::CreateDefault(); 48 options.set_use_update_notifications(true); 49 50 scoped_ptr<webrtc::WindowCapturer>window_capturer( 51 webrtc::WindowCapturer::Create(options)); 52 window_capturer->SelectWindow(window_id_); 53 54 return window_capturer.PassAs<webrtc::DesktopCapturer>(); 55} 56 57scoped_ptr<InputInjector> 58SingleWindowDesktopEnvironment::CreateInputInjector() { 59 DCHECK(caller_task_runner()->BelongsToCurrentThread()); 60 61 scoped_ptr<InputInjector> input_injector( 62 InputInjector::Create(input_task_runner(), 63 ui_task_runner())); 64 return SingleWindowInputInjector::CreateForWindow( 65 window_id_, input_injector.Pass()).PassAs<InputInjector>(); 66} 67 68SingleWindowDesktopEnvironment::SingleWindowDesktopEnvironment( 69 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 70 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, 71 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 72 webrtc::WindowId window_id) 73 : BasicDesktopEnvironment(caller_task_runner, 74 input_task_runner, 75 ui_task_runner), 76 window_id_(window_id) { 77} 78 79SingleWindowDesktopEnvironmentFactory::SingleWindowDesktopEnvironmentFactory( 80 scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 81 scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, 82 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 83 webrtc::WindowId window_id) 84 : BasicDesktopEnvironmentFactory(caller_task_runner, 85 input_task_runner, 86 ui_task_runner), 87 window_id_(window_id) { 88} 89 90SingleWindowDesktopEnvironmentFactory:: 91 ~SingleWindowDesktopEnvironmentFactory() { 92} 93 94scoped_ptr<DesktopEnvironment> SingleWindowDesktopEnvironmentFactory::Create( 95 base::WeakPtr<ClientSessionControl> client_session_control) { 96 DCHECK(caller_task_runner()->BelongsToCurrentThread()); 97 98 scoped_ptr<SingleWindowDesktopEnvironment> desktop_environment( 99 new SingleWindowDesktopEnvironment(caller_task_runner(), 100 input_task_runner(), 101 ui_task_runner(), 102 window_id_)); 103 return desktop_environment.PassAs<DesktopEnvironment>(); 104} 105 106} // namespace remoting 107