Index: ash/wm/maximize_mode/maximize_mode_event_blocker.cc |
diff --git a/ash/wm/maximize_mode/maximize_mode_event_blocker.cc b/ash/wm/maximize_mode/maximize_mode_event_blocker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e283149b6fe66755d368efea094e209f45419b0c |
--- /dev/null |
+++ b/ash/wm/maximize_mode/maximize_mode_event_blocker.cc |
@@ -0,0 +1,100 @@ |
+// Copyright 2014 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 "ash/wm/maximize_mode/maximize_mode_event_blocker.h" |
+ |
+#include "ash/shell.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "ui/aura/client/cursor_client.h" |
+#include "ui/events/event_targeter.h" |
+ |
+namespace ash { |
+ |
+namespace { |
+ |
+// Event targeter to prevent delivery of mouse and touchpad events while |
+// maximize mode is active. Other events such as touch are passed on to the |
+// default targeter. |
+// TODO(flackr): This should only stop events from the internal keyboard and |
+// touchpad. |
+class BlockKeyboardAndTouchpadTargeter : public ui::EventTargeter { |
+ public: |
+ BlockKeyboardAndTouchpadTargeter(); |
+ virtual ~BlockKeyboardAndTouchpadTargeter(); |
+ |
+ // Sets the default targeter to use when the event is not being blocked. |
+ void SetDefaultTargeter(EventTargeter* default_targeter); |
+ |
+ // Overridden from ui::EventTargeter: |
+ virtual ui::EventTarget* FindTargetForEvent(ui::EventTarget* root, |
+ ui::Event* event) OVERRIDE; |
+ |
+ private: |
+ // A weak pointer to the targeter this targeter is wrapping. The |
+ // default_targeter is owned by the ScopedWindowTargeter which will be valid |
+ // as long as this targeter is alive. |
+ ui::EventTargeter* default_targeter_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BlockKeyboardAndTouchpadTargeter); |
+}; |
+ |
+BlockKeyboardAndTouchpadTargeter::BlockKeyboardAndTouchpadTargeter() |
+ : default_targeter_(NULL) { |
+} |
+ |
+BlockKeyboardAndTouchpadTargeter::~BlockKeyboardAndTouchpadTargeter() { |
+} |
+ |
+void BlockKeyboardAndTouchpadTargeter::SetDefaultTargeter( |
+ ui::EventTargeter* default_targeter) { |
+ default_targeter_ = default_targeter; |
+} |
+ |
+ui::EventTarget* BlockKeyboardAndTouchpadTargeter::FindTargetForEvent( |
+ ui::EventTarget* root, |
+ ui::Event* event) { |
+ if (event->HasNativeEvent() && (event->IsMouseEvent() || event->IsKeyEvent())) |
+ return NULL; |
+ return default_targeter_->FindTargetForEvent(root, event); |
+} |
+ |
+} // namespace |
+ |
+MaximizeModeEventBlocker::MaximizeModeEventBlocker() { |
+ Shell::GetInstance()->AddShellObserver(this); |
+ |
+ // Hide the cursor as mouse events will be blocked. |
+ aura::client::CursorClient* cursor_client_ = |
+ aura::client::GetCursorClient(Shell::GetTargetRootWindow()); |
+ if (cursor_client_) |
+ cursor_client_->HideCursor(); |
+ |
+ // Block keyboard and mouse events on all existing and new root windows for |
+ // the lifetime of this class. |
+ aura::Window::Windows root_windows(Shell::GetAllRootWindows()); |
+ for (aura::Window::Windows::iterator iter = root_windows.begin(); |
+ iter != root_windows.end(); ++iter) { |
+ AddEventTargeterOn(*iter); |
+ } |
+} |
+ |
+MaximizeModeEventBlocker::~MaximizeModeEventBlocker() { |
+ Shell::GetInstance()->RemoveShellObserver(this); |
+} |
+ |
+void MaximizeModeEventBlocker::OnRootWindowAdded(aura::Window* root_window) { |
+ AddEventTargeterOn(root_window); |
+} |
+ |
+void MaximizeModeEventBlocker::AddEventTargeterOn( |
+ aura::Window* root_window) { |
+ BlockKeyboardAndTouchpadTargeter* targeter = |
+ new BlockKeyboardAndTouchpadTargeter(); |
+ aura::ScopedWindowTargeter* scoped_targeter = new aura::ScopedWindowTargeter( |
+ root_window, scoped_ptr<ui::EventTargeter>(targeter)); |
+ targeter->SetDefaultTargeter(scoped_targeter->old_targeter()); |
+ targeters_.push_back(scoped_targeter); |
+} |
+ |
+} // namespace ash |