summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-14 21:54:01 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-14 21:54:01 +0000
commit255a9a2e1ba2d4c3ac46140dac9c7beb4d811568 (patch)
tree786a410aa25a6bf169f5f73b9488e124b066d6f9 /views
parentd349a4ee13d849372eeaeaa62613667d7d854a13 (diff)
downloadchromium_src-255a9a2e1ba2d4c3ac46140dac9c7beb4d811568.zip
chromium_src-255a9a2e1ba2d4c3ac46140dac9c7beb4d811568.tar.gz
chromium_src-255a9a2e1ba2d4c3ac46140dac9c7beb4d811568.tar.bz2
Widget::GetCurrentEvent() to get hold of the current input event being processed.
BUG=none TEST=none Review URL: http://codereview.chromium.org/7144001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89074 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r--views/widget/widget.cc42
-rw-r--r--views/widget/widget.h14
2 files changed, 55 insertions, 1 deletions
diff --git a/views/widget/widget.cc b/views/widget/widget.cc
index f282823..ec971f6 100644
--- a/views/widget/widget.cc
+++ b/views/widget/widget.cc
@@ -26,6 +26,36 @@ namespace {
bool use_pure_views = false;
}
+// This class is used to keep track of the event a Widget is processing, and
+// restore any previously active event afterwards.
+class ScopedEvent {
+ public:
+ ScopedEvent(Widget* widget, const Event& event)
+ : widget_(widget),
+ event_(&event) {
+ widget->event_stack_.push(this);
+ }
+
+ ~ScopedEvent() {
+ if (widget_)
+ widget_->event_stack_.pop();
+ }
+
+ void reset() {
+ widget_ = NULL;
+ }
+
+ const Event* event() {
+ return event_;
+ }
+
+ private:
+ Widget* widget_;
+ const Event* event_;
+
+ DISALLOW_COPY_AND_ASSIGN(ScopedEvent);
+};
+
// A default implementation of WidgetDelegate, used by Widget when no
// WidgetDelegate is supplied.
class DefaultWidgetDelegate : public WidgetDelegate {
@@ -96,6 +126,7 @@ Widget::Widget()
widget_delegate_(NULL),
non_client_view_(NULL),
dragged_view_(NULL),
+ event_stack_(),
ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET),
is_secondary_widget_(true),
frame_type_(FRAME_TYPE_DEFAULT),
@@ -106,6 +137,11 @@ Widget::Widget()
}
Widget::~Widget() {
+ while (!event_stack_.empty()) {
+ event_stack_.top()->reset();
+ event_stack_.pop();
+ }
+
DestroyRootView();
if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET)
@@ -573,6 +609,10 @@ void Widget::NotifyAccessibilityEvent(
native_widget_->SendNativeAccessibilityEvent(view, event_type);
}
+const Event* Widget::GetCurrentEvent() {
+ return event_stack_.empty() ? NULL : event_stack_.top()->event();
+}
+
////////////////////////////////////////////////////////////////////////////////
// Widget, NativeWidgetDelegate implementation:
@@ -686,10 +726,12 @@ int Widget::GetNonClientComponent(const gfx::Point& point) {
}
bool Widget::OnKeyEvent(const KeyEvent& event) {
+ ScopedEvent scoped(this, event);
return static_cast<internal::RootView*>(GetRootView())->OnKeyEvent(event);
}
bool Widget::OnMouseEvent(const MouseEvent& event) {
+ ScopedEvent scoped(this, event);
switch (event.type()) {
case ui::ET_MOUSE_PRESSED:
last_mouse_event_was_move_ = false;
diff --git a/views/widget/widget.h b/views/widget/widget.h
index 42866f6..437ca35 100644
--- a/views/widget/widget.h
+++ b/views/widget/widget.h
@@ -6,7 +6,7 @@
#define VIEWS_WIDGET_WIDGET_H_
#pragma once
-#include <vector>
+#include <stack>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
@@ -52,6 +52,7 @@ class DefaultThemeProvider;
class InputMethod;
class NativeWidget;
class NonClientFrameView;
+class ScopedEvent;
class TooltipManager;
class View;
class WidgetDelegate;
@@ -461,6 +462,12 @@ class Widget : public internal::NativeWidgetDelegate,
const NativeWidget* native_widget() const { return native_widget_; }
NativeWidget* native_widget() { return native_widget_; }
+ // Returns the current event being processed. If there are multiple events
+ // being processed at the same time (e.g. one event triggers another event),
+ // then the most recent event is returned. Returns NULL if no event is being
+ // processed.
+ const Event* GetCurrentEvent();
+
// Overridden from NativeWidgetDelegate:
virtual bool IsModal() const OVERRIDE;
virtual bool IsDialogBox() const OVERRIDE;
@@ -525,6 +532,8 @@ class Widget : public internal::NativeWidgetDelegate,
gfx::Point last_mouse_event_position_;
private:
+ friend class ScopedEvent;
+
// Try to create a compositor if one hasn't been created yet.
void EnsureCompositor();
@@ -568,6 +577,9 @@ class Widget : public internal::NativeWidgetDelegate,
// started from.
View* dragged_view_;
+ // The event stack.
+ std::stack<ScopedEvent*> event_stack_;
+
// The compositor for accelerated drawing.
scoped_refptr<ui::Compositor> compositor_;