#ifndef UI_WM_CORE_WINDOW_MODALITY_CONTROLLER_H_
#define UI_WM_CORE_WINDOW_MODALITY_CONTROLLER_H_
#include <string_view>
#include <vector>
#include "base/component_export.h"
#include "base/memory/raw_ptr.h"
#include "ui/aura/env_observer.h"
#include "ui/aura/window_observer.h"
#include "ui/events/event_handler.h"
namespace aura {
class Env;
}
namespace ui {
class EventTarget;
class LocatedEvent;
}
namespace wm {
COMPONENT_EXPORT(UI_WM)
void SetModalParent(aura::Window* child, aura::Window* parent);
COMPONENT_EXPORT(UI_WM) aura::Window* GetModalTransient(aura::Window* window);
COMPONENT_EXPORT(UI_WM)
const aura::Window* GetModalTransient(const aura::Window* window);
class COMPONENT_EXPORT(UI_WM) WindowModalityController
: public ui::EventHandler,
public aura::EnvObserver,
public aura::WindowObserver {
public:
explicit WindowModalityController(ui::EventTarget* event_target,
aura::Env* env = nullptr);
WindowModalityController(const WindowModalityController&) = delete;
WindowModalityController& operator=(const WindowModalityController&) = delete;
~WindowModalityController() override;
void OnKeyEvent(ui::KeyEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
void OnTouchEvent(ui::TouchEvent* event) override;
std::string_view GetLogContext() const override;
void OnWindowInitialized(aura::Window* window) override;
void OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) override;
void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
void OnWindowDestroyed(aura::Window* window) override;
private:
bool ProcessLocatedEvent(aura::Window* target, ui::LocatedEvent* event);
void CancelTouchesOnTransientWindowTree(aura::Window* window);
raw_ptr<aura::Env> env_;
std::vector<raw_ptr<aura::Window, VectorExperimental>> windows_;
raw_ptr<ui::EventTarget> event_target_;
};
}
#endif