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

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

Issue 10964051: events: Clean up dispatching code for touch-events. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 3 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 "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
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 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 break; 873 break;
917 874
918 default: 875 default:
919 break; 876 break;
920 } 877 }
921 float scale = ui::GetDeviceScaleFactor(layer()); 878 float scale = ui::GetDeviceScaleFactor(layer());
922 ui::Transform transform = layer()->transform(); 879 ui::Transform transform = layer()->transform();
923 transform.ConcatScale(scale, scale); 880 transform.ConcatScale(scale, scale);
924 event->UpdateForRootTransform(transform); 881 event->UpdateForRootTransform(transform);
925 bool handled = false; 882 bool handled = false;
926 ui::TouchStatus status = ui::TOUCH_STATUS_UNKNOWN; 883 ui::EventResult result = ui::ER_UNHANDLED;
927 Window* target = client::GetCaptureWindow(this); 884 Window* target = client::GetCaptureWindow(this);
928 if (!target) { 885 if (!target) {
929 target = ConsumerToWindow( 886 target = ConsumerToWindow(
930 gesture_recognizer_->GetTouchLockedTarget(event)); 887 gesture_recognizer_->GetTouchLockedTarget(event));
931 if (!target) { 888 if (!target) {
932 target = ConsumerToWindow( 889 target = ConsumerToWindow(
933 gesture_recognizer_->GetTargetForLocation(event->location())); 890 gesture_recognizer_->GetTargetForLocation(event->location()));
934 } 891 }
935 } 892 }
936 893
937 if (!target && !bounds().Contains(event->location())) { 894 if (!target && !bounds().Contains(event->location())) {
938 // If the initial touch is outside the root window, target the root. 895 // If the initial touch is outside the root window, target the root.
939 target = this; 896 target = this;
940 status = ProcessTouchEvent(target, event); 897 result = ProcessTouchEvent(target, event);
941 CHECK_EQ(ui::TOUCH_STATUS_UNKNOWN, status); 898 CHECK_EQ(ui::ER_UNHANDLED, result);
942 } else { 899 } else {
943 // We only come here when the first contact was within the root window. 900 // We only come here when the first contact was within the root window.
944 if (!target) { 901 if (!target) {
945 target = GetEventHandlerForPoint(event->location()); 902 target = GetEventHandlerForPoint(event->location());
946 if (!target) 903 if (!target)
947 return false; 904 return false;
948 } 905 }
949 906
950 ui::TouchEvent translated_event( 907 ui::TouchEvent translated_event(
951 *event, static_cast<Window*>(this), target); 908 *event, static_cast<Window*>(this), target);
952 status = ProcessTouchEvent(target, &translated_event); 909 result = ProcessTouchEvent(target, &translated_event);
953 handled = status != ui::TOUCH_STATUS_UNKNOWN; 910 handled = result != ui::ER_UNHANDLED;
954 911
955 if (status == ui::TOUCH_STATUS_QUEUED || 912 if (result & ui::ER_ASYNC) {
956 status == ui::TOUCH_STATUS_QUEUED_END) {
957 gesture_recognizer_->QueueTouchEventForGesture(target, *event); 913 gesture_recognizer_->QueueTouchEventForGesture(target, *event);
958 return true; 914 return true;
959 } 915 }
960 } 916 }
961 917
962 // Get the list of GestureEvents from GestureRecognizer. 918 // Get the list of GestureEvents from GestureRecognizer.
963 scoped_ptr<ui::GestureRecognizer::Gestures> gestures; 919 scoped_ptr<ui::GestureRecognizer::Gestures> gestures;
964 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture( 920 gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(
965 *event, status, target)); 921 *event, result, target));
966 922
967 return ProcessGestures(gestures.get()) ? true : handled; 923 return ProcessGestures(gestures.get()) ? true : handled;
968 } 924 }
969 925
970 void RootWindow::OnHostLostCapture() { 926 void RootWindow::OnHostLostCapture() {
971 Window* capture_window = client::GetCaptureWindow(this); 927 Window* capture_window = client::GetCaptureWindow(this);
972 if (capture_window && capture_window->GetRootWindow() == this) 928 if (capture_window && capture_window->GetRootWindow() == this)
973 capture_window->ReleaseCapture(); 929 capture_window->ReleaseCapture();
974 } 930 }
975 931
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 void RootWindow::UnlockCompositor() { 1064 void RootWindow::UnlockCompositor() {
1109 DCHECK(compositor_lock_); 1065 DCHECK(compositor_lock_);
1110 compositor_lock_ = NULL; 1066 compositor_lock_ = NULL;
1111 if (draw_on_compositor_unlock_) { 1067 if (draw_on_compositor_unlock_) {
1112 draw_on_compositor_unlock_ = false; 1068 draw_on_compositor_unlock_ = false;
1113 ScheduleDraw(); 1069 ScheduleDraw();
1114 } 1070 }
1115 } 1071 }
1116 1072
1117 } // namespace aura 1073 } // namespace aura
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698