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/threading/worker_pool.h" | |
10 #include "ui/events/event_constants.h" | 13 #include "ui/events/event_constants.h" |
11 #include "ui/events/keycodes/dom3/dom_code.h" | 14 #include "ui/events/keycodes/dom3/dom_code.h" |
12 #include "ui/events/keycodes/dom3/dom_key.h" | 15 #include "ui/events/keycodes/dom3/dom_key.h" |
13 #include "ui/events/keycodes/dom4/keycode_converter.h" | 16 #include "ui/events/keycodes/dom4/keycode_converter.h" |
14 #include "ui/events/ozone/layout/layout_util.h" | 17 #include "ui/events/ozone/layout/layout_util.h" |
15 #include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h" | 18 #include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h" |
16 | 19 |
17 namespace ui { | 20 namespace ui { |
18 | 21 |
19 namespace { | 22 namespace { |
20 | 23 |
24 // Fallback keymap - us-qwerty. | |
25 const char* us_keymap = | |
26 "xkb_keymap{" | |
27 "xkb_keycodes \"evdev_aliases(qwerty)\"{minimum=8;maximum=255;" | |
28 "<ESC>=9;<AE01>=10;<AE02>=11;<AE03>=12;<AE04>=13;<AE05>=14;" | |
29 "<AE06>=15;<AE07>=16;<AE08>=17;<AE09>=18;<AE10>=19;<AE11>=20;" | |
30 "<AE12>=21;<BKSP>=22;<TAB>=23;<AD01>=24;<AD02>=25;<AD03>=26;" | |
31 "<AD04>=27;<AD05>=28;<AD06>=29;<AD07>=30;<AD08>=31;<AD09>=32;" | |
32 "<AD10>=33;<AD11>=34;<AD12>=35;<RTRN>=36;<LCTL>=37;<AC01>=38;" | |
33 "<AC02>=39;<AC03>=40;<AC04>=41;<AC05>=42;<AC06>=43;<AC07>=44;" | |
34 "<AC08>=45;<AC09>=46;<AC10>=47;<AC11>=48;<TLDE>=49;<LFSH>=50;" | |
35 "<BKSL>=51;<AB01>=52;<AB02>=53;<AB03>=54;<AB04>=55;<AB05>=56;" | |
36 "<AB06>=57;<AB07>=58;<AB08>=59;<AB09>=60;<AB10>=61;<RTSH>=62;" | |
37 "<KPMU>=63;<LALT>=64;<SPCE>=65;<CAPS>=66;<FK01>=67;<FK02>=68;" | |
38 "<FK03>=69;<FK04>=70;<FK05>=71;<FK06>=72;<FK07>=73;<FK08>=74;" | |
39 "<FK09>=75;<FK10>=76;<FK11>=95;<FK12>=96;<FK13>=191;<FK14>=192;" | |
40 "<FK15>=193;<FK16>=194;<FK17>=195;<FK18>=196;<FK19>=197;<FK20>=198;" | |
41 "<FK21>=199;<FK22>=200;<FK23>=201;<FK24>=202;<LWIN>=133;<RWIN>=134;" | |
42 "<NMLK>=77;<SCLK>=78;<KP7>=79;<KP8>=80;<KP9>=81;<KPSU>=82;<KP4>=83;" | |
43 "<KP5>=84;<KP6>=85;<KPAD>=86;<KP1>=87;<KP2>=88;<KP3>=89;<KP0>=90;" | |
44 "<KPDL>=91;<LVL3>=92;<LSGT>=94;<FK11>=95;<FK12>=96;<KATA>=98;<HIRA>=99;" | |
45 "<HENK>=100;<HKTG>=101;<MUHE>=102;<KPEN>=104;<RCTL>=105;" | |
46 "<KPDV>=106;<PRSC>=107;<RALT>=108;<LNFD>=109;<HOME>=110;<UP>=111;" | |
47 "<PGUP>=112;<LEFT>=113;<RGHT>=114;<END>=115;<DOWN>=116;<PGDN>=117;" | |
48 "<INS>=118;<DELE>=119;<MUTE>=121;<VOL->=122;<VOL+>=123;<POWR>=124;" | |
49 "<MDSW>=203;<ALT>=204;<META>=205;<SUPR>=206;<HYPR>=207;};" | |
50 "xkb_types \"complete\"{virtual_modifiers NumLock,Alt,LevelThree,LAlt," | |
51 "RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;" | |
52 "type \"ONE_LEVEL\"{modifiers=none;level_name[Level1]=\"Any\";};" | |
53 "type \"TWO_LEVEL\"{modifiers=Shift;map[Shift]=Level2;" | |
54 "level_name[Level1]=\"Base\";level_name[Level2]=\"Shift\";};" | |
55 "type \"ALPHABETIC\"{modifiers=Shift+Lock;" | |
56 "map[Shift]=Level2;map[Lock]=Level2;" | |
57 "level_name[Level1]=\"Base\";level_name[Level2]=\"Caps\";};" | |
58 "type \"FOUR_LEVEL\"{modifiers=Shift+LevelThree;map[Shift]=Level2;" | |
59 "map[LevelThree]=Level3;map[Shift+LevelThree]=Level4;" | |
60 "level_name[Level1]=\"Base\";level_name[Level2]=\"Shift\";" | |
61 "level_name[Level3]=\"Alt Base\";level_name[Level4]=\"Shift Alt\";};" | |
62 "type \"KEYPAD\"{modifiers=Shift+NumLock;" | |
63 "map[Shift]=Level2;map[NumLock]=Level2;" | |
64 "level_name[Level1]=\"Base\";level_name[Level2]=\"Number\";};};" | |
65 "xkb_compatibility \"complete\"{virtual_modifiers NumLock,Alt,LevelThree," | |
66 "LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;" | |
67 "interpret.useModMapMods=AnyLevel;interpret.repeat=False;" | |
68 "interpret ISO_Level2_Latch+Exactly(Shift){useModMapMods=level1;" | |
69 "action=LatchMods(modifiers=Shift,clearLocks,latchToLock);};" | |
70 "interpret Shift_Lock+AnyOf(Shift+Lock){action=LockMods(modifiers=Shift);};" | |
71 "interpret Num_Lock+AnyOf(all){virtualModifier=NumLock;" | |
72 "action=LockMods(modifiers=NumLock);};" | |
73 "interpret ISO_Level3_Shift+AnyOf(all){virtualModifier=LevelThree;" | |
74 "useModMapMods=level1;action=SetMods(modifiers=LevelThree,clearLocks);};" | |
75 "interpret ISO_Level3_Latch+AnyOf(all){" | |
76 "virtualModifier=LevelThree;useModMapMods=level1;" | |
77 "action=LatchMods(modifiers=LevelThree,clearLocks,latchToLock);};" | |
78 "interpret ISO_Level3_Lock+AnyOf(all){virtualModifier=LevelThree;" | |
79 "useModMapMods=level1;action=LockMods(modifiers=LevelThree);};" | |
80 "interpret Alt_L+AnyOf(all){virtualModifier=Alt;" | |
81 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
82 "interpret Alt_R+AnyOf(all){virtualModifier=Alt;" | |
83 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
84 "interpret Meta_L+AnyOf(all){virtualModifier=Meta;" | |
85 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
86 "interpret Meta_R+AnyOf(all){virtualModifier=Meta;" | |
87 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
88 "interpret Super_L+AnyOf(all){virtualModifier=Super;" | |
89 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
90 "interpret Super_R+AnyOf(all){virtualModifier=Super;" | |
91 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
92 "interpret Hyper_L+AnyOf(all){virtualModifier=Hyper;" | |
93 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
94 "interpret Hyper_R+AnyOf(all){virtualModifier=Hyper;" | |
95 "action=SetMods(modifiers=modMapMods,clearLocks);};" | |
96 "interpret Mode_switch+AnyOfOrNone(all){virtualModifier=AltGr;" | |
97 "useModMapMods=level1;action=SetGroup(group=+1);};" | |
98 "interpret ISO_Level3_Shift+AnyOfOrNone(all){" | |
99 "action=SetMods(modifiers=LevelThree,clearLocks);};" | |
100 "interpret ISO_Level3_Latch+AnyOfOrNone(all){" | |
101 "action=LatchMods(modifiers=LevelThree,clearLocks,latchToLock);};" | |
102 "interpret ISO_Level3_Lock+AnyOfOrNone(all){" | |
103 "action=LockMods(modifiers=LevelThree);};" | |
104 "interpret Alt_L+AnyOfOrNone(all){" | |
105 "action=SetMods(modifiers=Alt,clearLocks);};" | |
106 "interpret Alt_R+AnyOfOrNone(all){" | |
107 "action=SetMods(modifiers=Alt,clearLocks);};" | |
108 "interpret Meta_L+AnyOfOrNone(all){" | |
109 "action=SetMods(modifiers=Meta,clearLocks);};" | |
110 "interpret Meta_R+AnyOfOrNone(all){" | |
111 "action=SetMods(modifiers=Meta,clearLocks);};" | |
112 "interpret Super_L+AnyOfOrNone(all){" | |
113 "action=SetMods(modifiers=Super,clearLocks);};" | |
114 "interpret Super_R+AnyOfOrNone(all){" | |
115 "action=SetMods(modifiers=Super,clearLocks);};" | |
116 "interpret Hyper_L+AnyOfOrNone(all){" | |
117 "action=SetMods(modifiers=Hyper,clearLocks);};" | |
118 "interpret Hyper_R+AnyOfOrNone(all){" | |
119 "action=SetMods(modifiers=Hyper,clearLocks);};" | |
120 "interpret Shift_L+AnyOfOrNone(all){" | |
121 "action=SetMods(modifiers=Shift,clearLocks);};" | |
122 "interpret XF86Switch_VT_1+AnyOfOrNone(all){repeat=True;" | |
123 "action=SwitchScreen(screen=1,!same);};" | |
124 "interpret XF86Switch_VT_2+AnyOfOrNone(all){repeat=True;" | |
125 "action=SwitchScreen(screen=2,!same);};" | |
126 "interpret XF86Switch_VT_3+AnyOfOrNone(all){repeat=True;" | |
127 "action=SwitchScreen(screen=3,!same);};" | |
128 "interpret XF86Switch_VT_4+AnyOfOrNone(all){repeat=True;" | |
129 "action=SwitchScreen(screen=4,!same);};" | |
130 "interpret Caps_Lock+AnyOfOrNone(all){action=LockMods(modifiers=Lock);};" | |
131 "interpret Any+Exactly(Lock){action=LockMods(modifiers=Lock);};" | |
132 "interpret Any+AnyOf(all){action=SetMods(modifiers=modMapMods,clearLocks);" | |
133 "};};" | |
134 "xkb_symbols \"pc_us_inet(evdev)\"{name[group1]=\"English (US)\";" | |
135 "key<ESC>{[Escape]};key<AE01>{[1,exclam]};key<AE02>{[2,at]};" | |
136 "key<AE03>{[3,numbersign]};key<AE04>{[4,dollar]};key<AE05>{[5,percent]};" | |
137 "key<AE06>{[6,asciicircum]};key<AE07>{[7,ampersand]};" | |
138 "key<AE08>{[8,asterisk]};key<AE09>{[9,parenleft]};" | |
139 "key<AE10>{[0,parenright]};key<AE11>{[minus,underscore]};" | |
140 "key<AE12>{[equal,plus]};key<BKSP>{[BackSpace,BackSpace]};" | |
141 "key<TAB>{[Tab,ISO_Left_Tab]};key<AD01>{[q,Q]};key<AD02>{[w,W]};" | |
142 "key<AD03>{[e,E]};key<AD04>{[r,R]};key<AD05>{[t,T]};key<AD06>{[y,Y]};" | |
143 "key<AD07>{[u,U]};key<AD08>{[i,I]};key<AD09>{[o,O]};key<AD10>{[p,P]};" | |
144 "key<AD11>{[bracketleft,braceleft]};key<AD12>{[bracketright,braceright]};" | |
145 "key<RTRN>{[Return]};key<LCTL>{[Control_L]};key<AC01>{[a,A]};" | |
146 "key<AC02>{[s,S]};key<AC03>{[d,D]};key<AC04>{[f,F]};key<AC05>{[g,G]};" | |
147 "key<AC06>{[h,H]};key<AC07>{[j,J]};key<AC08>{[k,K]};key<AC09>{[l,L]};" | |
148 "key<AC10>{[semicolon,colon]};key<AC11>{[apostrophe,quotedbl]};" | |
149 "key<TLDE>{[grave,asciitilde]};key<LFSH>{[Shift_L]};" | |
150 "key<BKSL>{[backslash,bar]};key<AB01>{[z,Z]};key<AB02>{[x,X]};" | |
151 "key<AB03>{[c,C]};key<AB04>{[v,V]};key<AB05>{[b,B]};key<AB06>{[n,N]};" | |
152 "key<AB07>{[m,M]};key<AB08>{[comma,less]};key<AB09>{[period,greater]};" | |
153 "key<AB10>{[slash,question]};key<RTSH>{[Shift_R]};" | |
154 "key<KPMU>{[KP_Multiply,KP_Multiply]};key<LALT>{[Alt_L,Meta_L]};" | |
155 "key<SPCE>{[space]};key<CAPS>{[Caps_Lock]};key<FK01>{[F1,F1]};" | |
156 "key<FK02>{[F2,F2]};key<FK03>{[F3,F3]};key<FK04>{[F4,F4]};" | |
157 "key<FK05>{[F5,F5]};key<FK06>{[F6,F6]};key<FK07>{[F7,F7]};" | |
158 "key<FK08>{[F8,F8]};key<FK09>{[F9,F9]};key<FK10>{[F10,F10]};" | |
159 "key<FK11>{[F11,F11]};key<FK12>{[F12,F12]};key<FK13>{[F13,F13]};" | |
160 "key<FK14>{[F14,F14]};key<FK15>{[F15,F15]};key<FK16>{[F16,F16]};" | |
161 "key<FK17>{[F17,F17]};key<FK18>{[F18,F18]};key<FK19>{[F19,F19]};" | |
162 "key<FK20>{[F20,F20]};key<FK21>{[F21,F21]};key<FK22>{[F22,F22]};" | |
163 "key<FK23>{[F23,F23]}; key<FK24>{[F24,F24]};" | |
164 "key<NMLK>{[Num_Lock]};key<SCLK>{[Scroll_Lock]};" | |
165 "key<KP7>{[KP_Home,KP_7]};key<KP8>{[KP_Up,KP_8]};key<KP9>{[KP_Prior,KP_9]};" | |
166 "key<KPSU>{[KP_Subtract,KP_Subtract]};key<KP4>{[KP_Left,KP_4]};" | |
167 "key<KP5>{[KP_Begin,KP_5]};key<KP6>{[KP_Right,KP_6]};" | |
168 "key<KPAD>{[KP_Add,KP_Add]};key<KP1>{[KP_End,KP_1]};" | |
169 "key<KP2>{[KP_Down,KP_2]};key<KP3>{[KP_Next,KP_3]};" | |
170 "key<KP0>{[KP_Insert,KP_0]};key<KPDL>{[KP_Delete,KP_Decimal]};" | |
171 "key<LVL3>{[ISO_Level3_Shift]};key<LSGT>{[less,greater, bar,brokenbar]};" | |
172 "key<FK11>{[F11,F11]};key<FK12>{[F12,F12]};key<KATA>{[Katakana]};" | |
173 "key<HIRA>{[Hiragana]};key<HENK>{[Henkan_Mode]};" | |
174 "key<HKTG>{[Hiragana_Katakana]};key<MUHE>{[Muhenkan]};" | |
175 "key<KPEN>{[KP_Enter]};key<RCTL>{[Control_R]};key<MDSW>{[Mode_switch]};" | |
176 "key<KPDV>{[KP_Divide,KP_Divide]};key<PRSC>{[Print,Sys_Req]};" | |
177 "key<RALT>{type=\"TWO_LEVEL\",symbols[Group1]=[Alt_R,Meta_R]};" | |
178 "key<LNFD>{[Linefeed]};key<HOME>{[Home]};key<UP>{[Up]};key<PGUP>{[Prior]};" | |
179 "key<LEFT>{[Left]};key<RGHT>{[Right]};key<END>{[End]};key<DOWN>{[Down]};" | |
180 "key<PGDN>{[Next]};key<INS>{[Insert]};key<DELE>{[Delete]};" | |
181 "key<MUTE>{[XF86AudioMute]};key<VOL->{[XF86AudioLowerVolume]};" | |
182 "key<VOL+>{[XF86AudioRaiseVolume]};key<POWR>{[XF86PowerOff]};" | |
183 "key<ALT>{[NoSymbol,Alt_L]};key<META>{[NoSymbol,Meta_L]};" | |
184 "key<SUPR>{[NoSymbol,Super_L]};key<HYPR>{[NoSymbol,Hyper_L]};" | |
185 "key<LWIN>{[Super_L,Super_L]};key<RWIN>{[Super_R,Super_R]};" | |
186 "modifier_map Control{<LCTL>};modifier_map Shift{<LFSH>};" | |
187 "modifier_map Shift{<RTSH>};modifier_map Mod1{<LALT>};" | |
188 "modifier_map Lock{<CAPS>};modifier_map Mod2{<NMLK>};" | |
189 "modifier_map Mod5{<LVL3>};modifier_map Control{<RCTL>};" | |
190 "modifier_map Mod1{<RALT>};modifier_map Mod5{<MDSW>};" | |
191 "modifier_map Mod1{<META>};modifier_map Mod4{<SUPR>};" | |
192 "modifier_map Mod4{<LWIN>};modifier_map Mod4{<RWIN>};" | |
193 "modifier_map Mod4{<HYPR>};};};"; | |
194 | |
21 DomKey CharacterToDomKey(base::char16 character) { | 195 DomKey CharacterToDomKey(base::char16 character) { |
22 switch (character) { | 196 switch (character) { |
23 case 0x08: | 197 case 0x08: |
24 return DomKey::BACKSPACE; | 198 return DomKey::BACKSPACE; |
25 case 0x09: | 199 case 0x09: |
26 return DomKey::TAB; | 200 return DomKey::TAB; |
27 case 0x0A: | 201 case 0x0A: |
28 case 0x0D: | 202 case 0x0D: |
29 return DomKey::ENTER; | 203 return DomKey::ENTER; |
30 case 0x1B: | 204 case 0x1B: |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
611 {0x016F, VKEY_OEM_1}, // u ring above | 785 {0x016F, VKEY_OEM_1}, // u ring above |
612 {0x0171, VKEY_OEM_5}, // u double acute | 786 {0x0171, VKEY_OEM_5}, // u double acute |
613 {0x01A1, VKEY_OEM_6}, // o horn | 787 {0x01A1, VKEY_OEM_6}, // o horn |
614 {0x01B0, VKEY_OEM_4}, // u horn | 788 {0x01B0, VKEY_OEM_4}, // u horn |
615 {0x01B6, VKEY_OEM_6}, // z stroke | 789 {0x01B6, VKEY_OEM_6}, // z stroke |
616 {0x0259, VKEY_OEM_3}, // schwa | 790 {0x0259, VKEY_OEM_3}, // schwa |
617 }; | 791 }; |
618 | 792 |
619 } // anonymous namespace | 793 } // anonymous namespace |
620 | 794 |
795 XkbKeyboardLayoutEngine::XkbKeymapLoader::XkbKeymapLoader( | |
796 XkbKeyboardLayoutEngine* layout_engine) : layout_engine_(layout_engine) { | |
797 } | |
798 | |
799 void XkbKeyboardLayoutEngine::XkbKeymapLoader::loadKeymap( | |
800 const std::string& layout_name) { | |
801 size_t dash_index = layout_name.find('-'); | |
802 size_t parentheses_index = layout_name.find('('); | |
803 std::string layout_id = layout_name; | |
804 std::string layout_variant = ""; | |
805 if (parentheses_index != std::string::npos) { | |
806 layout_id = layout_name.substr(0, parentheses_index); | |
807 size_t close_index = layout_name.find(')', parentheses_index); | |
808 if (close_index == std::string::npos) | |
809 close_index = layout_name.size(); | |
810 layout_variant = layout_name.substr(parentheses_index + 1, | |
811 close_index - parentheses_index - 1); | |
812 } else if (dash_index != std::string::npos) { | |
813 layout_id = layout_name.substr(0, dash_index); | |
814 layout_variant = layout_name.substr(dash_index + 1); | |
815 } | |
816 names = new xkb_rule_names { | |
817 .rules = NULL, | |
818 .model = "pc101", | |
819 .layout = layout_id.c_str(), | |
820 .variant = layout_variant.c_str(), | |
821 .options = "" | |
822 }; | |
823 base::WorkerPool::PostTask( | |
824 FROM_HERE, | |
825 base::Bind(&XkbKeyboardLayoutEngine::XkbKeymapLoader::startLoadKeymap, | |
826 this, | |
827 layout_name, | |
828 base::Unretained(names)), | |
829 true); | |
830 } | |
831 | |
832 void XkbKeyboardLayoutEngine::XkbKeymapLoader::startLoadKeymap( | |
833 const std::string& layout_name, xkb_rule_names* names) { | |
834 xkb_keymap* keymap = xkb_keymap_new_from_names( | |
835 layout_engine_->xkb_context_.get(), | |
836 names, | |
837 XKB_KEYMAP_COMPILE_NO_FLAGS); | |
838 | |
839 delete names; | |
840 if (keymap) { | |
Shu Chen
2014/12/24 02:18:45
Please move the below block to UI thread via PostT
FengYuan
2014/12/26 02:42:20
Done.
| |
841 layout_engine_->xkb_keymaps_[layout_name] = keymap; | |
842 layout_engine_->SetKeymap(keymap); | |
843 } else { | |
844 // If keymap file failed to load, use the default us-qwerty keymap. | |
845 layout_engine_->SetCurrentLayoutByName("us"); | |
Shu Chen
2014/12/24 02:18:45
It'd be better to do:
if (!keymap)
keymap = lay
FengYuan
2014/12/26 02:42:20
Done.
| |
846 } | |
847 } | |
848 | |
621 XkbKeyCodeConverter::XkbKeyCodeConverter() { | 849 XkbKeyCodeConverter::XkbKeyCodeConverter() { |
622 } | 850 } |
623 | 851 |
624 XkbKeyCodeConverter::~XkbKeyCodeConverter() { | 852 XkbKeyCodeConverter::~XkbKeyCodeConverter() { |
625 } | 853 } |
626 | 854 |
627 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine( | 855 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine( |
628 const XkbKeyCodeConverter& converter) | 856 const XkbKeyCodeConverter& converter) |
629 : key_code_converter_(converter) { | 857 : key_code_converter_(converter) { |
630 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES | 858 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES |
631 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); | 859 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES)); |
632 xkb_context_include_path_append(xkb_context_.get(), | 860 xkb_context_include_path_append(xkb_context_.get(), |
633 "/usr/share/X11/xkb"); | 861 "/usr/share/X11/xkb"); |
862 xkb_keymap* keymap = xkb_keymap_new_from_string( | |
863 xkb_context_.get(), us_keymap, XKB_KEYMAP_FORMAT_TEXT_V1, | |
864 XKB_KEYMAP_COMPILE_NO_FLAGS); | |
865 xkb_keymaps_["us"] = keymap; | |
866 SetKeymap(keymap); | |
634 } | 867 } |
635 | 868 |
636 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() { | 869 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() { |
870 std::map<std::string, xkb_keymap*>::const_iterator it = xkb_keymaps_.begin(); | |
871 for(;it != xkb_keymaps_.end(); ++it) { | |
872 xkb_keymap_unref(it->second); | |
873 } | |
874 if (keymap_loader_) | |
875 delete keymap_loader_; | |
Shu Chen
2014/12/24 02:18:45
Please make keymap_loader_ as scoped_ptr.
FengYuan
2014/12/26 02:42:20
Done.
| |
637 } | 876 } |
638 | 877 |
639 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const { | 878 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const { |
640 #if defined(OS_CHROMEOS) | 879 #if defined(OS_CHROMEOS) |
641 return true; | 880 return true; |
642 #else | 881 #else |
643 return false; | 882 return false; |
644 #endif | 883 #endif |
645 } | 884 } |
646 | 885 |
647 bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName( | 886 bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName( |
648 const std::string& layout_name) { | 887 const std::string& layout_name) { |
649 #if defined(OS_CHROMEOS) | 888 #if defined(OS_CHROMEOS) |
650 size_t dash_index = layout_name.find('-'); | 889 xkb_keymap* keymap = xkb_keymaps_[layout_name]; |
651 size_t parentheses_index = layout_name.find('('); | |
652 std::string layout_id = layout_name; | |
653 std::string layout_variant = ""; | |
654 if (parentheses_index != std::string::npos) { | |
655 layout_id = layout_name.substr(0, parentheses_index); | |
656 size_t close_index = layout_name.find(')', parentheses_index); | |
657 if (close_index == std::string::npos) | |
658 close_index = layout_name.size(); | |
659 layout_variant = layout_name.substr(parentheses_index + 1, | |
660 close_index - parentheses_index - 1); | |
661 } else if (dash_index != std::string::npos) { | |
662 layout_id = layout_name.substr(0, dash_index); | |
663 layout_variant = layout_name.substr(dash_index + 1); | |
664 } | |
665 struct xkb_rule_names names = { | |
666 .rules = NULL, | |
667 .model = "pc101", | |
668 .layout = layout_id.c_str(), | |
669 .variant = layout_variant.c_str(), | |
670 .options = "" | |
671 }; | |
672 xkb_keymap* keymap = xkb_keymap_new_from_names(xkb_context_.get(), | |
673 &names, | |
674 XKB_KEYMAP_COMPILE_NO_FLAGS); | |
675 if (keymap) { | 890 if (keymap) { |
676 SetKeymap(keymap); | 891 SetKeymap(keymap); |
677 return true; | 892 } else { |
893 if (!keymap_loader_) | |
894 keymap_loader_ = new XkbKeymapLoader(this); | |
895 keymap_loader_->loadKeymap(layout_name); | |
678 } | 896 } |
897 return true; | |
679 #endif // defined(OS_CHROMEOS) | 898 #endif // defined(OS_CHROMEOS) |
680 return false; | 899 return false; |
681 } | 900 } |
682 | 901 |
683 bool XkbKeyboardLayoutEngine::UsesISOLevel5Shift() const { | 902 bool XkbKeyboardLayoutEngine::UsesISOLevel5Shift() const { |
684 // NOTIMPLEMENTED(); | 903 // NOTIMPLEMENTED(); |
685 return false; | 904 return false; |
686 } | 905 } |
687 | 906 |
688 bool XkbKeyboardLayoutEngine::UsesAltGr() const { | 907 bool XkbKeyboardLayoutEngine::UsesAltGr() const { |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
869 if (flags == base_flags) | 1088 if (flags == base_flags) |
870 return base_character; | 1089 return base_character; |
871 xkb_keysym_t keysym; | 1090 xkb_keysym_t keysym; |
872 base::char16 character = 0; | 1091 base::char16 character = 0; |
873 if (!XkbLookup(xkb_keycode, flags, &keysym, &character)) | 1092 if (!XkbLookup(xkb_keycode, flags, &keysym, &character)) |
874 character = kNone; | 1093 character = kNone; |
875 return character; | 1094 return character; |
876 } | 1095 } |
877 | 1096 |
878 } // namespace ui | 1097 } // namespace ui |
OLD | NEW |