diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-14 21:54:01 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-14 21:54:01 +0000 |
commit | 255a9a2e1ba2d4c3ac46140dac9c7beb4d811568 (patch) | |
tree | 786a410aa25a6bf169f5f73b9488e124b066d6f9 /views | |
parent | d349a4ee13d849372eeaeaa62613667d7d854a13 (diff) | |
download | chromium_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.cc | 42 | ||||
-rw-r--r-- | views/widget/widget.h | 14 |
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_; |