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