diff options
-rw-r--r-- | ash/shell.cc | 10 | ||||
-rw-r--r-- | ash/shell.h | 2 | ||||
-rw-r--r-- | ui/aura/env.cc | 10 | ||||
-rw-r--r-- | ui/aura/env.h | 2 | ||||
-rw-r--r-- | ui/aura/window.cc | 19 | ||||
-rw-r--r-- | ui/aura/window.h | 10 | ||||
-rw-r--r-- | ui/events/event_dispatcher_unittest.cc | 11 | ||||
-rw-r--r-- | ui/events/event_target.cc | 4 | ||||
-rw-r--r-- | ui/events/event_target.h | 25 | ||||
-rw-r--r-- | ui/events/event_target_iterator.h | 48 | ||||
-rw-r--r-- | ui/events/event_targeter.cc | 30 | ||||
-rw-r--r-- | ui/events/event_targeter.h | 45 | ||||
-rw-r--r-- | ui/events/events.gyp | 3 | ||||
-rw-r--r-- | ui/views/view.cc | 10 | ||||
-rw-r--r-- | ui/views/view.h | 2 |
15 files changed, 226 insertions, 5 deletions
diff --git a/ash/shell.cc b/ash/shell.cc index d5428cf..6fb3df9 100644 --- a/ash/shell.cc +++ b/ash/shell.cc @@ -91,6 +91,7 @@ #include "ui/base/ui_base_switches.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_animator.h" +#include "ui/events/event_target_iterator.h" #include "ui/gfx/display.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/screen.h" @@ -996,6 +997,15 @@ ui::EventTarget* Shell::GetParentTarget() { return aura::Env::GetInstance(); } +scoped_ptr<ui::EventTargetIterator> Shell::GetChildIterator() const { + return scoped_ptr<ui::EventTargetIterator>(); +} + +ui::EventTargeter* Shell::GetEventTargeter() { + NOTREACHED(); + return NULL; +} + void Shell::OnEvent(ui::Event* event) { } diff --git a/ash/shell.h b/ash/shell.h index 1c4e779..864bc86 100644 --- a/ash/shell.h +++ b/ash/shell.h @@ -559,6 +559,8 @@ class ASH_EXPORT Shell // Overridden from ui::EventTarget: virtual bool CanAcceptEvent(const ui::Event& event) OVERRIDE; virtual EventTarget* GetParentTarget() OVERRIDE; + virtual scoped_ptr<ui::EventTargetIterator> GetChildIterator() const OVERRIDE; + virtual ui::EventTargeter* GetEventTargeter() OVERRIDE; virtual void OnEvent(ui::Event* event) OVERRIDE; // Overridden from aura::client::ActivationChangeObserver: diff --git a/ui/aura/env.cc b/ui/aura/env.cc index 0314480..0982d91 100644 --- a/ui/aura/env.cc +++ b/ui/aura/env.cc @@ -10,6 +10,7 @@ #include "ui/aura/window.h" #include "ui/compositor/compositor.h" #include "ui/compositor/compositor_switches.h" +#include "ui/events/event_target_iterator.h" #if defined(USE_X11) #include "base/message_loop/message_pump_x11.h" @@ -128,4 +129,13 @@ ui::EventTarget* Env::GetParentTarget() { return NULL; } +scoped_ptr<ui::EventTargetIterator> Env::GetChildIterator() const { + return scoped_ptr<ui::EventTargetIterator>(); +} + +ui::EventTargeter* Env::GetEventTargeter() { + NOTREACHED(); + return NULL; +} + } // namespace aura diff --git a/ui/aura/env.h b/ui/aura/env.h index 4968d39..e326781 100644 --- a/ui/aura/env.h +++ b/ui/aura/env.h @@ -92,6 +92,8 @@ class AURA_EXPORT Env : public ui::EventTarget { // Overridden from ui::EventTarget: virtual bool CanAcceptEvent(const ui::Event& event) OVERRIDE; virtual ui::EventTarget* GetParentTarget() OVERRIDE; + virtual scoped_ptr<ui::EventTargetIterator> GetChildIterator() const OVERRIDE; + virtual ui::EventTargeter* GetEventTargeter() OVERRIDE; ObserverList<EnvObserver> observers_; #if !defined(OS_MACOSX) && !defined(OS_ANDROID) && !defined(USE_X11) diff --git a/ui/aura/window.cc b/ui/aura/window.cc index 1cd6a3e..ff36ef0 100644 --- a/ui/aura/window.cc +++ b/ui/aura/window.cc @@ -28,6 +28,7 @@ #include "ui/aura/window_tree_host.h" #include "ui/compositor/compositor.h" #include "ui/compositor/layer.h" +#include "ui/events/event_target_iterator.h" #include "ui/gfx/animation/multi_animation.h" #include "ui/gfx/canvas.h" #include "ui/gfx/path.h" @@ -827,9 +828,8 @@ Window* Window::GetWindowForPoint(const gfx::Point& local_point, if (client && !client->CanProcessEventsWithinSubtree(child)) continue; if (delegate_ && !delegate_->ShouldDescendIntoChildForEventHandling( - child, local_point)) { + child, local_point)) continue; - } } gfx::Point point_in_child_coords(local_point); @@ -1199,6 +1199,21 @@ ui::EventTarget* Window::GetParentTarget() { return parent_; } +scoped_ptr<ui::EventTargetIterator> Window::GetChildIterator() const { + return scoped_ptr<ui::EventTargetIterator>( + new ui::EventTargetIteratorImpl<Window>(children())); +} + +ui::EventTargeter* Window::GetEventTargeter() { + return targeter_.get(); +} + +void Window::ConvertEventToTarget(ui::EventTarget* target, + ui::LocatedEvent* event) { + event->ConvertLocationToTarget(this, + static_cast<Window*>(target)); +} + void Window::UpdateLayerName(const std::string& name) { #if !defined(NDEBUG) DCHECK(layer()); diff --git a/ui/aura/window.h b/ui/aura/window.h index ea38461..4b1b523 100644 --- a/ui/aura/window.h +++ b/ui/aura/window.h @@ -23,6 +23,7 @@ #include "ui/compositor/layer_type.h" #include "ui/events/event_constants.h" #include "ui/events/event_target.h" +#include "ui/events/event_targeter.h" #include "ui/events/gestures/gesture_types.h" #include "ui/gfx/insets.h" #include "ui/gfx/native_widget_types.h" @@ -155,6 +156,10 @@ class AURA_EXPORT Window : public ui::LayerDelegate, void SetLayoutManager(LayoutManager* layout_manager); LayoutManager* layout_manager() { return layout_manager_.get(); } + void set_event_targeter(scoped_ptr<ui::EventTargeter> targeter) { + targeter_ = targeter.Pass(); + } + // Changes the bounds of the window. If present, the window's parent's // LayoutManager may adjust the bounds. void SetBounds(const gfx::Rect& new_bounds); @@ -481,6 +486,10 @@ class AURA_EXPORT Window : public ui::LayerDelegate, // Overridden from ui::EventTarget: virtual bool CanAcceptEvent(const ui::Event& event) OVERRIDE; virtual EventTarget* GetParentTarget() OVERRIDE; + virtual scoped_ptr<ui::EventTargetIterator> GetChildIterator() const OVERRIDE; + virtual ui::EventTargeter* GetEventTargeter() OVERRIDE; + virtual void ConvertEventToTarget(ui::EventTarget* target, + ui::LocatedEvent* event) OVERRIDE; // Updates the layer name with a name based on the window's name and id. void UpdateLayerName(const std::string& name); @@ -524,6 +533,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate, scoped_ptr<ui::EventHandler> event_filter_; scoped_ptr<LayoutManager> layout_manager_; + scoped_ptr<ui::EventTargeter> targeter_; void* user_data_; diff --git a/ui/events/event_dispatcher_unittest.cc b/ui/events/event_dispatcher_unittest.cc index 6aae01a..30bbd0d 100644 --- a/ui/events/event_dispatcher_unittest.cc +++ b/ui/events/event_dispatcher_unittest.cc @@ -6,6 +6,9 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/events/event.h" +#include "ui/events/event_dispatcher.h" +#include "ui/events/event_target.h" +#include "ui/events/event_target_iterator.h" #include "ui/events/event_utils.h" namespace ui { @@ -43,6 +46,14 @@ class TestTarget : public EventTarget { return parent_; } + virtual scoped_ptr<EventTargetIterator> GetChildIterator() const OVERRIDE { + return scoped_ptr<EventTargetIterator>(); + } + + virtual EventTargeter* GetEventTargeter() OVERRIDE { + return NULL; + } + TestTarget* parent_; std::vector<int> handler_list_; bool valid_; diff --git a/ui/events/event_target.cc b/ui/events/event_target.cc index 56b7a16..9b44f9a 100644 --- a/ui/events/event_target.cc +++ b/ui/events/event_target.cc @@ -18,6 +18,10 @@ EventTarget::EventTarget() EventTarget::~EventTarget() { } +void EventTarget::ConvertEventToTarget(EventTarget* target, + LocatedEvent* event) { +} + void EventTarget::AddPreTargetHandler(EventHandler* handler) { pre_target_list_.push_back(handler); } diff --git a/ui/events/event_target.h b/ui/events/event_target.h index 936a86d..fd03667 100644 --- a/ui/events/event_target.h +++ b/ui/events/event_target.h @@ -5,19 +5,23 @@ #ifndef UI_EVENTS_EVENT_TARGET_H_ #define UI_EVENTS_EVENT_TARGET_H_ +#include <vector> + #include "base/basictypes.h" #include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" #include "ui/events/event_handler.h" #include "ui/events/events_export.h" namespace ui { class EventDispatcher; +class EventTargeter; +class EventTargetIterator; +class LocatedEvent; class EVENTS_EXPORT EventTarget : public EventHandler { public: - typedef std::vector<EventTarget*> EventTargets; - class DispatcherApi { public: explicit DispatcherApi(EventTarget* target) : target_(target) {} @@ -36,9 +40,24 @@ class EVENTS_EXPORT EventTarget : public EventHandler { EventTarget(); virtual ~EventTarget(); - virtual bool CanAcceptEvent(const ui::Event& event) = 0; + virtual bool CanAcceptEvent(const Event& event) = 0; + + // Returns the parent EventTarget in the event-target tree. virtual EventTarget* GetParentTarget() = 0; + // Returns an iterator an EventTargeter can use to iterate over the list of + // child EventTargets. + virtual scoped_ptr<EventTargetIterator> GetChildIterator() const = 0; + + // Returns the EventTargeter that should be used to find the target for an + // event in the subtree rooted at this EventTarget. + virtual EventTargeter* GetEventTargeter() = 0; + + // Updates the states in |event| (e.g. location) to be suitable for |target|, + // so that |event| can be dispatched to |target|. + virtual void ConvertEventToTarget(EventTarget* target, + LocatedEvent* event); + // Adds a handler to receive events before the target. The handler must be // explicitly removed from the target before the handler is destroyed. The // EventTarget does not take ownership of the handler. diff --git a/ui/events/event_target_iterator.h b/ui/events/event_target_iterator.h new file mode 100644 index 0000000..3083c83 --- /dev/null +++ b/ui/events/event_target_iterator.h @@ -0,0 +1,48 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_EVENTS_EVENT_TARGET_ITERATOR_H_ +#define UI_EVENTS_EVENT_TARGET_ITERATOR_H_ + +#include <vector> + +namespace ui { + +class EventTarget; + +// An interface that allows iterating over a set of EventTargets. +class EventTargetIterator { + public: + virtual ~EventTargetIterator() {} + virtual EventTarget* GetNextTarget() = 0; +}; + +// Provides an EventTargetIterator implementation for iterating over a list of +// EventTargets. The list is iterated in the reverse order, since typically the +// EventTargets are maintained in increasing z-order in the lists. +template<typename T> +class EventTargetIteratorImpl : public EventTargetIterator { + public: + explicit EventTargetIteratorImpl(const std::vector<T*>& children) + : begin_(children.rbegin()), + end_(children.rend()) { + } + virtual ~EventTargetIteratorImpl() {} + + virtual EventTarget* GetNextTarget() OVERRIDE { + if (begin_ == end_) + return NULL; + EventTarget* target = *(begin_); + ++begin_; + return target; + } + + private: + typename std::vector<T*>::const_reverse_iterator begin_; + typename std::vector<T*>::const_reverse_iterator end_; +}; + +} // namespace ui + +#endif // UI_EVENTS_EVENT_TARGET_ITERATOR_H_ diff --git a/ui/events/event_targeter.cc b/ui/events/event_targeter.cc new file mode 100644 index 0000000..f7e263f --- /dev/null +++ b/ui/events/event_targeter.cc @@ -0,0 +1,30 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/events/event_targeter.h" + +#include "ui/events/event.h" +#include "ui/events/event_target.h" + +namespace ui { + +EventTargeter::~EventTargeter() { +} + +EventTarget* EventTargeter::FindTargetForEvent(EventTarget* root, + Event* event) { + return NULL; +} + +EventTarget* EventTargeter::FindTargetForLocatedEvent(EventTarget* root, + LocatedEvent* event) { + return NULL; +} + +bool EventTargeter::SubtreeShouldBeExploredForEvent(EventTarget* target, + const LocatedEvent& event) { + return true; +} + +} // namespace ui diff --git a/ui/events/event_targeter.h b/ui/events/event_targeter.h new file mode 100644 index 0000000..a28662b5 --- /dev/null +++ b/ui/events/event_targeter.h @@ -0,0 +1,45 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_EVENTS_EVENT_TARGETER_H_ +#define UI_EVENTS_EVENT_TARGETER_H_ + +#include "base/compiler_specific.h" +#include "ui/events/event.h" +#include "ui/events/events_export.h" + +namespace ui { + +class Event; +class EventTarget; +class LocatedEvent; + +class EVENTS_EXPORT EventTargeter { + public: + virtual ~EventTargeter(); + + // Returns the target |event| should be dispatched to. If there is no such + // target, this should return NULL. + virtual EventTarget* FindTargetForEvent(EventTarget* root, + Event* event); + + // Same as FindTargetForEvent(), but used for positional events. The location + // etc. of |event| are in |root|'s coordinate system. When finding the target + // for the event, the targeter can mutate the |event| (e.g. chnage the + // coordinate to be in the returned target's coordinate sustem) so that it can + // be dispatched to the target without any farther modification. + virtual EventTarget* FindTargetForLocatedEvent(EventTarget* root, + LocatedEvent* event); + + protected: + // Returns true of |target| or one of its descendants can be a target of + // |event|. Note that the location etc. of |event| is in |target|'s parent's + // coordinate system. + virtual bool SubtreeShouldBeExploredForEvent(EventTarget* target, + const LocatedEvent& event); +}; + +} // namespace ui + +#endif // UI_EVENTS_EVENT_TARGETER_H_ diff --git a/ui/events/events.gyp b/ui/events/events.gyp index 8bc717d..46c2c26 100644 --- a/ui/events/events.gyp +++ b/ui/events/events.gyp @@ -87,6 +87,9 @@ 'event_handler.h', 'event_target.cc', 'event_target.h', + 'event_target_iterator.h', + 'event_targeter.cc', + 'event_targeter.h', 'event_utils.cc', 'event_utils.h', 'events_export.h', diff --git a/ui/views/view.cc b/ui/views/view.cc index 7157509..becd1bc1 100644 --- a/ui/views/view.cc +++ b/ui/views/view.cc @@ -22,6 +22,7 @@ #include "ui/compositor/compositor.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_animator.h" +#include "ui/events/event_target_iterator.h" #include "ui/gfx/canvas.h" #include "ui/gfx/interpolated_transform.h" #include "ui/gfx/path.h" @@ -1118,6 +1119,15 @@ ui::EventTarget* View::GetParentTarget() { return parent_; } +scoped_ptr<ui::EventTargetIterator> View::GetChildIterator() const { + return scoped_ptr<ui::EventTargetIterator>( + new ui::EventTargetIteratorImpl<View>(children_)); +} + +ui::EventTargeter* View::GetEventTargeter() { + return NULL; +} + // Accelerators ---------------------------------------------------------------- void View::AddAccelerator(const ui::Accelerator& accelerator) { diff --git a/ui/views/view.h b/ui/views/view.h index ef60e84..9f956d5 100644 --- a/ui/views/view.h +++ b/ui/views/view.h @@ -722,6 +722,8 @@ class VIEWS_EXPORT View : public ui::LayerDelegate, // Overridden from ui::EventTarget: virtual bool CanAcceptEvent(const ui::Event& event) OVERRIDE; virtual ui::EventTarget* GetParentTarget() OVERRIDE; + virtual scoped_ptr<ui::EventTargetIterator> GetChildIterator() const OVERRIDE; + virtual ui::EventTargeter* GetEventTargeter() OVERRIDE; // Overridden from ui::EventHandler: virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; |