| // Copyright 2019 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_WORK_AREA_INSETS_H_ |
| #define ASH_WM_WORK_AREA_INSETS_H_ |
| |
| #include "ash/ash_export.h" |
| #include "base/macros.h" |
| #include "ui/gfx/geometry/insets.h" |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/keyboard/keyboard_controller_observer.h" |
| |
| namespace aura { |
| class Window; |
| } |
| |
| namespace ash { |
| class RootWindowController; |
| |
| // Insets of the work area associated with this root window. |
| // Work area is the space left for user after removing areas occupied by |
| // persistent system elements like shelf, keyboard and accessibility widgets. |
| // Work area is assocciated with a single root window, because the configuration |
| // of persistent elements can be different for different screens. |
| // WorkAreaInsets class caches information about persistent system elements to |
| // avoid frequent recalculations. It gathers work area related computations and |
| // provides single interface to query work area details. |
| class ASH_EXPORT WorkAreaInsets : public keyboard::KeyboardControllerObserver { |
| public: |
| // Returns work area parameters associated with the given |window|. |
| static WorkAreaInsets* ForWindow(const aura::Window* window); |
| |
| explicit WorkAreaInsets(RootWindowController* root_window_controller); |
| ~WorkAreaInsets() override; |
| |
| // Returns cached height of the accessibility panel in DIPs for this root |
| // window. |
| int accessibility_panel_height() const { return accessibility_panel_height_; } |
| |
| // Returns cached height of the docked magnifier in DIPs for this root |
| // window. |
| int docked_magnifier_height() const { return docked_magnifier_height_; } |
| |
| // Returns cached user work area bounds in screen coordinates DIPs for this |
| // root window. |
| const gfx::Rect& user_work_area_bounds() const { |
| return user_work_area_bounds_; |
| } |
| |
| // Returns cached user work area insets in DIPs for this root window. |
| const gfx::Insets& user_work_area_insets() const { |
| return user_work_area_insets_; |
| } |
| |
| // Returns accessibility insets in DIPs. |
| gfx::Insets GetAccessibilityInsets() const; |
| |
| // Returns bounds of the stable work area (work area when the shelf is |
| // visible) in screen coordinates DIPs. |
| gfx::Rect ComputeStableWorkArea() const; |
| |
| // Returns whether keyboard is shown for this root window. |
| // TODO(agawronska): It would be nice to contain all keyboard related |
| // functionality in this class and remove this method. |
| bool IsKeyboardShown() const; |
| |
| // Sets height of the accessibility panel in DIPs for this root window. |
| // Shell observers will be notified that accessibility insets changed. |
| void SetDockedMagnifierHeight(int height); |
| |
| // Sets height of the docked magnifier in DIPs for this root window. |
| // Shell observers will be notified that accessibility insets changed. |
| void SetAccessibilityPanelHeight(int height); |
| |
| // Sets bounds (in window coordinates) and insets of the shelf for this root |
| // window. |bounds| and |insets| are passed separately, because insets depend |
| // on shelf visibility and can be different than calculated from bounds. |
| void SetShelfBoundsAndInsets(const gfx::Rect& bounds, |
| const gfx::Insets& insets); |
| |
| // keyboard::KeyboardControllerObserver: |
| void OnKeyboardAppearanceChanged( |
| const keyboard::KeyboardStateDescriptor& state) override; |
| void OnKeyboardVisibilityStateChanged(bool is_visible) override; |
| |
| private: |
| // Updates cached values of work area bounds and insets. |
| void UpdateWorkArea(); |
| |
| // RootWindowController associated with this work area. |
| RootWindowController* const root_window_controller_ = nullptr; |
| |
| // Cached bounds of user work area in screen coordinates DIPs. |
| gfx::Rect user_work_area_bounds_; |
| |
| // Cached insets of user work area in DIPs. |
| gfx::Insets user_work_area_insets_; |
| |
| // Cached occluded bounds of the keyboard in window coordinates. It needs to |
| // be removed from the available work area. See |
| // ui/keyboard/keyboard_controller_observer.h for details. |
| gfx::Rect keyboard_occluded_bounds_; |
| |
| // Cached displaced bounds of the keyboard in window coordinates. |
| // See ui/keyboard/keyboard_controller_observer.h for details. |
| gfx::Rect keyboard_displaced_bounds_; |
| |
| // Cached bounds of the shelf in window coordinates in DIPs. |
| gfx::Rect shelf_bounds_; |
| |
| // Cached insets of the shelf in DIPs. |
| gfx::Insets shelf_insets_; |
| |
| // Cached height of the docked magnifier in DIPs at the top of the screen. |
| // It needs to be removed from the available work area. |
| int docked_magnifier_height_ = 0; |
| |
| // Cached height of the accessibility panel in DIPs at the top of the |
| // screen. It needs to be removed from the available work area. |
| int accessibility_panel_height_ = 0; |
| |
| DISALLOW_COPY_AND_ASSIGN(WorkAreaInsets); |
| }; |
| |
| } // namespace ash |
| |
| #endif // ASH_WM_WORK_AREA_INSETS_H_ |