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

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: Add a TODO 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
« no previous file with comments | « ash/shell.h ('k') | chrome/browser/extensions/api/input/input.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
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
661 keyboard_controller_.reset();
662
663 #if defined(OS_CHROMEOS) && defined(USE_X11)
664 if (display_change_observer_)
665 output_configurator_->RemoveObserver(display_change_observer_.get());
666 if (output_configurator_animation_)
667 output_configurator_->RemoveObserver(output_configurator_animation_.get());
668 if (display_error_observer_)
669 output_configurator_->RemoveObserver(display_error_observer_.get());
670 base::MessagePumpX11::Current()->RemoveDispatcherForRootWindow(
671 output_configurator());
672 base::MessagePumpX11::Current()->RemoveObserver(output_configurator());
673 display_change_observer_.reset();
674 #endif // defined(OS_CHROMEOS)
675
676 #if defined(OS_CHROMEOS)
677 internal::PowerStatus::Shutdown();
678 #endif
679
680 DCHECK(instance_ == this);
681 instance_ = NULL;
682 }
683
684 void Shell::Init() {
685 CommandLine* command_line = CommandLine::ForCurrentProcess();
686
687 delegate_->PreInit();
688 bool display_initialized = false;
689 #if defined(OS_CHROMEOS) && defined(USE_X11)
690 output_configurator_animation_.reset(
691 new internal::OutputConfiguratorAnimation());
692 output_configurator_->AddObserver(output_configurator_animation_.get());
693 if (base::SysInfo::IsRunningOnChromeOS()) {
694 display_change_observer_.reset(new internal::DisplayChangeObserver);
695 // Register |display_change_observer_| first so that the rest of
696 // observer gets invoked after the root windows are configured.
697 output_configurator_->AddObserver(display_change_observer_.get());
698 display_error_observer_.reset(new internal::DisplayErrorObserver());
699 output_configurator_->AddObserver(display_error_observer_.get());
700 output_configurator_->set_state_controller(display_change_observer_.get());
701 if (!command_line->HasSwitch(ash::switches::kAshDisableSoftwareMirroring))
702 output_configurator_->set_mirroring_controller(display_manager_.get());
703 output_configurator_->Start(
704 delegate_->IsFirstRunAfterBoot() ? kChromeOsBootColor : 0);
705 display_initialized = true;
706 }
707 #endif // defined(OS_CHROMEOS) && defined(USE_X11)
708 if (!display_initialized)
709 display_manager_->InitFromCommandLine();
710
711 // Install the custom factory first so that views::FocusManagers for Tray,
712 // Launcher, and WallPaper could be created by the factory.
713 views::FocusManagerFactory::Install(new AshFocusManagerFactory);
714
715 // The WindowModalityController needs to be at the front of the input event
716 // pretarget handler list to ensure that it processes input events when modal
717 // windows are active.
718 window_modality_controller_.reset(
719 new views::corewm::WindowModalityController(this));
720
721 AddPreTargetHandler(this);
722
723 env_filter_.reset(new views::corewm::CompoundEventFilter);
724 AddPreTargetHandler(env_filter_.get());
725
726 // Env creates the compositor. Historically it seems to have been implicitly
727 // initialized first by the ActivationController, but now that FocusController
728 // no longer does this we need to do it explicitly.
729 aura::Env::GetInstance();
730 views::corewm::FocusController* focus_controller =
731 new views::corewm::FocusController(new wm::AshFocusRules);
732 focus_client_.reset(focus_controller);
733 activation_client_ = focus_controller;
734 activation_client_->AddObserver(this);
735 focus_cycler_.reset(new internal::FocusCycler());
736
737 screen_position_controller_.reset(new internal::ScreenPositionController);
738 root_window_host_factory_.reset(delegate_->CreateRootWindowHostFactory());
739
740 display_controller_->Start();
741 display_controller_->InitPrimaryDisplay();
742 aura::RootWindow* root_window = display_controller_->GetPrimaryRootWindow();
743 target_root_window_ = root_window;
744
745 resolution_notification_controller_.reset(
746 new internal::ResolutionNotificationController);
747
748 cursor_manager_.SetDisplay(DisplayController::GetPrimaryDisplay());
749
750 nested_dispatcher_controller_.reset(new NestedDispatcherController);
751 accelerator_controller_.reset(new AcceleratorController);
752
753 // The order in which event filters are added is significant.
754 event_rewriter_filter_.reset(new internal::EventRewriterEventFilter);
755 AddPreTargetHandler(event_rewriter_filter_.get());
756
757 // UserActivityDetector passes events to observers, so let them get
758 // rewritten first.
759 user_activity_detector_.reset(new UserActivityDetector);
760 AddPreTargetHandler(user_activity_detector_.get());
761
762 overlay_filter_.reset(new internal::OverlayEventFilter);
763 AddPreTargetHandler(overlay_filter_.get());
764 AddShellObserver(overlay_filter_.get());
765
766 input_method_filter_.reset(new views::corewm::InputMethodEventFilter(
767 root_window->GetAcceleratedWidget()));
768 AddPreTargetHandler(input_method_filter_.get());
769
770 accelerator_filter_.reset(new internal::AcceleratorFilter);
771 AddPreTargetHandler(accelerator_filter_.get());
772
773 event_transformation_handler_.reset(new internal::EventTransformationHandler);
774 AddPreTargetHandler(event_transformation_handler_.get());
775
776 system_gesture_filter_.reset(new internal::SystemGestureEventFilter);
777 AddPreTargetHandler(system_gesture_filter_.get());
778
779 keyboard_metrics_filter_.reset(new internal::KeyboardUMAEventFilter);
780 AddPreTargetHandler(keyboard_metrics_filter_.get());
781
782 // The keyboard system must be initialized before the RootWindowController is
783 // created.
784 if (keyboard::IsKeyboardEnabled())
785 keyboard::InitializeKeyboard();
786
787 lock_state_controller_.reset(new LockStateController);
788 power_button_controller_.reset(new PowerButtonController(
789 lock_state_controller_.get()));
790 AddShellObserver(lock_state_controller_.get());
791
792 drag_drop_controller_.reset(new internal::DragDropController);
793 mouse_cursor_filter_.reset(new internal::MouseCursorEventFilter());
794 PrependPreTargetHandler(mouse_cursor_filter_.get());
795
796 // Create Controllers that may need root window.
797 // TODO(oshima): Move as many controllers before creating
798 // RootWindowController as possible.
799 visibility_controller_.reset(new AshVisibilityController);
800 user_action_client_.reset(delegate_->CreateUserActionClient());
801
802 magnification_controller_.reset(
803 MagnificationController::CreateInstance());
804 mru_window_tracker_.reset(new MruWindowTracker(activation_client_));
805
806 partial_magnification_controller_.reset(
807 new PartialMagnificationController());
808
809 high_contrast_controller_.reset(new HighContrastController);
810 video_detector_.reset(new VideoDetector);
811 window_cycle_controller_.reset(new WindowCycleController());
812 window_selector_controller_.reset(new WindowSelectorController());
813
814 tooltip_controller_.reset(new views::corewm::TooltipController(
815 gfx::SCREEN_TYPE_ALTERNATE));
816 AddPreTargetHandler(tooltip_controller_.get());
817
818 event_client_.reset(new internal::EventClientImpl);
819
820 // This controller needs to be set before SetupManagedWindowMode.
821 desktop_background_controller_.reset(new DesktopBackgroundController());
822 user_wallpaper_delegate_.reset(delegate_->CreateUserWallpaperDelegate());
823
824 // StatusAreaWidget uses Shell's CapsLockDelegate.
825 caps_lock_delegate_.reset(delegate_->CreateCapsLockDelegate());
826
827 session_state_delegate_.reset(delegate_->CreateSessionStateDelegate());
828
829 if (!command_line->HasSwitch(views::corewm::switches::kNoDropShadows)) {
830 resize_shadow_controller_.reset(new internal::ResizeShadowController());
831 shadow_controller_.reset(
832 new views::corewm::ShadowController(activation_client_));
833 }
834
835 // Create system_tray_notifier_ before the delegate.
836 system_tray_notifier_.reset(new ash::SystemTrayNotifier());
837
838 // Initialize system_tray_delegate_ before initializing StatusAreaWidget.
839 system_tray_delegate_.reset(delegate()->CreateSystemTrayDelegate());
840 DCHECK(system_tray_delegate_.get());
841
842 internal::RootWindowController* root_window_controller =
843 new internal::RootWindowController(root_window);
844 InitRootWindowController(root_window_controller,
845 delegate_->IsFirstRunAfterBoot());
846 InitKeyboard(root_window_controller);
847
848 locale_notification_controller_.reset(
849 new internal::LocaleNotificationController);
850
851 // Initialize system_tray_delegate_ after StatusAreaWidget is created.
852 system_tray_delegate_->Initialize();
853
854 display_controller_->InitSecondaryDisplays();
855
856 // Force Layout
857 root_window_controller->root_window_layout()->OnWindowResized();
858
859 // It needs to be created after OnWindowResized has been called, otherwise the
860 // widget will not paint when restoring after a browser crash. Also it needs
861 // to be created after InitSecondaryDisplays() to initialize the wallpapers in
862 // the correct size.
863 user_wallpaper_delegate_->InitializeWallpaper();
864
865 if (initially_hide_cursor_)
866 cursor_manager_.HideCursor();
867 cursor_manager_.SetCursor(ui::kCursorPointer);
868
869 if (!cursor_manager_.IsCursorVisible()) {
870 // Cursor might have been hidden by something other than chrome.
871 // Let the first mouse event show the cursor.
872 env_filter_->set_cursor_hidden_by_filter(true);
873 }
874
875 // Set accelerator controller delegates.
876 #if defined(OS_CHROMEOS)
877 accelerator_controller_->SetBrightnessControlDelegate(
878 scoped_ptr<ash::BrightnessControlDelegate>(
879 new ash::system::BrightnessControllerChromeos).Pass());
880 #endif
881
882 // The compositor thread and main message loop have to be running in
883 // order to create mirror window. Run it after the main message loop
884 // is started.
885 base::MessageLoopForUI::current()->PostTask(
886 FROM_HERE,
887 base::Bind(&internal::DisplayManager::CreateMirrorWindowIfAny,
888 base::Unretained(display_manager_.get())));
889 }
890
891 void Shell::InitKeyboard(internal::RootWindowController* root) {
892 if (keyboard::IsKeyboardEnabled()) {
893 if (keyboard_controller_.get()) {
894 RootWindowControllerList controllers = GetAllRootWindowControllers();
895 for (RootWindowControllerList::iterator iter = controllers.begin();
896 iter != controllers.end(); ++iter) {
897 (*iter)->DeactivateKeyboard(keyboard_controller_.get());
898 }
899 }
900 keyboard::KeyboardControllerProxy* proxy =
901 delegate_->CreateKeyboardControllerProxy();
902 keyboard_controller_.reset(
903 new keyboard::KeyboardController(proxy));
904 root->ActivateKeyboard(keyboard_controller_.get());
905 }
906 }
907
879 void Shell::InitRootWindowController( 908 void Shell::InitRootWindowController(
880 internal::RootWindowController* controller, 909 internal::RootWindowController* controller,
881 bool first_run_after_boot) { 910 bool first_run_after_boot) {
882 911
883 aura::RootWindow* root_window = controller->root_window(); 912 aura::RootWindow* root_window = controller->root_window();
884 DCHECK(activation_client_); 913 DCHECK(activation_client_);
885 DCHECK(visibility_controller_.get()); 914 DCHECK(visibility_controller_.get());
886 DCHECK(drag_drop_controller_.get()); 915 DCHECK(drag_drop_controller_.get());
887 DCHECK(window_cycle_controller_.get()); 916 DCHECK(window_cycle_controller_.get());
888 917
(...skipping 14 matching lines...) Expand all
903 if (nested_dispatcher_controller_) { 932 if (nested_dispatcher_controller_) {
904 aura::client::SetDispatcherClient(root_window, 933 aura::client::SetDispatcherClient(root_window,
905 nested_dispatcher_controller_.get()); 934 nested_dispatcher_controller_.get());
906 } 935 }
907 if (user_action_client_) 936 if (user_action_client_)
908 aura::client::SetUserActionClient(root_window, user_action_client_.get()); 937 aura::client::SetUserActionClient(root_window, user_action_client_.get());
909 938
910 controller->Init(first_run_after_boot); 939 controller->Init(first_run_after_boot);
911 } 940 }
912 941
913 ////////////////////////////////////////////////////////////////////////////////
914 // Shell, private:
915
916 bool Shell::CanWindowReceiveEvents(aura::Window* window) { 942 bool Shell::CanWindowReceiveEvents(aura::Window* window) {
917 RootWindowControllerList controllers = GetAllRootWindowControllers(); 943 RootWindowControllerList controllers = GetAllRootWindowControllers();
918 for (RootWindowControllerList::iterator iter = controllers.begin(); 944 for (RootWindowControllerList::iterator iter = controllers.begin();
919 iter != controllers.end(); ++iter) { 945 iter != controllers.end(); ++iter) {
920 internal::SystemModalContainerLayoutManager* layout_manager = 946 internal::SystemModalContainerLayoutManager* layout_manager =
921 (*iter)->GetSystemModalLayoutManager(window); 947 (*iter)->GetSystemModalLayoutManager(window);
922 if (layout_manager && layout_manager->CanWindowReceiveEvents(window)) 948 if (layout_manager && layout_manager->CanWindowReceiveEvents(window))
923 return true; 949 return true;
924 } 950 }
925 return false; 951 return false;
(...skipping 16 matching lines...) Expand all
942 //////////////////////////////////////////////////////////////////////////////// 968 ////////////////////////////////////////////////////////////////////////////////
943 // Shell, aura::client::ActivationChangeObserver implementation: 969 // Shell, aura::client::ActivationChangeObserver implementation:
944 970
945 void Shell::OnWindowActivated(aura::Window* gained_active, 971 void Shell::OnWindowActivated(aura::Window* gained_active,
946 aura::Window* lost_active) { 972 aura::Window* lost_active) {
947 if (gained_active) 973 if (gained_active)
948 target_root_window_ = gained_active->GetRootWindow(); 974 target_root_window_ = gained_active->GetRootWindow();
949 } 975 }
950 976
951 } // namespace ash 977 } // namespace ash
OLDNEW
« no previous file with comments | « ash/shell.h ('k') | chrome/browser/extensions/api/input/input.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698