| Index: remoting/host/win/session_input_injector.cc
|
| diff --git a/remoting/host/win/session_input_injector.cc b/remoting/host/win/session_input_injector.cc
|
| index 9b685186c1f90c2c4d06d2dc90227c1412dbc7a4..0acccbe49d28ecca301613f8deb3617b3c8c187f 100644
|
| --- a/remoting/host/win/session_input_injector.cc
|
| +++ b/remoting/host/win/session_input_injector.cc
|
| @@ -34,6 +34,12 @@ bool CheckCtrlAndAltArePressed(const std::set<ui::DomCode>& pressed_keys) {
|
| (ctrl_keys + alt_keys == pressed_keys.size());
|
| }
|
|
|
| +bool IsWinKeyPressed(const std::set<ui::DomCode>& pressed_keys) {
|
| + size_t win_keys = pressed_keys.count(ui::DomCode::META_LEFT) +
|
| + pressed_keys.count(ui::DomCode::META_RIGHT);
|
| + return win_keys != 0 && win_keys == pressed_keys.size();
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace remoting {
|
| @@ -51,7 +57,8 @@ class SessionInputInjectorWin::Core
|
| Core(scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
|
| std::unique_ptr<InputInjector> nested_executor,
|
| scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner,
|
| - const base::Closure& inject_sas);
|
| + const base::Closure& inject_sas,
|
| + const base::Closure& lock_workstation);
|
|
|
| // InputInjector implementation.
|
| void Start(std::unique_ptr<ClipboardStub> client_clipboard) override;
|
| @@ -78,17 +85,20 @@ class SessionInputInjectorWin::Core
|
| // Pointer to the next event executor.
|
| std::unique_ptr<InputInjector> nested_executor_;
|
|
|
| - scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> execute_action_task_runner_;
|
|
|
| webrtc::ScopedThreadDesktop desktop_;
|
|
|
| // Used to inject Secure Attention Sequence on Vista+.
|
| base::Closure inject_sas_;
|
|
|
| + // Used to lock the current session on non-home SKUs of Windows.
|
| + base::Closure lock_workstation_;
|
| +
|
| // Used to inject Secure Attention Sequence on XP.
|
| std::unique_ptr<SasInjector> sas_injector_;
|
|
|
| - // Keys currently pressed by the client, used to detect Ctrl-Alt-Del.
|
| + // Keys currently pressed by the client, used to detect key sequences.
|
| std::set<ui::DomCode> pressed_keys_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Core);
|
| @@ -97,12 +107,14 @@ class SessionInputInjectorWin::Core
|
| SessionInputInjectorWin::Core::Core(
|
| scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
|
| std::unique_ptr<InputInjector> nested_executor,
|
| - scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner,
|
| - const base::Closure& inject_sas)
|
| + scoped_refptr<base::SingleThreadTaskRunner> execute_action_task_runner,
|
| + const base::Closure& inject_sas,
|
| + const base::Closure& lock_workstation)
|
| : input_task_runner_(input_task_runner),
|
| nested_executor_(std::move(nested_executor)),
|
| - inject_sas_task_runner_(inject_sas_task_runner),
|
| - inject_sas_(inject_sas) {}
|
| + execute_action_task_runner_(execute_action_task_runner),
|
| + inject_sas_(inject_sas),
|
| + lock_workstation_(lock_workstation) {}
|
|
|
| void SessionInputInjectorWin::Core::Start(
|
| std::unique_ptr<protocol::ClipboardStub> client_clipboard) {
|
| @@ -151,8 +163,11 @@ void SessionInputInjectorWin::Core::InjectKeyEvent(const KeyEvent& event) {
|
| if (!sas_injector_->InjectSas())
|
| LOG(ERROR) << "Failed to inject Secure Attention Sequence.";
|
| } else {
|
| - inject_sas_task_runner_->PostTask(FROM_HERE, inject_sas_);
|
| + execute_action_task_runner_->PostTask(FROM_HERE, inject_sas_);
|
| }
|
| + } else if (dom_code == ui::DomCode::US_L &&
|
| + IsWinKeyPressed(pressed_keys_)) {
|
| + execute_action_task_runner_->PostTask(FROM_HERE, lock_workstation_);
|
| }
|
|
|
| pressed_keys_.insert(dom_code);
|
| @@ -217,9 +232,10 @@ SessionInputInjectorWin::SessionInputInjectorWin(
|
| scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
|
| std::unique_ptr<InputInjector> nested_executor,
|
| scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner,
|
| - const base::Closure& inject_sas) {
|
| + const base::Closure& inject_sas,
|
| + const base::Closure& lock_workstation) {
|
| core_ = new Core(input_task_runner, std::move(nested_executor),
|
| - inject_sas_task_runner, inject_sas);
|
| + inject_sas_task_runner, inject_sas, lock_workstation);
|
| }
|
|
|
| SessionInputInjectorWin::~SessionInputInjectorWin() {
|
|
|