shell.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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) 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/accelerators/accelerator_controller.h" 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/accelerators/accelerator_filter.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/accelerators/focus_manager_factory.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/accelerators/nested_dispatcher_controller.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_switches.h" 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/autoclick/autoclick_controller.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/caps_lock_delegate.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_controller.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/desktop_background/desktop_background_view.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/desktop_background/user_wallpaper_delegate.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/display_controller.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/event_transformation_handler.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/mouse_cursor_event_filter.h" 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "ash/display/resolution_notification_controller.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/screen_position_controller.h" 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/display/virtual_keyboard_window_controller.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/drag_drop/drag_drop_controller.h" 288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/first_run/first_run_helper_impl.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/focus_cycler.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/high_contrast/high_contrast_controller.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/host/root_window_host_factory.h" 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/keyboard_uma_event_filter.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/magnifier/magnification_controller.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/partial_magnification_controller.h" 350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "ash/media_delegate.h" 361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/new_window_delegate.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/root_window_controller.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/screen_ash.h" 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ash/session_state_delegate.h" 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/shelf/app_list_shelf_item_delegate.h" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_delegate.h" 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_item_delegate.h" 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_item_delegate_manager.h" 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager.h" 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/shelf/shelf_model.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shelf/shelf_widget.h" 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ash/shelf/shelf_window_watcher.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_delegate.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_factory.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_window_ids.h" 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/system/locale/locale_notification_controller.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/status_area_widget.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_delegate.h" 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/system_tray_notifier.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/app_list_controller.h" 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/ash_focus_rules.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/ash_native_cursor_manager.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/base_layout_manager.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/coordinate_conversion.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/custom_frame_view_ash.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/event_client_impl.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/event_rewriter_event_filter.h" 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ash/wm/lock_state_controller.h" 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ash/wm/mru_window_tracker.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/overlay_event_filter.h" 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/wm/overview/window_selector_controller.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/power_button_controller.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/resize_shadow_controller.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/root_window_layout_manager.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/screen_dimmer.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_gesture_event_filter.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_modal_container_event_filter.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/system_modal_container_layout_manager.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/user_activity_detector.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/video_detector.h" 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/wm/window_animations.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_cycle_controller.h" 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_positioner.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_properties.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/workspace_controller.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/leak_annotations.h" 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/debug/trace_event.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/user_action_client.h" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/env.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/layout_manager.h" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/ui_base_switches.h" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/event_target_iterator.h" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/display.h" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/keyboard/keyboard.h" 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/keyboard/keyboard_controller.h" 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/keyboard/keyboard_switches.h" 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/keyboard/keyboard_util.h" 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/message_center/message_center.h" 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/compound_event_filter.h" 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/corewm_switches.h" 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/focus_controller.h" 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/input_method_event_filter.h" 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/shadow_controller.h" 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/views/corewm/tooltip_aura.h" 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/tooltip_controller.h" 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/visibility_controller.h" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/window_modality_controller.h" 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager_factory.h" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/native_widget_aura.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_CHROMEOS) 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(USE_X11) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/ash_constants.h" 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/display/display_change_observer_chromeos.h" 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "ash/display/display_error_observer_chromeos.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/display/output_configurator_animation.h" 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_pump_x11.h" 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/display/output_configurator.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/gpu_data_manager.h" 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_feature_type.h" 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // defined(USE_X11) 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/system/chromeos/brightness/brightness_controller_chromeos.h" 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/system/chromeos/power/power_event_observer.h" 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ash/system/chromeos/power/power_status.h" 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/system/chromeos/power/user_activity_notifier.h" 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/system/chromeos/power/video_activity_notifier.h" 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ash/wm/sticky_keys.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using aura::Window; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using views::Widget; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A Corewm VisibilityController subclass that calls the Ash animation routine 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// so we can pick up our extended animations. See ash/wm/window_animations.h. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class AshVisibilityController : public views::corewm::VisibilityController { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AshVisibilityController() {} 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AshVisibilityController() {} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from views::corewm::VisibilityController: 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CallAnimateOnChildWindowVisibilityChanged( 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool visible) OVERRIDE { 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AnimateOnChildWindowVisibilityChanged(window, visible); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AshVisibilityController); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::instance_ = NULL; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::initially_hide_cursor_ = false; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shell, public: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::CreateInstance(ShellDelegate* delegate) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(!instance_); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_ = new Shell(delegate); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->Init(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance_; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell* Shell::GetInstance() { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(instance_); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance_; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::HasInstance() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!instance_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::DeleteInstance() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete instance_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_ = NULL; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)internal::RootWindowController* Shell::GetPrimaryRootWindowController() { 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return internal::GetRootWindowController(GetPrimaryRootWindow()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Shell::RootWindowControllerList Shell::GetAllRootWindowControllers() { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::GetInstance()->display_controller()-> 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllRootWindowControllers(); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)aura::Window* Shell::GetPrimaryRootWindow() { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetInstance()->display_controller()->GetPrimaryRootWindow(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)aura::Window* Shell::GetTargetRootWindow() { 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) Shell* shell = GetInstance(); 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (shell->scoped_target_root_window_) 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return shell->scoped_target_root_window_; 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return shell->target_root_window_; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Screen* Shell::GetScreen() { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)aura::Window::Windows Shell::GetAllRootWindows() { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Shell::GetInstance()->display_controller()-> 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetAllRootWindows(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)aura::Window* Shell::GetContainer(aura::Window* root_window, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int container_id) { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_window->GetChildById(container_id); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const aura::Window* Shell::GetContainer(const aura::Window* root_window, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int container_id) { 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return root_window->GetChildById(container_id); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<aura::Window*> Shell::GetContainersFromAllRootWindows( 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int container_id, 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* priority_root) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<aura::Window*> containers; 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window::Windows root_windows = GetAllRootWindows(); 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (aura::Window::Windows::const_iterator it = root_windows.begin(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != root_windows.end(); ++it) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* container = (*it)->GetChildById(container_id); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (container) { 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (priority_root && priority_root->Contains(container)) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) containers.insert(containers.begin(), container); 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) containers.push_back(container); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return containers; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::ShowContextMenu(const gfx::Point& location_in_screen, 2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::MenuSourceType source_type) { 2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // No context menus if there is no session with an active user. 2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!session_state_delegate_->NumberOfLoggedInUsers()) 2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // No context menus when screen is locked. 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (session_state_delegate_->IsScreenLocked()) 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root = 2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wm::GetRootWindowMatching(gfx::Rect(location_in_screen, gfx::Size())); 2758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) internal::GetRootWindowController(root)-> 2768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ShowContextMenu(location_in_screen, source_type); 2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::ToggleAppList(aura::Window* window) { 2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If the context window is not given, show it on the target root window. 2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!window) 2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window = GetTargetRootWindow(); 2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!app_list_controller_) 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_list_controller_.reset(new internal::AppListController); 2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_list_controller_->SetVisible(!app_list_controller_->IsVisible(), window); 2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool Shell::GetAppListTargetVisibility() const { 2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return app_list_controller_.get() && 2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_list_controller_->GetTargetVisibility(); 2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)aura::Window* Shell::GetAppListWindow() { 2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return app_list_controller_.get() ? app_list_controller_->GetWindow() : NULL; 2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)app_list::AppListView* Shell::GetAppListView() { 2988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return app_list_controller_.get() ? app_list_controller_->GetView() : NULL; 2998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 3008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool Shell::IsSystemModalWindowOpen() const { 3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (simulate_modal_window_open_for_testing_) 3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<aura::Window*> containers = GetContainersFromAllRootWindows( 3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal::kShellWindowId_SystemModalContainer, NULL); 3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (std::vector<aura::Window*>::const_iterator cit = containers.begin(); 3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cit != containers.end(); ++cit) { 3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (aura::Window::Windows::const_iterator wit = (*cit)->children().begin(); 3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) wit != (*cit)->children().end(); ++wit) { 3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if ((*wit)->GetProperty(aura::client::kModalKey) == 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::MODAL_TYPE_SYSTEM && (*wit)->TargetVisibility()) { 3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)views::NonClientFrameView* Shell::CreateDefaultNonClientFrameView( 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::Widget* widget) { 3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Use translucent-style window frames for dialogs. 3228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return new CustomFrameViewAsh(widget); 3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::RotateFocus(Direction direction) { 3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) focus_cycler_->RotateFocus( 3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) direction == FORWARD ? internal::FocusCycler::FORWARD : 3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal::FocusCycler::BACKWARD); 3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetDisplayWorkAreaInsets(Window* contains, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Insets& insets) { 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!display_controller_->UpdateWorkAreaOfDisplayNearestWindow( 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch contains, insets)) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDisplayWorkAreaInsetsChanged()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnLoginStateChanged(user::LoginStatus status) { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnLoginStateChanged(status)); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Shell::OnLoginUserProfilePrepared() { 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateLauncher(); 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CreateKeyboard(); 348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::UpdateAfterLoginStatusChange(user::LoginStatus status) { 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->UpdateAfterLoginStatusChange(status); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnAppTerminating() { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnAppTerminating()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnLockStateChanged(bool locked) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnLockStateChanged(locked)); 363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef NDEBUG 364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Make sure that there is no system modal in Lock layer when unlocked. 365ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!locked) { 366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector<aura::Window*> containers = GetContainersFromAllRootWindows( 367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch internal::kShellWindowId_LockSystemModalContainer, 368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetPrimaryRootWindow()); 369ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch for (std::vector<aura::Window*>::const_iterator iter = containers.begin(); 370ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch iter != containers.end(); ++iter) { 371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK_EQ(0u, (*iter)->children().size()); 372ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 374ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CreateLauncher() { 378b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 379b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 380b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) iter != controllers.end(); ++iter) 381b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->shelf()->CreateLauncher(); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Shell::CreateKeyboard() { 385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(bshe): Primary root window controller may not be the controller to 386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // attach virtual keyboard. See http://crbug.com/303429 387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) InitKeyboard(); 388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (keyboard::IsKeyboardUsabilityExperimentEnabled()) { 389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_controller()->virtual_keyboard_window_controller()-> 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ActivateKeyboard(keyboard_controller_.get()); 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetPrimaryRootWindowController()-> 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ActivateKeyboard(keyboard_controller_.get()); 394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::ShowLauncher() { 398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 400b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) iter != controllers.end(); ++iter) 401b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) (*iter)->ShowLauncher(); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::AddShellObserver(ShellObserver* observer) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::RemoveShellObserver(ShellObserver* observer) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::UpdateShelfVisibility() { 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((*iter)->shelf()) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->UpdateShelfVisibility(); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShelfAutoHideBehavior(ShelfAutoHideBehavior behavior, 4211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window) { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ash::internal::ShelfLayoutManager::ForLauncher(root_window)-> 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAutoHideBehavior(behavior); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShelfAutoHideBehavior Shell::GetShelfAutoHideBehavior( 4271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window) const { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ash::internal::ShelfLayoutManager::ForLauncher(root_window)-> 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) auto_hide_behavior(); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetShelfAlignment(ShelfAlignment alignment, 4331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window) { 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ash::internal::ShelfLayoutManager::ForLauncher(root_window)-> 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetAlignment(alignment)) { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FOR_EACH_OBSERVER( 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShellObserver, observers_, OnShelfAlignmentChanged(root_window)); 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)ShelfAlignment Shell::GetShelfAlignment(aura::Window* root_window) { 44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return internal::GetRootWindowController(root_window)-> 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetShelfLayoutManager()->GetAlignment(); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::SetDimming(bool should_dim) { 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->screen_dimmer()->SetDimming(should_dim); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::NotifyFullscreenStateChange(bool is_fullscreen, 4541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window) { 4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FOR_EACH_OBSERVER(ShellObserver, observers_, OnFullscreenStateChanged( 4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_fullscreen, root_window)); 4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::CreateModalBackground(aura::Window* window) { 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!modality_filter_) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modality_filter_.reset(new internal::SystemModalContainerEventFilter(this)); 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddPreTargetHandler(modality_filter_.get()); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->GetSystemModalLayoutManager(window)->CreateModalBackground(); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::OnModalWindowRemoved(aura::Window* removed) { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool activated = false; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end() && !activated; ++iter) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) activated = (*iter)->GetSystemModalLayoutManager(removed)-> 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ActivateNextModalWindow(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!activated) { 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RemovePreTargetHandler(modality_filter_.get()); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modality_filter_.reset(); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*iter)->GetSystemModalLayoutManager(removed)->DestroyModalBackground(); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebNotificationTray* Shell::GetWebNotificationTray() { 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPrimaryRootWindowController()->shelf()-> 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_area_widget()->web_notification_tray(); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::HasPrimaryStatusArea() { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShelfWidget* shelf = GetPrimaryRootWindowController()->shelf(); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return shelf && shelf->status_area_widget(); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SystemTray* Shell::GetPrimarySystemTray() { 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetPrimaryRootWindowController()->GetSystemTray(); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ShelfDelegate* Shell::GetShelfDelegate() { 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!shelf_delegate_) { 503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model_.reset(new ShelfModel); 504a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Creates ShelfItemDelegateManager before ShelfDelegate. 505a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_item_delegate_manager_.reset( 506a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new ShelfItemDelegateManager(shelf_model_.get())); 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 508a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_delegate_.reset(delegate_->CreateShelfDelegate(shelf_model_.get())); 509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ShelfItemDelegate> controller( 51068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new internal::AppListShelfItemDelegate); 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Finding the shelf model's location of the app list and setting its 513a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // ShelfItemDelegate. 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int app_list_index = shelf_model_->GetItemIndexForType(TYPE_APP_LIST); 5151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK_GE(app_list_index, 0); 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LauncherID app_list_id = shelf_model_->items()[app_list_index].id; 5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(app_list_id); 518a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_item_delegate_manager_->SetShelfItemDelegate(app_list_id, 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) controller.Pass()); 520a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_window_watcher_.reset( 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) new internal::ShelfWindowWatcher(shelf_model_.get())); 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return shelf_delegate_.get(); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid Shell::SetTouchHudProjectionEnabled(bool enabled) { 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (is_touch_hud_projection_enabled_ == enabled) 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch is_touch_hud_projection_enabled_ = enabled; 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FOR_EACH_OBSERVER(ShellObserver, observers_, 5327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OnTouchHudProjectionToggled(enabled)); 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS) 5368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)ash::FirstRunHelper* Shell::CreateFirstRunHelper() { 5378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return new ash::FirstRunHelperImpl; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Shell::DoInitialWorkspaceAnimation() { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPrimaryRootWindowController()->workspace_controller()-> 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoInitialAnimation(); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shell, private: 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Shell::Shell(ShellDelegate* delegate) 5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) : screen_(new ScreenAsh), 5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) target_root_window_(NULL), 5524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_target_root_window_(NULL), 5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_(delegate), 5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_positioner_(new WindowPositioner), 5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) activation_client_(NULL), 5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_(new chromeos::OutputConfigurator()), 5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(OS_CHROMEOS) && defined(USE_X11) 5594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) native_cursor_manager_(new AshNativeCursorManager), 5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cursor_manager_(scoped_ptr<views::corewm::NativeCursorManager>( 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) native_cursor_manager_)), 5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) simulate_modal_window_open_for_testing_(false), 5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) is_touch_hud_projection_enabled_(false) { 5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(delegate_.get()); 5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_manager_.reset(new internal::DisplayManager); 5664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ANNOTATE_LEAKING_OBJECT_PTR(screen_); // see crbug.com/156466 5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_ALTERNATE, screen_); 5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE)) 5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_); 5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_controller_.reset(new DisplayController); 5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool is_panel_fitting_disabled = 5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::GpuDataManager::GetInstance()->IsFeatureBlacklisted( 5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gpu::GPU_FEATURE_TYPE_PANEL_FITTING); 5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->Init(!is_panel_fitting_disabled); 578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) periodic_metrics_recorder_.reset(new PeriodicMetricsRecorder); 5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessagePumpX11::Current()->AddDispatcherForRootWindow( 5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator()); 5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // We can't do this with a root window listener because XI_HierarchyChanged 5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // messages don't have a target window. 5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessagePumpX11::Current()->AddObserver(output_configurator()); 5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal::PowerStatus::Initialize(); 5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)Shell::~Shell() { 5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) TRACE_EVENT0("shutdown", "ash::Shell::Destructor"); 5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::FocusManagerFactory::Install(NULL); 5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Remove the focus from any window. This will prevent overhead and side 5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // effects (e.g. crashes) from changing focus during shutdown. 5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // See bug crbug.com/134502. 6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::GetFocusClient(GetPrimaryRootWindow())->FocusWindow(NULL); 6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Please keep in same order as in Init() because it's easy to miss one. 6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (window_modality_controller_) 6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_modality_controller_.reset(); 6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(event_rewriter_filter_.get()); 6064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(user_activity_detector_.get()); 6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(overlay_filter_.get()); 6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(input_method_filter_.get()); 6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (mouse_cursor_filter_) 6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(mouse_cursor_filter_.get()); 6114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(system_gesture_filter_.get()); 6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(keyboard_metrics_filter_.get()); 6134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(event_transformation_handler_.get()); 6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(accelerator_filter_.get()); 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TooltipController is deleted with the Shell so removing its references. 6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RemovePreTargetHandler(tooltip_controller_.get()); 6184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // AppList needs to be released before shelf layout manager, which is 6204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // destroyed with launcher container in the loop below. However, app list 6214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // container is now on top of launcher container and released after it. 6224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(xiyuan): Move it back when app list container is no longer needed. 6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) app_list_controller_.reset(); 6244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy SystemTrayDelegate before destroying the status area(s). 6264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_tray_delegate_->Shutdown(); 6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_tray_delegate_.reset(); 6284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) locale_notification_controller_.reset(); 6304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Drag-and-drop must be canceled prior to close all windows. 6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) drag_drop_controller_.reset(); 6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Controllers who have WindowObserver added must be deleted 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // before |display_controller_| is deleted. 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 637a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_CHROMEOS) 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // VideoActivityNotifier must be deleted before |video_detector_| is 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // deleted because it's observing video activity through 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // VideoDetectorObserver interface. 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) video_activity_notifier_.reset(); 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // defined(OS_CHROMEOS) 643a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) video_detector_.reset(); 644a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shadow_controller_.reset(); 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) resize_shadow_controller_.reset(); 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) window_cycle_controller_.reset(); 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) mru_window_tracker_.reset(); 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |shelf_window_watcher_| has a weak pointer to |shelf_Model_| 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // and has window observers. 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_window_watcher_.reset(); 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy all child windows including widgets. 6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_controller_->CloseChildWindows(); 657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) display_controller_->CloseNonDesktopDisplay(); 6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Chrome implementation of shelf delegate depends on FocusClient, 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // so must be deleted before |focus_client_|. 661a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_delegate_.reset(); 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) focus_client_.reset(); 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Destroy SystemTrayNotifier after destroying SystemTray as TrayItems 6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // needs to remove observers from it. 6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_tray_notifier_.reset(); 6674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // These need a valid Shell instance to clean up properly, so explicitly 6694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // delete them before invalidating the instance. 6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Alphabetical. TODO(oshima): sort. 6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) magnification_controller_.reset(); 6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) partial_magnification_controller_.reset(); 6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tooltip_controller_.reset(); 6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event_client_.reset(); 6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) nested_dispatcher_controller_.reset(); 6764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_action_client_.reset(); 6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) visibility_controller_.reset(); 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |shelf_item_delegate_manager_| observes |shelf_model_|. It must be 679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // destroyed before |shelf_model_| is destroyed. 680a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) shelf_item_delegate_manager_.reset(); 681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) shelf_model_.reset(); 6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) power_button_controller_.reset(); 6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lock_state_controller_.reset(); 6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resolution_notification_controller_.reset(); 6874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) desktop_background_controller_.reset(); 6884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This also deletes all RootWindows. Note that we invoke Shutdown() on 6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // DisplayController before resetting |display_controller_|, since destruction 6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // of its owned RootWindowControllers relies on the value. 6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_controller_->Shutdown(); 6934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_controller_.reset(); 6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen_position_controller_.reset(); 6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) keyboard_controller_.reset(); 6971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) accessibility_delegate_.reset(); 6980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) new_window_delegate_.reset(); 6990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) media_delegate_.reset(); 7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (display_change_observer_) 7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->RemoveObserver(display_change_observer_.get()); 7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (output_configurator_animation_) 7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->RemoveObserver(output_configurator_animation_.get()); 7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (display_error_observer_) 7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->RemoveObserver(display_error_observer_.get()); 7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow( 7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator()); 7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessagePumpX11::Current()->RemoveObserver(output_configurator()); 7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_change_observer_.reset(); 7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 7154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) internal::PowerStatus::Shutdown(); 7164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 7174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(instance_ == this); 7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) instance_ = NULL; 7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 7214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void Shell::Init() { 7234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) CommandLine* command_line = CommandLine::ForCurrentProcess(); 7244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->PreInit(); 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (keyboard::IsKeyboardUsabilityExperimentEnabled()) { 7271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) display_manager_->SetSecondDisplayMode( 7281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) internal::DisplayManager::VIRTUAL_KEYBOARD); 7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 7300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) bool display_initialized = display_manager_->InitFromCommandLine(); 7310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_X11) 7320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) output_configurator_animation_.reset( 7330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) new internal::OutputConfiguratorAnimation()); 7340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) output_configurator_->AddObserver(output_configurator_animation_.get()); 7350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 7360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!display_initialized && base::SysInfo::IsRunningOnChromeOS()) { 7374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_change_observer_.reset(new internal::DisplayChangeObserver); 7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Register |display_change_observer_| first so that the rest of 7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // observer gets invoked after the root windows are configured. 7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->AddObserver(display_change_observer_.get()); 7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_error_observer_.reset(new internal::DisplayErrorObserver()); 7424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->AddObserver(display_error_observer_.get()); 7434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->set_state_controller(display_change_observer_.get()); 7441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) output_configurator_->set_mirroring_controller(display_manager_.get()); 7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) output_configurator_->Start( 7464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->IsFirstRunAfterBoot() ? kChromeOsBootColor : 0); 7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_initialized = true; 7484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 7494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(OS_CHROMEOS) && defined(USE_X11) 7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!display_initialized) 7510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) display_manager_->InitDefaultDisplay(); 7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Install the custom factory first so that views::FocusManagers for Tray, 7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Launcher, and WallPaper could be created by the factory. 7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::FocusManagerFactory::Install(new AshFocusManagerFactory); 7564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Env creates the compositor. Historically it seems to have been implicitly 7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // initialized first by the ActivationController, but now that FocusController 7594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // no longer does this we need to do it explicitly. 7604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::Env::CreateInstance(); 7614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The WindowModalityController needs to be at the front of the input event 7634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // pretarget handler list to ensure that it processes input events when modal 7644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // windows are active. 7654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_modality_controller_.reset( 7664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new views::corewm::WindowModalityController(this)); 7674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(this); 7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) env_filter_.reset(new views::corewm::CompoundEventFilter); 7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(env_filter_.get()); 7724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::corewm::FocusController* focus_controller = 7744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new views::corewm::FocusController(new wm::AshFocusRules); 7754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) focus_client_.reset(focus_controller); 7764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) activation_client_ = focus_controller; 7774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) activation_client_->AddObserver(this); 7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) focus_cycler_.reset(new internal::FocusCycler()); 7794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen_position_controller_.reset(new internal::ScreenPositionController); 7814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_window_host_factory_.reset(delegate_->CreateRootWindowHostFactory()); 7824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_controller_->Start(); 7844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) display_controller_->InitPrimaryDisplay(); 7851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = display_controller_->GetPrimaryRootWindow(); 7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) target_root_window_ = root_window; 7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resolution_notification_controller_.reset( 7894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new internal::ResolutionNotificationController); 7904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cursor_manager_.SetDisplay(DisplayController::GetPrimaryDisplay()); 7924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) nested_dispatcher_controller_.reset(new NestedDispatcherController); 7944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) accelerator_controller_.reset(new AcceleratorController); 7954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The order in which event filters are added is significant. 7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event_rewriter_filter_.reset(new internal::EventRewriterEventFilter); 7984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(event_rewriter_filter_.get()); 7994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_CHROMEOS) 801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The StickyKeys event filter also rewrites events and must be added 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // before observers, but after the EventRewriterEventFilter. 803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) sticky_keys_.reset(new StickyKeys); 804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AddPreTargetHandler(sticky_keys_.get()); 805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // UserActivityDetector passes events to observers, so let them get 8084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // rewritten first. 8094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_activity_detector_.reset(new UserActivityDetector); 8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(user_activity_detector_.get()); 8114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) overlay_filter_.reset(new internal::OverlayEventFilter); 8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(overlay_filter_.get()); 8144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddShellObserver(overlay_filter_.get()); 8154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) input_method_filter_.reset(new views::corewm::InputMethodEventFilter( 817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_window->GetDispatcher()->host()->GetAcceleratedWidget())); 8184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(input_method_filter_.get()); 8194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) accelerator_filter_.reset(new internal::AcceleratorFilter); 8214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(accelerator_filter_.get()); 8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event_transformation_handler_.reset(new internal::EventTransformationHandler); 8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(event_transformation_handler_.get()); 8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_gesture_filter_.reset(new internal::SystemGestureEventFilter); 8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(system_gesture_filter_.get()); 8284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) keyboard_metrics_filter_.reset(new internal::KeyboardUMAEventFilter); 8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(keyboard_metrics_filter_.get()); 8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The keyboard system must be initialized before the RootWindowController is 8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // created. 8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (keyboard::IsKeyboardEnabled()) 8354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) keyboard::InitializeKeyboard(); 8364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lock_state_controller_.reset(new LockStateController); 8384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) power_button_controller_.reset(new PowerButtonController( 8394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) lock_state_controller_.get())); 8404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddShellObserver(lock_state_controller_.get()); 8414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) drag_drop_controller_.reset(new internal::DragDropController); 8434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mouse_cursor_filter_.reset(new internal::MouseCursorEventFilter()); 8444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) PrependPreTargetHandler(mouse_cursor_filter_.get()); 8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create Controllers that may need root window. 8474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(oshima): Move as many controllers before creating 8484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // RootWindowController as possible. 8494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) visibility_controller_.reset(new AshVisibilityController); 8504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_action_client_.reset(delegate_->CreateUserActionClient()); 8514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) magnification_controller_.reset( 8534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MagnificationController::CreateInstance()); 8544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mru_window_tracker_.reset(new MruWindowTracker(activation_client_)); 8554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) partial_magnification_controller_.reset( 8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new PartialMagnificationController()); 8584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) autoclick_controller_.reset(AutoclickController::CreateInstance()); 8604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) high_contrast_controller_.reset(new HighContrastController); 8624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_detector_.reset(new VideoDetector); 8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_cycle_controller_.reset(new WindowCycleController()); 8644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) window_selector_controller_.reset(new WindowSelectorController()); 8654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) tooltip_controller_.reset( 8674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new views::corewm::TooltipController( 8684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<views::corewm::Tooltip>( 8694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new views::corewm::TooltipAura(gfx::SCREEN_TYPE_ALTERNATE)))); 8704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) AddPreTargetHandler(tooltip_controller_.get()); 8714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event_client_.reset(new internal::EventClientImpl); 8734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This controller needs to be set before SetupManagedWindowMode. 8754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) desktop_background_controller_.reset(new DesktopBackgroundController()); 8764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_wallpaper_delegate_.reset(delegate_->CreateUserWallpaperDelegate()); 8774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // StatusAreaWidget uses Shell's CapsLockDelegate. 8794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) caps_lock_delegate_.reset(delegate_->CreateCapsLockDelegate()); 8804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) session_state_delegate_.reset(delegate_->CreateSessionStateDelegate()); 8821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) accessibility_delegate_.reset(delegate_->CreateAccessibilityDelegate()); 8831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new_window_delegate_.reset(delegate_->CreateNewWindowDelegate()); 8840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) media_delegate_.reset(delegate_->CreateMediaDelegate()); 8854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!command_line->HasSwitch(views::corewm::switches::kNoDropShadows)) { 8874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) resize_shadow_controller_.reset(new internal::ResizeShadowController()); 8884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) shadow_controller_.reset( 8894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new views::corewm::ShadowController(activation_client_)); 8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 8914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Create system_tray_notifier_ before the delegate. 8934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_tray_notifier_.reset(new ash::SystemTrayNotifier()); 8944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Initialize system_tray_delegate_ before initializing StatusAreaWidget. 8964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_tray_delegate_.reset(delegate()->CreateSystemTrayDelegate()); 8974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(system_tray_delegate_.get()); 8984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) locale_notification_controller_.reset( 9004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new internal::LocaleNotificationController); 9014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Initialize system_tray_delegate_ after StatusAreaWidget is created. 9034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) system_tray_delegate_->Initialize(); 9044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // TODO(oshima): Initialize all RootWindowControllers once, and 9068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // initialize controller/delegates above when initializing the 9078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // primary root window controller. 9081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) internal::RootWindowController::CreateForPrimaryDisplay( 9091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) root_window->GetDispatcher()); 9104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) display_controller_->InitSecondaryDisplays(); 9124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // It needs to be created after RootWindowController has been created 9148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // (which calls OnWindowResized has been called, otherwise the 9154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // widget will not paint when restoring after a browser crash. Also it needs 9164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // to be created after InitSecondaryDisplays() to initialize the wallpapers in 9174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // the correct size. 9184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_wallpaper_delegate_->InitializeWallpaper(); 9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (initially_hide_cursor_) 9214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cursor_manager_.HideCursor(); 9224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) cursor_manager_.SetCursor(ui::kCursorPointer); 9234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 9254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set accelerator controller delegates. 9264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) accelerator_controller_->SetBrightnessControlDelegate( 9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<ash::BrightnessControlDelegate>( 9284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new ash::system::BrightnessControllerChromeos).Pass()); 9294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) power_event_observer_.reset(new internal::PowerEventObserver()); 9314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) user_activity_notifier_.reset( 9324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new internal::UserActivityNotifier(user_activity_detector_.get())); 9334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) video_activity_notifier_.reset( 9344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new internal::VideoActivityNotifier(video_detector_.get())); 9354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 9364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) weak_display_manager_factory_.reset( 9381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new base::WeakPtrFactory<internal::DisplayManager>( 9391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) display_manager_.get())); 9404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The compositor thread and main message loop have to be running in 9414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // order to create mirror window. Run it after the main message loop 9424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // is started. 9434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::MessageLoopForUI::current()->PostTask( 9444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FROM_HERE, 9454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::Bind(&internal::DisplayManager::CreateMirrorWindowIfAny, 9461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) weak_display_manager_factory_->GetWeakPtr())); 9474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Shell::InitKeyboard() { 9504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (keyboard::IsKeyboardEnabled()) { 9514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (keyboard_controller_.get()) { 9524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 9534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 9544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) iter != controllers.end(); ++iter) { 9554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) (*iter)->DeactivateKeyboard(keyboard_controller_.get()); 9564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) keyboard::KeyboardControllerProxy* proxy = 9594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) delegate_->CreateKeyboardControllerProxy(); 9604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) keyboard_controller_.reset( 9614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new keyboard::KeyboardController(proxy)); 9624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Shell::InitRootWindow(aura::Window* root_window) { 9664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(activation_client_); 9674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(visibility_controller_.get()); 9684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(drag_drop_controller_.get()); 9694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DCHECK(window_cycle_controller_.get()); 9704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetFocusClient(root_window, focus_client_.get()); 9724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) input_method_filter_->SetInputMethodPropertyInRootWindow(root_window); 9734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetActivationClient(root_window, activation_client_); 9744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) views::corewm::FocusController* focus_controller = 9754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static_cast<views::corewm::FocusController*>(activation_client_); 9764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) root_window->AddPreTargetHandler(focus_controller); 9774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetVisibilityClient(root_window, visibility_controller_.get()); 9784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetDragDropClient(root_window, drag_drop_controller_.get()); 9794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetScreenPositionClient(root_window, 9804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) screen_position_controller_.get()); 9814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetCursorClient(root_window, &cursor_manager_); 9824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetTooltipClient(root_window, tooltip_controller_.get()); 9834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetEventClient(root_window, event_client_.get()); 9844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (nested_dispatcher_controller_) { 9864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetDispatcherClient(root_window, 9874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) nested_dispatcher_controller_.get()); 9884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 9894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (user_action_client_) 9904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::client::SetUserActionClient(root_window, user_action_client_.get()); 9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Shell::CanWindowReceiveEvents(aura::Window* window) { 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RootWindowControllerList controllers = GetAllRootWindowControllers(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RootWindowControllerList::iterator iter = controllers.begin(); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != controllers.end(); ++iter) { 99790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) internal::SystemModalContainerLayoutManager* layout_manager = 99890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (*iter)->GetSystemModalLayoutManager(window); 99990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (layout_manager && layout_manager->CanWindowReceiveEvents(window)) 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shell, ui::EventTarget overrides: 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool Shell::CanAcceptEvent(const ui::Event& event) { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::EventTarget* Shell::GetParentTarget() { 1013f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return aura::Env::GetInstance(); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)scoped_ptr<ui::EventTargetIterator> Shell::GetChildIterator() const { 1017a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return scoped_ptr<ui::EventTargetIterator>(); 1018a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ui::EventTargeter* Shell::GetEventTargeter() { 1021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTREACHED(); 1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return NULL; 1023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::OnEvent(ui::Event* event) { 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Shell, aura::client::ActivationChangeObserver implementation: 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Shell::OnWindowActivated(aura::Window* gained_active, 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* lost_active) { 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gained_active) 1034a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) target_root_window_ = gained_active->GetRootWindow(); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 1038