summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ash/shell.cc10
-rw-r--r--ash/shell.h2
-rw-r--r--ui/aura/env.cc10
-rw-r--r--ui/aura/env.h2
-rw-r--r--ui/aura/window.cc19
-rw-r--r--ui/aura/window.h10
-rw-r--r--ui/events/event_dispatcher_unittest.cc11
-rw-r--r--ui/events/event_target.cc4
-rw-r--r--ui/events/event_target.h25
-rw-r--r--ui/events/event_target_iterator.h48
-rw-r--r--ui/events/event_targeter.cc30
-rw-r--r--ui/events/event_targeter.h45
-rw-r--r--ui/events/events.gyp3
-rw-r--r--ui/views/view.cc10
-rw-r--r--ui/views/view.h2
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;