chromium/ash/public/cpp/shell_window_ids.h

// 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_PUBLIC_CPP_SHELL_WINDOW_IDS_H_
#define ASH_PUBLIC_CPP_SHELL_WINDOW_IDS_H_

#include <vector>

#include "ash/public/cpp/ash_public_export.h"

// Declarations of ids of special shell windows.

namespace ash {

enum ShellWindowId {
  // Used to indicate no shell window id.
  kShellWindowId_Invalid = -1,

  // This container is used for animations which take a screenshot of the
  // contents, place them on top of the root and animate the screenshot layer.
  // We can't take a screenshot of the root itself, otherwise subsequent
  // screenshots will screenshot previous screenshots.
  kShellWindowId_ScreenAnimationContainer = 0,

  // The container that displays booting animations.
  kShellWindowId_BootingAnimationContainer,

  // The magnified container which contains everything that would be magnified
  // when docked magnifier is enabled.
  kShellWindowId_MagnifiedContainer,

  // The container for the Docked Magnifier viewport widget and the separator.
  kShellWindowId_DockedMagnifierContainer,

  // A higher-level container that holds all of the containers stacked below
  // kShellWindowId_LockScreenContainer.  Only used by PowerButtonController for
  // animating lower-level containers and AccessibilityController for hiding
  // non-lock screen windows from Accessibility when the user session is
  // blocked.
  kShellWindowId_NonLockScreenContainersContainer,

  // A higher-level container that holds containers that hold lock-screen
  // windows. Only used by PowerButtonController for animating lower-level
  // containers.
  kShellWindowId_LockScreenContainersContainer,

  // A higher-level container that holds containers that hold
  // lock-screen-related windows (which are displayed regardless of the screen
  // lock state, effectively containers stacked above
  // kShellWindowId_LockSystemModalContainer). Used by the shelf, status area,
  // virtual keyboard, settings bubble, menus, etc. Also used by the
  // PowerButtonController for animating lower-level containers.
  kShellWindowId_LockScreenRelatedContainersContainer,

  // A container used for windows that temporarily have no parent. It is
  // expected the windows will get parented to another container shortly after.
  // This container is not visible.
  kShellWindowId_UnparentedContainer,

  // The wallpaper (desktop background) window.
  kShellWindowId_WallpaperContainer,

  // A container for the windows that will be included in the shutdown
  // screenshot. Including desk containers, float and always on top containers.
  // Note: Only created if the forest feature is enabled.
  kShellWindowId_ShutdownScreenshotContainer,

  // The containers for standard top-level windows per active desks.
  // * Notes:
  //   - There are no direct mapping between `kShellWindowId_DeskContainerA` and
  //     Desk 1, or `kShellWindowId_DeskContainerB` and Desk 2. The containers
  //     are reused as desks are created and deleted.
  //   - Keep the desk container IDs sequential here.
  //   - **DO NOT** use these container IDs directly, instead use
  //     `desks_util::GetActiveDeskContainerId()`.
  kShellWindowId_DeskContainerA,
  kShellWindowId_DeskContainerB,
  kShellWindowId_DeskContainerC,
  kShellWindowId_DeskContainerD,
  kShellWindowId_DeskContainerE,
  kShellWindowId_DeskContainerF,
  kShellWindowId_DeskContainerG,
  kShellWindowId_DeskContainerH,
  kShellWindowId_DeskContainerI,
  kShellWindowId_DeskContainerJ,
  kShellWindowId_DeskContainerK,
  kShellWindowId_DeskContainerL,
  kShellWindowId_DeskContainerM,
  kShellWindowId_DeskContainerN,
  kShellWindowId_DeskContainerO,
  kShellWindowId_DeskContainerP,

  // The container for top-level windows with the 'always-on-top' flag set.
  kShellWindowId_AlwaysOnTopContainer,

  // The container for the floating window.
  kShellWindowId_FloatContainer,

  // The container for the app list.
  kShellWindowId_AppListContainer,

  // The container for the home screen, e.g. the app list in tablet mode.
  kShellWindowId_HomeScreenContainer,

  // The container for the PIP window.
  kShellWindowId_PipContainer,

  // The parent container that holds the ARC IME container and windows created
  // by ARC IME other than the virtual keyboard window.
  // This container window is to ensure that the ARC IME window is stacked above
  // top-level windows and the app list window but below the shelf.
  kShellWindowId_ArcImeWindowParentContainer,

  // The container for Virtual Keyboard from ARC IMEs.
  kShellWindowId_ArcVirtualKeyboardContainer,

  // The container for UI on the shelf (shelf, navigation, hotseat,
  // status area).
  kShellWindowId_ShelfContainer,

  // The container for bubbles which float over the shelf.
  kShellWindowId_ShelfBubbleContainer,

  // The container for user-specific modal windows.
  kShellWindowId_SystemModalContainer,

  // The container for the lock screen wallpaper (lock screen background).
  kShellWindowId_LockScreenWallpaperContainer,

  // The container for the lock screen.
  kShellWindowId_LockScreenContainer,

