Commit 5928688b authored by Gary Kacmarcik's avatar Gary Kacmarcik Committed by Commit Bot

[KeyboardMap] Convert combining chars into printable chars

Rather than have each platform convert Unicode combining characters
before adding them to the DomKeyboardLayout, with this change each
platform adds the Unicode combining characters and they are converted
into printable characters as the LayoutMap is being created for
the user.

Bug: 832811
Change-Id: Ie1b23b228c1227b7c4be6e5409dba881ef1ff586
Reviewed-on: https://chromium-review.googlesource.com/1070756Reviewed-by: default avatarJoe Downing <joedow@chromium.org>
Commit-Queue: Gary Kacmarcik <garykac@chromium.org>
Cr-Commit-Position: refs/heads/master@{#561321}
parent fb38830c
...@@ -38,6 +38,19 @@ const DomCode writing_system_key_domcodes[] = { ...@@ -38,6 +38,19 @@ const DomCode writing_system_key_domcodes[] = {
const size_t kWritingSystemKeyDomCodeEntries = const size_t kWritingSystemKeyDomCodeEntries =
base::size(writing_system_key_domcodes); base::size(writing_system_key_domcodes);
// Mapping from Unicode combining characters to corresponding printable
// character.
const static struct {
uint16_t combining;
uint16_t printable;
} kCombiningKeyMapping[] = {
{0x0300, 0x0060}, // Grave
{0x0301, 0x0027}, // Acute
{0x0302, 0x005e}, // Circumflex
{0x0303, 0x007e}, // Tilde
{0x0308, 0x00a8}, // Diaeresis
};
DomKeyboardLayout::DomKeyboardLayout() = default; DomKeyboardLayout::DomKeyboardLayout() = default;
DomKeyboardLayout::~DomKeyboardLayout() = default; DomKeyboardLayout::~DomKeyboardLayout() = default;
...@@ -51,6 +64,19 @@ base::flat_map<std::string, std::string> DomKeyboardLayout::GetMap() { ...@@ -51,6 +64,19 @@ base::flat_map<std::string, std::string> DomKeyboardLayout::GetMap() {
for (size_t i = 0; i < kWritingSystemKeyDomCodeEntries; ++i) { for (size_t i = 0; i < kWritingSystemKeyDomCodeEntries; ++i) {
ui::DomCode dom_code = ui::writing_system_key_domcodes[i]; ui::DomCode dom_code = ui::writing_system_key_domcodes[i];
uint16_t unicode = layout_[dom_code]; uint16_t unicode = layout_[dom_code];
// Map combining accents into the corresponding printable character.
if (unicode >= 0x0300 && unicode <= 0x036f) {
uint16_t printable = 0;
for (size_t j = 0; j < base::size(kCombiningKeyMapping); ++j) {
if (kCombiningKeyMapping[j].combining == unicode) {
printable = kCombiningKeyMapping[j].printable;
break;
}
}
unicode = printable;
}
if (unicode == 0) if (unicode == 0)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment