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
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245
  246
  247
  248
  249
  250
  251
  252
  253
  254
  255
  256
  257
  258
  259
  260
  261
  262
  263

ash / wm / window_util.h [blame]

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef ASH_WM_WINDOW_UTIL_H_
#define ASH_WM_WINDOW_UTIL_H_

#include <stdint.h>

#include <vector>

#include "ash/ash_export.h"
#include "ash/wm/window_transient_descendant_iterator.h"
#include "ash/wm/wm_metrics.h"
#include "base/memory/raw_ptr.h"
#include "chromeos/ui/base/window_state_type.h"
#include "ui/aura/window.h"
#include "ui/gfx/geometry/rounded_corners_f.h"
#include "ui/views/window/dialog_delegate.h"
#include "ui/wm/core/window_util.h"

class PrefRegistrySimple;

namespace gfx {
class Point;
class Rect;
class RectF;
}  // namespace gfx

namespace ui {
class LocatedEvent;
}  // namespace ui

namespace views {
class BubbleDialogDelegate;
class View;
}  // namespace views

namespace ash::window_util {

ASH_EXPORT int GetMiniWindowRoundedCornerRadius();

// Returns the rounded corners for a mini window representation of
// `source_window`. It takes into account if the `source_window`
// belongs to a snap group or not.
// If `include_header_rounding` is false, function returns the radii of only
// bottom two corners of mini window.
ASH_EXPORT gfx::RoundedCornersF GetMiniWindowRoundedCorners(
    const aura::Window* source_window,
    bool include_header_rounding,
    std::optional<float> scale = std::nullopt);

// See ui/wm/core/window_util.h for ActivateWindow(), DeactivateWindow(),
// IsActiveWindow() and CanActivateWindow().
ASH_EXPORT aura::Window* GetActiveWindow();
ASH_EXPORT aura::Window* GetFocusedWindow();

// Returns true if `win1` is stacked (not directly) below `win2`. Note that this
// API only applies for windows with the same direct parent.
ASH_EXPORT bool IsStackedBelow(aura::Window* win1, aura::Window* win2);

// Returns the top most window for the given `windows` list by first finding the
// lowest common parent of all the `windows` and then finding the window among
// `windows` that is top-most in terms of z-order. Note that this doesn't take
// account of the visibility of the windows.
ASH_EXPORT aura::Window* GetTopMostWindow(const aura::Window::Windows& windows);

// Sort the windows in `window_set` according to their stacking order in the
// window tree. Windows which are descendants of a different root window will be
// returned in an arbitrary order relative to each-other.
ASH_EXPORT std::vector<aura::Window*> SortWindowsBottomToTop(
    std::set<raw_ptr<aura::Window, SetExperimental>> window_set);

// Returns the window with capture, null if no window currently has capture.
ASH_EXPORT aura::Window* GetCaptureWindow();

// Returns the Windows that may block events.
// If |min_container| is non-null then windows that are not children of
// |min_container| or not stacked above (z-order) will not receive events.
// |system_modal_container| is the window system modal windows appear in. If
// there is a system modal window in it, then events that are not targetted
// at the active modal window (or an ancestor or transient ancestor) will not
// receive events.
ASH_EXPORT void GetBlockingContainersForRoot(
    aura::Window* root_window,
    aura::Window** min_container,
    aura::Window** system_modal_container);

// Returns true if |window|'s location can be controlled by the user.
ASH_EXPORT bool IsWindowUserPositionable(aura::Window* window);

// Pins the window on top of other windows.
ASH_EXPORT void PinWindow(aura::Window* window, bool trusted);

// Indicates that the window should autohide the shelf when it is the active
// window.
ASH_EXPORT void SetAutoHideShelf(aura::Window* window, bool autohide);

// Moves |window| to the root window for the given |display_id|, if it is not
// already in the same root window. Returns true if |window| was moved.
ASH_EXPORT bool MoveWindowToDisplay(aura::Window* window, int64_t display_id);

// Convenience for window->delegate()->GetNonClientComponent(location) that
// returns HTNOWHERE if window->delegate() is null.
ASH_EXPORT int GetNonClientComponent(aura::Window* window,
                                     const gfx::Point& location);

// When set, the child windows should get a slightly larger hit region to make
// resizing easier.
ASH_EXPORT void SetChildrenUseExtendedHitRegionForWindow(aura::Window* window);

// Requests the |window| to close and destroy itself. This is intended to
// forward to an associated widget.
ASH_EXPORT void CloseWidgetForWindow(aura::Window* window);

// Installs a resize handler on the window that makes it easier to resize
// the window.
ASH_EXPORT void InstallResizeHandleWindowTargeterForWindow(
    aura::Window* window);

// Returns true if `window` is currently in tab-dragging process.
ASH_EXPORT bool IsDraggingTabs(const aura::Window* window);

// Returns true if `window` should be excluded from the cycle list and/or
// overview.
ASH_EXPORT bool ShouldExcludeForCycleList(const aura::Window* window);
ASH_EXPORT bool ShouldExcludeForOverview(const aura::Window* window);

// Removes all windows in |out_window_list| whose transient root is also in
// |out_window_list|. Also replaces transient descendants with their transient
// roots, ensuring only one unique instance of each transient root. This is used
// by overview and window cycler to avoid showing multiple previews for windows
// linked by transient and creating items using transient descendants.
ASH_EXPORT void EnsureTransientRoots(
    std::vector<raw_ptr<aura::Window, VectorExperimental>>* out_window_list);

// Minimizes a hides list of |windows| without any animations.
ASH_EXPORT void MinimizeAndHideWithoutAnimation(
    const std::vector<raw_ptr<aura::Window, VectorExperimental>>& windows);

// Returns the RootWindow at |point_in_screen| in virtual screen coordinates.
// Returns nullptr if the root window does not exist at the given point.
ASH_EXPORT aura::Window* GetRootWindowAt(const gfx::Point& point_in_screen);

// Returns the RootWindow that shares the most area with |rect_in_screen| in
// virtual screen coordinates.
ASH_EXPORT aura::Window* GetRootWindowMatching(const gfx::Rect& rect_in_screen);

// Returns true if |window| is an ARC PIP window.
ASH_EXPORT bool IsArcPipWindow(const aura::Window* window);

// Expands the Android PIP window.
ASH_EXPORT void ExpandArcPipWindow();

// Returns true if any window is being dragged, or we are in overview mode and
// an item is being dragged around.
bool IsAnyWindowDragged();

// Adjusts the z-order stacking of `window_to_fix` in its parent to match its
// order in the MRU window list. This is done after the window is moved from one
// parent container to another by means of calling `AddChild()` which adds it as
// the top-most window, which doesn't necessarily match the MRU order.
// `window_to_fix` must be a child of a desk container, and the root of a
// transient hierarchy (if it belongs to one).
// This function must be called after `AddChild()` was called to add the
// `window_to_fix`.
void FixWindowStackingAccordingToGlobalMru(aura::Window* window_to_fix);

// Returns the top window on MRU window list, or null if the list is empty.
ASH_EXPORT aura::Window* GetTopWindow();
ASH_EXPORT aura::Window* GetTopNonFloatedWindow();

// Returns the floated window for the active desk if it exists.
ASH_EXPORT aura::Window* GetFloatedWindowForActiveDesk();

// Returns whether the top window should be minimized on back action.
ASH_EXPORT bool ShouldMinimizeTopWindowOnBack();

// Returns true if `window` is in minimized state, or is in floated state and
// tucked to the side in tablet mode.
ASH_EXPORT bool IsMinimizedOrTucked(aura::Window* window);

// Sends |ui::VKEY_BROWSER_BACK| key press and key release event to the
// WindowTreeHost associated with |root_window|.
void SendBackKeyEvent(aura::Window* root_window);

// Iterates through all the windows in the transient tree associated with
// |window| that are visible.
WindowTransientDescendantIteratorRange GetVisibleTransientTreeIterator(
    aura::Window* window);

// Applies the `transform` to `window` and all of its transient children,
// except those with `kExcludeFromTransientTreeTransformKey` set to true.
// Note `transform` is the transform that is applied to `window` and needs to be
// adjusted for the transient child windows.
ASH_EXPORT void SetTransform(aura::Window* window,
                             const gfx::Transform& transform);

// Calculates the bounds of the |transformed_window|. Those bounds are a union
// of all regular (normal and panel) windows in the |transformed_window|'s
// transient hierarchy. The returned Rect is in screen coordinates. The returned
// bounds are adjusted to allow the original |transformed_window|'s header to be
// hidden if |top_inset| is not zero.
ASH_EXPORT gfx::RectF GetTransformedBounds(aura::Window* transformed_window,
                                int top_inset);

// Returns the `BubbleDialogDelegate` associated with the given
// `transient_window`, if it's a bubble dialog.
ASH_EXPORT views::BubbleDialogDelegate* AsBubbleDialogDelegate(
    aura::Window* transient_window);

// Returns the `DialogDelegate` associated with the given `transient_window`, if
// it's a dialog.
views::DialogDelegate* AsDialogDelegate(aura::Window* transient_window);

// If multi profile is on, check if |window| should be shown for the current
// user.
bool ShouldShowForCurrentUser(aura::Window* window);

ASH_EXPORT aura::Window* GetEventHandlerForEvent(const ui::LocatedEvent& event);

// TODO(zxdan): Remove this method after all related code being migrated to the
// new way of getting input device settings. Note: this method is being
// deprecated. Please use IsNaturalScrollOn(const ui::ScrollEvent&).
ASH_EXPORT bool IsNaturalScrollOn();

// Checks the device settings to see if natural scroll for the touchpad is
// turned on.
ASH_EXPORT bool IsNaturalScrollOn(const ui::ScrollEvent& event);

// The thumbnail window (transformed window for non-minimized state in overview,
// mirror window for minimized state in overview and alt+tab windows) may need
// to be rounded depending on the state of the backdrop. This helper takes into
// account the rounded corners of `backdrop_view`, if it exists. Used for
// overview and alt+tab.
ASH_EXPORT bool ShouldRoundThumbnailWindow(
    views::View* backdrop_view,
    const gfx::RectF& thumbnail_bounds_in_screen);

// Returns the target snap ratio for the given `window` or
// `chromeos::kDefaultSnapRatio` if the target snap ratio doesn't exist.
float GetSnapRatioForWindow(aura::Window* window);

// Registers the per-profile preferences for whether faster splitscreen setup is
// enabled.
void RegisterProfilePrefs(PrefRegistrySimple* registry);

// Returns true if `SplitViewOverviewSession` is created through faster split
// screen setup, i.e. partial overview is started on the other side of the
// screen when `window` is snapped.
bool IsInFasterSplitScreenSetupSession(const aura::Window* window);

// Returns true if overview is in session in clamshell mode and any overview
// grid is in faster splitview. This is a specific mode during which we don't
// show the desk bar or save desk buttons.
bool IsInFasterSplitScreenSetupSession();

// Returns the target bounds of `window` in screen coordinates.
ASH_EXPORT gfx::Rect GetTargetScreenBounds(aura::Window* window);

}  // namespace ash::window_util

#endif  // ASH_WM_WINDOW_UTIL_H_