Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: ash/shell.cc

Issue 25111002: Only show virtual keyboard on primary root window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/shell.h" 5 #include "ash/shell.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "ash/accelerators/accelerator_controller.h" 10 #include "ash/accelerators/accelerator_controller.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 #include "ui/aura/root_window.h" 85 #include "ui/aura/root_window.h"
86 #include "ui/aura/window.h" 86 #include "ui/aura/window.h"
87 #include "ui/base/ui_base_switches.h" 87 #include "ui/base/ui_base_switches.h"
88 #include "ui/compositor/layer.h" 88 #include "ui/compositor/layer.h"
89 #include "ui/compositor/layer_animator.h" 89 #include "ui/compositor/layer_animator.h"
90 #include "ui/gfx/display.h" 90 #include "ui/gfx/display.h"
91 #include "ui/gfx/image/image_skia.h" 91 #include "ui/gfx/image/image_skia.h"
92 #include "ui/gfx/screen.h" 92 #include "ui/gfx/screen.h"
93 #include "ui/gfx/size.h" 93 #include "ui/gfx/size.h"
94 #include "ui/keyboard/keyboard.h" 94 #include "ui/keyboard/keyboard.h"
95 #include "ui/keyboard/keyboard_controller.h"
95 #include "ui/keyboard/keyboard_util.h" 96 #include "ui/keyboard/keyboard_util.h"
96 #include "ui/message_center/message_center.h" 97 #include "ui/message_center/message_center.h"
97 #include "ui/views/corewm/compound_event_filter.h" 98 #include "ui/views/corewm/compound_event_filter.h"
98 #include "ui/views/corewm/corewm_switches.h" 99 #include "ui/views/corewm/corewm_switches.h"
99 #include "ui/views/corewm/focus_controller.h" 100 #include "ui/views/corewm/focus_controller.h"
100 #include "ui/views/corewm/input_method_event_filter.h" 101 #include "ui/views/corewm/input_method_event_filter.h"
101 #include "ui/views/corewm/shadow_controller.h" 102 #include "ui/views/corewm/shadow_controller.h"
102 #include "ui/views/corewm/tooltip_controller.h" 103 #include "ui/views/corewm/tooltip_controller.h"
103 #include "ui/views/corewm/visibility_controller.h" 104 #include "ui/views/corewm/visibility_controller.h"
104 #include "ui/views/corewm/window_modality_controller.h" 105 #include "ui/views/corewm/window_modality_controller.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 } // namespace 151 } // namespace
151 152
152 // static 153 // static
153 Shell* Shell::instance_ = NULL; 154 Shell* Shell::instance_ = NULL;
154 // static 155 // static
155 bool Shell::initially_hide_cursor_ = false; 156 bool Shell::initially_hide_cursor_ = false;
156 157
157 //////////////////////////////////////////////////////////////////////////////// 158 ////////////////////////////////////////////////////////////////////////////////
158 // Shell, public: 159 // Shell, public:
159 160
160 Shell::Shell(ShellDelegate* delegate)
oshima 2013/10/04 16:50:17 thank you for fixing this. next time, please do th
bshe 2013/10/04 17:38:32 Sorry about it. I should have done it in a separat
161 : screen_(new ScreenAsh),
162 target_root_window_(NULL),
163 scoped_target_root_window_(NULL),
164 delegate_(delegate),
165 window_positioner_(new WindowPositioner),
166 activation_client_(NULL),
167 #if defined(OS_CHROMEOS) && defined(USE_X11)
168 output_configurator_(new chromeos::OutputConfigurator()),
169 #endif // defined(OS_CHROMEOS)
170 native_cursor_manager_(new AshNativeCursorManager),
171 cursor_manager_(scoped_ptr<views::corewm::NativeCursorManager>(
172 native_cursor_manager_)),
173 browser_context_(NULL),
174 simulate_modal_window_open_for_testing_(false),
175 is_touch_hud_projection_enabled_(false) {
176 DCHECK(delegate_.get());
177 display_manager_.reset(new internal::DisplayManager);
178
179 ANNOTATE_LEAKING_OBJECT_PTR(screen_); // see crbug.com/156466
180 gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_ALTERNATE, screen_);
181 if (!gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE))
182 gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_);
183 display_controller_.reset(new DisplayController);
184 #if defined(OS_CHROMEOS) && defined(USE_X11)
185 bool is_panel_fitting_disabled =
186 content::GpuDataManager::GetInstance()->IsFeatureBlacklisted(
187 gpu::GPU_FEATURE_TYPE_PANEL_FITTING);
188
189 output_configurator_->Init(!is_panel_fitting_disabled);
190
191 base::MessagePumpX11::Current()->AddDispatcherForRootWindow(
192 output_configurator());
193 // We can't do this with a root window listener because XI_HierarchyChanged
194 // messages don't have a target window.
195 base::MessagePumpX11::Current()->AddObserver(output_configurator());
196 #endif // defined(OS_CHROMEOS)
197
198 #if defined(OS_CHROMEOS)
199 internal::PowerStatus::Initialize();
200 #endif
201 }
202
203 Shell::~Shell() {
204 TRACE_EVENT0("shutdown", "ash::Shell::Destructor");
205
206 views::FocusManagerFactory::Install(NULL);
207
208 // Remove the focus from any window. This will prevent overhead and side
209 // effects (e.g. crashes) from changing focus during shutdown.
210 // See bug crbug.com/134502.
211 aura::client::GetFocusClient(GetPrimaryRootWindow())->FocusWindow(NULL);
212
213 // Please keep in same order as in Init() because it's easy to miss one.
214 if (window_modality_controller_)
215 window_modality_controller_.reset();
216 RemovePreTargetHandler(event_rewriter_filter_.get());
217 RemovePreTargetHandler(user_activity_detector_.get());
218 RemovePreTargetHandler(overlay_filter_.get());
219 RemovePreTargetHandler(input_method_filter_.get());
220 if (mouse_cursor_filter_)
221 RemovePreTargetHandler(mouse_cursor_filter_.get());
222 RemovePreTargetHandler(system_gesture_filter_.get());
223 RemovePreTargetHandler(keyboard_metrics_filter_.get());
224 RemovePreTargetHandler(event_transformation_handler_.get());
225 RemovePreTargetHandler(accelerator_filter_.get());
226
227 // TooltipController is deleted with the Shell so removing its references.
228 RemovePreTargetHandler(tooltip_controller_.get());
229
230 // AppList needs to be released before shelf layout manager, which is
231 // destroyed with launcher container in the loop below. However, app list
232 // container is now on top of launcher container and released after it.
233 // TODO(xiyuan): Move it back when app list container is no longer needed.
234 app_list_controller_.reset();
235
236 // Destroy SystemTrayDelegate before destroying the status area(s).
237 system_tray_delegate_->Shutdown();
238 system_tray_delegate_.reset();
239
240 locale_notification_controller_.reset();
241
242 // Drag-and-drop must be canceled prior to close all windows.
243 drag_drop_controller_.reset();
244
245 // Destroy all child windows including widgets.
246 display_controller_->CloseChildWindows();
247
248 // Destroy SystemTrayNotifier after destroying SystemTray as TrayItems
249 // needs to remove observers from it.
250 system_tray_notifier_.reset();
251
252 // These need a valid Shell instance to clean up properly, so explicitly
253 // delete them before invalidating the instance.
254 // Alphabetical. TODO(oshima): sort.
255 magnification_controller_.reset();
256 partial_magnification_controller_.reset();
257 resize_shadow_controller_.reset();
258 shadow_controller_.reset();
259 tooltip_controller_.reset();
260 event_client_.reset();
261 window_cycle_controller_.reset();
262 nested_dispatcher_controller_.reset();
263 user_action_client_.reset();
264 visibility_controller_.reset();
265 launcher_delegate_.reset();
266 launcher_model_.reset();
267 video_detector_.reset();
268
269 power_button_controller_.reset();
270 lock_state_controller_.reset();
271 mru_window_tracker_.reset();
272
273 resolution_notification_controller_.reset();
274 desktop_background_controller_.reset();
275
276 // This also deletes all RootWindows. Note that we invoke Shutdown() on
277 // DisplayController before resetting |display_controller_|, since destruction
278 // of its owned RootWindowControllers relies on the value.
279 display_controller_->Shutdown();
280 display_controller_.reset();
281 screen_position_controller_.reset();
282
283 #if defined(OS_CHROMEOS) && defined(USE_X11)
284 if (display_change_observer_)
285 output_configurator_->RemoveObserver(display_change_observer_.get());
286 if (output_configurator_animation_)
287 output_configurator_->RemoveObserver(output_configurator_animation_.get());
288 if (display_error_observer_)
289 output_configurator_->RemoveObserver(display_error_observer_.get());
290 base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow(
291 output_configurator());
292 base::MessagePumpX11::Current()->RemoveObserver(output_configurator());
293 display_change_observer_.reset();
294 #endif // defined(OS_CHROMEOS)
295
296 #if defined(OS_CHROMEOS)
297 internal::PowerStatus::Shutdown();
298 #endif
299
300 DCHECK(instance_ == this);
301 instance_ = NULL;
302 }
303
304 // static 161 // static
305 Shell* Shell::CreateInstance(ShellDelegate* delegate) { 162 Shell* Shell::CreateInstance(ShellDelegate* delegate) {
306 CHECK(!instance_); 163 CHECK(!instance_);
307 instance_ = new Shell(delegate); 164 instance_ = new Shell(delegate);
308 instance_->Init(); 165 instance_->Init();
309 return instance_; 166 return instance_;
310 } 167 }
311 168
312 // static 169 // static
313 Shell* Shell::GetInstance() { 170 Shell* Shell::GetInstance() {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 } 248 }
392 return containers; 249 return containers;
393 } 250 }
394 251
395 // static 252 // static
396 bool Shell::IsForcedMaximizeMode() { 253 bool Shell::IsForcedMaximizeMode() {
397 CommandLine* command_line = CommandLine::ForCurrentProcess(); 254 CommandLine* command_line = CommandLine::ForCurrentProcess();
398 return command_line->HasSwitch(switches::kForcedMaximizeMode); 255 return command_line->HasSwitch(switches::kForcedMaximizeMode);
399 } 256 }
400 257
401 void Shell::Init() {
402 CommandLine* command_line = CommandLine::ForCurrentProcess();
403
404 delegate_->PreInit();
405 bool display_initialized = false;
406 #if defined(OS_CHROMEOS) && defined(USE_X11)
407 output_configurator_animation_.reset(
408 new internal::OutputConfiguratorAnimation());
409 output_configurator_->AddObserver(output_configurator_animation_.get());
410 if (base::SysInfo::IsRunningOnChromeOS()) {
411 display_change_observer_.reset(new internal::DisplayChangeObserver);
412 // Register |display_change_observer_| first so that the rest of
413 // observer gets invoked after the root windows are configured.
414 output_configurator_->AddObserver(display_change_observer_.get());
415 display_error_observer_.reset(new internal::DisplayErrorObserver());
416 output_configurator_->AddObserver(display_error_observer_.get());
417 output_configurator_->set_state_controller(display_change_observer_.get());
418 if (!command_line->HasSwitch(ash::switches::kAshDisableSoftwareMirroring))
419 output_configurator_->set_mirroring_controller(display_manager_.get());
420 output_configurator_->Start(
421 delegate_->IsFirstRunAfterBoot() ? kChromeOsBootColor : 0);
422 display_initialized = true;
423 }
424 #endif // defined(OS_CHROMEOS) && defined(USE_X11)
425 if (!display_initialized)
426 display_manager_->InitFromCommandLine();
427
428 // Install the custom factory first so that views::FocusManagers for Tray,
429 // Launcher, and WallPaper could be created by the factory.
430 views::FocusManagerFactory::Install(new AshFocusManagerFactory);
431
432 // The WindowModalityController needs to be at the front of the input event
433 // pretarget handler list to ensure that it processes input events when modal
434 // windows are active.
435 window_modality_controller_.reset(
436 new views::corewm::WindowModalityController(this));
437
438 AddPreTargetHandler(this);
439
440 env_filter_.reset(new views::corewm::CompoundEventFilter);
441 AddPreTargetHandler(env_filter_.get());
442
443 // Env creates the compositor. Historically it seems to have been implicitly
444 // initialized first by the ActivationController, but now that FocusController
445 // no longer does this we need to do it explicitly.
446 aura::Env::GetInstance();
447 views::corewm::FocusController* focus_controller =
448 new views::corewm::FocusController(new wm::AshFocusRules);
449 focus_client_.reset(focus_controller);
450 activation_client_ = focus_controller;
451 activation_client_->AddObserver(this);
452 focus_cycler_.reset(new internal::FocusCycler());
453
454 screen_position_controller_.reset(new internal::ScreenPositionController);
455 root_window_host_factory_.reset(delegate_->CreateRootWindowHostFactory());
456
457 display_controller_->Start();
458 display_controller_->InitPrimaryDisplay();
459 aura::RootWindow* root_window = display_controller_->GetPrimaryRootWindow();
460 target_root_window_ = root_window;
461
462 resolution_notification_controller_.reset(
463 new internal::ResolutionNotificationController);
464
465 cursor_manager_.SetDisplay(DisplayController::GetPrimaryDisplay());
466
467 nested_dispatcher_controller_.reset(new NestedDispatcherController);
468 accelerator_controller_.reset(new AcceleratorController);
469
470 // The order in which event filters are added is significant.
471 event_rewriter_filter_.reset(new internal::EventRewriterEventFilter);
472 AddPreTargetHandler(event_rewriter_filter_.get());
473
474 // UserActivityDetector passes events to observers, so let them get
475 // rewritten first.
476 user_activity_detector_.reset(new UserActivityDetector);
477 AddPreTargetHandler(user_activity_detector_.get());
478
479 overlay_filter_.reset(new internal::OverlayEventFilter);
480 AddPreTargetHandler(overlay_filter_.get());
481 AddShellObserver(overlay_filter_.get());
482
483 input_method_filter_.reset(new views::corewm::InputMethodEventFilter(
484 root_window->GetAcceleratedWidget()));
485 AddPreTargetHandler(input_method_filter_.get());
486
487 accelerator_filter_.reset(new internal::AcceleratorFilter);
488 AddPreTargetHandler(accelerator_filter_.get());
489
490 event_transformation_handler_.reset(new internal::EventTransformationHandler);
491 AddPreTargetHandler(event_transformation_handler_.get());
492
493 system_gesture_filter_.reset(new internal::SystemGestureEventFilter);
494 AddPreTargetHandler(system_gesture_filter_.get());
495
496 keyboard_metrics_filter_.reset(new internal::KeyboardUMAEventFilter);
497 AddPreTargetHandler(keyboard_metrics_filter_.get());
498
499 // The keyboard system must be initialized before the RootWindowController is
500 // created.
501 if (keyboard::IsKeyboardEnabled())
502 keyboard::InitializeKeyboard();
503
504 lock_state_controller_.reset(new LockStateController);
505 power_button_controller_.reset(new PowerButtonController(
506 lock_state_controller_.get()));
507 AddShellObserver(lock_state_controller_.get());
508
509 drag_drop_controller_.reset(new internal::DragDropController);
510 mouse_cursor_filter_.reset(new internal::MouseCursorEventFilter());
511 PrependPreTargetHandler(mouse_cursor_filter_.get());
512
513 // Create Controllers that may need root window.
514 // TODO(oshima): Move as many controllers before creating
515 // RootWindowController as possible.
516 visibility_controller_.reset(new AshVisibilityController);
517 user_action_client_.reset(delegate_->CreateUserActionClient());
518
519 magnification_controller_.reset(
520 MagnificationController::CreateInstance());
521 mru_window_tracker_.reset(new MruWindowTracker(activation_client_));
522
523 partial_magnification_controller_.reset(
524 new PartialMagnificationController());
525
526 high_contrast_controller_.reset(new HighContrastController);
527 video_detector_.reset(new VideoDetector);
528 window_cycle_controller_.reset(new WindowCycleController());
529 window_selector_controller_.reset(new WindowSelectorController());
530
531 tooltip_controller_.reset(new views::corewm::TooltipController(
532 gfx::SCREEN_TYPE_ALTERNATE));
533 AddPreTargetHandler(tooltip_controller_.get());
534
535 event_client_.reset(new internal::EventClientImpl);
536
537 // This controller needs to be set before SetupManagedWindowMode.
538 desktop_background_controller_.reset(new DesktopBackgroundController());
539 user_wallpaper_delegate_.reset(delegate_->CreateUserWallpaperDelegate());
540
541 // StatusAreaWidget uses Shell's CapsLockDelegate.
542 caps_lock_delegate_.reset(delegate_->CreateCapsLockDelegate());
543
544 session_state_delegate_.reset(delegate_->CreateSessionStateDelegate());
545
546 if (!command_line->HasSwitch(views::corewm::switches::kNoDropShadows)) {
547 resize_shadow_controller_.reset(new internal::ResizeShadowController());
548 shadow_controller_.reset(
549 new views::corewm::ShadowController(activation_client_));
550 }
551
552 // Create system_tray_notifier_ before the delegate.
553 system_tray_notifier_.reset(new ash::SystemTrayNotifier());
554
555 // Initialize system_tray_delegate_ before initializing StatusAreaWidget.
556 system_tray_delegate_.reset(delegate()->CreateSystemTrayDelegate());
557 DCHECK(system_tray_delegate_.get());
558
559 internal::RootWindowController* root_window_controller =
560 new internal::RootWindowController(root_window);
561 InitRootWindowController(root_window_controller,
562 delegate_->IsFirstRunAfterBoot());
563
564 locale_notification_controller_.reset(
565 new internal::LocaleNotificationController);
566
567 // Initialize system_tray_delegate_ after StatusAreaWidget is created.
568 system_tray_delegate_->Initialize();
569
570 display_controller_->InitSecondaryDisplays();
571
572 // Force Layout
573 root_window_controller->root_window_layout()->OnWindowResized();
574
575 // It needs to be created after OnWindowResized has been called, otherwise the
576 // widget will not paint when restoring after a browser crash. Also it needs
577 // to be created after InitSecondaryDisplays() to initialize the wallpapers in
578 // the correct size.
579 user_wallpaper_delegate_->InitializeWallpaper();
580
581 if (initially_hide_cursor_)
582 cursor_manager_.HideCursor();
583 cursor_manager_.SetCursor(ui::kCursorPointer);
584
585 if (!cursor_manager_.IsCursorVisible()) {
586 // Cursor might have been hidden by something other than chrome.
587 // Let the first mouse event show the cursor.
588 env_filter_->set_cursor_hidden_by_filter(true);
589 }
590
591 // Set accelerator controller delegates.
592 #if defined(OS_CHROMEOS)
593 accelerator_controller_->SetBrightnessControlDelegate(
594 scoped_ptr<ash::BrightnessControlDelegate>(
595 new ash::system::BrightnessControllerChromeos).Pass());
596 #endif
597
598 // The compositor thread and main message loop have to be running in
599 // order to create mirror window. Run it after the main message loop
600 // is started.
601 base::MessageLoopForUI::current()->PostTask(
602 FROM_HERE,
603 base::Bind(&internal::DisplayManager::CreateMirrorWindowIfAny,
604 base::Unretained(display_manager_.get())));
605 }
606
607 void Shell::ShowContextMenu(const gfx::Point& location_in_screen, 258 void Shell::ShowContextMenu(const gfx::Point& location_in_screen,
608 ui::MenuSourceType source_type) { 259 ui::MenuSourceType source_type) {
609 // No context menus if there is no session with an active user. 260 // No context menus if there is no session with an active user.
610 if (!session_state_delegate_->NumberOfLoggedInUsers()) 261 if (!session_state_delegate_->NumberOfLoggedInUsers())
611 return; 262 return;
612 // No context menus when screen is locked. 263 // No context menus when screen is locked.
613 if (session_state_delegate_->IsScreenLocked()) 264 if (session_state_delegate_->IsScreenLocked())
614 return; 265 return;
615 266
616 aura::RootWindow* root = 267 aura::RootWindow* root =
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
680 const gfx::Insets& insets) { 331 const gfx::Insets& insets) {
681 if (!display_controller_->UpdateWorkAreaOfDisplayNearestWindow( 332 if (!display_controller_->UpdateWorkAreaOfDisplayNearestWindow(
682 contains, insets)) { 333 contains, insets)) {
683 return; 334 return;
684 } 335 }
685 FOR_EACH_OBSERVER(ShellObserver, observers_, 336 FOR_EACH_OBSERVER(ShellObserver, observers_,
686 OnDisplayWorkAreaInsetsChanged()); 337 OnDisplayWorkAreaInsetsChanged());
687 } 338 }
688 339
689 void Shell::OnLoginStateChanged(user::LoginStatus status) { 340 void Shell::OnLoginStateChanged(user::LoginStatus status) {
341 if (status != user::LOGGED_IN_NONE) {
342 // TODO(bshe): Primary root window controller may not be the controller to
343 // attach virtual keyboard. See http://crbug.com/303429
344 InitKeyboard(GetPrimaryRootWindowController());
345 }
690 FOR_EACH_OBSERVER(ShellObserver, observers_, OnLoginStateChanged(status)); 346 FOR_EACH_OBSERVER(ShellObserver, observers_, OnLoginStateChanged(status));
691 } 347 }
692 348
693 void Shell::UpdateAfterLoginStatusChange(user::LoginStatus status) { 349 void Shell::UpdateAfterLoginStatusChange(user::LoginStatus status) {
694 RootWindowControllerList controllers = GetAllRootWindowControllers(); 350 RootWindowControllerList controllers = GetAllRootWindowControllers();
695 for (RootWindowControllerList::iterator iter = controllers.begin(); 351 for (RootWindowControllerList::iterator iter = controllers.begin();
696 iter != controllers.end(); ++iter) 352 iter != controllers.end(); ++iter)
697 (*iter)->UpdateAfterLoginStatusChange(status); 353 (*iter)->UpdateAfterLoginStatusChange(status);
698 } 354 }
699 355
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 // Create a launcher if a user is already logged. 525 // Create a launcher if a user is already logged.
870 if (Shell::GetInstance()->session_state_delegate()->NumberOfLoggedInUsers()) 526 if (Shell::GetInstance()->session_state_delegate()->NumberOfLoggedInUsers())
871 controller->shelf()->CreateLauncher(); 527 controller->shelf()->CreateLauncher();
872 } 528 }
873 529
874 void Shell::DoInitialWorkspaceAnimation() { 530 void Shell::DoInitialWorkspaceAnimation() {
875 return GetPrimaryRootWindowController()->workspace_controller()-> 531 return GetPrimaryRootWindowController()->workspace_controller()->
876 DoInitialAnimation(); 532 DoInitialAnimation();
877 } 533 }
878 534
535 ////////////////////////////////////////////////////////////////////////////////
536 // Shell, private:
537
538 Shell::Shell(ShellDelegate* delegate)
539 : screen_(new ScreenAsh),
540 target_root_window_(NULL),
541 scoped_target_root_window_(NULL),
542 delegate_(delegate),
543 window_positioner_(new WindowPositioner),
544 activation_client_(NULL),
545 #if defined(OS_CHROMEOS) && defined(USE_X11)
546 output_configurator_(new chromeos::OutputConfigurator()),
547 #endif // defined(OS_CHROMEOS)
548 native_cursor_manager_(new AshNativeCursorManager),
549 cursor_manager_(scoped_ptr<views::corewm::NativeCursorManager>(
550 native_cursor_manager_)),
551 browser_context_(NULL),
552 simulate_modal_window_open_for_testing_(false),
553 is_touch_hud_projection_enabled_(false) {
554 DCHECK(delegate_.get());
555 display_manager_.reset(new internal::DisplayManager);
556
557 ANNOTATE_LEAKING_OBJECT_PTR(screen_); // see crbug.com/156466
558 gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_ALTERNATE, screen_);
559 if (!gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE))
560 gfx::Screen::SetScreenInstance(gfx::SCREEN_TYPE_NATIVE, screen_);
561 display_controller_.reset(new DisplayController);
562 #if defined(OS_CHROMEOS) && defined(USE_X11)
563 bool is_panel_fitting_disabled =
564 content::GpuDataManager::GetInstance()->IsFeatureBlacklisted(
565 gpu::GPU_FEATURE_TYPE_PANEL_FITTING);
566
567 output_configurator_->Init(!is_panel_fitting_disabled);
568
569 base::MessagePumpX11::Current()->AddDispatcherForRootWindow(
570 output_configurator());
571 // We can't do this with a root window listener because XI_HierarchyChanged
572 // messages don't have a target window.
573 base::MessagePumpX11::Current()->AddObserver(output_configurator());
574 #endif // defined(OS_CHROMEOS)
575
576 #if defined(OS_CHROMEOS)
577 internal::PowerStatus::Initialize();
578 #endif
579 }
580
581 Shell::~Shell() {
582 TRACE_EVENT0("shutdown", "ash::Shell::Destructor");
583
584 views::FocusManagerFactory::Install(NULL);
585
586 // Remove the focus from any window. This will prevent overhead and side
587 // effects (e.g. crashes) from changing focus during shutdown.
588 // See bug crbug.com/134502.
589 aura::client::GetFocusClient(GetPrimaryRootWindow())->FocusWindow(NULL);
590
591 // Please keep in same order as in Init() because it's easy to miss one.
592 if (window_modality_controller_)
593 window_modality_controller_.reset();
594 RemovePreTargetHandler(event_rewriter_filter_.get());
595 RemovePreTargetHandler(user_activity_detector_.get());
596 RemovePreTargetHandler(overlay_filter_.get());
597 RemovePreTargetHandler(input_method_filter_.get());
598 if (mouse_cursor_filter_)
599 RemovePreTargetHandler(mouse_cursor_filter_.get());
600 RemovePreTargetHandler(system_gesture_filter_.get());
601 RemovePreTargetHandler(keyboard_metrics_filter_.get());
602 RemovePreTargetHandler(event_transformation_handler_.get());
603 RemovePreTargetHandler(accelerator_filter_.get());
604
605 // TooltipController is deleted with the Shell so removing its references.
606 RemovePreTargetHandler(tooltip_controller_.get());
607
608 // AppList needs to be released before shelf layout manager, which is
609 // destroyed with launcher container in the loop below. However, app list
610 // container is now on top of launcher container and released after it.
611 // TODO(xiyuan): Move it back when app list container is no longer needed.
612 app_list_controller_.reset();
613
614 // Destroy SystemTrayDelegate before destroying the status area(s).
615 system_tray_delegate_->Shutdown();
616 system_tray_delegate_.reset();
617
618 locale_notification_controller_.reset();
619
620 // Drag-and-drop must be canceled prior to close all windows.
621 drag_drop_controller_.reset();
622
623 // Destroy all child windows including widgets.
624 display_controller_->CloseChildWindows();
625
626 // Destroy SystemTrayNotifier after destroying SystemTray as TrayItems
627 // needs to remove observers from it.
628 system_tray_notifier_.reset();
629
630 // These need a valid Shell instance to clean up properly, so explicitly
631 // delete them before invalidating the instance.
632 // Alphabetical. TODO(oshima): sort.
633 magnification_controller_.reset();
634 partial_magnification_controller_.reset();
635 resize_shadow_controller_.reset();
636 shadow_controller_.reset();
637 tooltip_controller_.reset();
638 event_client_.reset();
639 window_cycle_controller_.reset();
640 nested_dispatcher_controller_.reset();
641 user_action_client_.reset();
642 visibility_controller_.reset();
643 launcher_delegate_.reset();
644 launcher_model_.reset();
645 video_detector_.reset();
646
647 power_button_controller_.reset();
648 lock_state_controller_.reset();
649 mru_window_tracker_.reset();
650
651 resolution_notification_controller_.reset();
652 desktop_background_controller_.reset();
653
654 // This also deletes all RootWindows. Note that we invoke Shutdown() on
655 // DisplayController before resetting |display_controller_|, since destruction
656 // of its owned RootWindowControllers relies on the value.
657 display_controller_->Shutdown();
658 display_controller_.reset();
659 screen_position_controller_.reset();
660
oshima 2013/10/04 16:50:17 maybe you should reset the controller before setti
bshe 2013/10/04 17:38:32 Done. keyboard_controller doesn't depend on shell
661 #if defined(OS_CHROMEOS) && defined(USE_X11)
662 if (display_change_observer_)
663 output_configurator_->RemoveObserver(display_change_observer_.get());
664 if (output_configurator_animation_)
665 output_configurator_->RemoveObserver(output_configurator_animation_.get());
666 if (display_error_observer_)
667 output_configurator_->RemoveObserver(display_error_observer_.get());
668 base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow(
669 output_configurator());
670 base::MessagePumpX11::Current()->RemoveObserver(output_configurator());
671 display_change_observer_.reset();
672 #endif // defined(OS_CHROMEOS)
673
674 #if defined(OS_CHROMEOS)
675 internal::PowerStatus::Shutdown();
676 #endif
677
678 DCHECK(instance_ == this);
679 instance_ = NULL;
680 }
681
682 void Shell::Init() {
683 CommandLine* command_line = CommandLine::ForCurrentProcess();
684
685 delegate_->PreInit();
686 bool display_initialized = false;
687 #if defined(OS_CHROMEOS) && defined(USE_X11)
688 output_configurator_animation_.reset(
689 new internal::OutputConfiguratorAnimation());
690 output_configurator_->AddObserver(output_configurator_animation_.get());
691 if (base::SysInfo::IsRunningOnChromeOS()) {
692 display_change_observer_.reset(new internal::DisplayChangeObserver);
693 // Register |display_change_observer_| first so that the rest of
694 // observer gets invoked after the root windows are configured.
695 output_configurator_->AddObserver(display_change_observer_.get());
696 display_error_observer_.reset(new internal::DisplayErrorObserver());
697 output_configurator_->AddObserver(display_error_observer_.get());
698 output_configurator_->set_state_controller(display_change_observer_.get());
699 if (!command_line->HasSwitch(ash::switches::kAshDisableSoftwareMirroring))
700 output_configurator_->set_mirroring_controller(display_manager_.get());
701 output_configurator_->Start(
702 delegate_->IsFirstRunAfterBoot() ? kChromeOsBootColor : 0);
703 display_initialized = true;
704 }
705 #endif // defined(OS_CHROMEOS) && defined(USE_X11)
706 if (!display_initialized)
707 display_manager_->InitFromCommandLine();
708
709 // Install the custom factory first so that views::FocusManagers for Tray,
710 // Launcher, and WallPaper could be created by the factory.
711 views::FocusManagerFactory::Install(new AshFocusManagerFactory);
712
713 // The WindowModalityController needs to be at the front of the input event
714 // pretarget handler list to ensure that it processes input events when modal
715 // windows are active.
716 window_modality_controller_.reset(
717 new views::corewm::WindowModalityController(this));
718
719 AddPreTargetHandler(this);
720
721 env_filter_.reset(new views::corewm::CompoundEventFilter);
722 AddPreTargetHandler(env_filter_.get());
723
724 // Env creates the compositor. Historically it seems to have been implicitly
725 // initialized first by the ActivationController, but now that FocusController
726 // no longer does this we need to do it explicitly.
727 aura::Env::GetInstance();
728 views::corewm::FocusController* focus_controller =
729 new views::corewm::FocusController(new wm::AshFocusRules);
730 focus_client_.reset(focus_controller);
731 activation_client_ = focus_controller;
732 activation_client_->AddObserver(this);
733 focus_cycler_.reset(new internal::FocusCycler());
734
735 screen_position_controller_.reset(new internal::ScreenPositionController);
736 root_window_host_factory_.reset(delegate_->CreateRootWindowHostFactory());
737
738 display_controller_->Start();
739 display_controller_->InitPrimaryDisplay();
740 aura::RootWindow* root_window = display_controller_->GetPrimaryRootWindow();
741 target_root_window_ = root_window;
742
743 resolution_notification_controller_.reset(
744 new internal::ResolutionNotificationController);
745
746 cursor_manager_.SetDisplay(DisplayController::GetPrimaryDisplay());
747
748 nested_dispatcher_controller_.reset(new NestedDispatcherController);
749 accelerator_controller_.reset(new AcceleratorController);
750
751 // The order in which event filters are added is significant.
752 event_rewriter_filter_.reset(new internal::EventRewriterEventFilter);
753 AddPreTargetHandler(event_rewriter_filter_.get());
754
755 // UserActivityDetector passes events to observers, so let them get
756 // rewritten first.
757 user_activity_detector_.reset(new UserActivityDetector);
758 AddPreTargetHandler(user_activity_detector_.get());
759
760 overlay_filter_.reset(new internal::OverlayEventFilter);
761 AddPreTargetHandler(overlay_filter_.get());
762 AddShellObserver(overlay_filter_.get());
763
764 input_method_filter_.reset(new views::corewm::InputMethodEventFilter(
765 root_window->GetAcceleratedWidget()));
766 AddPreTargetHandler(input_method_filter_.get());
767
768 accelerator_filter_.reset(new internal::AcceleratorFilter);
769 AddPreTargetHandler(accelerator_filter_.get());
770
771 event_transformation_handler_.reset(new internal::EventTransformationHandler);
772 AddPreTargetHandler(event_transformation_handler_.get());
773
774 system_gesture_filter_.reset(new internal::SystemGestureEventFilter);
775 AddPreTargetHandler(system_gesture_filter_.get());
776
777 keyboard_metrics_filter_.reset(new internal::KeyboardUMAEventFilter);
778 AddPreTargetHandler(keyboard_metrics_filter_.get());
779
780 // The keyboard system must be initialized before the RootWindowController is
781 // created.
782 if (keyboard::IsKeyboardEnabled())
783 keyboard::InitializeKeyboard();
784
785 lock_state_controller_.reset(new LockStateController);
786 power_button_controller_.reset(new PowerButtonController(
787 lock_state_controller_.get()));
788 AddShellObserver(lock_state_controller_.get());
789
790 drag_drop_controller_.reset(new internal::DragDropController);
791 mouse_cursor_filter_.reset(new internal::MouseCursorEventFilter());
792 PrependPreTargetHandler(mouse_cursor_filter_.get());
793
794 // Create Controllers that may need root window.
795 // TODO(oshima): Move as many controllers before creating
796 // RootWindowController as possible.
797 visibility_controller_.reset(new AshVisibilityController);
798 user_action_client_.reset(delegate_->CreateUserActionClient());
799
800 magnification_controller_.reset(
801 MagnificationController::CreateInstance());
802 mru_window_tracker_.reset(new MruWindowTracker(activation_client_));
803
804 partial_magnification_controller_.reset(
805 new PartialMagnificationController());
806
807 high_contrast_controller_.reset(new HighContrastController);
808 video_detector_.reset(new VideoDetector);
809 window_cycle_controller_.reset(new WindowCycleController());
810 window_selector_controller_.reset(new WindowSelectorController());
811
812 tooltip_controller_.reset(new views::corewm::TooltipController(
813 gfx::SCREEN_TYPE_ALTERNATE));
814 AddPreTargetHandler(tooltip_controller_.get());
815
816 event_client_.reset(new internal::EventClientImpl);
817
818 // This controller needs to be set before SetupManagedWindowMode.
819 desktop_background_controller_.reset(new DesktopBackgroundController());
820 user_wallpaper_delegate_.reset(delegate_->CreateUserWallpaperDelegate());
821
822 // StatusAreaWidget uses Shell's CapsLockDelegate.
823 caps_lock_delegate_.reset(delegate_->CreateCapsLockDelegate());
824
825 session_state_delegate_.reset(delegate_->CreateSessionStateDelegate());
826
827 if (!command_line->HasSwitch(views::corewm::switches::kNoDropShadows)) {
828 resize_shadow_controller_.reset(new internal::ResizeShadowController());
829 shadow_controller_.reset(
830 new views::corewm::ShadowController(activation_client_));
831 }
832
833 // Create system_tray_notifier_ before the delegate.
834 system_tray_notifier_.reset(new ash::SystemTrayNotifier());
835
836 // Initialize system_tray_delegate_ before initializing StatusAreaWidget.
837 system_tray_delegate_.reset(delegate()->CreateSystemTrayDelegate());
838 DCHECK(system_tray_delegate_.get());
839
840 internal::RootWindowController* root_window_controller =
841 new internal::RootWindowController(root_window);
842 InitRootWindowController(root_window_controller,
843 delegate_->IsFirstRunAfterBoot());
844 InitKeyboard(root_window_controller);
845
846 locale_notification_controller_.reset(
847 new internal::LocaleNotificationController);
848
849 // Initialize system_tray_delegate_ after StatusAreaWidget is created.
850 system_tray_delegate_->Initialize();
851
852 display_controller_->InitSecondaryDisplays();
853
854 // Force Layout
855 root_window_controller->root_window_layout()->OnWindowResized();
856
857 // It needs to be created after OnWindowResized has been called, otherwise the
858 // widget will not paint when restoring after a browser crash. Also it needs
859 // to be created after InitSecondaryDisplays() to initialize the wallpapers in
860 // the correct size.
861 user_wallpaper_delegate_->InitializeWallpaper();
862
863 if (initially_hide_cursor_)
864 cursor_manager_.HideCursor();
865 cursor_manager_.SetCursor(ui::kCursorPointer);
866
867 if (!cursor_manager_.IsCursorVisible()) {
868 // Cursor might have been hidden by something other than chrome.
869 // Let the first mouse event show the cursor.
870 env_filter_->set_cursor_hidden_by_filter(true);
871 }
872
873 // Set accelerator controller delegates.
874 #if defined(OS_CHROMEOS)
875 accelerator_controller_->SetBrightnessControlDelegate(
876 scoped_ptr<ash::BrightnessControlDelegate>(
877 new ash::system::BrightnessControllerChromeos).Pass());
878 #endif
879
880 // The compositor thread and main message loop have to be running in
881 // order to create mirror window. Run it after the main message loop
882 // is started.
883 base::MessageLoopForUI::current()->PostTask(
884 FROM_HERE,
885 base::Bind(&internal::DisplayManager::CreateMirrorWindowIfAny,
886 base::Unretained(display_manager_.get())));
887 }
888
889 void Shell::InitKeyboard(internal::RootWindowController* root) {
890 if (keyboard::IsKeyboardEnabled()) {
891 if (keyboard_controller_.get()) {
892 RootWindowControllerList controllers = GetAllRootWindowControllers();
893 for (RootWindowControllerList::iterator iter = controllers.begin();
894 iter != controllers.end(); ++iter) {
895 (*iter)->DeactivateKeyboard(keyboard_controller_.get());
896 }
897 }
898 keyboard::KeyboardControllerProxy* proxy =
899 delegate_->CreateKeyboardControllerProxy();
900 keyboard_controller_.reset(
901 new keyboard::KeyboardController(proxy));
902 root->ActivateKeyboard(keyboard_controller_.get());
903 }
904 }
905
879 void Shell::InitRootWindowController( 906 void Shell::InitRootWindowController(
880 internal::RootWindowController* controller, 907 internal::RootWindowController* controller,
881 bool first_run_after_boot) { 908 bool first_run_after_boot) {
882 909
883 aura::RootWindow* root_window = controller->root_window(); 910 aura::RootWindow* root_window = controller->root_window();
884 DCHECK(activation_client_); 911 DCHECK(activation_client_);
885 DCHECK(visibility_controller_.get()); 912 DCHECK(visibility_controller_.get());
886 DCHECK(drag_drop_controller_.get()); 913 DCHECK(drag_drop_controller_.get());
887 DCHECK(window_cycle_controller_.get()); 914 DCHECK(window_cycle_controller_.get());
888 915
(...skipping 14 matching lines...) Expand all
903 if (nested_dispatcher_controller_) { 930 if (nested_dispatcher_controller_) {
904 aura::client::SetDispatcherClient(root_window, 931 aura::client::SetDispatcherClient(root_window,
905 nested_dispatcher_controller_.get()); 932 nested_dispatcher_controller_.get());
906 } 933 }
907 if (user_action_client_) 934 if (user_action_client_)
908 aura::client::SetUserActionClient(root_window, user_action_client_.get()); 935 aura::client::SetUserActionClient(root_window, user_action_client_.get());
909 936
910 controller->Init(first_run_after_boot); 937 controller->Init(first_run_after_boot);
911 } 938 }
912 939
913 ////////////////////////////////////////////////////////////////////////////////
914 // Shell, private:
915
916 bool Shell::CanWindowReceiveEvents(aura::Window* window) { 940 bool Shell::CanWindowReceiveEvents(aura::Window* window) {
917 RootWindowControllerList controllers = GetAllRootWindowControllers(); 941 RootWindowControllerList controllers = GetAllRootWindowControllers();
918 for (RootWindowControllerList::iterator iter = controllers.begin(); 942 for (RootWindowControllerList::iterator iter = controllers.begin();
919 iter != controllers.end(); ++iter) { 943 iter != controllers.end(); ++iter) {
920 internal::SystemModalContainerLayoutManager* layout_manager = 944 internal::SystemModalContainerLayoutManager* layout_manager =
921 (*iter)->GetSystemModalLayoutManager(window); 945 (*iter)->GetSystemModalLayoutManager(window);
922 if (layout_manager && layout_manager->CanWindowReceiveEvents(window)) 946 if (layout_manager && layout_manager->CanWindowReceiveEvents(window))
923 return true; 947 return true;
924 } 948 }
925 return false; 949 return false;
(...skipping 16 matching lines...) Expand all
942 //////////////////////////////////////////////////////////////////////////////// 966 ////////////////////////////////////////////////////////////////////////////////
943 // Shell, aura::client::ActivationChangeObserver implementation: 967 // Shell, aura::client::ActivationChangeObserver implementation:
944 968
945 void Shell::OnWindowActivated(aura::Window* gained_active, 969 void Shell::OnWindowActivated(aura::Window* gained_active,
946 aura::Window* lost_active) { 970 aura::Window* lost_active) {
947 if (gained_active) 971 if (gained_active)
948 target_root_window_ = gained_active->GetRootWindow(); 972 target_root_window_ = gained_active->GetRootWindow();
949 } 973 }
950 974
951 } // namespace ash 975 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698