1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/it2me_desktop_environment.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/single_thread_task_runner.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/client_session_control.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/host_window.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/host_window_proxy.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "remoting/host/local_input_monitor.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_POSIX) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <sys/types.h> 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <unistd.h> 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_POSIX) 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace remoting { 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironment::~It2MeDesktopEnvironment() { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(caller_task_runner()->BelongsToCurrentThread()); 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironment::It2MeDesktopEnvironment( 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::WeakPtr<ClientSessionControl> client_session_control) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : BasicDesktopEnvironment(caller_task_runner, 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_task_runner, 32b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) ui_task_runner) { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(caller_task_runner->BelongsToCurrentThread()); 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create the local input monitor. 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) local_input_monitor_ = LocalInputMonitor::Create(caller_task_runner, 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_task_runner, 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_task_runner, 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) client_session_control); 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The host UI should be created on the UI thread. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool want_user_interface = true; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't try to display any UI on top of the system's login screen as this 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is rejected by the Window Server on OS X 10.7.4, and prevents the 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // capturer from working (http://crbug.com/140984). 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(lambroslambrou): Use a better technique of detecting whether we're 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // running in the LoginWindow context, and refactor this into a separate 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // function to be used here and in CurtainMode::ActivateCurtain(). 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) want_user_interface = getuid() != 0; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // defined(OS_MACOSX) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Create the continue and disconnect windows. 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (want_user_interface) { 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) continue_window_ = HostWindow::CreateContinueWindow(); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue_window_.reset(new HostWindowProxy( 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) caller_task_runner, 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_task_runner, 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue_window_.Pass())); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue_window_->Start(client_session_control); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) disconnect_window_ = HostWindow::CreateDisconnectWindow(); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disconnect_window_.reset(new HostWindowProxy( 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) caller_task_runner, 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_task_runner, 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disconnect_window_.Pass())); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) disconnect_window_->Start(client_session_control); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironmentFactory::It2MeDesktopEnvironmentFactory( 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : BasicDesktopEnvironmentFactory(caller_task_runner, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_task_runner, 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui_task_runner) { 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)It2MeDesktopEnvironmentFactory::~It2MeDesktopEnvironmentFactory() { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<DesktopEnvironment> It2MeDesktopEnvironmentFactory::Create( 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::WeakPtr<ClientSessionControl> client_session_control) { 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(caller_task_runner()->BelongsToCurrentThread()); 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return scoped_ptr<DesktopEnvironment>( 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new It2MeDesktopEnvironment(caller_task_runner(), 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) input_task_runner(), 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui_task_runner(), 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) client_session_control)); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace remoting 96