chromium/ui/base/win/session_change_observer.h

// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_BASE_WIN_SESSION_CHANGE_OBSERVER_H_
#define UI_BASE_WIN_SESSION_CHANGE_OBSERVER_H_

#include <windows.h>

#include "base/component_export.h"
#include "base/functional/callback.h"

namespace ui {

// Calls the provided callback on WM_WTSSESSION_CHANGE messages along with
// managing the tricky business of observing a singleton object. Only
// WTS_SESSION_LOCK and WTS_SESSION_UNLOCK events trigger the callback
// because those are the only events existing observers handle.
class COMPONENT_EXPORT(UI_BASE) SessionChangeObserver {
 public:
  // WPARAM is the wparam passed to the OnWndProc when message is
  // WM_WTSSESSION_CHANGE. The bool indicates whether the session
  // change is for the current session or not. If we couldn't get the current
  // session id, it will be nullptr.
  using WtsCallback = base::RepeatingCallback<void(WPARAM, const bool*)>;
  explicit SessionChangeObserver(const WtsCallback& callback);

  SessionChangeObserver(const SessionChangeObserver&) = delete;
  SessionChangeObserver& operator=(const SessionChangeObserver&) = delete;

  ~SessionChangeObserver();

 private:
  class WtsRegistrationNotificationManager;

  void OnSessionChange(WPARAM wparam, const bool* is_current_session);
  void ClearCallback();

  WtsCallback callback_;
};

}  // namespace ui

#endif  // UI_BASE_WIN_SESSION_CHANGE_OBSERVER_H_