| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/root_window_controller.h" | 5 #include "ash/root_window_controller.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "ash/ash_constants.h" | 10 #include "ash/ash_constants.h" |
| 11 #include "ash/ash_switches.h" | 11 #include "ash/ash_switches.h" |
| 12 #include "ash/desktop_background/desktop_background_controller.h" | 12 #include "ash/desktop_background/desktop_background_controller.h" |
| 13 #include "ash/desktop_background/desktop_background_widget_controller.h" | 13 #include "ash/desktop_background/desktop_background_widget_controller.h" |
| 14 #include "ash/desktop_background/user_wallpaper_delegate.h" | 14 #include "ash/desktop_background/user_wallpaper_delegate.h" |
| 15 #include "ash/display/display_manager.h" | 15 #include "ash/display/display_manager.h" |
| 16 #include "ash/focus_cycler.h" | 16 #include "ash/focus_cycler.h" |
| 17 #include "ash/high_contrast/high_contrast_controller.h" | 17 #include "ash/high_contrast/high_contrast_controller.h" |
| 18 #include "ash/host/ash_window_tree_host.h" | 18 #include "ash/host/ash_window_tree_host.h" |
| 19 #include "ash/root_window_controller_common.h" |
| 19 #include "ash/root_window_settings.h" | 20 #include "ash/root_window_settings.h" |
| 20 #include "ash/session/session_state_delegate.h" | 21 #include "ash/session/session_state_delegate.h" |
| 21 #include "ash/shelf/shelf_layout_manager.h" | 22 #include "ash/shelf/shelf_layout_manager.h" |
| 22 #include "ash/shelf/shelf_types.h" | 23 #include "ash/shelf/shelf_types.h" |
| 23 #include "ash/shelf/shelf_widget.h" | 24 #include "ash/shelf/shelf_widget.h" |
| 24 #include "ash/shell.h" | 25 #include "ash/shell.h" |
| 25 #include "ash/shell_delegate.h" | 26 #include "ash/shell_delegate.h" |
| 26 #include "ash/shell_factory.h" | 27 #include "ash/shell_factory.h" |
| 27 #include "ash/shell_window_ids.h" | 28 #include "ash/shell_window_ids.h" |
| 28 #include "ash/system/status_area_widget.h" | 29 #include "ash/system/status_area_widget.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 namespace { | 96 namespace { |
| 96 | 97 |
| 97 #if defined(OS_CHROMEOS) | 98 #if defined(OS_CHROMEOS) |
| 98 // Duration for the animation that hides the boot splash screen, in | 99 // Duration for the animation that hides the boot splash screen, in |
| 99 // milliseconds. This should be short enough in relation to | 100 // milliseconds. This should be short enough in relation to |
| 100 // wm/window_animation.cc's brightness/grayscale fade animation that the login | 101 // wm/window_animation.cc's brightness/grayscale fade animation that the login |
| 101 // background image animation isn't hidden by the splash screen animation. | 102 // background image animation isn't hidden by the splash screen animation. |
| 102 const int kBootSplashScreenHideDurationMs = 500; | 103 const int kBootSplashScreenHideDurationMs = 500; |
| 103 #endif | 104 #endif |
| 104 | 105 |
| 105 // Creates a new window for use as a container. | |
| 106 wm::WmWindow* CreateContainer(int window_id, | |
| 107 const char* name, | |
| 108 wm::WmWindow* parent) { | |
| 109 wm::WmWindow* window = wm::WmGlobals::Get()->NewContainerWindow(); | |
| 110 window->SetShellWindowId(window_id); | |
| 111 window->SetName(name); | |
| 112 parent->AddChild(window); | |
| 113 if (window_id != kShellWindowId_UnparentedControlContainer) | |
| 114 window->Show(); | |
| 115 return window; | |
| 116 } | |
| 117 | |
| 118 float ToRelativeValue(int value, int src, int dst) { | 106 float ToRelativeValue(int value, int src, int dst) { |
| 119 return static_cast<float>(value) / static_cast<float>(src) * dst; | 107 return static_cast<float>(value) / static_cast<float>(src) * dst; |
| 120 } | 108 } |
| 121 | 109 |
| 122 void MoveOriginRelativeToSize(const gfx::Size& src_size, | 110 void MoveOriginRelativeToSize(const gfx::Size& src_size, |
| 123 const gfx::Size& dst_size, | 111 const gfx::Size& dst_size, |
| 124 gfx::Rect* bounds_in_out) { | 112 gfx::Rect* bounds_in_out) { |
| 125 gfx::Point origin = bounds_in_out->origin(); | 113 gfx::Point origin = bounds_in_out->origin(); |
| 126 bounds_in_out->set_origin(gfx::Point( | 114 bounds_in_out->set_origin(gfx::Point( |
| 127 ToRelativeValue(origin.x(), src_size.width(), dst_size.width()), | 115 ToRelativeValue(origin.x(), src_size.width(), dst_size.width()), |
| (...skipping 533 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 // RootWindowController, private: | 649 // RootWindowController, private: |
| 662 | 650 |
| 663 RootWindowController::RootWindowController(AshWindowTreeHost* ash_host) | 651 RootWindowController::RootWindowController(AshWindowTreeHost* ash_host) |
| 664 : ash_host_(ash_host), | 652 : ash_host_(ash_host), |
| 665 root_window_layout_(NULL), | 653 root_window_layout_(NULL), |
| 666 docked_layout_manager_(NULL), | 654 docked_layout_manager_(NULL), |
| 667 panel_layout_manager_(NULL), | 655 panel_layout_manager_(NULL), |
| 668 touch_hud_debug_(NULL), | 656 touch_hud_debug_(NULL), |
| 669 touch_hud_projection_(NULL) { | 657 touch_hud_projection_(NULL) { |
| 670 aura::Window* root_window = GetRootWindow(); | 658 aura::Window* root_window = GetRootWindow(); |
| 659 root_window_controller_common_.reset( |
| 660 new RootWindowControllerCommon(wm::WmWindowAura::Get(root_window))); |
| 671 GetRootWindowSettings(root_window)->controller = this; | 661 GetRootWindowSettings(root_window)->controller = this; |
| 672 | 662 |
| 673 stacking_controller_.reset(new StackingController); | 663 stacking_controller_.reset(new StackingController); |
| 674 aura::client::SetWindowTreeClient(root_window, stacking_controller_.get()); | 664 aura::client::SetWindowTreeClient(root_window, stacking_controller_.get()); |
| 675 capture_client_.reset(new ::wm::ScopedCaptureClient(root_window)); | 665 capture_client_.reset(new ::wm::ScopedCaptureClient(root_window)); |
| 676 } | 666 } |
| 677 | 667 |
| 678 void RootWindowController::Init(RootWindowType root_window_type, | 668 void RootWindowController::Init(RootWindowType root_window_type, |
| 679 bool first_run_after_boot) { | 669 bool first_run_after_boot) { |
| 680 aura::Window* root_window = GetRootWindow(); | 670 aura::Window* root_window = GetRootWindow(); |
| 681 Shell* shell = Shell::GetInstance(); | 671 Shell* shell = Shell::GetInstance(); |
| 682 shell->InitRootWindow(root_window); | 672 shell->InitRootWindow(root_window); |
| 683 | 673 |
| 684 CreateContainersInRootWindow(wm::WmWindowAura::Get(root_window)); | 674 root_window_controller_common_->CreateContainers(); |
| 685 | 675 |
| 686 CreateSystemBackground(first_run_after_boot); | 676 CreateSystemBackground(first_run_after_boot); |
| 687 | 677 |
| 688 InitLayoutManagers(); | 678 InitLayoutManagers(); |
| 689 InitTouchHuds(); | 679 InitTouchHuds(); |
| 690 | 680 |
| 691 if (Shell::GetPrimaryRootWindowController()-> | 681 if (Shell::GetPrimaryRootWindowController()-> |
| 692 GetSystemModalLayoutManager(NULL)->has_modal_background()) { | 682 GetSystemModalLayoutManager(NULL)->has_modal_background()) { |
| 693 GetSystemModalLayoutManager(NULL)->CreateModalBackground(); | 683 GetSystemModalLayoutManager(NULL)->CreateModalBackground(); |
| 694 } | 684 } |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 // onscreen until the desktop background is ready. | 821 // onscreen until the desktop background is ready. |
| 832 if (is_first_run_after_boot && | 822 if (is_first_run_after_boot && |
| 833 (base::CommandLine::ForCurrentProcess()->HasSwitch( | 823 (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 834 switches::kAshCopyHostBackgroundAtBoot) || | 824 switches::kAshCopyHostBackgroundAtBoot) || |
| 835 base::CommandLine::ForCurrentProcess()->HasSwitch( | 825 base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 836 switches::kAshAnimateFromBootSplashScreen))) | 826 switches::kAshAnimateFromBootSplashScreen))) |
| 837 boot_splash_screen_.reset(new BootSplashScreen(GetHost())); | 827 boot_splash_screen_.reset(new BootSplashScreen(GetHost())); |
| 838 #endif | 828 #endif |
| 839 } | 829 } |
| 840 | 830 |
| 841 void RootWindowController::CreateContainersInRootWindow( | |
| 842 wm::WmWindow* root_window) { | |
| 843 // These containers are just used by PowerButtonController to animate groups | |
| 844 // of containers simultaneously without messing up the current transformations | |
| 845 // on those containers. These are direct children of the root window; all of | |
| 846 // the other containers are their children. | |
| 847 | |
| 848 // The desktop background container is not part of the lock animation, so it | |
| 849 // is not included in those animate groups. | |
| 850 // When screen is locked desktop background is moved to lock screen background | |
| 851 // container (moved back on unlock). We want to make sure that there's an | |
| 852 // opaque layer occluding the non-lock-screen layers. | |
| 853 wm::WmWindow* desktop_background_container = | |
| 854 CreateContainer(kShellWindowId_DesktopBackgroundContainer, | |
| 855 "DesktopBackgroundContainer", root_window); | |
| 856 desktop_background_container->SetChildWindowVisibilityChangesAnimated(); | |
| 857 | |
| 858 wm::WmWindow* non_lock_screen_containers = | |
| 859 CreateContainer(kShellWindowId_NonLockScreenContainersContainer, | |
| 860 "NonLockScreenContainersContainer", root_window); | |
| 861 // Clip all windows inside this container, as half pixel of the window's | |
| 862 // texture may become visible when the screen is scaled. crbug.com/368591. | |
| 863 non_lock_screen_containers->SetMasksToBounds(true); | |
| 864 | |
| 865 wm::WmWindow* lock_background_containers = | |
| 866 CreateContainer(kShellWindowId_LockScreenBackgroundContainer, | |
| 867 "LockScreenBackgroundContainer", root_window); | |
| 868 lock_background_containers->SetChildWindowVisibilityChangesAnimated(); | |
| 869 | |
| 870 wm::WmWindow* lock_screen_containers = | |
| 871 CreateContainer(kShellWindowId_LockScreenContainersContainer, | |
| 872 "LockScreenContainersContainer", root_window); | |
| 873 wm::WmWindow* lock_screen_related_containers = | |
| 874 CreateContainer(kShellWindowId_LockScreenRelatedContainersContainer, | |
| 875 "LockScreenRelatedContainersContainer", root_window); | |
| 876 | |
| 877 CreateContainer(kShellWindowId_UnparentedControlContainer, | |
| 878 "UnparentedControlContainer", | |
| 879 non_lock_screen_containers); | |
| 880 | |
| 881 wm::WmWindow* default_container = | |
| 882 CreateContainer(kShellWindowId_DefaultContainer, "DefaultContainer", | |
| 883 non_lock_screen_containers); | |
| 884 default_container->SetChildWindowVisibilityChangesAnimated(); | |
| 885 default_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 886 default_container->SetBoundsInScreenBehaviorForChildren( | |
| 887 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 888 default_container->SetChildrenUseExtendedHitRegion(); | |
| 889 | |
| 890 wm::WmWindow* always_on_top_container = | |
| 891 CreateContainer(kShellWindowId_AlwaysOnTopContainer, | |
| 892 "AlwaysOnTopContainer", non_lock_screen_containers); | |
| 893 always_on_top_container->SetChildWindowVisibilityChangesAnimated(); | |
| 894 always_on_top_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 895 always_on_top_container->SetBoundsInScreenBehaviorForChildren( | |
| 896 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 897 | |
| 898 wm::WmWindow* docked_container = | |
| 899 CreateContainer(kShellWindowId_DockedContainer, "DockedContainer", | |
| 900 non_lock_screen_containers); | |
| 901 docked_container->SetChildWindowVisibilityChangesAnimated(); | |
| 902 docked_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 903 docked_container->SetBoundsInScreenBehaviorForChildren( | |
| 904 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 905 docked_container->SetChildrenUseExtendedHitRegion(); | |
| 906 | |
| 907 wm::WmWindow* shelf_container = | |
| 908 CreateContainer(kShellWindowId_ShelfContainer, "ShelfContainer", | |
| 909 non_lock_screen_containers); | |
| 910 shelf_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 911 shelf_container->SetBoundsInScreenBehaviorForChildren( | |
| 912 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 913 shelf_container->SetDescendantsStayInSameRootWindow(true); | |
| 914 | |
| 915 wm::WmWindow* panel_container = | |
| 916 CreateContainer(kShellWindowId_PanelContainer, "PanelContainer", | |
| 917 non_lock_screen_containers); | |
| 918 panel_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 919 panel_container->SetBoundsInScreenBehaviorForChildren( | |
| 920 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 921 | |
| 922 wm::WmWindow* shelf_bubble_container = | |
| 923 CreateContainer(kShellWindowId_ShelfBubbleContainer, | |
| 924 "ShelfBubbleContainer", non_lock_screen_containers); | |
| 925 shelf_bubble_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 926 shelf_bubble_container->SetBoundsInScreenBehaviorForChildren( | |
| 927 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 928 shelf_bubble_container->SetDescendantsStayInSameRootWindow(true); | |
| 929 | |
| 930 wm::WmWindow* app_list_container = | |
| 931 CreateContainer(kShellWindowId_AppListContainer, "AppListContainer", | |
| 932 non_lock_screen_containers); | |
| 933 app_list_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 934 app_list_container->SetBoundsInScreenBehaviorForChildren( | |
| 935 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 936 | |
| 937 wm::WmWindow* modal_container = | |
| 938 CreateContainer(kShellWindowId_SystemModalContainer, | |
| 939 "SystemModalContainer", non_lock_screen_containers); | |
| 940 modal_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 941 modal_container->SetChildWindowVisibilityChangesAnimated(); | |
| 942 modal_container->SetBoundsInScreenBehaviorForChildren( | |
| 943 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 944 modal_container->SetChildrenUseExtendedHitRegion(); | |
| 945 | |
| 946 // TODO(beng): Figure out if we can make this use | |
| 947 // SystemModalContainerEventFilter instead of stops_event_propagation. | |
| 948 wm::WmWindow* lock_container = | |
| 949 CreateContainer(kShellWindowId_LockScreenContainer, "LockScreenContainer", | |
| 950 lock_screen_containers); | |
| 951 lock_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 952 lock_container->SetBoundsInScreenBehaviorForChildren( | |
| 953 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 954 // TODO(beng): stopsevents | |
| 955 | |
| 956 wm::WmWindow* lock_modal_container = | |
| 957 CreateContainer(kShellWindowId_LockSystemModalContainer, | |
| 958 "LockSystemModalContainer", lock_screen_containers); | |
| 959 lock_modal_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 960 lock_modal_container->SetChildWindowVisibilityChangesAnimated(); | |
| 961 lock_modal_container->SetBoundsInScreenBehaviorForChildren( | |
| 962 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 963 lock_modal_container->SetChildrenUseExtendedHitRegion(); | |
| 964 | |
| 965 wm::WmWindow* status_container = | |
| 966 CreateContainer(kShellWindowId_StatusContainer, "StatusContainer", | |
| 967 lock_screen_related_containers); | |
| 968 status_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 969 status_container->SetBoundsInScreenBehaviorForChildren( | |
| 970 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 971 status_container->SetDescendantsStayInSameRootWindow(true); | |
| 972 | |
| 973 wm::WmWindow* settings_bubble_container = | |
| 974 CreateContainer(kShellWindowId_SettingBubbleContainer, | |
| 975 "SettingBubbleContainer", lock_screen_related_containers); | |
| 976 settings_bubble_container->SetChildWindowVisibilityChangesAnimated(); | |
| 977 settings_bubble_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 978 settings_bubble_container->SetBoundsInScreenBehaviorForChildren( | |
| 979 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 980 settings_bubble_container->SetDescendantsStayInSameRootWindow(true); | |
| 981 | |
| 982 wm::WmWindow* virtual_keyboard_parent_container = CreateContainer( | |
| 983 kShellWindowId_ImeWindowParentContainer, "VirtualKeyboardParentContainer", | |
| 984 lock_screen_related_containers); | |
| 985 virtual_keyboard_parent_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 986 virtual_keyboard_parent_container->SetBoundsInScreenBehaviorForChildren( | |
| 987 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 988 | |
| 989 wm::WmWindow* menu_container = | |
| 990 CreateContainer(kShellWindowId_MenuContainer, "MenuContainer", | |
| 991 lock_screen_related_containers); | |
| 992 menu_container->SetChildWindowVisibilityChangesAnimated(); | |
| 993 menu_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 994 menu_container->SetBoundsInScreenBehaviorForChildren( | |
| 995 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 996 | |
| 997 wm::WmWindow* drag_drop_container = CreateContainer( | |
| 998 kShellWindowId_DragImageAndTooltipContainer, | |
| 999 "DragImageAndTooltipContainer", lock_screen_related_containers); | |
| 1000 drag_drop_container->SetChildWindowVisibilityChangesAnimated(); | |
| 1001 drag_drop_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 1002 drag_drop_container->SetBoundsInScreenBehaviorForChildren( | |
| 1003 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 1004 | |
| 1005 wm::WmWindow* overlay_container = | |
| 1006 CreateContainer(kShellWindowId_OverlayContainer, "OverlayContainer", | |
| 1007 lock_screen_related_containers); | |
| 1008 overlay_container->SetSnapsChildrenToPhysicalPixelBoundary(); | |
| 1009 overlay_container->SetBoundsInScreenBehaviorForChildren( | |
| 1010 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 1011 | |
| 1012 #if defined(OS_CHROMEOS) | |
| 1013 wm::WmWindow* mouse_cursor_container = CreateContainer( | |
| 1014 kShellWindowId_MouseCursorContainer, "MouseCursorContainer", root_window); | |
| 1015 mouse_cursor_container->SetBoundsInScreenBehaviorForChildren( | |
| 1016 wm::WmWindow::BoundsInScreenBehavior::USE_SCREEN_COORDINATES); | |
| 1017 #endif | |
| 1018 | |
| 1019 CreateContainer(kShellWindowId_PowerButtonAnimationContainer, | |
| 1020 "PowerButtonAnimationContainer", root_window); | |
| 1021 } | |
| 1022 | |
| 1023 void RootWindowController::EnableTouchHudProjection() { | 831 void RootWindowController::EnableTouchHudProjection() { |
| 1024 if (touch_hud_projection_) | 832 if (touch_hud_projection_) |
| 1025 return; | 833 return; |
| 1026 set_touch_hud_projection(new TouchHudProjection(GetRootWindow())); | 834 set_touch_hud_projection(new TouchHudProjection(GetRootWindow())); |
| 1027 } | 835 } |
| 1028 | 836 |
| 1029 void RootWindowController::DisableTouchHudProjection() { | 837 void RootWindowController::DisableTouchHudProjection() { |
| 1030 if (!touch_hud_projection_) | 838 if (!touch_hud_projection_) |
| 1031 return; | 839 return; |
| 1032 touch_hud_projection_->Remove(); | 840 touch_hud_projection_->Remove(); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1064 aura::Window* primary_root_window = Shell::GetInstance() | 872 aura::Window* primary_root_window = Shell::GetInstance() |
| 1065 ->window_tree_host_manager() | 873 ->window_tree_host_manager() |
| 1066 ->GetPrimaryRootWindow(); | 874 ->GetPrimaryRootWindow(); |
| 1067 return GetRootWindowSettings(primary_root_window)->controller; | 875 return GetRootWindowSettings(primary_root_window)->controller; |
| 1068 } | 876 } |
| 1069 | 877 |
| 1070 return GetRootWindowSettings(root_window)->controller; | 878 return GetRootWindowSettings(root_window)->controller; |
| 1071 } | 879 } |
| 1072 | 880 |
| 1073 } // namespace ash | 881 } // namespace ash |
| OLD | NEW |