  // The container for windows that handle lock tray actions (e.g. new note
  // action). The action handler container's children should be visible on lock
  // screen, but only when an action is being handled - i.e. action handling
  // state is either:
  //  *  active - the container is stacked above LockScreenContainer
  //  *  background - the container is stacked below LockScreenContainer
  kShellWindowId_LockActionHandlerContainer,

  // The container for the lock screen modal windows.
  kShellWindowId_LockSystemModalContainer,

  // A parent container that holds the virtual keyboard container and ime
  // windows if any. This is to ensure that the virtual keyboard or ime window
  // is stacked above most containers but below the mouse cursor and the power
  // off animation.
  kShellWindowId_ImeWindowParentContainer,

  // The virtual keyboard container.
  kShellWindowId_VirtualKeyboardContainer,

  // The container for menus.
  kShellWindowId_MenuContainer,

  // The container for drag/drop images, tooltips and widgets that are tagged
  // with ui::ZOrderLevel::kSecuritySurface.
  kShellWindowId_DragImageAndTooltipContainer,

  // The container for the fullscreen power button menu.
  kShellWindowId_PowerMenuContainer,

  // The container for bubbles briefly overlaid onscreen to show settings
  // changes (volume, brightness, input method bubbles, etc.), tray bubbles and
  // notifier elements such as notification popups, toasts and system nudges.
  kShellWindowId_SettingBubbleContainer,

  // The container for the live caption window.
  kShellWindowId_LiveCaptionContainer,

  // The container for help bubbles which are anchored to views for the purpose
  // of user education. In the case of the Welcome Tour, which walks new users
  // through ChromeOS System UI, a background blur will be applied to the
  // container with a masked cut out for the help bubble anchor view.
  kShellWindowId_HelpBubbleContainer,

  // Contains special accessibility windows that can inset the display work area
  // (e.g. the ChromeVox spoken feedback window).
  // TODO(jamescook): Consolidate this with DockedMagnifierContainer.
  kShellWindowId_AccessibilityPanelContainer,

  // The container for accessibility bubbles that overlay the work area and any
  // other menus and bubbles, but appear under the Autoclick mouse UX in
  // kShellWindowId_OverlayContainer. Both Autoclick and Switch Access have
  // bubbles that appear in this layer. These features need to work with dialogs
  // and menus, so they must be shown above
  // kShellWindowId_SettingBubbleContainer to allow the user to access these
  // settings. However, these bubbles may have buttons with tooltips which must
  // be shown above the bubbles, so it must be under
  // kShellWindowId_DragImageAndTooltipContainer.
  // TODO(crbug/1076973): Investigate merging this container with
  // AccessibilityPanelContainer.
  kShellWindowId_AccessibilityBubbleContainer,

  // The container for special components overlaid onscreen, such as the
  // region selector for partial screenshots.
  kShellWindowId_OverlayContainer,

  // The container for ambient mode screen saver.
  kShellWindowId_AmbientModeContainer,

  // The container for mouse cursor.
  kShellWindowId_MouseCursorContainer,

  // The container for an image that should stay on top of everything except for
  // the power off animation.
  kShellWindowId_AlwaysOnTopWallpaperContainer,

  // The topmost container, used for power off animation.
  kShellWindowId_PowerButtonAnimationContainer,

  kShellWindowId_MinContainer = kShellWindowId_ScreenAnimationContainer,
  kShellWindowId_MaxContainer = kShellWindowId_PowerButtonAnimationContainer,
};

// Special shell windows that are not containers.
enum NonContainerWindowId {
  // The window created by PhantomWindowController or DragWindowController.
  kShellWindowId_PhantomWindow = kShellWindowId_MaxContainer + 1,

  // The window that shows a blue highlight on the edges of a selected display.
  // Only one window exists whenever the display settings page is open with
  // multiple displays connected.
  kShellWindowId_DisplayIdentificationHighlightWindow,

  // The window specified as the owner of the folder selection menu for capture
  // mode, which will be a transient window parent of the about to be created
  // dialog window. This is needed in order to prevent
  // |SelectFileDialogExtension| from favoring to parent the dialog to a browser
  // window (if one exists).
  kShellWindowId_CaptureModeFolderSelectionDialogOwner,

  // The window that notifies the user that an admin user was present on the
  // host device when the remote desktop session was curtained.
  kShellWindowId_AdminWasPresentNotificationWindow,
};

// A list of system modal container IDs. The order of the list is important that
// the more restrictive container appears before the less restrictive ones.
constexpr int kSystemModalContainerIds[] = {
    kShellWindowId_LockSystemModalContainer, kShellWindowId_HelpBubbleContainer,
    kShellWindowId_SystemModalContainer};

// Returns the list of container ids of containers which may contain windows
// that need to be activated. this list is ordered by the activation order; that
// is, windows in containers appearing earlier in the list are activated before
// windows in containers appearing later in the list. This list is used by
// AshFocusRules to determine which container to start the search from when
// looking for the next activatable window.
ASH_PUBLIC_EXPORT std::vector<int> GetActivatableShellWindowIds();

// Returns true if |id| is in GetActivatableShellWindowIds.
ASH_PUBLIC_EXPORT bool IsActivatableShellWindowId(int id);

}  // namespace ash

#endif  // ASH_PUBLIC_CPP_SHELL_WINDOW_IDS_H_