Index: ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
index 49f29a118aa0f21f90a28e786fb984a6352f0799..0f99b2cea2d8c9d56c10b0b7d6d2d2fc4e0c47a8 100644 |
--- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc |
@@ -625,20 +625,51 @@ const PrintableSimpleEntry kSimpleMap[] = { |
{0x0259, VKEY_OEM_3}, // schwa |
}; |
+void ParseLayoutName(const std::string& layout_name, |
+ std::string* layout_id, |
+ std::string* layout_variant) { |
+ size_t dash_index = layout_name.find('-'); |
+ size_t parentheses_index = layout_name.find('('); |
+ *layout_id = layout_name; |
+ *layout_variant = ""; |
+ if (parentheses_index != std::string::npos) { |
+ *layout_id = layout_name.substr(0, parentheses_index); |
+ size_t close_index = layout_name.find(')', parentheses_index); |
+ if (close_index == std::string::npos) |
+ close_index = layout_name.size(); |
+ *layout_variant = layout_name.substr(parentheses_index + 1, |
+ close_index - parentheses_index - 1); |
+ } else if (dash_index != std::string::npos) { |
+ *layout_id = layout_name.substr(0, dash_index); |
+ *layout_variant = layout_name.substr(dash_index + 1); |
+ } |
+} |
+ |
void LoadKeymap(const std::string& layout_name, |
- scoped_ptr<xkb_rule_names> names, |
scoped_refptr<base::SingleThreadTaskRunner> reply_runner, |
const LoadKeymapCallback& reply_callback) { |
+ std::string layout_id; |
+ std::string layout_variant; |
+ ParseLayoutName(layout_name, &layout_id, &layout_variant); |
+ xkb_rule_names names = {.rules = NULL, |
+ .model = "pc101", |
+ .layout = layout_id.c_str(), |
+ .variant = layout_variant.c_str(), |
+ .options = ""}; |
scoped_ptr<xkb_context, XkbContextDeleter> context; |
context.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); |
xkb_context_include_path_append(context.get(), "/usr/share/X11/xkb"); |
scoped_ptr<xkb_keymap, XkbKeymapDeleter> keymap; |
- keymap.reset(xkb_keymap_new_from_names(context.get(), names.get(), |
+ keymap.reset(xkb_keymap_new_from_names(context.get(), &names, |
XKB_KEYMAP_COMPILE_NO_FLAGS)); |
- char* keymap_str = |
- xkb_keymap_get_as_string(keymap.get(), XKB_KEYMAP_FORMAT_TEXT_V1); |
- reply_runner->PostTask(FROM_HERE, base::Bind(reply_callback, layout_name, |
- base::Owned(keymap_str))); |
+ if (keymap) { |
+ char* keymap_str = |
+ xkb_keymap_get_as_string(keymap.get(), XKB_KEYMAP_FORMAT_TEXT_V1); |
+ reply_runner->PostTask(FROM_HERE, base::Bind(reply_callback, layout_name, |
+ base::Owned(keymap_str))); |
+ } else { |
+ LOG(ERROR) << "Keymap file failed to load: " << layout_name; |
+ } |
} |
} // anonymous namespace |
@@ -686,11 +717,10 @@ bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName( |
} |
LoadKeymapCallback reply_callback = base::Bind( |
&XkbKeyboardLayoutEngine::OnKeymapLoaded, weak_ptr_factory_.GetWeakPtr()); |
- scoped_ptr<xkb_rule_names> names = GetXkbRuleNames(layout_name); |
base::WorkerPool::PostTask( |
FROM_HERE, |
- base::Bind(&LoadKeymap, layout_name, base::Passed(&names), |
- base::ThreadTaskRunnerHandle::Get(), reply_callback), |
+ base::Bind(&LoadKeymap, layout_name, base::ThreadTaskRunnerHandle::Get(), |
+ reply_callback), |
true); |
#else |
xkb_keymap* keymap = xkb_map_new_from_string( |
@@ -703,31 +733,6 @@ bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName( |
return true; |
} |
-scoped_ptr<xkb_rule_names> XkbKeyboardLayoutEngine::GetXkbRuleNames( |
- const std::string& layout_name) { |
- size_t dash_index = layout_name.find('-'); |
- size_t parentheses_index = layout_name.find('('); |
- std::string layout_id = layout_name; |
- std::string layout_variant = ""; |
- if (parentheses_index != std::string::npos) { |
- layout_id = layout_name.substr(0, parentheses_index); |
- size_t close_index = layout_name.find(')', parentheses_index); |
- if (close_index == std::string::npos) |
- close_index = layout_name.size(); |
- layout_variant = layout_name.substr(parentheses_index + 1, |
- close_index - parentheses_index - 1); |
- } else if (dash_index != std::string::npos) { |
- layout_id = layout_name.substr(0, dash_index); |
- layout_variant = layout_name.substr(dash_index + 1); |
- } |
- return make_scoped_ptr<xkb_rule_names>( |
- new xkb_rule_names{.rules = NULL, |
- .model = "pc101", |
- .layout = layout_id.c_str(), |
- .variant = layout_variant.c_str(), |
- .options = ""}); |
-} |
- |
void XkbKeyboardLayoutEngine::OnKeymapLoaded(const std::string& layout_name, |
const char* keymap_str) { |
if (keymap_str) { |
@@ -739,7 +744,7 @@ void XkbKeyboardLayoutEngine::OnKeymapLoaded(const std::string& layout_name, |
if (layout_name == current_layout_name_) |
SetKeymap(keymap); |
} else { |
- LOG(ERROR) << "Keymap file fail to load: " << layout_name; |
+ LOG(ERROR) << "Keymap file failed to load: " << layout_name; |
} |
} |