| OLD | NEW | 
|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/exo/keyboard.h" | 5 #include "components/exo/keyboard.h" | 
| 6 | 6 | 
| 7 #include "components/exo/keyboard_delegate.h" | 7 #include "components/exo/keyboard_delegate.h" | 
|  | 8 #include "components/exo/keyboard_device_configuration_delegate.h" | 
| 8 #include "components/exo/shell_surface.h" | 9 #include "components/exo/shell_surface.h" | 
| 9 #include "components/exo/surface.h" | 10 #include "components/exo/surface.h" | 
| 10 #include "ui/aura/client/focus_client.h" | 11 #include "ui/aura/client/focus_client.h" | 
| 11 #include "ui/aura/window.h" | 12 #include "ui/aura/window.h" | 
| 12 #include "ui/base/ime/input_method.h" | 13 #include "ui/base/ime/input_method.h" | 
| 13 #include "ui/events/base_event_utils.h" | 14 #include "ui/events/base_event_utils.h" | 
|  | 15 #include "ui/events/devices/input_device.h" | 
|  | 16 #include "ui/events/devices/input_device_manager.h" | 
| 14 #include "ui/events/event.h" | 17 #include "ui/events/event.h" | 
| 15 #include "ui/views/widget/widget.h" | 18 #include "ui/views/widget/widget.h" | 
| 16 | 19 | 
| 17 namespace exo { | 20 namespace exo { | 
|  | 21 namespace { | 
| 18 | 22 | 
| 19 bool ConsumedByIme(Surface* focus, const ui::KeyEvent* event) { | 23 bool ConsumedByIme(Surface* focus, const ui::KeyEvent* event) { | 
| 20   // Check if IME consumed the event, to avoid it to be doubly processed. | 24   // Check if IME consumed the event, to avoid it to be doubly processed. | 
| 21   // First let us see whether IME is active and is in text input mode. | 25   // First let us see whether IME is active and is in text input mode. | 
| 22   views::Widget* widget = | 26   views::Widget* widget = | 
| 23       focus ? views::Widget::GetTopLevelWidgetForNativeView(focus->window()) | 27       focus ? views::Widget::GetTopLevelWidgetForNativeView(focus->window()) | 
| 24             : nullptr; | 28             : nullptr; | 
| 25   ui::InputMethod* ime = widget ? widget->GetInputMethod() : nullptr; | 29   ui::InputMethod* ime = widget ? widget->GetInputMethod() : nullptr; | 
| 26   if (!ime || ime->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) | 30   if (!ime || ime->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) | 
| 27     return false; | 31     return false; | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 63   if ((event->flags() & kModifierMask) == 0) { | 67   if ((event->flags() & kModifierMask) == 0) { | 
| 64     if (event->key_code() == ui::VKEY_RETURN || | 68     if (event->key_code() == ui::VKEY_RETURN || | 
| 65         event->key_code() == ui::VKEY_BACK) { | 69         event->key_code() == ui::VKEY_BACK) { | 
| 66       return true; | 70       return true; | 
| 67     } | 71     } | 
| 68   } | 72   } | 
| 69 | 73 | 
| 70   return false; | 74   return false; | 
| 71 } | 75 } | 
| 72 | 76 | 
|  | 77 bool IsPhysicalKeyboardEnabled() { | 
|  | 78   // The internal keyboard is enabled if maximize mode is not enabled. | 
|  | 79   if (WMHelper::GetInstance()->IsMaximizeModeWindowManagerEnabled()) | 
|  | 80     return true; | 
|  | 81 | 
|  | 82   for (auto& keyboard : | 
|  | 83        ui::InputDeviceManager::GetInstance()->GetKeyboardDevices()) { | 
|  | 84     if (keyboard.type != ui::InputDeviceType::INPUT_DEVICE_INTERNAL) | 
|  | 85       return true; | 
|  | 86   } | 
|  | 87   return false; | 
|  | 88 } | 
|  | 89 | 
|  | 90 }  // namespace | 
|  | 91 | 
| 73 //////////////////////////////////////////////////////////////////////////////// | 92 //////////////////////////////////////////////////////////////////////////////// | 
| 74 // Keyboard, public: | 93 // Keyboard, public: | 
| 75 | 94 | 
| 76 Keyboard::Keyboard(KeyboardDelegate* delegate) : delegate_(delegate) { | 95 Keyboard::Keyboard(KeyboardDelegate* delegate) : delegate_(delegate) { | 
| 77   auto* helper = WMHelper::GetInstance(); | 96   auto* helper = WMHelper::GetInstance(); | 
| 78   helper->AddPostTargetHandler(this); | 97   helper->AddPostTargetHandler(this); | 
| 79   helper->AddFocusObserver(this); | 98   helper->AddFocusObserver(this); | 
|  | 99   helper->AddMaximizeModeObserver(this); | 
|  | 100   helper->AddInputDeviceEventObserver(this); | 
| 80   OnWindowFocused(helper->GetFocusedWindow(), nullptr); | 101   OnWindowFocused(helper->GetFocusedWindow(), nullptr); | 
| 81 } | 102 } | 
| 82 | 103 | 
| 83 Keyboard::~Keyboard() { | 104 Keyboard::~Keyboard() { | 
| 84   delegate_->OnKeyboardDestroying(this); | 105   delegate_->OnKeyboardDestroying(this); | 
|  | 106   if (device_configuration_delegate_) | 
|  | 107     device_configuration_delegate_->OnKeyboardDestroying(this); | 
| 85   if (focus_) | 108   if (focus_) | 
| 86     focus_->RemoveSurfaceObserver(this); | 109     focus_->RemoveSurfaceObserver(this); | 
| 87   auto* helper = WMHelper::GetInstance(); | 110   auto* helper = WMHelper::GetInstance(); | 
| 88   helper->RemoveFocusObserver(this); | 111   helper->RemoveFocusObserver(this); | 
| 89   helper->RemovePostTargetHandler(this); | 112   helper->RemovePostTargetHandler(this); | 
|  | 113   helper->RemoveMaximizeModeObserver(this); | 
|  | 114   helper->RemoveInputDeviceEventObserver(this); | 
|  | 115 } | 
|  | 116 | 
|  | 117 void Keyboard::SetDeviceConfigurationDelegate( | 
|  | 118     KeyboardDeviceConfigurationDelegate* delegate) { | 
|  | 119   device_configuration_delegate_ = delegate; | 
|  | 120   OnKeyboardDeviceConfigurationChanged(); | 
| 90 } | 121 } | 
| 91 | 122 | 
| 92 //////////////////////////////////////////////////////////////////////////////// | 123 //////////////////////////////////////////////////////////////////////////////// | 
| 93 // ui::EventHandler overrides: | 124 // ui::EventHandler overrides: | 
| 94 | 125 | 
| 95 void Keyboard::OnKeyEvent(ui::KeyEvent* event) { | 126 void Keyboard::OnKeyEvent(ui::KeyEvent* event) { | 
| 96   // These modifiers reflect what Wayland is aware of.  For example, | 127   // These modifiers reflect what Wayland is aware of.  For example, | 
| 97   // EF_SCROLL_LOCK_ON is missing because Wayland doesn't support scroll lock. | 128   // EF_SCROLL_LOCK_ON is missing because Wayland doesn't support scroll lock. | 
| 98   const int kModifierMask = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | | 129   const int kModifierMask = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN | | 
| 99                             ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN | | 130                             ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN | | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 163 //////////////////////////////////////////////////////////////////////////////// | 194 //////////////////////////////////////////////////////////////////////////////// | 
| 164 // SurfaceObserver overrides: | 195 // SurfaceObserver overrides: | 
| 165 | 196 | 
| 166 void Keyboard::OnSurfaceDestroying(Surface* surface) { | 197 void Keyboard::OnSurfaceDestroying(Surface* surface) { | 
| 167   DCHECK(surface == focus_); | 198   DCHECK(surface == focus_); | 
| 168   focus_ = nullptr; | 199   focus_ = nullptr; | 
| 169   surface->RemoveSurfaceObserver(this); | 200   surface->RemoveSurfaceObserver(this); | 
| 170 } | 201 } | 
| 171 | 202 | 
| 172 //////////////////////////////////////////////////////////////////////////////// | 203 //////////////////////////////////////////////////////////////////////////////// | 
|  | 204 // ui::InputDeviceEventObserver overrides: | 
|  | 205 | 
|  | 206 void Keyboard::OnKeyboardDeviceConfigurationChanged() { | 
|  | 207   if (device_configuration_delegate_) { | 
|  | 208     device_configuration_delegate_->OnKeyboardTypeChanged( | 
|  | 209         IsPhysicalKeyboardEnabled()); | 
|  | 210   } | 
|  | 211 } | 
|  | 212 | 
|  | 213 //////////////////////////////////////////////////////////////////////////////// | 
|  | 214 // WMHelper::MaximizeModeObserver overrides: | 
|  | 215 | 
|  | 216 void Keyboard::OnMaximizeModeStarted() { | 
|  | 217   OnKeyboardDeviceConfigurationChanged(); | 
|  | 218 } | 
|  | 219 | 
|  | 220 void Keyboard::OnMaximizeModeEnded() { | 
|  | 221   OnKeyboardDeviceConfigurationChanged(); | 
|  | 222 } | 
|  | 223 | 
|  | 224 //////////////////////////////////////////////////////////////////////////////// | 
| 173 // Keyboard, private: | 225 // Keyboard, private: | 
| 174 | 226 | 
| 175 Surface* Keyboard::GetEffectiveFocus(aura::Window* window) const { | 227 Surface* Keyboard::GetEffectiveFocus(aura::Window* window) const { | 
| 176   // Use window surface as effective focus. | 228   // Use window surface as effective focus. | 
| 177   Surface* focus = Surface::AsSurface(window); | 229   Surface* focus = Surface::AsSurface(window); | 
| 178   if (!focus) { | 230   if (!focus) { | 
| 179     // Fallback to main surface. | 231     // Fallback to main surface. | 
| 180     aura::Window* top_level_window = window->GetToplevelWindow(); | 232     aura::Window* top_level_window = window->GetToplevelWindow(); | 
| 181     if (top_level_window) | 233     if (top_level_window) | 
| 182       focus = ShellSurface::GetMainSurface(top_level_window); | 234       focus = ShellSurface::GetMainSurface(top_level_window); | 
| 183   } | 235   } | 
| 184 | 236 | 
| 185   return focus && delegate_->CanAcceptKeyboardEventsForSurface(focus) ? focus | 237   return focus && delegate_->CanAcceptKeyboardEventsForSurface(focus) ? focus | 
| 186                                                                       : nullptr; | 238                                                                       : nullptr; | 
| 187 } | 239 } | 
| 188 | 240 | 
| 189 }  // namespace exo | 241 }  // namespace exo | 
| OLD | NEW | 
|---|