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

Side by Side Diff: ash/wm/maximize_mode/maximize_mode_event_blocker.cc

Issue 269633005: Only block internal touchpad and allow external mice to continue working in maximize mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 6 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ash/wm/maximize_mode/maximize_mode_event_blocker.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ash/wm/maximize_mode/maximize_mode_event_blocker.h" 5 #include "ash/wm/maximize_mode/maximize_mode_event_blocker.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/wm/maximize_mode/internal_input_device_list.h"
8 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
9 #include "ui/aura/client/cursor_client.h" 10 #include "ui/aura/client/cursor_client.h"
11 #include "ui/aura/window_event_dispatcher.h"
12 #include "ui/aura/window_tree_host.h"
10 #include "ui/events/event_targeter.h" 13 #include "ui/events/event_targeter.h"
11 #include "ui/events/keycodes/keyboard_codes.h" 14 #include "ui/events/keycodes/keyboard_codes.h"
15 #include "ui/gfx/point.h"
16
17 #if defined(USE_X11)
18 #include "ash/wm/maximize_mode/internal_input_device_list_x11.h"
19 #endif
12 20
13 namespace ash { 21 namespace ash {
14 22
15 namespace { 23 namespace {
16 24
17 // Event targeter to prevent delivery of mouse and touchpad events while 25 // Event targeter to prevent delivery of mouse and touchpad events while
18 // maximize mode is active. Other events such as touch are passed on to the 26 // maximize mode is active. Other events such as touch are passed on to the
19 // default targeter. 27 // default targeter.
20 // TODO(flackr): This should only stop events from the internal keyboard and
21 // touchpad.
22 class BlockKeyboardAndTouchpadTargeter : public ui::EventTargeter { 28 class BlockKeyboardAndTouchpadTargeter : public ui::EventTargeter {
23 public: 29 public:
24 BlockKeyboardAndTouchpadTargeter(); 30 BlockKeyboardAndTouchpadTargeter(
31 aura::Window* root_window,
32 MaximizeModeEventBlocker* event_blocker);
25 virtual ~BlockKeyboardAndTouchpadTargeter(); 33 virtual ~BlockKeyboardAndTouchpadTargeter();
26 34
27 // Sets the default targeter to use when the event is not being blocked. 35 // Sets the default targeter to use when the event is not being blocked.
28 void SetDefaultTargeter(EventTargeter* default_targeter); 36 void SetDefaultTargeter(EventTargeter* default_targeter);
29 37
30 // Overridden from ui::EventTargeter: 38 // Overridden from ui::EventTargeter:
31 virtual ui::EventTarget* FindTargetForEvent(ui::EventTarget* root, 39 virtual ui::EventTarget* FindTargetForEvent(ui::EventTarget* root,
32 ui::Event* event) OVERRIDE; 40 ui::Event* event) OVERRIDE;
33 41
34 private: 42 private:
43 // A weak pointer to the root window on which this targeter will be set. The
44 // root window owns this targeter.
45 aura::Window* root_window_;
46
47 // A weak pointer to the event blocker which owns the scoped targeter owning
48 // this targeter.
49 MaximizeModeEventBlocker* event_blocker_;
50
35 // A weak pointer to the targeter this targeter is wrapping. The 51 // A weak pointer to the targeter this targeter is wrapping. The
36 // default_targeter is owned by the ScopedWindowTargeter which will be valid 52 // default_targeter is owned by the ScopedWindowTargeter which will be valid
37 // as long as this targeter is alive. 53 // as long as this targeter is alive.
38 ui::EventTargeter* default_targeter_; 54 ui::EventTargeter* default_targeter_;
39 55
56 // The last known mouse location to lock the cursor in place to when events
57 // come from the internal touchpad.
58 gfx::Point last_mouse_location_;
59
40 DISALLOW_COPY_AND_ASSIGN(BlockKeyboardAndTouchpadTargeter); 60 DISALLOW_COPY_AND_ASSIGN(BlockKeyboardAndTouchpadTargeter);
41 }; 61 };
42 62
43 BlockKeyboardAndTouchpadTargeter::BlockKeyboardAndTouchpadTargeter() 63 BlockKeyboardAndTouchpadTargeter::BlockKeyboardAndTouchpadTargeter(
44 : default_targeter_(NULL) { 64 aura::Window* root_window,
65 MaximizeModeEventBlocker* event_blocker)
66 : root_window_(root_window),
67 event_blocker_(event_blocker),
68 default_targeter_(NULL),
69 last_mouse_location_(root_window->GetHost()->dispatcher()->
70 GetLastMouseLocationInRoot()) {
45 } 71 }
46 72
47 BlockKeyboardAndTouchpadTargeter::~BlockKeyboardAndTouchpadTargeter() { 73 BlockKeyboardAndTouchpadTargeter::~BlockKeyboardAndTouchpadTargeter() {
48 } 74 }
49 75
50 void BlockKeyboardAndTouchpadTargeter::SetDefaultTargeter( 76 void BlockKeyboardAndTouchpadTargeter::SetDefaultTargeter(
51 ui::EventTargeter* default_targeter) { 77 ui::EventTargeter* default_targeter) {
52 default_targeter_ = default_targeter; 78 default_targeter_ = default_targeter;
53 } 79 }
54 80
55 ui::EventTarget* BlockKeyboardAndTouchpadTargeter::FindTargetForEvent( 81 ui::EventTarget* BlockKeyboardAndTouchpadTargeter::FindTargetForEvent(
56 ui::EventTarget* root, 82 ui::EventTarget* root,
57 ui::Event* event) { 83 ui::Event* event) {
58 if (event->IsMouseEvent() || 84 bool internal_device = event_blocker_->internal_devices() &&
59 event->IsMouseWheelEvent() || 85 event_blocker_->internal_devices()->IsEventFromInternalDevice(event);
60 event->IsScrollEvent()) { 86 if (event->IsMouseEvent()) {
87 if (internal_device) {
88 // The cursor movement is handled at a lower level which is not blocked.
89 // Move the mouse cursor back to its last known location resulting from
90 // an external mouse to prevent the internal touchpad from moving it.
91 root_window_->GetHost()->MoveCursorToHostLocation(
92 last_mouse_location_);
93 return NULL;
94 } else {
95 // Track the last location seen from an external mouse event.
96 last_mouse_location_ =
97 static_cast<ui::MouseEvent*>(event)->root_location();
98 root_window_->GetHost()->ConvertPointToHost(&last_mouse_location_);
99 }
100 } else if (internal_device && (event->IsMouseWheelEvent() ||
101 event->IsScrollEvent())) {
61 return NULL; 102 return NULL;
62 } 103 } else if (event->IsKeyEvent() && event->HasNativeEvent()) {
63 if (event->IsKeyEvent() && event->HasNativeEvent()) { 104 // TODO(flackr): Disable events only from the internal keyboard device
105 // when we begin using XI2 events for keyboard events
106 // (http://crbug.com/368750) and can tell which device the event is
107 // coming from, http://crbug.com/362881.
64 // TODO(bruthig): Fix this to block rewritten volume keys 108 // TODO(bruthig): Fix this to block rewritten volume keys
65 // (i.e. F9 and F10) from the device's keyboard. https://crbug.com/368669 109 // (i.e. F9 and F10) from the device's keyboard. https://crbug.com/368669
66 ui::KeyEvent* key_event = static_cast<ui::KeyEvent*>(event); 110 ui::KeyEvent* key_event = static_cast<ui::KeyEvent*>(event);
67 if (key_event->key_code() != ui::VKEY_VOLUME_DOWN && 111 if (key_event->key_code() != ui::VKEY_VOLUME_DOWN &&
68 key_event->key_code() != ui::VKEY_VOLUME_UP 112 key_event->key_code() != ui::VKEY_VOLUME_UP
69 #if defined(OS_CHROMEOS) 113 #if defined(OS_CHROMEOS)
70 && key_event->key_code() != ui::VKEY_POWER 114 && key_event->key_code() != ui::VKEY_POWER
71 #endif 115 #endif
72 ) { 116 ) {
73 return NULL; 117 return NULL;
74 } 118 }
75 } 119 }
76 return default_targeter_->FindTargetForEvent(root, event); 120 return default_targeter_->FindTargetForEvent(root, event);
77 } 121 }
78 122
79 } // namespace 123 } // namespace
80 124
81 MaximizeModeEventBlocker::MaximizeModeEventBlocker() { 125 MaximizeModeEventBlocker::MaximizeModeEventBlocker()
126 #if defined(USE_X11)
127 : internal_devices_(new InternalInputDeviceListX11)
128 #endif
129 {
82 Shell::GetInstance()->AddShellObserver(this); 130 Shell::GetInstance()->AddShellObserver(this);
83 131
84 // Hide the cursor as mouse events will be blocked. 132 // Hide the cursor as mouse events will be blocked.
85 aura::client::CursorClient* cursor_client_ = 133 aura::client::CursorClient* cursor_client_ =
86 aura::client::GetCursorClient(Shell::GetTargetRootWindow()); 134 aura::client::GetCursorClient(Shell::GetTargetRootWindow());
87 if (cursor_client_) 135 if (cursor_client_)
88 cursor_client_->HideCursor(); 136 cursor_client_->HideCursor();
89 137
90 // Block keyboard and mouse events on all existing and new root windows for 138 // Block keyboard and mouse events on all existing and new root windows for
91 // the lifetime of this class. 139 // the lifetime of this class.
92 aura::Window::Windows root_windows(Shell::GetAllRootWindows()); 140 aura::Window::Windows root_windows(Shell::GetAllRootWindows());
93 for (aura::Window::Windows::iterator iter = root_windows.begin(); 141 for (aura::Window::Windows::iterator iter = root_windows.begin();
94 iter != root_windows.end(); ++iter) { 142 iter != root_windows.end(); ++iter) {
95 AddEventTargeterOn(*iter); 143 AddEventTargeterOn(*iter);
96 } 144 }
97 } 145 }
98 146
99 MaximizeModeEventBlocker::~MaximizeModeEventBlocker() { 147 MaximizeModeEventBlocker::~MaximizeModeEventBlocker() {
100 Shell::GetInstance()->RemoveShellObserver(this); 148 Shell::GetInstance()->RemoveShellObserver(this);
101 } 149 }
102 150
103 void MaximizeModeEventBlocker::OnRootWindowAdded(aura::Window* root_window) { 151 void MaximizeModeEventBlocker::OnRootWindowAdded(aura::Window* root_window) {
104 AddEventTargeterOn(root_window); 152 AddEventTargeterOn(root_window);
105 } 153 }
106 154
107 void MaximizeModeEventBlocker::AddEventTargeterOn( 155 void MaximizeModeEventBlocker::AddEventTargeterOn(
108 aura::Window* root_window) { 156 aura::Window* root_window) {
109 BlockKeyboardAndTouchpadTargeter* targeter = 157 BlockKeyboardAndTouchpadTargeter* targeter =
110 new BlockKeyboardAndTouchpadTargeter(); 158 new BlockKeyboardAndTouchpadTargeter(root_window, this);
111 aura::ScopedWindowTargeter* scoped_targeter = new aura::ScopedWindowTargeter( 159 aura::ScopedWindowTargeter* scoped_targeter = new aura::ScopedWindowTargeter(
112 root_window, scoped_ptr<ui::EventTargeter>(targeter)); 160 root_window, scoped_ptr<ui::EventTargeter>(targeter));
113 targeter->SetDefaultTargeter(scoped_targeter->old_targeter()); 161 targeter->SetDefaultTargeter(scoped_targeter->old_targeter());
114 targeters_.push_back(scoped_targeter); 162 targeters_.push_back(scoped_targeter);
115 } 163 }
116 164
117 } // namespace ash 165 } // namespace ash
OLDNEW
« no previous file with comments | « ash/wm/maximize_mode/maximize_mode_event_blocker.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698