OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |