123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
- #define EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
- #include <list>
- #include <memory>
- #include "base/memory/raw_ptr.h"
- #include "extensions/browser/app_window/app_window_registry.h"
- #include "ui/aura/client/window_parenting_client.h"
- #include "ui/aura/window_tree_host_observer.h"
- #include "ui/gfx/native_widget_types.h"
- namespace aura {
- class WindowTreeHost;
- namespace client {
- class ScreenPositionClient;
- } // namespace client
- } // namespace aura
- namespace content {
- class BrowserContext;
- } // namespace content
- namespace gfx {
- class Rect;
- class Size;
- } // namespace gfx
- namespace extensions {
- class AppWindow;
- // Owns and manages a WindowTreeHost for a display. New AppWindows will fill
- // the entire root window. Any additional AppWindows are simply drawn over the
- // existing AppWindow(s) and cannot be resized except by resizing the
- // WindowTreeHost.
- // TODO(michaelpg): Allow app windows to move between displays when bounds are
- // updated via the chrome.app.window API.
- class RootWindowController : public aura::client::WindowParentingClient,
- public aura::WindowTreeHostObserver,
- public AppWindowRegistry::Observer {
- public:
- class DesktopDelegate {
- public:
- virtual ~DesktopDelegate() = default;
- // Called when the root window requests to be closed. This should eventually
- // destroy |root_window_controller|.
- virtual void CloseRootWindowController(
- RootWindowController* root_window_controller) = 0;
- };
- // RootWindowController initializes and displays a WindowTreeHost within
- // |bounds| (in physical pixels).
- // |desktop_delegate| must outlive the RootWindowController.
- RootWindowController(DesktopDelegate* desktop_delegate,
- const gfx::Rect& bounds,
- content::BrowserContext* browser_context);
- RootWindowController(const RootWindowController&) = delete;
- RootWindowController& operator=(const RootWindowController&) = delete;
- ~RootWindowController() override;
- // Attaches a NativeAppWindow's window to our root window.
- void AddAppWindow(AppWindow* app_window, gfx::NativeWindow window);
- // Unparents the AppWindow's window from our root window so it can be added to
- // a different RootWindowController.
- void RemoveAppWindow(AppWindow* app_window);
- // Closes the root window's AppWindows, resulting in their destruction.
- void CloseAppWindows();
- // Updates the size of the root window.
- // TODO(michaelpg): Handle display events to adapt or close the window.
- void UpdateSize(const gfx::Size& size);
- aura::WindowTreeHost* host() { return host_.get(); }
- // aura::client::WindowParentingClient:
- aura::Window* GetDefaultParent(aura::Window* window,
- const gfx::Rect& bounds) override;
- // aura::WindowTreeHostObserver:
- void OnHostCloseRequested(aura::WindowTreeHost* host) override;
- // AppWindowRegistry::Observer:
- void OnAppWindowRemoved(AppWindow* app_window) override;
- private:
- void DestroyWindowTreeHost();
- const raw_ptr<DesktopDelegate> desktop_delegate_;
- // The BrowserContext used to create AppWindows.
- const raw_ptr<content::BrowserContext> browser_context_;
- std::unique_ptr<aura::client::ScreenPositionClient> screen_position_client_;
- // The host we create.
- std::unique_ptr<aura::WindowTreeHost> host_;
- // List of AppWindows we've created. Used to close any remaining app windows
- // when |host_| is closed or |this| is destroyed.
- // Note: Pointers are unowned. NativeAppWindow::Close() will delete them.
- std::list<AppWindow*> app_windows_;
- };
- } // namespace extensions
- #endif // EXTENSIONS_SHELL_BROWSER_ROOT_WINDOW_CONTROLLER_H_
|