shell.cc revision ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/focus_manager_factory.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/caps_lock_delegate.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_view.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/desktop_background/user_wallpaper_delegate.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/event_transformation_handler.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/mouse_cursor_event_filter.h" 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/resolution_notification_controller.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/screen_position_controller.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/drag_drop/drag_drop_controller.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/focus_cycler.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/high_contrast/high_contrast_controller.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/host/root_window_host_factory.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_delegate.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/launcher/launcher_model.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/magnifier/magnification_controller.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/partial_magnification_controller.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h" 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_factory.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/system/locale/locale_notification_controller.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/activation_controller.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/app_list_controller.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/ash_activation_controller.h" 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/ash_focus_rules.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/ash_native_cursor_manager.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/base_layout_manager.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/capture_controller.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/coordinate_conversion.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/custom_frame_view_ash.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/event_client_impl.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/event_rewriter_event_filter.h" 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller.h" 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller_impl2.h" 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/wm/mru_window_tracker.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/overlay_event_filter.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/power_button_controller.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/resize_shadow_controller.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/root_window_layout_manager.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/screen_dimmer.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/session_state_controller_impl.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_gesture_event_filter.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_modal_container_event_filter.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_modal_container_layout_manager.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/user_activity_detector.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/video_detector.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_animations.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_properties.h" 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/wm/window_selector_controller.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/leak_annotations.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/user_action_client.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/focus_manager.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/layout_manager.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/ui_base_switches.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/keyboard/keyboard.h" 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/keyboard/keyboard_util.h" 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h" 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/compound_event_filter.h" 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/corewm_switches.h" 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/focus_controller.h" 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/input_method_event_filter.h" 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/shadow_controller.h" 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/tooltip_controller.h" 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/visibility_controller.h" 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/window_modality_controller.h" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager_factory.h" 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_controller.h" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/accelerator_filter.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/nested_dispatcher_controller.h" 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_constants.h" 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_change_observer_x11.h" 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/display/display_error_observer.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/output_configurator_animation.h" 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/chromeos/chromeos_version.h" 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/message_loop/message_pump_aurax11.h" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/display/output_configurator.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/content_switches.h" 12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_feature_type.h" 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(USE_X11) 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/chromeos/power/power_status.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using aura::Window; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::Widget; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This dummy class is used for shell unit tests. We dont have chrome delegate 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in these tests. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DummyUserWallpaperDelegate : public UserWallpaperDelegate { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DummyUserWallpaperDelegate() {} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DummyUserWallpaperDelegate() {} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GetAnimationType() OVERRIDE { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return views::corewm::WINDOW_VISIBILITY_ANIMATION_TYPE_FADE; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool ShouldShowInitialAnimation() OVERRIDE { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateWallpaper() OVERRIDE { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void InitializeWallpaper() OVERRIDE { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ash::Shell::GetInstance()->desktop_background_controller()-> 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateEmptyWallpaper(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OpenSetWallpaperPage() OVERRIDE { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool CanOpenSetWallpaperPage() OVERRIDE { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWallpaperAnimationFinished() OVERRIDE { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnWallpaperBootAnimationFinished() OVERRIDE { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DummyUserWallpaperDelegate); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A Corewm VisibilityController subclass that calls the Ash animation routine 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can pick up our extended animations. See ash/wm/window_animations.h. 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AshVisibilityController : public views::corewm::VisibilityController { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AshVisibilityController() {} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AshVisibilityController() {} 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::corewm::VisibilityController: 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CallAnimateOnChildWindowVisibilityChanged( 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible) OVERRIDE { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AnimateOnChildWindowVisibilityChanged(window, visible); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AshVisibilityController); 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::instance_ = NULL; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::initially_hide_cursor_ = false; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shell, public: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::Shell(ShellDelegate* delegate) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : screen_(new ScreenAsh), 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) target_root_window_(NULL), 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_target_root_window_(NULL), 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activation_client_(NULL), 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_configurator_(new chromeos::OutputConfigurator()), 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_cursor_manager_(new AshNativeCursorManager), 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_(scoped_ptr<views::corewm::NativeCursorManager>( 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) native_cursor_manager_)), 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) browser_context_(NULL), 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch simulate_modal_window_open_for_testing_(false), 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_touch_hud_projection_enabled_(false) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(delegate_.get()); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager_.reset(new internal::DisplayManager); 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANNOTATE_LEAKING_OBJECT_PTR(screen_); // see crbug.com/156466 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_ALTERNATE, screen_); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE)) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_); 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_controller_.reset(new DisplayController); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_panel_fitting_disabled = 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::GpuDataManager::GetInstance()->IsFeatureBlacklisted( 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gpu::GPU_FEATURE_TYPE_PANEL_FITTING) || 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch( 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ::switches::kDisablePanelFitting); 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) output_configurator_->Init(!is_panel_fitting_disabled); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessagePumpAuraX11::Current()->AddDispatcherForRootWindow( 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_configurator()); 238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // We can't do this with a root window listener because XI_HierarchyChanged 239558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // messages don't have a target window. 240558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessagePumpAuraX11::Current()->AddObserver(output_configurator()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(this); 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 244eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch internal::PowerStatus::Initialize(); 246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::~Shell() { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::FocusManagerFactory::Install(NULL); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the focus from any window. This will prevent overhead and side 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // effects (e.g. crashes) from changing focus during shutdown. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See bug crbug.com/134502. 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) aura::client::GetFocusClient(GetPrimaryRootWindow())->FocusWindow(NULL); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Please keep in same order as in Init() because it's easy to miss one. 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(event_rewriter_filter_.get()); 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RemovePreTargetHandler(user_activity_detector_.get()); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(overlay_filter_.get()); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(input_method_filter_.get()); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(window_modality_controller_.get()); 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (mouse_cursor_filter_) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(mouse_cursor_filter_.get()); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(system_gesture_filter_.get()); 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RemovePreTargetHandler(event_transformation_handler_.get()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(accelerator_filter_.get()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TooltipController is deleted with the Shell so removing its references. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(tooltip_controller_.get()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppList needs to be released before shelf layout manager, which is 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed with launcher container in the loop below. However, app list 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // container is now on top of launcher container and released after it. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(xiyuan): Move it back when app list container is no longer needed. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_list_controller_.reset(); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy SystemTrayDelegate before destroying the status area(s). 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) system_tray_delegate_->Shutdown(); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_tray_delegate_.reset(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) locale_notification_controller_.reset(); 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroy all child windows including widgets. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller_->CloseChildWindows(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Destroy SystemTrayNotifier after destroying SystemTray as TrayItems 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // needs to remove observers from it. 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system_tray_notifier_.reset(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These need a valid Shell instance to clean up properly, so explicitly 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete them before invalidating the instance. 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Alphabetical. TODO(oshima): sort. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_drop_controller_.reset(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) magnification_controller_.reset(); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partial_magnification_controller_.reset(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_shadow_controller_.reset(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shadow_controller_.reset(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tooltip_controller_.reset(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_client_.reset(); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_cycle_controller_.reset(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capture_controller_.reset(); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_dispatcher_controller_.reset(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_action_client_.reset(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility_controller_.reset(); 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_delegate_.reset(); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_model_.reset(); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_detector_.reset(); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_button_controller_.reset(); 313868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_state_controller_.reset(); 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) mru_window_tracker_.reset(); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 316ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resolution_notification_controller_.reset(); 317ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This also deletes all RootWindows. Note that we invoke Shutdown() on 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DisplayController before resetting |display_controller_|, since destruction 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of its owned RootWindowControllers relies on the value. 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_controller_->Shutdown(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller_.reset(); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_position_controller_.reset(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the activation controller after other controllers and launcher 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because they might have registered ActivationChangeObserver. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) activation_controller_.reset(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_change_observer_) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_->RemoveObserver(display_change_observer_.get()); 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (output_configurator_animation_) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_->RemoveObserver(output_configurator_animation_.get()); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (display_error_observer_) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_->RemoveObserver(display_error_observer_.get()); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessagePumpAuraX11::Current()->RemoveDispatcherForRootWindow( 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output_configurator()); 338558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch base::MessagePumpAuraX11::Current()->RemoveObserver(output_configurator()); 339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) display_change_observer_.reset(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 343eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch internal::PowerStatus::Shutdown(); 344eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(instance_ == this); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance_ = NULL; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::CreateInstance(ShellDelegate* delegate) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!instance_); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_ = new Shell(delegate); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->Init(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance_; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::GetInstance() { 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(instance_); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance_; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::HasInstance() { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!instance_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::DeleteInstance() { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete instance_; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_ = NULL; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::RootWindowController* Shell::GetPrimaryRootWindowController() { 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetRootWindowController(GetPrimaryRootWindow()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::RootWindowControllerList Shell::GetAllRootWindowControllers() { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::GetInstance()->display_controller()-> 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllRootWindowControllers(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::RootWindow* Shell::GetPrimaryRootWindow() { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetInstance()->display_controller()->GetPrimaryRootWindow(); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::RootWindow* Shell::GetActiveRootWindow() { 393a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Shell* shell = GetInstance(); 394a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (shell->scoped_target_root_window_) 395a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return shell->scoped_target_root_window_; 396a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return shell->target_root_window_; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Screen* Shell::GetScreen() { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::RootWindowList Shell::GetAllRootWindows() { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::GetInstance()->display_controller()-> 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllRootWindows(); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* Shell::GetContainer(aura::RootWindow* root_window, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int container_id) { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_window->GetChildById(container_id); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const aura::Window* Shell::GetContainer(const aura::RootWindow* root_window, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int container_id) { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_window->GetChildById(container_id); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<aura::Window*> Shell::GetContainersFromAllRootWindows( 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int container_id, 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::RootWindow* priority_root) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> containers; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowList root_windows = GetAllRootWindows(); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowList::const_iterator it = root_windows.begin(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != root_windows.end(); ++it) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* container = (*it)->GetChildById(container_id); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container) { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (priority_root && priority_root->Contains(container)) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) containers.insert(containers.begin(), container); 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) containers.push_back(container); 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return containers; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool Shell::IsForcedMaximizeMode() { 443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return command_line->HasSwitch(switches::kForcedMaximizeMode); 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::Init() { 44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->PreInit(); 4517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool display_initialized = false; 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_animation_.reset( 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new internal::OutputConfiguratorAnimation()); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_->AddObserver(output_configurator_animation_.get()); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::chromeos::IsRunningOnChromeOS()) { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_change_observer_.reset(new internal::DisplayChangeObserverX11); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Register |display_change_observer_| first so that the rest of 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // observer gets invoked after the root windows are configured. 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_->AddObserver(display_change_observer_.get()); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_error_observer_.reset(new internal::DisplayErrorObserver()); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) output_configurator_->AddObserver(display_error_observer_.get()); 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) output_configurator_->set_state_controller(display_change_observer_.get()); 464868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!command_line->HasSwitch(ash::switches::kAshDisableSoftwareMirroring)) 46590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) output_configurator_->set_mirroring_controller(display_manager_.get()); 466a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) output_configurator_->Start( 467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) delegate_->IsFirstRunAfterBoot() ? kChromeOsBootColor : 0); 4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch display_initialized = true; 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 4717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!display_initialized) 4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch display_manager_->InitFromCommandLine(); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Install the custom factory first so that views::FocusManagers for Tray, 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Launcher, and WallPaper could be created by the factory. 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::FocusManagerFactory::Install(new AshFocusManagerFactory); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter_.reset(new views::corewm::CompoundEventFilter); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(env_filter_.get()); 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Env creates the compositor. Historically it seems to have been implicitly 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // initialized first by the ActivationController, but now that FocusController 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no longer does this we need to do it explicitly. 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Env::GetInstance(); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (views::corewm::UseFocusController()) { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::FocusController* focus_controller = 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new views::corewm::FocusController(new wm::AshFocusRules); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_client_.reset(focus_controller); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activation_client_ = focus_controller; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activation_client_->AddObserver(this); 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_client_.reset(new aura::FocusManager); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activation_controller_.reset( 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new internal::ActivationController( 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) focus_client_.get(), 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new internal::AshActivationController)); 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) activation_client_ = activation_controller_.get(); 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(activation_controller_.get()); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_cycler_.reset(new internal::FocusCycler()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_position_controller_.reset(new internal::ScreenPositionController); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window_host_factory_.reset(delegate_->CreateRootWindowHostFactory()); 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_controller_->Start(); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller_->InitPrimaryDisplay(); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root_window = display_controller_->GetPrimaryRootWindow(); 509a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) target_root_window_ = root_window; 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 511ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch resolution_notification_controller_.reset( 512ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new internal::ResolutionNotificationController); 513ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.SetDisplay(DisplayController::GetPrimaryDisplay()); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_dispatcher_controller_.reset(new NestedDispatcherController); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_controller_.reset(new AcceleratorController); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The order in which event filters are added is significant. 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_rewriter_filter_.reset(new internal::EventRewriterEventFilter); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(event_rewriter_filter_.get()); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // UserActivityDetector passes events to observers, so let them get 5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // rewritten first. 5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch user_activity_detector_.reset(new UserActivityDetector); 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AddPreTargetHandler(user_activity_detector_.get()); 5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) overlay_filter_.reset(new internal::OverlayEventFilter); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(overlay_filter_.get()); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddShellObserver(overlay_filter_.get()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_method_filter_.reset(new views::corewm::InputMethodEventFilter( 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->GetAcceleratedWidget())); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(input_method_filter_.get()); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accelerator_filter_.reset(new internal::AcceleratorFilter); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(accelerator_filter_.get()); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_transformation_handler_.reset(new internal::EventTransformationHandler); 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(event_transformation_handler_.get()); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_gesture_filter_.reset(new internal::SystemGestureEventFilter); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(system_gesture_filter_.get()); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) capture_controller_.reset(new internal::CaptureController); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The keyboard system must be initialized before the RootWindowController is 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // created. 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (keyboard::IsKeyboardEnabled()) 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) keyboard::InitializeKeyboard(); 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (command_line->HasSwitch(ash::switches::kAshDisableNewLockAnimations)) 557868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_state_controller_.reset(new SessionStateControllerImpl); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_state_controller_.reset(new LockStateControllerImpl2); 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) power_button_controller_.reset(new PowerButtonController( 561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) lock_state_controller_.get())); 562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) AddShellObserver(lock_state_controller_.get()); 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) drag_drop_controller_.reset(new internal::DragDropController); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_cursor_filter_.reset(new internal::MouseCursorEventFilter()); 566868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) PrependPreTargetHandler(mouse_cursor_filter_.get()); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create Controllers that may need root window. 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(oshima): Move as many controllers before creating 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RootWindowController as possible. 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visibility_controller_.reset(new AshVisibilityController); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_action_client_.reset(delegate_->CreateUserActionClient()); 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_modality_controller_.reset( 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new views::corewm::WindowModalityController); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(window_modality_controller_.get()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) magnification_controller_.reset( 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MagnificationController::CreateInstance()); 579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) mru_window_tracker_.reset(new MruWindowTracker(activation_client_)); 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) partial_magnification_controller_.reset( 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new PartialMagnificationController()); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) high_contrast_controller_.reset(new HighContrastController); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_detector_.reset(new VideoDetector); 586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window_cycle_controller_.reset(new WindowCycleController()); 587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) window_selector_controller_.reset(new WindowSelectorController()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tooltip_controller_.reset(new views::corewm::TooltipController( 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::SCREEN_TYPE_ALTERNATE)); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(tooltip_controller_.get()); 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event_client_.reset(new internal::EventClientImpl); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This controller needs to be set before SetupManagedWindowMode. 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_background_controller_.reset(new DesktopBackgroundController()); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_wallpaper_delegate_.reset(delegate_->CreateUserWallpaperDelegate()); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!user_wallpaper_delegate_) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_wallpaper_delegate_.reset(new DummyUserWallpaperDelegate()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // StatusAreaWidget uses Shell's CapsLockDelegate. 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caps_lock_delegate_.reset(delegate_->CreateCapsLockDelegate()); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) session_state_delegate_.reset(delegate_->CreateSessionStateDelegate()); 605c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!command_line->HasSwitch(views::corewm::switches::kNoDropShadows)) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) resize_shadow_controller_.reset(new internal::ResizeShadowController()); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) shadow_controller_.reset( 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new views::corewm::ShadowController(activation_client_)); 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Create system_tray_notifier_ before the delegate. 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) system_tray_notifier_.reset(new ash::SystemTrayNotifier()); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize system_tray_delegate_ before initializing StatusAreaWidget. 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_tray_delegate_.reset(delegate()->CreateSystemTrayDelegate()); 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!system_tray_delegate_) 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_tray_delegate_.reset(SystemTrayDelegate::CreateDummyDelegate()); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch internal::RootWindowController* root_window_controller = 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new internal::RootWindowController(root_window); 622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitRootWindowController(root_window_controller, 623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delegate_->IsFirstRunAfterBoot()); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) locale_notification_controller_.reset( 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new internal::LocaleNotificationController); 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initialize system_tray_delegate_ after StatusAreaWidget is created. 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) system_tray_delegate_->Initialize(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_controller_->InitSecondaryDisplays(); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force Layout 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_window_controller->root_window_layout()->OnWindowResized(); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It needs to be created after OnWindowResized has been called, otherwise the 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // widget will not paint when restoring after a browser crash. Also it needs 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to be created after InitSecondaryDisplays() to initialize the wallpapers in 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the correct size. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) user_wallpaper_delegate_->InitializeWallpaper(); 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (initially_hide_cursor_) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.HideCursor(); 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cursor_manager_.SetCursor(ui::kCursorPointer); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cursor_manager_.IsCursorVisible()) { 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cursor might have been hidden by something other than chrome. 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Let the first mouse event show the cursor. 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) env_filter_->set_cursor_hidden_by_filter(true); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void Shell::ShowContextMenu(const gfx::Point& location_in_screen, 6547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::MenuSourceType source_type) { 655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // No context menus if there is no session with an active user. 65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!session_state_delegate_->NumberOfLoggedInUsers()) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // No context menus when screen is locked. 659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (session_state_delegate_->IsScreenLocked()) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root = 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wm::GetRootWindowMatching(gfx::Rect(location_in_screen, gfx::Size())); 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(oshima): The root and root window controller shouldn't be 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NULL even for the out-of-bounds |location_in_screen| (It should 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // return the primary root). Investigate why/how this is 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // happening. crbug.com/165214. 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::RootWindowController* rwc = GetRootWindowController(root); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(rwc) << "root=" << root 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << ", location:" << location_in_screen.ToString(); 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (rwc) 6727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) rwc->ShowContextMenu(location_in_screen, source_type); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::ToggleAppList(aura::Window* window) { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the context window is not given, show it on the active root window. 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!window) 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window = GetActiveRootWindow(); 679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_list_controller_) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_list_controller_.reset(new internal::AppListController); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) app_list_controller_->SetVisible(!app_list_controller_->IsVisible(), window); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::GetAppListTargetVisibility() const { 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return app_list_controller_.get() && 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) app_list_controller_->GetTargetVisibility(); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)aura::Window* Shell::GetAppListWindow() { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return app_list_controller_.get() ? app_list_controller_->GetWindow() : NULL; 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::IsSystemModalWindowOpen() const { 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (simulate_modal_window_open_for_testing_) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<aura::Window*> containers = GetContainersFromAllRootWindows( 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::kShellWindowId_SystemModalContainer, NULL); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<aura::Window*>::const_iterator cit = containers.begin(); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cit != containers.end(); ++cit) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (aura::Window::Windows::const_iterator wit = (*cit)->children().begin(); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wit != (*cit)->children().end(); ++wit) { 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*wit)->GetProperty(aura::client::kModalKey) == 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MODAL_TYPE_SYSTEM && (*wit)->TargetVisibility()) { 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::NonClientFrameView* Shell::CreateDefaultNonClientFrameView( 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget) { 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use translucent-style window frames for dialogs. 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CustomFrameViewAsh* frame_view = new CustomFrameViewAsh; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_view->Init(widget); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return frame_view; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::RotateFocus(Direction direction) { 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_cycler_->RotateFocus( 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) direction == FORWARD ? internal::FocusCycler::FORWARD : 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::FocusCycler::BACKWARD); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetDisplayWorkAreaInsets(Window* contains, 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Insets& insets) { 7277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!display_controller_->UpdateWorkAreaOfDisplayNearestWindow( 7287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch contains, insets)) { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDisplayWorkAreaInsetsChanged()); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnLoginStateChanged(user::LoginStatus status) { 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnLoginStateChanged(status)); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::UpdateAfterLoginStatusChange(user::LoginStatus status) { 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->UpdateAfterLoginStatusChange(status); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnAppTerminating() { 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnAppTerminating()); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnLockStateChanged(bool locked) { 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnLockStateChanged(locked)); 752ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef NDEBUG 753ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Make sure that there is no system modal in Lock layer when unlocked. 754ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!locked) { 755ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector<aura::Window*> containers = GetContainersFromAllRootWindows( 756ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch internal::kShellWindowId_LockSystemModalContainer, 757ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetPrimaryRootWindow()); 758ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (std::vector<aura::Window*>::const_iterator iter = containers.begin(); 759ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch iter != containers.end(); ++iter) { 760ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_EQ(0u, (*iter)->children().size()); 761ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 762ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 763ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CreateLauncher() { 767b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 768b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 769b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) iter != controllers.end(); ++iter) 770b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->shelf()->CreateLauncher(); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::ShowLauncher() { 774b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 775b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 776b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) iter != controllers.end(); ++iter) 777b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->ShowLauncher(); 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::AddShellObserver(ShellObserver* observer) { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::RemoveShellObserver(ShellObserver* observer) { 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::UpdateShelfVisibility() { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->shelf()) 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->UpdateShelfVisibility(); 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShelfAutoHideBehavior(ShelfAutoHideBehavior behavior, 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root_window) { 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::internal::ShelfLayoutManager::ForLauncher(root_window)-> 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAutoHideBehavior(behavior); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShelfAutoHideBehavior Shell::GetShelfAutoHideBehavior( 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root_window) const { 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ash::internal::ShelfLayoutManager::ForLauncher(root_window)-> 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_hide_behavior(); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShelfAlignment(ShelfAlignment alignment, 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root_window) { 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ash::internal::ShelfLayoutManager::ForLauncher(root_window)-> 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAlignment(alignment)) { 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellObserver, observers_, OnShelfAlignmentChanged(root_window)); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShelfAlignment Shell::GetShelfAlignment(aura::RootWindow* root_window) { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetRootWindowController(root_window)-> 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetShelfLayoutManager()->GetAlignment(); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetDimming(bool should_dim) { 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->screen_dimmer()->SetDimming(should_dim); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CreateModalBackground(aura::Window* window) { 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!modality_filter_) { 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modality_filter_.reset(new internal::SystemModalContainerEventFilter(this)); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(modality_filter_.get()); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->GetSystemModalLayoutManager(window)->CreateModalBackground(); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnModalWindowRemoved(aura::Window* removed) { 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool activated = false; 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end() && !activated; ++iter) { 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) activated = (*iter)->GetSystemModalLayoutManager(removed)-> 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActivateNextModalWindow(); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!activated) { 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(modality_filter_.get()); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modality_filter_.reset(); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->GetSystemModalLayoutManager(removed)->DestroyModalBackground(); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebNotificationTray* Shell::GetWebNotificationTray() { 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPrimaryRootWindowController()->shelf()-> 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget()->web_notification_tray(); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::HasPrimaryStatusArea() { 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShelfWidget* shelf = GetPrimaryRootWindowController()->shelf(); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shelf && shelf->status_area_widget(); 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemTray* Shell::GetPrimarySystemTray() { 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPrimaryRootWindowController()->GetSystemTray(); 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LauncherDelegate* Shell::GetLauncherDelegate() { 872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!launcher_delegate_) { 873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch launcher_model_.reset(new LauncherModel); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) launcher_delegate_.reset( 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->CreateLauncherDelegate(launcher_model_.get())); 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return launcher_delegate_.get(); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Shell::SetTouchHudProjectionEnabled(bool enabled) { 881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (is_touch_hud_projection_enabled_ == enabled) 882eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 883eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 884eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_touch_hud_projection_enabled_ = enabled; 8857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FOR_EACH_OBSERVER(ShellObserver, observers_, 8867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnTouchHudProjectionToggled(enabled)); 887eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 888eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::InitRootWindowForSecondaryDisplay(aura::RootWindow* root) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) internal::RootWindowController* controller = 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new internal::RootWindowController(root); 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pass false for the |is_first_run_after_boot| parameter so we'll show a 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // black background on this display instead of trying to mimic the boot splash 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen. 895eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitRootWindowController(controller, false); 896eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) controller->root_window_layout()->OnWindowResized(); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desktop_background_controller_->OnRootWindowAdded(root); 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) high_contrast_controller_->OnRootWindowAdded(root); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root->ShowRootWindow(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Activate new root for testing. 902a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // TODO(oshima): remove this. 903a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) target_root_window_ = root; 904eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 905eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a launcher if a user is already logged. 906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (Shell::GetInstance()->session_state_delegate()->NumberOfLoggedInUsers()) 907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller->shelf()->CreateLauncher(); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::DoInitialWorkspaceAnimation() { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrimaryRootWindowController()->workspace_controller()-> 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoInitialAnimation(); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::InitRootWindowController( 916eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch internal::RootWindowController* controller, 917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool first_run_after_boot) { 918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::RootWindow* root_window = controller->root_window(); 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(activation_client_); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(visibility_controller_.get()); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(drag_drop_controller_.get()); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(capture_controller_.get()); 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(window_cycle_controller_.get()); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetFocusClient(root_window, focus_client_.get()); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_filter_->SetInputMethodPropertyInRootWindow(root_window); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetActivationClient(root_window, activation_client_); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (views::corewm::UseFocusController()) { 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::corewm::FocusController* controller = 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<views::corewm::FocusController*>(activation_client_); 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_window->AddPreTargetHandler(controller); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetVisibilityClient(root_window, visibility_controller_.get()); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetDragDropClient(root_window, drag_drop_controller_.get()); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetCaptureClient(root_window, capture_controller_.get()); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetScreenPositionClient(root_window, 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_position_controller_.get()); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetCursorClient(root_window, &cursor_manager_); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetTooltipClient(root_window, tooltip_controller_.get()); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetEventClient(root_window, event_client_.get()); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (nested_dispatcher_controller_) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetDispatcherClient(root_window, 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nested_dispatcher_controller_.get()); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (user_action_client_) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::SetUserActionClient(root_window, user_action_client_.get()); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 950eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller->Init(first_run_after_boot); 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 952a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) mru_window_tracker_->OnRootWindowAdded(root_window); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shell, private: 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::CanWindowReceiveEvents(aura::Window* window) { 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) { 96290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) internal::SystemModalContainerLayoutManager* layout_manager = 96390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (*iter)->GetSystemModalLayoutManager(window); 96490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layout_manager && layout_manager->CanWindowReceiveEvents(window)) 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shell, ui::EventTarget overrides: 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::CanAcceptEvent(const ui::Event& event) { 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventTarget* Shell::GetParentTarget() { 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::OnEvent(ui::Event* event) { 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shell, aura::client::ActivationChangeObserver implementation: 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::OnWindowActivated(aura::Window* gained_active, 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lost_active) { 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gained_active) 990a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) target_root_window_ = gained_active->GetRootWindow(); 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 994