Chromium Code Reviews| Index: ash/wm/maximize_mode/maximize_mode_controller.cc |
| diff --git a/ash/wm/maximize_mode/maximize_mode_controller.cc b/ash/wm/maximize_mode/maximize_mode_controller.cc |
| index 7fec42064d7b923798fb3c180d1ccd67484ed159..f61e167c0d1f9ff6c70fd3f10d573d8b7fe26068 100644 |
| --- a/ash/wm/maximize_mode/maximize_mode_controller.cc |
| +++ b/ash/wm/maximize_mode/maximize_mode_controller.cc |
| @@ -7,6 +7,8 @@ |
| #include "ash/accelerometer/accelerometer_controller.h" |
| #include "ash/display/display_manager.h" |
| #include "ash/shell.h" |
| +#include "ui/aura/client/cursor_client.h" |
| +#include "ui/events/event_handler.h" |
| #include "ui/gfx/vector3d_f.h" |
| namespace ash { |
| @@ -68,6 +70,46 @@ float ClockwiseAngleBetweenVectorsInDegrees(const gfx::Vector3dF& base, |
| return angle; |
| } |
| +// Filter to prevent delivery of mouse and touch events while maximize mode is |
| +// active. |
| +// TODO(flackr): This should only stop events from the internal keyboard and |
| +// touchpad. |
| +class BlockKeyboardAndTouchpadFilter : public ui::EventHandler { |
| + public: |
| + BlockKeyboardAndTouchpadFilter(); |
| + virtual ~BlockKeyboardAndTouchpadFilter(); |
| + |
| + // Overridden from ui::EventHandler: |
| + virtual void OnKeyEvent(ui::KeyEvent* event) OVERRIDE; |
| + virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE; |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BlockKeyboardAndTouchpadFilter); |
| +}; |
| + |
| +BlockKeyboardAndTouchpadFilter::BlockKeyboardAndTouchpadFilter() { |
| + // This needs to be the first handler to block events. |
| + Shell::GetInstance()->PrependPreTargetHandler(this); |
|
sadrul
2014/04/09 16:54:18
Can you install a WindowTargeter on the root-windo
flackr
2014/04/09 17:11:49
It looks like event targeters are per window / roo
sadrul
2014/04/09 17:33:30
There isn't a global event targeter. If a new root
flackr
2014/04/10 02:30:02
Just wanted to be sure I wasn't just missing somet
|
| + aura::client::CursorClient* cursor_client_ = |
| + aura::client::GetCursorClient(Shell::GetTargetRootWindow()); |
| + if (cursor_client_) |
| + cursor_client_->HideCursor(); |
| +} |
| + |
| +BlockKeyboardAndTouchpadFilter::~BlockKeyboardAndTouchpadFilter() { |
| + Shell::GetInstance()->RemovePreTargetHandler(this); |
| +} |
| + |
| +void BlockKeyboardAndTouchpadFilter::OnKeyEvent(ui::KeyEvent* event) { |
| + if (event->HasNativeEvent()) |
| + event->StopPropagation(); |
| +} |
| + |
| +void BlockKeyboardAndTouchpadFilter::OnMouseEvent(ui::MouseEvent* event) { |
| + if (event->HasNativeEvent()) |
| + event->StopPropagation(); |
| +} |
| + |
| } // namespace |
| MaximizeModeController::MaximizeModeController() { |
| @@ -113,9 +155,11 @@ void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base, |
| angle > kFullyOpenAngleErrorTolerance && |
| angle < kExitMaximizeModeAngle) { |
| Shell::GetInstance()->EnableMaximizeModeWindowManager(false); |
| + event_handler_.reset(); |
| } else if (!maximize_mode_engaged && |
| angle > kEnterMaximizeModeAngle) { |
| Shell::GetInstance()->EnableMaximizeModeWindowManager(true); |
| + event_handler_.reset(new BlockKeyboardAndTouchpadFilter); |
| } |
| } |