Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3716)

Unified Diff: ash/wm/maximize_mode/maximize_mode_event_blocker.cc

Issue 230613004: Block keyboard and mouse input when maximize mode is activated by accelerometer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use event targeter to block keyboard and mouse events. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698