1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/global_shortcut_listener_chromeos.h" 6 7 #include "ash/accelerators/accelerator_controller.h" 8 #include "ash/shell.h" 9 #include "content/public/browser/browser_thread.h" 10 11 using content::BrowserThread; 12 13 namespace extensions { 14 15 // static 16 GlobalShortcutListener* GlobalShortcutListener::GetInstance() { 17 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 18 static GlobalShortcutListenerChromeOS* instance = 19 new GlobalShortcutListenerChromeOS(); 20 return instance; 21 } 22 23 GlobalShortcutListenerChromeOS::GlobalShortcutListenerChromeOS() 24 : is_listening_(false) { 25 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 26 } 27 28 GlobalShortcutListenerChromeOS::~GlobalShortcutListenerChromeOS() { 29 if (is_listening_) 30 StopListening(); 31 } 32 33 void GlobalShortcutListenerChromeOS::StartListening() { 34 DCHECK(!is_listening_); // Don't start twice. 35 is_listening_ = true; 36 } 37 38 void GlobalShortcutListenerChromeOS::StopListening() { 39 DCHECK(is_listening_); // No point if we are not already listening. 40 is_listening_ = false; 41 } 42 43 bool GlobalShortcutListenerChromeOS::RegisterAcceleratorImpl( 44 const ui::Accelerator& accelerator) { 45 ash::AcceleratorController* controller = 46 ash::Shell::GetInstance()->accelerator_controller(); 47 if (controller->IsRegistered(accelerator)) 48 return false; 49 50 // TODO(dtseng): Support search key mapping. 51 controller->Register(accelerator, this); 52 return controller->IsRegistered(accelerator); 53 } 54 55 void GlobalShortcutListenerChromeOS::UnregisterAcceleratorImpl( 56 const ui::Accelerator& accelerator) { 57 // This code path gets called during object destruction. 58 if (!ash::Shell::HasInstance()) 59 return; 60 ash::Shell::GetInstance()->accelerator_controller()->Unregister(accelerator, 61 this); 62 } 63 64 bool GlobalShortcutListenerChromeOS::AcceleratorPressed( 65 const ui::Accelerator& accelerator) { 66 DCHECK(is_listening_); 67 ash::AcceleratorController* controller = 68 ash::Shell::GetInstance()->accelerator_controller(); 69 ash::AcceleratorController::AcceleratorProcessingRestriction restriction = 70 controller->GetCurrentAcceleratorRestriction(); 71 if (restriction == ash::AcceleratorController::RESTRICTION_NONE) { 72 NotifyKeyPressed(accelerator); 73 return true; 74 } 75 return restriction == ash::AcceleratorController:: 76 RESTRICTION_PREVENT_PROCESSING_AND_PROPAGATION; 77 } 78 79 bool GlobalShortcutListenerChromeOS::CanHandleAccelerators() const { 80 return is_listening_; 81 } 82 83 } // namespace extensions 84