#ifndef UI_VIEWS_FOCUS_NATIVE_VIEW_FOCUS_MANAGER_H_
#define UI_VIEWS_FOCUS_NATIVE_VIEW_FOCUS_MANAGER_H_
#include "base/no_destructor.h"
#include "base/observer_list.h"
#include "base/scoped_observation_traits.h"
#include "ui/gfx/native_ui_types.h"
#include "ui/views/views_export.h"
namespace views {
class NativeViewFocusChangeListener {
public:
virtual void OnNativeFocusChanged(gfx::NativeView focused_now) = 0;
protected:
virtual ~NativeViewFocusChangeListener() = default;
};
class VIEWS_EXPORT NativeViewFocusManager {
public:
static NativeViewFocusManager* GetInstance();
NativeViewFocusManager(const NativeViewFocusManager&) = delete;
NativeViewFocusManager& operator=(const NativeViewFocusManager&) = delete;
~NativeViewFocusManager();
void AddFocusChangeListener(NativeViewFocusChangeListener* listener);
void RemoveFocusChangeListener(NativeViewFocusChangeListener* listener);
void OnNativeFocusChanged(gfx::NativeView focused_now);
void EnableNotifications() { enabled_ = true; }
void DisableNotifications() { enabled_ = false; }
private:
class Owner;
friend class base::NoDestructor<NativeViewFocusManager>;
NativeViewFocusManager();
base::ObserverList<NativeViewFocusChangeListener>::Unchecked
focus_change_listeners_;
bool enabled_ = true;
};
class VIEWS_EXPORT AutoNativeNotificationDisabler {
public:
AutoNativeNotificationDisabler();
AutoNativeNotificationDisabler(const AutoNativeNotificationDisabler&) =
delete;
AutoNativeNotificationDisabler& operator=(
const AutoNativeNotificationDisabler&) = delete;
~AutoNativeNotificationDisabler();
};
}
namespace base {
template <>
struct ScopedObservationTraits<views::NativeViewFocusManager,
views::NativeViewFocusChangeListener> {
public:
static void AddObserver(views::NativeViewFocusManager* source,
views::NativeViewFocusChangeListener* observer) {
source->AddFocusChangeListener(observer);
}
static void RemoveObserver(views::NativeViewFocusManager* source,
views::NativeViewFocusChangeListener* observer) {
source->RemoveFocusChangeListener(observer);
}
};
}
#endif