1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Use of this source code is governed by a BSD-style license that can be
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// found in the LICENSE file.
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant#ifndef ASH_WM_WINDOW_UTIL_H_
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant#define ASH_WM_WINDOW_UTIL_H_
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ash/ash_export.h"
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "base/compiler_specific.h"
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "ui/base/ui_base_types.h"
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace aura {
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass Window;
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace gfx {
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass Point;
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass Rect;
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass Size;
201b92188a82b01e76ac6e8ad5f997293c2a078adcMarshall Clow}
21061d0cc4db18d17bf01ed14c5db0be098205bd47Marshall Clow
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace ui {
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass Event;
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace ash {
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// We force at least this many DIPs for any window on the screen.
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst int kMinimumOnScreenArea = 10;
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace wm {
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Utility functions for window activation.
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT void ActivateWindow(aura::Window* window);
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT void DeactivateWindow(aura::Window* window);
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT bool IsActiveWindow(aura::Window* window);
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT aura::Window* GetActiveWindow();
37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT bool CanActivateWindow(aura::Window* window);
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Retrieves the activatable window for |window|. If |window| is activatable,
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// this will just return it, otherwise it will climb the parent/transient parent
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// chain looking for a window that is activatable, per the ActivationController.
42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// If you're looking for a function to get the activatable "top level" window,
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// this is probably what you're looking for.
44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT aura::Window* GetActivatableWindow(aura::Window* window);
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// TODO(oshima): remove this.
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT bool IsWindowMinimized(aura::Window* window);
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Moves the window to the center of the display.
50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT void CenterWindow(aura::Window* window);
516046aced820aaab4f14f2026531dd11d10690691Howard Hinnant
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Returns the bounds of a left snapped window with default width in parent
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// coordinates.
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT gfx::Rect GetDefaultLeftSnappedWindowBoundsInParent(
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    aura::Window* window);
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Returns the bounds of a right snapped window with default width in parent
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// coordinates.
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT gfx::Rect GetDefaultRightSnappedWindowBoundsInParent(
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    aura::Window* window);
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
62ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// Adjusts |bounds| so that the size does not exceed |max_size|.
63ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall ClowASH_EXPORT void AdjustBoundsSmallerThan(const gfx::Size& max_size,
64ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow                                        gfx::Rect* bounds);
65ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow
66ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// Move the given bounds inside the given |visible_area| in parent coordinates,
67ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// including a safety margin given by |kMinimumOnScreenArea|.
68ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// This also ensures that the top of the bounds is visible.
69ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall ClowASH_EXPORT void AdjustBoundsToEnsureMinimumWindowVisibility(
70ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow    const gfx::Rect& visible_area,
71ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow    gfx::Rect* bounds);
72ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow
73ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// Move the given bounds inside the given |visible_area| in parent coordinates,
74ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// including a safety margin given by |min_width| and |min_height|.
75ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall Clow// This also ensures that the top of the bounds is visible.
76ebfc50ee89c8e47151bf6abe999fb7def08c908bMarshall ClowASH_EXPORT void AdjustBoundsToEnsureWindowVisibility(
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const gfx::Rect& visible_area,
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int min_width,
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int min_height,
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    gfx::Rect* bounds);
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Moves |window| to the root window where the |event| occured if it is not
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// already in the same root window. Returns true if |window| was moved.
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT bool MoveWindowToEventRoot(aura::Window* window,
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                      const ui::Event& event);
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Changes the parent of a |child| and all its transient children that are
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// themselves children of |old_parent| to |new_parent|.
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid ReparentChildWithTransientChildren(aura::Window* child,
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                        aura::Window* old_parent,
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                        aura::Window* new_parent);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Changes the parent of all transient children of a |child| to |new_parent|.
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Does not change parent of the transient children that are not themselves
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// children of |old_parent|.
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid ReparentTransientChildrenOfChild(aura::Window* child,
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                      aura::Window* old_parent,
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                      aura::Window* new_parent);
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Snap the window's layer to physical pixel boundary.
1016046aced820aaab4f14f2026531dd11d10690691Howard Hinnantvoid SnapWindowToPixelBoundary(aura::Window* window);
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Mark the container window so that InstallSnapLayoutManagerToContainers
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// installs the SnapToPixelLayoutManager.
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantASH_EXPORT void SetSnapsChildrenToPhysicalPixelBoundary(
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    aura::Window* container);
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Traverse the |container| tree and installs SnapToPixelLayoutManager.
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid InstallSnapLayoutManagerToContainers(aura::Window* container);
11070342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant
11170342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant}  // namespace wm
11270342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant}  // namespace ash
11370342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant
11470342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant#endif  // ASH_WM_WINDOW_UTIL_H_
11570342b99e227912742972b754ad86e75c5d7eefbHoward Hinnant