Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Side by Side Diff: ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc

Issue 817983002: ozone: xkb: Load keymaps on worker thread & cache them (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adds unittests Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h" 5 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
6 6
7 #include <xkbcommon/xkbcommon-names.h> 7 #include <xkbcommon/xkbcommon-names.h>
8 8
9 #include "base/bind.h"
10 #include "base/location.h"
9 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/single_thread_task_runner.h"
13 #include "base/task_runner.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "base/threading/worker_pool.h"
10 #include "ui/events/event_constants.h" 16 #include "ui/events/event_constants.h"
11 #include "ui/events/keycodes/dom3/dom_code.h" 17 #include "ui/events/keycodes/dom3/dom_code.h"
12 #include "ui/events/keycodes/dom3/dom_key.h" 18 #include "ui/events/keycodes/dom3/dom_key.h"
13 #include "ui/events/keycodes/dom4/keycode_converter.h" 19 #include "ui/events/keycodes/dom4/keycode_converter.h"
14 #include "ui/events/ozone/layout/layout_util.h" 20 #include "ui/events/ozone/layout/layout_util.h"
15 #include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h" 21 #include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h"
16 22
17 namespace ui { 23 namespace ui {
18 24
25 typedef base::Callback<void(const std::string&,
26 xkb_keymap* keymap)> LoadKeymapCallback;
27
19 namespace { 28 namespace {
20 29
30 // Fallback keymap - us-qwerty.
31 const char* us_keymap =
spang 2015/01/02 20:16:35 I'm not sure we want this here. We'll always ship
FengYuan 2015/01/03 17:57:04 I reintroduced the fallback here because of issue:
Shu Chen 2015/01/04 01:43:16 Agreed to remove this.
FengYuan 2015/01/04 02:25:22 Done.
32 "xkb_keymap{"
33 "xkb_keycodes \"evdev_aliases(qwerty)\"{minimum=8;maximum=255;"
34 "<ESC>=9;<AE01>=10;<AE02>=11;<AE03>=12;<AE04>=13;<AE05>=14;"
35 "<AE06>=15;<AE07>=16;<AE08>=17;<AE09>=18;<AE10>=19;<AE11>=20;"
36 "<AE12>=21;<BKSP>=22;<TAB>=23;<AD01>=24;<AD02>=25;<AD03>=26;"
37 "<AD04>=27;<AD05>=28;<AD06>=29;<AD07>=30;<AD08>=31;<AD09>=32;"
38 "<AD10>=33;<AD11>=34;<AD12>=35;<RTRN>=36;<LCTL>=37;<AC01>=38;"
39 "<AC02>=39;<AC03>=40;<AC04>=41;<AC05>=42;<AC06>=43;<AC07>=44;"
40 "<AC08>=45;<AC09>=46;<AC10>=47;<AC11>=48;<TLDE>=49;<LFSH>=50;"
41 "<BKSL>=51;<AB01>=52;<AB02>=53;<AB03>=54;<AB04>=55;<AB05>=56;"
42 "<AB06>=57;<AB07>=58;<AB08>=59;<AB09>=60;<AB10>=61;<RTSH>=62;"
43 "<KPMU>=63;<LALT>=64;<SPCE>=65;<CAPS>=66;<FK01>=67;<FK02>=68;"
44 "<FK03>=69;<FK04>=70;<FK05>=71;<FK06>=72;<FK07>=73;<FK08>=74;"
45 "<FK09>=75;<FK10>=76;<FK11>=95;<FK12>=96;<FK13>=191;<FK14>=192;"
46 "<FK15>=193;<FK16>=194;<FK17>=195;<FK18>=196;<FK19>=197;<FK20>=198;"
47 "<FK21>=199;<FK22>=200;<FK23>=201;<FK24>=202;<LWIN>=133;<RWIN>=134;"
48 "<NMLK>=77;<SCLK>=78;<KP7>=79;<KP8>=80;<KP9>=81;<KPSU>=82;<KP4>=83;"
49 "<KP5>=84;<KP6>=85;<KPAD>=86;<KP1>=87;<KP2>=88;<KP3>=89;<KP0>=90;"
50 "<KPDL>=91;<LVL3>=92;<LSGT>=94;<FK11>=95;<FK12>=96;<KATA>=98;<HIRA>=99;"
51 "<HENK>=100;<HKTG>=101;<MUHE>=102;<KPEN>=104;<RCTL>=105;"
52 "<KPDV>=106;<PRSC>=107;<RALT>=108;<LNFD>=109;<HOME>=110;<UP>=111;"
53 "<PGUP>=112;<LEFT>=113;<RGHT>=114;<END>=115;<DOWN>=116;<PGDN>=117;"
54 "<INS>=118;<DELE>=119;<MUTE>=121;<VOL->=122;<VOL+>=123;<POWR>=124;"
55 "<MDSW>=203;<ALT>=204;<META>=205;<SUPR>=206;<HYPR>=207;};"
56 "xkb_types \"complete\"{virtual_modifiers NumLock,Alt,LevelThree,LAlt,"
57 "RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;"
58 "type \"ONE_LEVEL\"{modifiers=none;level_name[Level1]=\"Any\";};"
59 "type \"TWO_LEVEL\"{modifiers=Shift;map[Shift]=Level2;"
60 "level_name[Level1]=\"Base\";level_name[Level2]=\"Shift\";};"
61 "type \"ALPHABETIC\"{modifiers=Shift+Lock;"
62 "map[Shift]=Level2;map[Lock]=Level2;"
63 "level_name[Level1]=\"Base\";level_name[Level2]=\"Caps\";};"
64 "type \"FOUR_LEVEL\"{modifiers=Shift+LevelThree;map[Shift]=Level2;"
65 "map[LevelThree]=Level3;map[Shift+LevelThree]=Level4;"
66 "level_name[Level1]=\"Base\";level_name[Level2]=\"Shift\";"
67 "level_name[Level3]=\"Alt Base\";level_name[Level4]=\"Shift Alt\";};"
68 "type \"KEYPAD\"{modifiers=Shift+NumLock;"
69 "map[Shift]=Level2;map[NumLock]=Level2;"
70 "level_name[Level1]=\"Base\";level_name[Level2]=\"Number\";};};"
71 "xkb_compatibility \"complete\"{virtual_modifiers NumLock,Alt,LevelThree,"
72 "LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;"
73 "interpret.useModMapMods=AnyLevel;interpret.repeat=False;"
74 "interpret ISO_Level2_Latch+Exactly(Shift){useModMapMods=level1;"
75 "action=LatchMods(modifiers=Shift,clearLocks,latchToLock);};"
76 "interpret Shift_Lock+AnyOf(Shift+Lock){action=LockMods(modifiers=Shift);};"
77 "interpret Num_Lock+AnyOf(all){virtualModifier=NumLock;"
78 "action=LockMods(modifiers=NumLock);};"
79 "interpret ISO_Level3_Shift+AnyOf(all){virtualModifier=LevelThree;"
80 "useModMapMods=level1;action=SetMods(modifiers=LevelThree,clearLocks);};"
81 "interpret ISO_Level3_Latch+AnyOf(all){"
82 "virtualModifier=LevelThree;useModMapMods=level1;"
83 "action=LatchMods(modifiers=LevelThree,clearLocks,latchToLock);};"
84 "interpret ISO_Level3_Lock+AnyOf(all){virtualModifier=LevelThree;"
85 "useModMapMods=level1;action=LockMods(modifiers=LevelThree);};"
86 "interpret Alt_L+AnyOf(all){virtualModifier=Alt;"
87 "action=SetMods(modifiers=modMapMods,clearLocks);};"
88 "interpret Alt_R+AnyOf(all){virtualModifier=Alt;"
89 "action=SetMods(modifiers=modMapMods,clearLocks);};"
90 "interpret Meta_L+AnyOf(all){virtualModifier=Meta;"
91 "action=SetMods(modifiers=modMapMods,clearLocks);};"
92 "interpret Meta_R+AnyOf(all){virtualModifier=Meta;"
93 "action=SetMods(modifiers=modMapMods,clearLocks);};"
94 "interpret Super_L+AnyOf(all){virtualModifier=Super;"
95 "action=SetMods(modifiers=modMapMods,clearLocks);};"
96 "interpret Super_R+AnyOf(all){virtualModifier=Super;"
97 "action=SetMods(modifiers=modMapMods,clearLocks);};"
98 "interpret Hyper_L+AnyOf(all){virtualModifier=Hyper;"
99 "action=SetMods(modifiers=modMapMods,clearLocks);};"
100 "interpret Hyper_R+AnyOf(all){virtualModifier=Hyper;"
101 "action=SetMods(modifiers=modMapMods,clearLocks);};"
102 "interpret Mode_switch+AnyOfOrNone(all){virtualModifier=AltGr;"
103 "useModMapMods=level1;action=SetGroup(group=+1);};"
104 "interpret ISO_Level3_Shift+AnyOfOrNone(all){"
105 "action=SetMods(modifiers=LevelThree,clearLocks);};"
106 "interpret ISO_Level3_Latch+AnyOfOrNone(all){"
107 "action=LatchMods(modifiers=LevelThree,clearLocks,latchToLock);};"
108 "interpret ISO_Level3_Lock+AnyOfOrNone(all){"
109 "action=LockMods(modifiers=LevelThree);};"
110 "interpret Alt_L+AnyOfOrNone(all){"
111 "action=SetMods(modifiers=Alt,clearLocks);};"
112 "interpret Alt_R+AnyOfOrNone(all){"
113 "action=SetMods(modifiers=Alt,clearLocks);};"
114 "interpret Meta_L+AnyOfOrNone(all){"
115 "action=SetMods(modifiers=Meta,clearLocks);};"
116 "interpret Meta_R+AnyOfOrNone(all){"
117 "action=SetMods(modifiers=Meta,clearLocks);};"
118 "interpret Super_L+AnyOfOrNone(all){"
119 "action=SetMods(modifiers=Super,clearLocks);};"
120 "interpret Super_R+AnyOfOrNone(all){"
121 "action=SetMods(modifiers=Super,clearLocks);};"
122 "interpret Hyper_L+AnyOfOrNone(all){"
123 "action=SetMods(modifiers=Hyper,clearLocks);};"
124 "interpret Hyper_R+AnyOfOrNone(all){"
125 "action=SetMods(modifiers=Hyper,clearLocks);};"
126 "interpret Shift_L+AnyOfOrNone(all){"
127 "action=SetMods(modifiers=Shift,clearLocks);};"
128 "interpret XF86Switch_VT_1+AnyOfOrNone(all){repeat=True;"
129 "action=SwitchScreen(screen=1,!same);};"
130 "interpret XF86Switch_VT_2+AnyOfOrNone(all){repeat=True;"
131 "action=SwitchScreen(screen=2,!same);};"
132 "interpret XF86Switch_VT_3+AnyOfOrNone(all){repeat=True;"
133 "action=SwitchScreen(screen=3,!same);};"
134 "interpret XF86Switch_VT_4+AnyOfOrNone(all){repeat=True;"
135 "action=SwitchScreen(screen=4,!same);};"
136 "interpret Caps_Lock+AnyOfOrNone(all){action=LockMods(modifiers=Lock);};"
137 "interpret Any+Exactly(Lock){action=LockMods(modifiers=Lock);};"
138 "interpret Any+AnyOf(all){action=SetMods(modifiers=modMapMods,clearLocks);"
139 "};};"
140 "xkb_symbols \"pc_us_inet(evdev)\"{name[group1]=\"English (US)\";"
141 "key<ESC>{[Escape]};key<AE01>{[1,exclam]};key<AE02>{[2,at]};"
142 "key<AE03>{[3,numbersign]};key<AE04>{[4,dollar]};key<AE05>{[5,percent]};"
143 "key<AE06>{[6,asciicircum]};key<AE07>{[7,ampersand]};"
144 "key<AE08>{[8,asterisk]};key<AE09>{[9,parenleft]};"
145 "key<AE10>{[0,parenright]};key<AE11>{[minus,underscore]};"
146 "key<AE12>{[equal,plus]};key<BKSP>{[BackSpace,BackSpace]};"
147 "key<TAB>{[Tab,ISO_Left_Tab]};key<AD01>{[q,Q]};key<AD02>{[w,W]};"
148 "key<AD03>{[e,E]};key<AD04>{[r,R]};key<AD05>{[t,T]};key<AD06>{[y,Y]};"
149 "key<AD07>{[u,U]};key<AD08>{[i,I]};key<AD09>{[o,O]};key<AD10>{[p,P]};"
150 "key<AD11>{[bracketleft,braceleft]};key<AD12>{[bracketright,braceright]};"
151 "key<RTRN>{[Return]};key<LCTL>{[Control_L]};key<AC01>{[a,A]};"
152 "key<AC02>{[s,S]};key<AC03>{[d,D]};key<AC04>{[f,F]};key<AC05>{[g,G]};"
153 "key<AC06>{[h,H]};key<AC07>{[j,J]};key<AC08>{[k,K]};key<AC09>{[l,L]};"
154 "key<AC10>{[semicolon,colon]};key<AC11>{[apostrophe,quotedbl]};"
155 "key<TLDE>{[grave,asciitilde]};key<LFSH>{[Shift_L]};"
156 "key<BKSL>{[backslash,bar]};key<AB01>{[z,Z]};key<AB02>{[x,X]};"
157 "key<AB03>{[c,C]};key<AB04>{[v,V]};key<AB05>{[b,B]};key<AB06>{[n,N]};"
158 "key<AB07>{[m,M]};key<AB08>{[comma,less]};key<AB09>{[period,greater]};"
159 "key<AB10>{[slash,question]};key<RTSH>{[Shift_R]};"
160 "key<KPMU>{[KP_Multiply,KP_Multiply]};key<LALT>{[Alt_L,Meta_L]};"
161 "key<SPCE>{[space]};key<CAPS>{[Caps_Lock]};key<FK01>{[F1,F1]};"
162 "key<FK02>{[F2,F2]};key<FK03>{[F3,F3]};key<FK04>{[F4,F4]};"
163 "key<FK05>{[F5,F5]};key<FK06>{[F6,F6]};key<FK07>{[F7,F7]};"
164 "key<FK08>{[F8,F8]};key<FK09>{[F9,F9]};key<FK10>{[F10,F10]};"
165 "key<FK11>{[F11,F11]};key<FK12>{[F12,F12]};key<FK13>{[F13,F13]};"
166 "key<FK14>{[F14,F14]};key<FK15>{[F15,F15]};key<FK16>{[F16,F16]};"
167 "key<FK17>{[F17,F17]};key<FK18>{[F18,F18]};key<FK19>{[F19,F19]};"
168 "key<FK20>{[F20,F20]};key<FK21>{[F21,F21]};key<FK22>{[F22,F22]};"
169 "key<FK23>{[F23,F23]}; key<FK24>{[F24,F24]};"
170 "key<NMLK>{[Num_Lock]};key<SCLK>{[Scroll_Lock]};"
171 "key<KP7>{[KP_Home,KP_7]};key<KP8>{[KP_Up,KP_8]};key<KP9>{[KP_Prior,KP_9]};"
172 "key<KPSU>{[KP_Subtract,KP_Subtract]};key<KP4>{[KP_Left,KP_4]};"
173 "key<KP5>{[KP_Begin,KP_5]};key<KP6>{[KP_Right,KP_6]};"
174 "key<KPAD>{[KP_Add,KP_Add]};key<KP1>{[KP_End,KP_1]};"
175 "key<KP2>{[KP_Down,KP_2]};key<KP3>{[KP_Next,KP_3]};"
176 "key<KP0>{[KP_Insert,KP_0]};key<KPDL>{[KP_Delete,KP_Decimal]};"
177 "key<LVL3>{[ISO_Level3_Shift]};key<LSGT>{[less,greater, bar,brokenbar]};"
178 "key<FK11>{[F11,F11]};key<FK12>{[F12,F12]};key<KATA>{[Katakana]};"
179 "key<HIRA>{[Hiragana]};key<HENK>{[Henkan_Mode]};"
180 "key<HKTG>{[Hiragana_Katakana]};key<MUHE>{[Muhenkan]};"
181 "key<KPEN>{[KP_Enter]};key<RCTL>{[Control_R]};key<MDSW>{[Mode_switch]};"
182 "key<KPDV>{[KP_Divide,KP_Divide]};key<PRSC>{[Print,Sys_Req]};"
183 "key<RALT>{type=\"TWO_LEVEL\",symbols[Group1]=[Alt_R,Meta_R]};"
184 "key<LNFD>{[Linefeed]};key<HOME>{[Home]};key<UP>{[Up]};key<PGUP>{[Prior]};"
185 "key<LEFT>{[Left]};key<RGHT>{[Right]};key<END>{[End]};key<DOWN>{[Down]};"
186 "key<PGDN>{[Next]};key<INS>{[Insert]};key<DELE>{[Delete]};"
187 "key<MUTE>{[XF86AudioMute]};key<VOL->{[XF86AudioLowerVolume]};"
188 "key<VOL+>{[XF86AudioRaiseVolume]};key<POWR>{[XF86PowerOff]};"
189 "key<ALT>{[NoSymbol,Alt_L]};key<META>{[NoSymbol,Meta_L]};"
190 "key<SUPR>{[NoSymbol,Super_L]};key<HYPR>{[NoSymbol,Hyper_L]};"
191 "key<LWIN>{[Super_L,Super_L]};key<RWIN>{[Super_R,Super_R]};"
192 "modifier_map Control{<LCTL>};modifier_map Shift{<LFSH>};"
193 "modifier_map Shift{<RTSH>};modifier_map Mod1{<LALT>};"
194 "modifier_map Lock{<CAPS>};modifier_map Mod2{<NMLK>};"
195 "modifier_map Mod5{<LVL3>};modifier_map Control{<RCTL>};"
196 "modifier_map Mod1{<RALT>};modifier_map Mod5{<MDSW>};"
197 "modifier_map Mod1{<META>};modifier_map Mod4{<SUPR>};"
198 "modifier_map Mod4{<LWIN>};modifier_map Mod4{<RWIN>};"
199 "modifier_map Mod4{<HYPR>};};};";
200
21 DomKey CharacterToDomKey(base::char16 character) { 201 DomKey CharacterToDomKey(base::char16 character) {
22 switch (character) { 202 switch (character) {
23 case 0x08: 203 case 0x08:
24 return DomKey::BACKSPACE; 204 return DomKey::BACKSPACE;
25 case 0x09: 205 case 0x09:
26 return DomKey::TAB; 206 return DomKey::TAB;
27 case 0x0A: 207 case 0x0A:
28 case 0x0D: 208 case 0x0D:
29 return DomKey::ENTER; 209 return DomKey::ENTER;
30 case 0x1B: 210 case 0x1B:
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 } // anonymous namespace 799 } // anonymous namespace
620 800
621 XkbKeyCodeConverter::XkbKeyCodeConverter() { 801 XkbKeyCodeConverter::XkbKeyCodeConverter() {
622 } 802 }
623 803
624 XkbKeyCodeConverter::~XkbKeyCodeConverter() { 804 XkbKeyCodeConverter::~XkbKeyCodeConverter() {
625 } 805 }
626 806
627 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine( 807 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine(
628 const XkbKeyCodeConverter& converter) 808 const XkbKeyCodeConverter& converter)
629 : key_code_converter_(converter) { 809 : key_code_converter_(converter),
810 weak_ptr_factory_(this) {
630 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES 811 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES
631 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); 812 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES));
632 xkb_context_include_path_append(xkb_context_.get(), 813 xkb_context_include_path_append(xkb_context_.get(),
633 "/usr/share/X11/xkb"); 814 "/usr/share/X11/xkb");
815 xkb_keymap* keymap = xkb_keymap_new_from_string(
816 xkb_context_.get(), us_keymap, XKB_KEYMAP_FORMAT_TEXT_V1,
817 XKB_KEYMAP_COMPILE_NO_FLAGS);
818 current_layout_name_ = "us";
819 xkb_keymaps_[current_layout_name_] = keymap;
820 SetKeymap(keymap);
634 } 821 }
635 822
636 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() { 823 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() {
824 std::map<std::string, xkb_keymap*>::const_iterator it = xkb_keymaps_.begin();
825 for(;it != xkb_keymaps_.end(); ++it) {
spang 2015/01/02 20:16:34 Wrong whitespace, please git cl format.
FengYuan 2015/01/03 17:57:04 Done.
826 xkb_keymap_unref(it->second);
827 }
637 } 828 }
638 829
639 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const { 830 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const {
640 #if defined(OS_CHROMEOS) 831 #if defined(OS_CHROMEOS)
641 return true; 832 return true;
642 #else 833 #else
643 return false; 834 return false;
644 #endif 835 #endif
645 } 836 }
646 837
838 void loadKeymap(const std::string& layout_name,
spang 2015/01/02 20:16:35 LoadKeymap
FengYuan 2015/01/03 17:57:04 Done.
839 scoped_ptr<xkb_rule_names> names,
840 xkb_context* context,
841 scoped_refptr<base::SingleThreadTaskRunner> reply_runner,
842 const LoadKeymapCallback& reply_callback) {
843 xkb_keymap* keymap = xkb_keymap_new_from_names(context,
844 names.get(),
845 XKB_KEYMAP_COMPILE_NO_FLAGS);
846 reply_runner->PostTask(FROM_HERE,
847 base::Bind(reply_callback,
848 layout_name,
849 base::Unretained(keymap)));
spang 2015/01/02 20:16:35 Using base::Unretained() leaks the keymap whenever
FengYuan 2015/01/03 17:57:04 Done.
850 }
851
647 bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName( 852 bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName(
648 const std::string& layout_name) { 853 const std::string& layout_name) {
649 #if defined(OS_CHROMEOS) 854 #if defined(OS_CHROMEOS)
855 current_layout_name_ = layout_name;
856 xkb_keymap* keymap = xkb_keymaps_[layout_name];
857 if (keymap) {
858 SetKeymap(keymap);
spang 2015/01/02 20:16:35 if (keymap) { SetKeyMap(keymap) return true; }
FengYuan 2015/01/03 17:57:04 Done.
859 } else {
860 if (xkb_keymaps_.find(layout_name) != std::map::end)
spang 2015/01/02 20:16:35 I think you meant if (xkb_keymaps_.find(layout_
FengYuan 2015/01/03 17:57:04 Acknowledged.
861 return true;
862 // Inserts layout_name into map to track it is loading.
863 xkb_keymaps_[layout_name] = NULL;
864 if (!ui_task_runner_.get())
865 ui_task_runner_ = base::ThreadTaskRunnerHandle::Get();
866 LoadKeymapCallback reply_callback =
867 base::Bind(&XkbKeyboardLayoutEngine::OnKeymapLoaded,
868 weak_ptr_factory_.GetWeakPtr());
869 scoped_ptr<xkb_rule_names> names = GetXkbRuleNames(layout_name);
870 base::WorkerPool::PostTask(
871 FROM_HERE,
872 base::Bind(&loadKeymap,
873 layout_name,
874 base::Passed(&names),
875 base::Unretained(xkb_context_.get()),
876 ui_task_runner_,
spang 2015/01/02 20:16:35 Just write base::ThreadTaskRunnerHandle::Get()
FengYuan 2015/01/03 17:57:04 Done.
877 reply_callback),
878 true);
879 }
880 return true;
881 #endif // defined(OS_CHROMEOS)
882 return false;
883 }
884
885 scoped_ptr<xkb_rule_names> XkbKeyboardLayoutEngine::GetXkbRuleNames(
886 const std::string& layout_name) {
650 size_t dash_index = layout_name.find('-'); 887 size_t dash_index = layout_name.find('-');
651 size_t parentheses_index = layout_name.find('('); 888 size_t parentheses_index = layout_name.find('(');
652 std::string layout_id = layout_name; 889 std::string layout_id = layout_name;
653 std::string layout_variant = ""; 890 std::string layout_variant = "";
654 if (parentheses_index != std::string::npos) { 891 if (parentheses_index != std::string::npos) {
655 layout_id = layout_name.substr(0, parentheses_index); 892 layout_id = layout_name.substr(0, parentheses_index);
656 size_t close_index = layout_name.find(')', parentheses_index); 893 size_t close_index = layout_name.find(')', parentheses_index);
657 if (close_index == std::string::npos) 894 if (close_index == std::string::npos)
658 close_index = layout_name.size(); 895 close_index = layout_name.size();
659 layout_variant = layout_name.substr(parentheses_index + 1, 896 layout_variant = layout_name.substr(parentheses_index + 1,
660 close_index - parentheses_index - 1); 897 close_index - parentheses_index - 1);
661 } else if (dash_index != std::string::npos) { 898 } else if (dash_index != std::string::npos) {
662 layout_id = layout_name.substr(0, dash_index); 899 layout_id = layout_name.substr(0, dash_index);
663 layout_variant = layout_name.substr(dash_index + 1); 900 layout_variant = layout_name.substr(dash_index + 1);
664 } 901 }
665 struct xkb_rule_names names = { 902 return make_scoped_ptr<xkb_rule_names>(new xkb_rule_names {
666 .rules = NULL, 903 .rules = NULL,
667 .model = "pc101", 904 .model = "pc101",
668 .layout = layout_id.c_str(), 905 .layout = layout_id.c_str(),
669 .variant = layout_variant.c_str(), 906 .variant = layout_variant.c_str(),
670 .options = "" 907 .options = ""
671 }; 908 });
672 xkb_keymap* keymap = xkb_keymap_new_from_names(xkb_context_.get(), 909 }
673 &names, 910
674 XKB_KEYMAP_COMPILE_NO_FLAGS); 911 void XkbKeyboardLayoutEngine::OnKeymapLoaded(
912 const std::string& layout_name, xkb_keymap* keymap) {
675 if (keymap) { 913 if (keymap) {
676 SetKeymap(keymap); 914 xkb_keymaps_[layout_name] = keymap;
spang 2015/01/02 20:16:34 Is it OK caching these indefinitely in a map? I gu
FengYuan 2015/01/03 17:57:04 Done.
677 return true; 915 if (layout_name.compare(current_layout_name_) == 0)
spang 2015/01/02 20:16:35 if (layout_name == current_layout_name_)
FengYuan 2015/01/03 17:57:04 Done.
916 SetKeymap(keymap);
917 } else {
918 // If keymap file failed to load, erase the layout_name from map.
919 xkb_keymaps_.erase(layout_name);
678 } 920 }
679 #endif // defined(OS_CHROMEOS)
680 return false;
681 } 921 }
682 922
683 bool XkbKeyboardLayoutEngine::UsesISOLevel5Shift() const { 923 bool XkbKeyboardLayoutEngine::UsesISOLevel5Shift() const {
684 // NOTIMPLEMENTED(); 924 // NOTIMPLEMENTED();
685 return false; 925 return false;
686 } 926 }
687 927
688 bool XkbKeyboardLayoutEngine::UsesAltGr() const { 928 bool XkbKeyboardLayoutEngine::UsesAltGr() const {
689 // NOTIMPLEMENTED(); 929 // NOTIMPLEMENTED();
690 return false; 930 return false;
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
869 if (flags == base_flags) 1109 if (flags == base_flags)
870 return base_character; 1110 return base_character;
871 xkb_keysym_t keysym; 1111 xkb_keysym_t keysym;
872 base::char16 character = 0; 1112 base::char16 character = 0;
873 if (!XkbLookup(xkb_keycode, flags, &keysym, &character)) 1113 if (!XkbLookup(xkb_keycode, flags, &keysym, &character))
874 character = kNone; 1114 character = kNone;
875 return character; 1115 return character;
876 } 1116 }
877 1117
878 } // namespace ui 1118 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698