#ifndef ASH_SHELF_SHELF_WINDOW_WATCHER_H_
#define ASH_SHELF_SHELF_WINDOW_WATCHER_H_
#include <set>
#include "ash/shell_observer.h"
#include "base/memory/raw_ptr.h"
#include "base/scoped_multi_source_observation.h"
#include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
#include "ui/wm/public/activation_change_observer.h"
namespace ash {
class ShelfModel;
class ShelfWindowWatcher : public ::wm::ActivationChangeObserver,
public ShellObserver {
public:
explicit ShelfWindowWatcher(ShelfModel* model);
ShelfWindowWatcher(const ShelfWindowWatcher&) = delete;
ShelfWindowWatcher& operator=(const ShelfWindowWatcher&) = delete;
~ShelfWindowWatcher() override;
private:
class ContainerWindowObserver : public aura::WindowObserver {
public:
explicit ContainerWindowObserver(ShelfWindowWatcher* window_watcher);
ContainerWindowObserver(const ContainerWindowObserver&) = delete;
ContainerWindowObserver& operator=(const ContainerWindowObserver&) = delete;
~ContainerWindowObserver() override;
private:
void OnWindowAdded(aura::Window* new_window) override;
void OnWindowDestroying(aura::Window* window) override;
raw_ptr<ShelfWindowWatcher> window_watcher_;
};
class UserWindowObserver : public aura::WindowObserver {
public:
explicit UserWindowObserver(ShelfWindowWatcher* window_watcher);
UserWindowObserver(const UserWindowObserver&) = delete;
UserWindowObserver& operator=(const UserWindowObserver&) = delete;
~UserWindowObserver() override;
private:
void OnWindowPropertyChanged(aura::Window* window,
const void* key,
intptr_t old) override;
void OnWindowDestroying(aura::Window* window) override;
void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
void OnWindowTitleChanged(aura::Window* window) override;
raw_ptr<ShelfWindowWatcher> window_watcher_;
};
void AddShelfItem(aura::Window* window);
void RemoveShelfItem(aura::Window* window);
void OnContainerWindowDestroying(aura::Window* container);
void OnUserWindowAdded(aura::Window* window);
void OnUserWindowPropertyChanged(aura::Window* window);
void OnUserWindowDestroying(aura::Window* window);
void OnWindowActivated(ActivationReason reason,
aura::Window* gained_active,
aura::Window* lost_active) override;
void OnRootWindowAdded(aura::Window* root_window) override;
raw_ptr<ShelfModel> model_;
ContainerWindowObserver container_window_observer_{this};
UserWindowObserver user_window_observer_{this};
base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver>
observed_container_windows_;
base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver>
observed_user_windows_;
std::set<raw_ptr<aura::Window, SetExperimental>> user_windows_with_items_;
};
}
#endif