OLD | NEW |
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" |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 | 654 |
655 bool RootWindow::ProcessKeyEvent(Window* target, ui::KeyEvent* event) { | 655 bool RootWindow::ProcessKeyEvent(Window* target, ui::KeyEvent* event) { |
656 if (!target) | 656 if (!target) |
657 target = this; | 657 target = this; |
658 AutoReset<Window*> reset(&event_dispatch_target_, target); | 658 AutoReset<Window*> reset(&event_dispatch_target_, target); |
659 if (ProcessEvent(target, event) != ui::ER_UNHANDLED) | 659 if (ProcessEvent(target, event) != ui::ER_UNHANDLED) |
660 return true; | 660 return true; |
661 return false; | 661 return false; |
662 } | 662 } |
663 | 663 |
664 ui::TouchStatus RootWindow::ProcessTouchEvent(Window* target, | 664 ui::EventResult RootWindow::ProcessTouchEvent(Window* target, |
665 ui::TouchEvent* event) { | 665 ui::TouchEvent* event) { |
666 if (ProcessEvent(NULL, event) != ui::ER_UNHANDLED) | 666 if (!target) |
667 return ui::TOUCH_STATUS_CONTINUE; | 667 target = this; |
668 | 668 AutoReset<Window*> reset(&event_dispatch_target_, target); |
669 if (!target->IsVisible()) | 669 return static_cast<ui::EventResult>(ProcessEvent(target, event)); |
670 return ui::TOUCH_STATUS_UNKNOWN; | |
671 | |
672 ui::Event::DispatcherApi dispatch_helper(event); | |
673 dispatch_helper.set_target(target); | |
674 | |
675 // It is necessary to dispatch the event to the event-handlers on env first. | |
676 // TODO(sad): Fix touch-event handling so it can use the same | |
677 // event-dispatching code used for other events. | |
678 ui::EventTarget::DispatcherApi dispatch_target_helper(Env::GetInstance()); | |
679 const ui::EventHandlerList& pre_target = | |
680 dispatch_target_helper.pre_target_list(); | |
681 for (ui::EventHandlerList::const_iterator iter = pre_target.begin(); | |
682 iter != pre_target.end(); ++iter) { | |
683 ui::TouchStatus status = (*iter)->OnTouchEvent(event); | |
684 if (status != ui::TOUCH_STATUS_UNKNOWN) | |
685 return status; | |
686 } | |
687 | |
688 EventFilters filters; | |
689 if (target == this) | |
690 GetEventFiltersToNotify(target, &filters); | |
691 else | |
692 GetEventFiltersToNotify(target->parent(), &filters); | |
693 | |
694 // |target| can be deleted by any of the handlers below. | |
695 WindowTracker tracker; | |
696 tracker.Add(target); | |
697 | |
698 for (EventFilters::const_reverse_iterator it = filters.rbegin(), | |
699 rend = filters.rend(); | |
700 it != rend; ++it) { | |
701 ui::TouchStatus status = (*it)->PreHandleTouchEvent(target, event); | |
702 if (status != ui::TOUCH_STATUS_UNKNOWN) | |
703 return status; | |
704 } | |
705 | |
706 if (tracker.Contains(target) && target->delegate()) { | |
707 ui::TouchStatus status = target->delegate()->OnTouchEvent(event); | |
708 if (status != ui::TOUCH_STATUS_UNKNOWN) | |
709 return status; | |
710 } | |
711 | |
712 return ui::TOUCH_STATUS_UNKNOWN; | |
713 } | 670 } |
714 | 671 |
715 ui::EventResult RootWindow::ProcessGestureEvent(Window* target, | 672 ui::EventResult RootWindow::ProcessGestureEvent(Window* target, |
716 ui::GestureEvent* event) { | 673 ui::GestureEvent* event) { |
717 if (!target) | 674 if (!target) |
718 target = this; | 675 target = this; |
719 AutoReset<Window*> reset(&event_dispatch_target_, target); | 676 AutoReset<Window*> reset(&event_dispatch_target_, target); |
720 return static_cast<ui::EventResult>(ProcessEvent(target, event)); | 677 return static_cast<ui::EventResult>(ProcessEvent(target, event)); |
721 } | 678 } |
722 | 679 |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 break; | 867 break; |
911 | 868 |
912 default: | 869 default: |
913 break; | 870 break; |
914 } | 871 } |
915 float scale = ui::GetDeviceScaleFactor(layer()); | 872 float scale = ui::GetDeviceScaleFactor(layer()); |
916 ui::Transform transform = layer()->transform(); | 873 ui::Transform transform = layer()->transform(); |
917 transform.ConcatScale(scale, scale); | 874 transform.ConcatScale(scale, scale); |
918 event->UpdateForRootTransform(transform); | 875 event->UpdateForRootTransform(transform); |
919 bool handled = false; | 876 bool handled = false; |
920 ui::TouchStatus status = ui::TOUCH_STATUS_UNKNOWN; | 877 ui::EventResult result = ui::ER_UNHANDLED; |
921 Window* target = client::GetCaptureWindow(this); | 878 Window* target = client::GetCaptureWindow(this); |
922 if (!target) { | 879 if (!target) { |
923 target = ConsumerToWindow( | 880 target = ConsumerToWindow( |
924 gesture_recognizer_->GetTouchLockedTarget(event)); | 881 gesture_recognizer_->GetTouchLockedTarget(event)); |
925 if (!target) { | 882 if (!target) { |
926 target = ConsumerToWindow( | 883 target = ConsumerToWindow( |
927 gesture_recognizer_->GetTargetForLocation(event->location())); | 884 gesture_recognizer_->GetTargetForLocation(event->location())); |
928 } | 885 } |
929 } | 886 } |
930 | 887 |
931 if (!target && !bounds().Contains(event->location())) { | 888 if (!target && !bounds().Contains(event->location())) { |
932 // If the initial touch is outside the root window, target the root. | 889 // If the initial touch is outside the root window, target the root. |
933 target = this; | 890 target = this; |
934 status = ProcessTouchEvent(target, event); | 891 result = ProcessTouchEvent(target, event); |
935 CHECK_EQ(ui::TOUCH_STATUS_UNKNOWN, status); | 892 CHECK_EQ(ui::ER_UNHANDLED, result); |
936 } else { | 893 } else { |
937 // We only come here when the first contact was within the root window. | 894 // We only come here when the first contact was within the root window. |
938 if (!target) { | 895 if (!target) { |
939 target = GetEventHandlerForPoint(event->location()); | 896 target = GetEventHandlerForPoint(event->location()); |
940 if (!target) | 897 if (!target) |
941 return false; | 898 return false; |
942 } | 899 } |
943 | 900 |
944 ui::TouchEvent translated_event( | 901 ui::TouchEvent translated_event( |
945 *event, static_cast<Window*>(this), target); | 902 *event, static_cast<Window*>(this), target); |
946 status = ProcessTouchEvent(target, &translated_event); | 903 result = ProcessTouchEvent(target, &translated_event); |
947 handled = status != ui::TOUCH_STATUS_UNKNOWN; | 904 handled = result != ui::ER_UNHANDLED; |
948 | 905 |
949 if (status == ui::TOUCH_STATUS_QUEUED || | 906 if (result & ui::ER_ASYNC) { |
950 status == ui::TOUCH_STATUS_QUEUED_END) { | |
951 gesture_recognizer_->QueueTouchEventForGesture(target, *event); | 907 gesture_recognizer_->QueueTouchEventForGesture(target, *event); |
952 return true; | 908 return true; |
953 } | 909 } |
954 } | 910 } |
955 | 911 |
956 // Get the list of GestureEvents from GestureRecognizer. | 912 // Get the list of GestureEvents from GestureRecognizer. |
957 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; | 913 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; |
958 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( | 914 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( |
959 *event, status, target)); | 915 *event, result, target)); |
960 | 916 |
961 return ProcessGestures(gestures.get()) ? true : handled; | 917 return ProcessGestures(gestures.get()) ? true : handled; |
962 } | 918 } |
963 | 919 |
964 void RootWindow::OnHostLostCapture() { | 920 void RootWindow::OnHostLostCapture() { |
965 Window* capture_window = client::GetCaptureWindow(this); | 921 Window* capture_window = client::GetCaptureWindow(this); |
966 if (capture_window && capture_window->GetRootWindow() == this) | 922 if (capture_window && capture_window->GetRootWindow() == this) |
967 capture_window->ReleaseCapture(); | 923 capture_window->ReleaseCapture(); |
968 } | 924 } |
969 | 925 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 void RootWindow::UnlockCompositor() { | 1058 void RootWindow::UnlockCompositor() { |
1103 DCHECK(compositor_lock_); | 1059 DCHECK(compositor_lock_); |
1104 compositor_lock_ = NULL; | 1060 compositor_lock_ = NULL; |
1105 if (draw_on_compositor_unlock_) { | 1061 if (draw_on_compositor_unlock_) { |
1106 draw_on_compositor_unlock_ = false; | 1062 draw_on_compositor_unlock_ = false; |
1107 ScheduleDraw(); | 1063 ScheduleDraw(); |
1108 } | 1064 } |
1109 } | 1065 } |
1110 | 1066 |
1111 } // namespace aura | 1067 } // namespace aura |
OLD | NEW |