| // Copyright 2015 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 ASH_WM_NON_CLIENT_FRAME_CONTROLLER_H_ |
| #define ASH_WM_NON_CLIENT_FRAME_CONTROLLER_H_ |
| |
| #include <stdint.h> |
| |
| #include <map> |
| #include <string> |
| #include <vector> |
| |
| #include "ash/ash_export.h" |
| #include "base/macros.h" |
| #include "base/strings/string16.h" |
| #include "ui/aura/window_observer.h" |
| #include "ui/gfx/geometry/insets.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/views/widget/widget_delegate.h" |
| |
| namespace aura { |
| class PropertyConverter; |
| class Window; |
| } // namespace aura |
| |
| namespace gfx { |
| class Insets; |
| } |
| |
| namespace ws { |
| class TopLevelProxyWindow; |
| } // namespace ws |
| |
| namespace ash { |
| |
| // Provides the non-client frame and contents view for windows created by remote |
| // app processes. |
| class ASH_EXPORT NonClientFrameController : public views::WidgetDelegate, |
| public aura::WindowObserver { |
| public: |
| // Creates a new NonClientFrameController and window to render the non-client |
| // frame decorations. This deletes itself when |window| is destroyed. |parent| |
| // is the parent to place the newly created window in, and may be null. If |
| // |parent| is null, |context| is used to determine the parent Window. One of |
| // |parent| or |context| must be non-null. |window_manager_client| may be |
| // null for now. |bounds| is screen coordinates when |parent| is null, |
| // otherwise local coordinates, see views::Widget::InitParams::bounds. |
| NonClientFrameController( |
| ws::TopLevelProxyWindow* top_level_proxy_window, |
| aura::Window* parent, |
| aura::Window* context, |
| const gfx::Rect& bounds, |
| aura::PropertyConverter* property_converter, |
| std::map<std::string, std::vector<uint8_t>>* properties); |
| |
| // Returns the NonClientFrameController for the specified window, null if |
| // one was not created. |
| static NonClientFrameController* Get(aura::Window* window); |
| |
| // Returns the preferred client area insets. |
| static gfx::Insets GetPreferredClientAreaInsets(); |
| |
| // Returns the width needed to display the standard set of buttons on the |
| // title bar. |
| static int GetMaxTitleBarButtonWidth(); |
| |
| aura::Window* window() { return window_; } |
| |
| // Stores |cursor| as this window's active cursor. It does not actually update |
| // the active cursor by calling into CursorManager, but will update the return |
| // value provided by the associated window's aura::WindowDelegate::GetCursor. |
| void StoreCursor(const ui::Cursor& cursor); |
| |
| ws::TopLevelProxyWindow* top_level_proxy_window() { |
| return top_level_proxy_window_; |
| } |
| |
| // views::WidgetDelegate: |
| base::string16 GetWindowTitle() const override; |
| bool CanResize() const override; |
| bool CanMaximize() const override; |
| bool CanMinimize() const override; |
| bool CanActivate() const override; |
| bool ShouldShowWindowTitle() const override; |
| void DeleteDelegate() override; |
| views::Widget* GetWidget() override; |
| const views::Widget* GetWidget() const override; |
| views::View* GetContentsView() override; |
| views::ClientView* CreateClientView(views::Widget* widget) override; |
| void OnWindowBeginUserBoundsChange() override; |
| void OnWindowEndUserBoundsChange() override; |
| |
| // aura::WindowObserver: |
| void OnWindowPropertyChanged(aura::Window* window, |
| const void* key, |
| intptr_t old) override; |
| void OnWindowDestroyed(aura::Window* window) override; |
| |
| private: |
| ~NonClientFrameController() override; |
| |
| views::Widget* widget_; |
| views::View* contents_view_ = nullptr; |
| // Owned by the window-service. |
| ws::TopLevelProxyWindow* top_level_proxy_window_; |
| |
| // WARNING: as widget delays destruction there is a portion of time when this |
| // is null. |
| aura::Window* window_ = nullptr; |
| |
| bool did_init_native_widget_ = false; |
| |
| DISALLOW_COPY_AND_ASSIGN(NonClientFrameController); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_WM_NON_CLIENT_FRAME_CONTROLLER_H_ |