diff options
Diffstat (limited to 'chromium/content/browser/screenlock_monitor/screenlock_monitor_device_source_win.cc')
-rw-r--r-- | chromium/content/browser/screenlock_monitor/screenlock_monitor_device_source_win.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/chromium/content/browser/screenlock_monitor/screenlock_monitor_device_source_win.cc b/chromium/content/browser/screenlock_monitor/screenlock_monitor_device_source_win.cc new file mode 100644 index 00000000000..486470e3d64 --- /dev/null +++ b/chromium/content/browser/screenlock_monitor/screenlock_monitor_device_source_win.cc @@ -0,0 +1,70 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/screenlock_monitor/screenlock_monitor_device_source.h" + +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/task/post_task.h" +#include "base/win/message_window.h" + +namespace content { + +ScreenlockMonitorDeviceSource::SessionMessageWindow::SessionMessageWindow() { + // Create a window for receiving session change notifications. + window_.reset(new base::win::MessageWindow()); + if (!window_->Create(base::BindRepeating(&SessionMessageWindow::OnWndProc, + base::Unretained(this)))) { + DLOG(ERROR) << "Failed to create the screenlock monitor window."; + window_.reset(); + return; + } + + base::OnceClosure wts_register = + base::BindOnce(base::IgnoreResult(&::WTSRegisterSessionNotification), + window_->hwnd(), NOTIFY_FOR_ALL_SESSIONS); + + base::CreateCOMSTATaskRunnerWithTraits({})->PostTask(FROM_HERE, + std::move(wts_register)); +} + +ScreenlockMonitorDeviceSource::SessionMessageWindow::~SessionMessageWindow() { + // There should be no race condition between this code and the worker thread. + // WTSUnRegisterSessionNotification is only called from destruction as we are + // in shutdown, which means no other worker threads can be running. + if (window_) { + ::WTSUnRegisterSessionNotification(window_->hwnd()); + window_.reset(); + } +} + +bool ScreenlockMonitorDeviceSource::SessionMessageWindow::OnWndProc( + UINT message, + WPARAM wparam, + LPARAM lparam, + LRESULT* result) { + if (message == WM_WTSSESSION_CHANGE) { + ProcessWTSSessionLockMessage(wparam); + } + return true; +} + +void ScreenlockMonitorDeviceSource::SessionMessageWindow:: + ProcessWTSSessionLockMessage(WPARAM event_id) { + ScreenlockEvent screenlock_event; + switch (event_id) { + case WTS_SESSION_LOCK: + screenlock_event = SCREEN_LOCK_EVENT; + break; + case WTS_SESSION_UNLOCK: + screenlock_event = SCREEN_UNLOCK_EVENT; + break; + default: + return; + } + + ProcessScreenlockEvent(screenlock_event); +} + +} // namespace content |