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() { |