1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_
#define EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_
#include <map>
#include <memory>
#include "base/compiler_specific.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/keep_alive_registry/keep_alive_state_observer.h"
#include "extensions/shell/browser/desktop_controller.h"
#include "extensions/shell/browser/root_window_controller.h"
#include "ui/aura/window.h"
#include "ui/base/ime/ime_key_event_dispatcher.h"
#include "ui/display/display.h"
#if BUILDFLAG(IS_CHROMEOS)
#include "chromeos/dbus/power/power_manager_client.h"
#include "ui/display/manager/display_configurator.h"
#endif
namespace aura {
class WindowTreeHost;
} // namespace aura
namespace content {
class BrowserContext;
} // namespace content
namespace display {
class Screen;
} // namespace display
namespace gfx {
class Size;
} // namespace gfx
namespace ui {
class InputMethod;
#if BUILDFLAG(IS_CHROMEOS)
class UserActivityPowerManagerNotifier;
#endif
} // namespace ui
namespace wm {
class CompoundEventFilter;
class CursorManager;
class FocusController;
} // namespace wm
namespace extensions {
class AppWindowClient;
// Simple desktop controller for app_shell. Associates each display with a
// RootWindowController. Adds AppWindows by passing them to the nearest
// RootWindowController.
class ShellDesktopControllerAura
: public DesktopController,
public RootWindowController::DesktopDelegate,
#if BUILDFLAG(IS_CHROMEOS)
public chromeos::PowerManagerClient::Observer,
public display::DisplayConfigurator::Observer,
#endif
public ui::ImeKeyEventDispatcher,
public KeepAliveStateObserver {
public:
explicit ShellDesktopControllerAura(content::BrowserContext* browser_context);
ShellDesktopControllerAura(const ShellDesktopControllerAura&) = delete;
ShellDesktopControllerAura& operator=(const ShellDesktopControllerAura&) =
delete;
~ShellDesktopControllerAura() override;
// DesktopController:
void PreMainMessageLoopRun() override;
void WillRunMainMessageLoop(
std::unique_ptr<base::RunLoop>& run_loop) override;
void PostMainMessageLoopRun() override;
void AddAppWindow(AppWindow* app_window, gfx::NativeWindow window) override;
void CloseAppWindows() override;
// RootWindowController::DesktopDelegate:
void CloseRootWindowController(
RootWindowController* root_window_controller) override;
#if BUILDFLAG(IS_CHROMEOS)
// chromeos::PowerManagerClient::Observer:
void PowerButtonEventReceived(bool down, base::TimeTicks timestamp) override;
// display::DisplayConfigurator::Observer:
void OnDisplayConfigurationChanged(
const display::DisplayConfigurator::DisplayStateList& displays) override;
#endif
// ui::ImeKeyEventDispatcher:
ui::EventDispatchDetails DispatchKeyEventPostIME(
ui::KeyEvent* key_event) override;
// KeepAliveStateObserver:
void OnKeepAliveStateChanged(bool is_keeping_alive) override;
void OnKeepAliveRestartStateChanged(bool can_restart) override;
// Returns the WindowTreeHost for the primary display.
aura::WindowTreeHost* GetPrimaryHost();
// Returns all root windows managed by RootWindowControllers.
aura::Window::Windows GetAllRootWindows();
// Updates the bounds of `app_window`. This may involve reparenting the window
// to a different root window if the new bounds are in a different display.
void SetWindowBoundsInScreen(AppWindow* app_window, const gfx::Rect& bounds);
protected:
// Creates and sets the aura clients and window manager stuff. Subclass may
// initialize different sets of the clients.
virtual void InitWindowManager();
// Removes all RootWindowControllers and tears down our aura clients.
virtual void TearDownWindowManager();
private:
// Creates a RootWindowController to host AppWindows.
std::unique_ptr<RootWindowController> CreateRootWindowControllerForDisplay(
const display::Display& display);
// Removes handlers from the RootWindowController so it can be destroyed.
void TearDownRootWindowController(RootWindowController* root);
// Quits if there are no app windows, and no keep-alives waiting for apps to
// relaunch.
void MaybeQuit();
#if BUILDFLAG(IS_CHROMEOS)
// Returns the desired dimensions of the RootWindowController from the command
// line, or falls back to a default size.
gfx::Size GetStartingWindowSize();
// Returns the dimensions (in pixels) of the primary display, or an empty size
// if the dimensions can't be determined or no display is connected.
gfx::Size GetPrimaryDisplaySize();
#endif
const raw_ptr<content::BrowserContext> browser_context_;
#if BUILDFLAG(IS_CHROMEOS)
std::unique_ptr<display::DisplayConfigurator> display_configurator_;
#endif
std::unique_ptr<display::Screen> screen_;
std::unique_ptr<wm::CompoundEventFilter> root_window_event_filter_;
// Mapping from display ID to the RootWindowController created for that
// display.
std::map<int64_t, std::unique_ptr<RootWindowController>>
root_window_controllers_;
std::unique_ptr<ui::InputMethod> input_method_;
std::unique_ptr<wm::FocusController> focus_controller_;
std::unique_ptr<wm::CursorManager> cursor_manager_;
#if BUILDFLAG(IS_CHROMEOS)
std::unique_ptr<ui::UserActivityPowerManagerNotifier> user_activity_notifier_;
#endif
std::unique_ptr<AppWindowClient> app_window_client_;
// NativeAppWindow::Close() deletes the AppWindow.
std::list<raw_ptr<AppWindow, CtnExperimental>> app_windows_;
// Non-null between WillRunMainMessageLoop() and MaybeQuit().
base::OnceClosure quit_when_idle_closure_;
};
} // namespace extensions
#endif // EXTENSIONS_SHELL_BROWSER_SHELL_DESKTOP_CONTROLLER_AURA_H_
|