Index: ash/wm/workspace/frame_maximize_button.cc |
diff --git a/ash/wm/workspace/frame_maximize_button.cc b/ash/wm/workspace/frame_maximize_button.cc |
index 4c3e614cf18356511002f575c42ad5722877ce35..b2e249990f3d0315ec30afb4f499ff505e276fac 100644 |
--- a/ash/wm/workspace/frame_maximize_button.cc |
+++ b/ash/wm/workspace/frame_maximize_button.cc |
@@ -10,6 +10,8 @@ |
#include "ash/wm/workspace/phantom_window_controller.h" |
#include "ash/wm/workspace/workspace_window_resizer.h" |
#include "grit/ui_resources.h" |
+#include "ui/aura/event.h" |
+#include "ui/aura/event_filter.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/image/image.h" |
#include "ui/gfx/screen.h" |
@@ -17,6 +19,72 @@ |
namespace ash { |
+// EscapeEventFilter is installed on the RootWindow to track when the escape key |
+// is pressed. We use an EventFilter for this as the FrameMaximizeButton |
+// normally does not get focus. |
+class FrameMaximizeButton::EscapeEventFilter : public aura::EventFilter { |
+ public: |
+ explicit EscapeEventFilter(FrameMaximizeButton* button); |
+ virtual ~EscapeEventFilter(); |
+ |
+ // EventFilter overrides: |
+ virtual bool PreHandleKeyEvent(aura::Window* target, |
+ aura::KeyEvent* event) OVERRIDE; |
+ virtual bool PreHandleMouseEvent(aura::Window* target, |
+ aura::MouseEvent* event) OVERRIDE; |
+ virtual ui::TouchStatus PreHandleTouchEvent( |
+ aura::Window* target, |
+ aura::TouchEvent* event) OVERRIDE; |
+ virtual ui::GestureStatus PreHandleGestureEvent( |
+ aura::Window* target, |
+ aura::GestureEvent* event) OVERRIDE; |
+ |
+ private: |
+ FrameMaximizeButton* button_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(EscapeEventFilter); |
+}; |
+ |
+FrameMaximizeButton::EscapeEventFilter::EscapeEventFilter( |
+ FrameMaximizeButton* button) |
+ : button_(button) { |
+ Shell::GetInstance()->AddRootWindowEventFilter(this); |
+} |
+ |
+FrameMaximizeButton::EscapeEventFilter::~EscapeEventFilter() { |
+ Shell::GetInstance()->RemoveRootWindowEventFilter(this); |
+} |
+ |
+bool FrameMaximizeButton::EscapeEventFilter::PreHandleKeyEvent( |
+ aura::Window* target, |
+ aura::KeyEvent* event) { |
+ if (event->type() == ui::ET_KEY_PRESSED && |
+ event->key_code() == ui::VKEY_ESCAPE) { |
+ button_->Cancel(); |
+ } |
+ return false; |
+} |
+ |
+bool FrameMaximizeButton::EscapeEventFilter::PreHandleMouseEvent( |
+ aura::Window* target, |
+ aura::MouseEvent* event) { |
+ return false; |
+} |
+ |
+ui::TouchStatus FrameMaximizeButton::EscapeEventFilter::PreHandleTouchEvent( |
+ aura::Window* target, |
+ aura::TouchEvent* event) { |
+ return ui::TOUCH_STATUS_UNKNOWN; |
+} |
+ |
+ui::GestureStatus FrameMaximizeButton::EscapeEventFilter::PreHandleGestureEvent( |
+ aura::Window* target, |
+ aura::GestureEvent* event) { |
+ return ui::GESTURE_STATUS_UNKNOWN; |
+} |
+ |
+// FrameMaximizeButton --------------------------------------------------------- |
+ |
FrameMaximizeButton::FrameMaximizeButton(views::ButtonListener* listener) |
: ImageButton(listener), |
is_snap_enabled_(false), |
@@ -32,6 +100,7 @@ FrameMaximizeButton::~FrameMaximizeButton() { |
bool FrameMaximizeButton::OnMousePressed(const views::MouseEvent& event) { |
is_snap_enabled_ = event.IsLeftMouseButton(); |
if (is_snap_enabled_) { |
+ InstallEventFilter(); |
snap_type_ = SNAP_NONE; |
press_location_ = event.location(); |
exceeded_drag_threshold_ = false; |
@@ -63,6 +132,7 @@ bool FrameMaximizeButton::OnMouseDragged(const views::MouseEvent& event) { |
} |
void FrameMaximizeButton::OnMouseReleased(const views::MouseEvent& event) { |
+ UninstallEventFilter(); |
bool should_snap = is_snap_enabled_; |
is_snap_enabled_ = false; |
if (should_snap && snap_type_ != SNAP_NONE) { |
@@ -75,9 +145,7 @@ void FrameMaximizeButton::OnMouseReleased(const views::MouseEvent& event) { |
} |
void FrameMaximizeButton::OnMouseCaptureLost() { |
- is_snap_enabled_ = false; |
- phantom_window_.reset(); |
- SchedulePaint(); |
+ Cancel(); |
ImageButton::OnMouseCaptureLost(); |
} |
@@ -126,6 +194,24 @@ SkBitmap FrameMaximizeButton::GetImageToPaint() { |
return ImageButton::GetImageToPaint(); |
} |
+void FrameMaximizeButton::Cancel() { |
+ UninstallEventFilter(); |
+ is_snap_enabled_ = false; |
+ phantom_window_.reset(); |
+ SchedulePaint(); |
+} |
+ |
+void FrameMaximizeButton::InstallEventFilter() { |
+ if (escape_event_filter_.get()) |
+ return; |
+ |
+ escape_event_filter_.reset(new EscapeEventFilter(this)); |
+} |
+ |
+void FrameMaximizeButton::UninstallEventFilter() { |
+ escape_event_filter_.reset(NULL); |
+} |
+ |
void FrameMaximizeButton::UpdateSnap(int delta_x, int delta_y) { |
SnapType type = SnapTypeForDelta(delta_x, delta_y); |
if (type == snap_type_) |