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