1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 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) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef UI_BASE_IME_CHROMEOS_CHARACTER_COMPOSER_H_ 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define UI_BASE_IME_CHROMEOS_CHARACTER_COMPOSER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class KeyEvent; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to recognize compose and dead key sequence. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Outputs composed character. 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT CharacterComposer { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharacterComposer(); 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CharacterComposer(); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Reset(); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filters keypress. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the keypress is recognized as a part of composition 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sequence. 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Fabricated events which don't have the native event, are not supported. 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool FilterKeyPress(const ui::KeyEvent& event); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a string consisting of composed character. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Empty string is returned when there is no composition result. 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& composed_character() const { 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return composed_character_; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the preedit string. 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& preedit_string() const { return preedit_string_; } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) friend class CharacterComposerTest; 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An enum to describe composition mode. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum CompositionMode { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is the initial state. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Composite a character with dead-keys and compose-key. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KEY_SEQUENCE_MODE, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Composite a character with a hexadecimal unicode sequence. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HEX_MODE, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Filters keypress using IBus defined value. 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns true if the keypress is recognized as a part of composition 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // sequence. 55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |keyval| must be a GDK_KEY_* constant. 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |keycode| must be a X key code. 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // |flags| must be a combination of ui::EF_* flags. 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // composed_character() returns non empty string when there is a character 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // composed after this method returns true. 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // preedit_string() returns non empty string when there is a preedit string 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // after this method returns true. 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Return values of preedit_string() is empty after this method returns false. 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // composed_character() may have some characters which are consumed in this 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // composing session. 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(nona): Actually a X KeySym is passed to |keyval|, so we should use 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // XK_* rather than GDK_KEY_*. 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool FilterKeyPressInternal(unsigned int keyval, unsigned int keycode, 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int flags); 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filters keypress in key sequence mode. 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool FilterKeyPressSequenceMode(unsigned int keyval, int flags); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Filters keypress in hexadecimal mode. 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool FilterKeyPressHexMode(unsigned int keyval, unsigned int keycode, 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int flags); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Commit a character composed from hexadecimal uncode sequence 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CommitHex(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates preedit string in hexadecimal mode. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdatePreeditStringHexMode(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remembers keypresses previously filtered. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned int> compose_buffer_; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A string representing the composed character. 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 composed_character_; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preedit string. 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 preedit_string_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Composition mode which this instance is in. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositionMode composition_mode_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CharacterComposer); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif // UI_BASE_IME_CHROMEOS_CHARACTER_COMPOSER_H_ 104