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

Side by Side Diff: ui/aura/root_window.cc

Issue 11299219: Rework FocusManager as FocusClient. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years 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 | « ui/aura/root_window.h ('k') | ui/aura/root_window_unittest.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 "ui/aura/root_window.h" 5 #include "ui/aura/root_window.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/debug/trace_event.h" 12 #include "base/debug/trace_event.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/message_loop.h" 14 #include "base/message_loop.h"
15 #include "ui/aura/aura_switches.h" 15 #include "ui/aura/aura_switches.h"
16 #include "ui/aura/client/activation_client.h" 16 #include "ui/aura/client/activation_client.h"
17 #include "ui/aura/client/capture_client.h" 17 #include "ui/aura/client/capture_client.h"
18 #include "ui/aura/client/cursor_client.h" 18 #include "ui/aura/client/cursor_client.h"
19 #include "ui/aura/client/event_client.h" 19 #include "ui/aura/client/event_client.h"
20 #include "ui/aura/client/focus_client.h"
20 #include "ui/aura/client/screen_position_client.h" 21 #include "ui/aura/client/screen_position_client.h"
21 #include "ui/aura/env.h" 22 #include "ui/aura/env.h"
22 #include "ui/aura/focus_manager.h"
23 #include "ui/aura/root_window_host.h" 23 #include "ui/aura/root_window_host.h"
24 #include "ui/aura/root_window_observer.h" 24 #include "ui/aura/root_window_observer.h"
25 #include "ui/aura/window.h" 25 #include "ui/aura/window.h"
26 #include "ui/aura/window_delegate.h" 26 #include "ui/aura/window_delegate.h"
27 #include "ui/aura/window_tracker.h" 27 #include "ui/aura/window_tracker.h"
28 #include "ui/base/events/event.h" 28 #include "ui/base/events/event.h"
29 #include "ui/base/gestures/gesture_recognizer.h" 29 #include "ui/base/gestures/gesture_recognizer.h"
30 #include "ui/base/gestures/gesture_types.h" 30 #include "ui/base/gestures/gesture_types.h"
31 #include "ui/base/hit_test.h" 31 #include "ui/base/hit_test.h"
32 #include "ui/base/view_prop.h" 32 #include "ui/base/view_prop.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 ALLOW_THIS_IN_INITIALIZER_LIST(host_(CreateHost(this, params))), 96 ALLOW_THIS_IN_INITIALIZER_LIST(host_(CreateHost(this, params))),
97 ALLOW_THIS_IN_INITIALIZER_LIST(schedule_paint_factory_(this)), 97 ALLOW_THIS_IN_INITIALIZER_LIST(schedule_paint_factory_(this)),
98 ALLOW_THIS_IN_INITIALIZER_LIST(event_factory_(this)), 98 ALLOW_THIS_IN_INITIALIZER_LIST(event_factory_(this)),
99 mouse_button_flags_(0), 99 mouse_button_flags_(0),
100 touch_ids_down_(0), 100 touch_ids_down_(0),
101 last_cursor_(ui::kCursorNull), 101 last_cursor_(ui::kCursorNull),
102 mouse_pressed_handler_(NULL), 102 mouse_pressed_handler_(NULL),
103 mouse_moved_handler_(NULL), 103 mouse_moved_handler_(NULL),
104 mouse_event_dispatch_target_(NULL), 104 mouse_event_dispatch_target_(NULL),
105 event_dispatch_target_(NULL), 105 event_dispatch_target_(NULL),
106 focus_manager_(NULL),
107 ALLOW_THIS_IN_INITIALIZER_LIST( 106 ALLOW_THIS_IN_INITIALIZER_LIST(
108 gesture_recognizer_(ui::GestureRecognizer::Create(this))), 107 gesture_recognizer_(ui::GestureRecognizer::Create(this))),
109 synthesize_mouse_move_(false), 108 synthesize_mouse_move_(false),
110 waiting_on_compositing_end_(false), 109 waiting_on_compositing_end_(false),
111 draw_on_compositing_end_(false), 110 draw_on_compositing_end_(false),
112 defer_draw_scheduling_(false), 111 defer_draw_scheduling_(false),
113 mouse_move_hold_count_(0), 112 mouse_move_hold_count_(0),
114 ALLOW_THIS_IN_INITIALIZER_LIST(held_mouse_event_factory_(this)) { 113 ALLOW_THIS_IN_INITIALIZER_LIST(held_mouse_event_factory_(this)) {
115 SetName("RootWindow"); 114 SetName("RootWindow");
116 115
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 // RootWindow, overridden from aura::Window: 520 // RootWindow, overridden from aura::Window:
522 521
523 bool RootWindow::CanFocus() const { 522 bool RootWindow::CanFocus() const {
524 return IsVisible(); 523 return IsVisible();
525 } 524 }
526 525
527 bool RootWindow::CanReceiveEvents() const { 526 bool RootWindow::CanReceiveEvents() const {
528 return IsVisible(); 527 return IsVisible();
529 } 528 }
530 529
531 FocusManager* RootWindow::GetFocusManager() {
532 return focus_manager_;
533 }
534
535 //////////////////////////////////////////////////////////////////////////////// 530 ////////////////////////////////////////////////////////////////////////////////
536 // RootWindow, overridden from aura::client::CaptureDelegate: 531 // RootWindow, overridden from aura::client::CaptureDelegate:
537 532
538 void RootWindow::UpdateCapture(Window* old_capture, 533 void RootWindow::UpdateCapture(Window* old_capture,
539 Window* new_capture) { 534 Window* new_capture) {
540 if (old_capture && old_capture->GetRootWindow() == this && 535 if (old_capture && old_capture->GetRootWindow() == this &&
541 old_capture->delegate()) { 536 old_capture->delegate()) {
542 // Send a capture changed event with bogus location data. 537 // Send a capture changed event with bogus location data.
543 ui::MouseEvent event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(), 538 ui::MouseEvent event(ui::ET_MOUSE_CAPTURE_CHANGED, gfx::Point(),
544 gfx::Point(), 0); 539 gfx::Point(), 0);
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 } 680 }
686 681
687 void RootWindow::OnWindowHidden(Window* invisible, 682 void RootWindow::OnWindowHidden(Window* invisible,
688 WindowHiddenReason reason, 683 WindowHiddenReason reason,
689 RootWindow* new_root) { 684 RootWindow* new_root) {
690 // Update the focused window state if the invisible window contains 685 // Update the focused window state if the invisible window contains
691 // focused_window. See the comment below, which also applies for focus with 686 // focused_window. See the comment below, which also applies for focus with
692 // the exception for the case where the focus managers change (otherwise a 687 // the exception for the case where the focus managers change (otherwise a
693 // focus manager might dereference a deleted root window). 688 // focus manager might dereference a deleted root window).
694 if (reason != WINDOW_MOVING || 689 if (reason != WINDOW_MOVING ||
695 (new_root->GetFocusManager() != focus_manager_)) { 690 (client::GetFocusClient(new_root) != client::GetFocusClient(this))) {
696 Window* focused_window = focus_manager_->GetFocusedWindow(); 691 Window* focused_window = client::GetFocusClient(this)->GetFocusedWindow();
697 if (invisible->Contains(focused_window)) { 692 if (invisible->Contains(focused_window)) {
698 Window* focus_to = invisible->transient_parent(); 693 Window* focus_to = invisible->transient_parent();
699 if (focus_to) { 694 if (focus_to) {
700 // Has to be removed from the transient parent before focusing, 695 // Has to be removed from the transient parent before focusing,
701 // otherwise |window| will be focused again. 696 // otherwise |window| will be focused again.
702 if (reason == WINDOW_DESTROYED) 697 if (reason == WINDOW_DESTROYED)
703 focus_to->RemoveTransientChild(invisible); 698 focus_to->RemoveTransientChild(invisible);
704 } else { 699 } else {
705 // If the invisible view has no visible transient window, focus to the 700 // If the invisible view has no visible transient window, focus to the
706 // topmost visible parent window. 701 // topmost visible parent window.
707 focus_to = invisible->parent(); 702 focus_to = invisible->parent();
708 } 703 }
709 if (focus_to && 704 if (focus_to &&
710 (!focus_to->IsVisible() || 705 (!focus_to->IsVisible() ||
711 !focus_to->CanFocus() || 706 !focus_to->CanFocus() ||
712 (client::GetActivationClient(this) && 707 (client::GetActivationClient(this) &&
713 !client::GetActivationClient(this)->OnWillFocusWindow(focus_to, 708 !client::GetActivationClient(this)->OnWillFocusWindow(focus_to,
714 NULL)))) { 709 NULL)))) {
715 focus_to = NULL; 710 focus_to = NULL;
716 } 711 }
717 GetFocusManager()->SetFocusedWindow(focus_to, NULL); 712 client::GetFocusClient(this)->FocusWindow(focus_to, NULL);
718 } 713 }
719 } 714 }
720 715
721 // Do not clear the capture, and the dispatch targets if the window is moving 716 // Do not clear the capture, and the dispatch targets if the window is moving
722 // across root windows, because the target itself is actually still visible 717 // across root windows, because the target itself is actually still visible
723 // and clearing them stops further event processing, which can cause 718 // and clearing them stops further event processing, which can cause
724 // unexpected behaviors. See crbug.com/157583 719 // unexpected behaviors. See crbug.com/157583
725 if (reason != WINDOW_MOVING) { 720 if (reason != WINDOW_MOVING) {
726 Window* capture_window = aura::client::GetCaptureWindow(this); 721 Window* capture_window = aura::client::GetCaptureWindow(this);
727 // If the ancestor of the capture window is hidden, 722 // If the ancestor of the capture window is hidden,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 } 781 }
787 782
788 //////////////////////////////////////////////////////////////////////////////// 783 ////////////////////////////////////////////////////////////////////////////////
789 // RootWindow, RootWindowHostDelegate implementation: 784 // RootWindow, RootWindowHostDelegate implementation:
790 785
791 bool RootWindow::OnHostKeyEvent(ui::KeyEvent* event) { 786 bool RootWindow::OnHostKeyEvent(ui::KeyEvent* event) {
792 DispatchHeldMouseMove(); 787 DispatchHeldMouseMove();
793 if (event->key_code() == ui::VKEY_UNKNOWN) 788 if (event->key_code() == ui::VKEY_UNKNOWN)
794 return false; 789 return false;
795 client::EventClient* client = client::GetEventClient(GetRootWindow()); 790 client::EventClient* client = client::GetEventClient(GetRootWindow());
796 Window* focused_window = focus_manager_->GetFocusedWindow(); 791 Window* focused_window = client::GetFocusClient(this)->GetFocusedWindow();
797 if (client && !client->CanProcessEventsWithinSubtree(focused_window)) { 792 if (client && !client->CanProcessEventsWithinSubtree(focused_window)) {
798 GetFocusManager()->SetFocusedWindow(NULL, NULL); 793 client::GetFocusClient(this)->FocusWindow(NULL, NULL);
799 return false; 794 return false;
800 } 795 }
801 return ProcessKeyEvent(focused_window, event); 796 return ProcessKeyEvent(focused_window, event);
802 } 797 }
803 798
804 bool RootWindow::OnHostMouseEvent(ui::MouseEvent* event) { 799 bool RootWindow::OnHostMouseEvent(ui::MouseEvent* event) {
805 if (event->type() == ui::ET_MOUSE_DRAGGED || 800 if (event->type() == ui::ET_MOUSE_DRAGGED ||
806 (event->flags() & ui::EF_IS_SYNTHESIZED)) { 801 (event->flags() & ui::EF_IS_SYNTHESIZED)) {
807 if (mouse_move_hold_count_) { 802 if (mouse_move_hold_count_) {
808 Window* null_window = static_cast<Window*>(NULL); 803 Window* null_window = static_cast<Window*>(NULL);
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 ui::MouseEvent event(ui::ET_MOUSE_MOVED, 1040 ui::MouseEvent event(ui::ET_MOUSE_MOVED,
1046 orig_mouse_location, 1041 orig_mouse_location,
1047 orig_mouse_location, 1042 orig_mouse_location,
1048 ui::EF_IS_SYNTHESIZED); 1043 ui::EF_IS_SYNTHESIZED);
1049 event.set_system_location(Env::GetInstance()->last_mouse_location()); 1044 event.set_system_location(Env::GetInstance()->last_mouse_location());
1050 OnHostMouseEvent(&event); 1045 OnHostMouseEvent(&event);
1051 #endif 1046 #endif
1052 } 1047 }
1053 1048
1054 } // namespace aura 1049 } // namespace aura
OLDNEW
« no previous file with comments | « ui/aura/root_window.h ('k') | ui/aura/root_window_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698