15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/ime_controller_chromeos.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ImeController::HandleNextIme() { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::input_method::InputMethodManager* manager = 12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get(); 1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) manager->GetActiveIMEState()->SwitchToNextInputMethod(); 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16a3f7b4e666c476898878fa745f637129375cd889Ben Murdochbool ImeController::HandlePreviousIme(const ui::Accelerator& accelerator) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::input_method::InputMethodManager* manager = 18a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get(); 1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return manager->GetActiveIMEState()->SwitchToPreviousInputMethod(accelerator); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImeController::HandleSwitchIme(const ui::Accelerator& accelerator) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::input_method::InputMethodManager* manager = 24a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get(); 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return manager->GetActiveIMEState()->SwitchInputMethod(accelerator); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::Accelerator ImeController::RemapAccelerator( 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Accelerator& accelerator) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyboardCode key = accelerator.key_code(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int modifiers = accelerator.modifiers(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On French keyboards the user needs to press a number key in conjunction 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with the shift key. To get the right accelerator from our static table 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we modify the received accelerator to match this. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (key >= ui::VKEY_0 && key <= ui::VKEY_9) { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A keyboard layout can get changed by the user, so we perform quickly 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this cheap layout test. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // See http://crbug.com/129017 for more details. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (UsingFrenchInputMethod()) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We toggle the shift key to get the correct accelerator from our table. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) modifiers ^= ui::EF_SHIFT_DOWN; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::Accelerator remapped_accelerator(key, modifiers); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remapped_accelerator.set_type(accelerator.type()); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return remapped_accelerator; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ImeController::UsingFrenchInputMethod() const { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chromeos::input_method::InputMethodManager* manager = 51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) chromeos::input_method::InputMethodManager::Get(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const chromeos::input_method::InputMethodDescriptor& descriptor = 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) manager->GetActiveIMEState()->GetCurrentInputMethod(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& layout = descriptor.id(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (layout == "xkb:fr::fra" || layout == "xkb:be::fra"); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 57