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

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

Issue 778503002: XKB implementation of Ozone key layout. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@x430194-layout
Patch Set: fix boneheaded license paste Created 6 years 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h"
6
7 #include <xkbcommon/xkbcommon-names.h>
8
9 #include "base/logging.h"
10 #include "ui/events/event_constants.h"
11 #include "ui/events/keycodes/dom3/dom_key.h"
12 #include "ui/events/keycodes/dom4/keycode_converter.h"
13 #include "ui/events/ozone/layout/layout_util.h"
14 #include "ui/events/ozone/layout/xkb/xkb_keyboard_code_conversion.h"
15
16 namespace ui {
17
18 namespace {
19
20 // Temporarily hard-code an initial layout to test libxkbcommon.
21 // TODO: remove this after SetCurrentLayoutByName() is implemented.
22 const char* temporary_initial_keymap =
23 "xkb_keymap{"
24 "xkb_keycodes \"evdev_aliases(qwerty)\"{minimum=8;maximum=255;"
25 "<ESC>=9;<AE01>=10;<AE02>=11;<AE03>=12;<AE04>=13;<AE05>=14;"
26 "<AE06>=15;<AE07>=16;<AE08>=17;<AE09>=18;<AE10>=19;<AE11>=20;"
27 "<AE12>=21;<BKSP>=22;<TAB>=23;<AD01>=24;<AD02>=25;<AD03>=26;"
28 "<AD04>=27;<AD05>=28;<AD06>=29;<AD07>=30;<AD08>=31;<AD09>=32;"
29 "<AD10>=33;<AD11>=34;<AD12>=35;<RTRN>=36;<LCTL>=37;<AC01>=38;"
30 "<AC02>=39;<AC03>=40;<AC04>=41;<AC05>=42;<AC06>=43;<AC07>=44;"
31 "<AC08>=45;<AC09>=46;<AC10>=47;<AC11>=48;<TLDE>=49;<LFSH>=50;"
32 "<BKSL>=51;<AB01>=52;<AB02>=53;<AB03>=54;<AB04>=55;<AB05>=56;"
33 "<AB06>=57;<AB07>=58;<AB08>=59;<AB09>=60;<AB10>=61;<RTSH>=62;"
34 "<KPMU>=63;<LALT>=64;<SPCE>=65;<CAPS>=66;<FK01>=67;<FK02>=68;"
35 "<FK03>=69;<FK04>=70;<FK05>=71;<FK06>=72;<FK07>=73;<FK08>=74;"
36 "<FK09>=75;<FK10>=76;<FK11>=95;<FK12>=96;<FK13>=191;<FK14>=192;"
37 "<FK15>=193;<FK16>=194;<FK17>=195;<FK18>=196;<FK19>=197;<FK20>=198;"
38 "<FK21>=199;<FK22>=200;<FK23>=201;<FK24>=202;<LWIN>=133;<RWIN>=134;"
39 "<NMLK>=77;<SCLK>=78;<KP7>=79;<KP8>=80;<KP9>=81;<KPSU>=82;<KP4>=83;"
40 "<KP5>=84;<KP6>=85;<KPAD>=86;<KP1>=87;<KP2>=88;<KP3>=89;<KP0>=90;"
41 "<KPDL>=91;<LVL3>=92;<LSGT>=94;<FK11>=95;<FK12>=96;<KATA>=98;<HIRA>=99;"
42 "<HENK>=100;<HKTG>=101;<MUHE>=102;<KPEN>=104;<RCTL>=105;"
43 "<KPDV>=106;<PRSC>=107;<RALT>=108;<LNFD>=109;<HOME>=110;<UP>=111;"
44 "<PGUP>=112;<LEFT>=113;<RGHT>=114;<END>=115;<DOWN>=116;<PGDN>=117;"
45 "<INS>=118;<DELE>=119;<MUTE>=121;<VOL->=122;<VOL+>=123;<POWR>=124;"
46 "<MDSW>=203;<ALT>=204;<META>=205;<SUPR>=206;<HYPR>=207;};"
47 "xkb_types \"complete\"{virtual_modifiers NumLock,Alt,LevelThree,LAlt,"
48 "RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;"
49 "type \"ONE_LEVEL\"{modifiers=none;level_name[Level1]=\"Any\";};"
50 "type \"TWO_LEVEL\"{modifiers=Shift;map[Shift]=Level2;"
51 "level_name[Level1]=\"Base\";level_name[Level2]=\"Shift\";};"
52 "type \"ALPHABETIC\"{modifiers=Shift+Lock;"
53 "map[Shift]=Level2;map[Lock]=Level2;"
54 "level_name[Level1]=\"Base\";level_name[Level2]=\"Caps\";};"
55 "type \"FOUR_LEVEL\"{modifiers=Shift+LevelThree;map[Shift]=Level2;"
56 "map[LevelThree]=Level3;map[Shift+LevelThree]=Level4;"
57 "level_name[Level1]=\"Base\";level_name[Level2]=\"Shift\";"
58 "level_name[Level3]=\"Alt Base\";level_name[Level4]=\"Shift Alt\";};"
59 "type \"KEYPAD\"{modifiers=Shift+NumLock;"
60 "map[Shift]=Level2;map[NumLock]=Level2;"
61 "level_name[Level1]=\"Base\";level_name[Level2]=\"Number\";};};"
62 "xkb_compatibility \"complete\"{virtual_modifiers NumLock,Alt,LevelThree,"
63 "LAlt,RAlt,RControl,LControl,ScrollLock,LevelFive,AltGr,Meta,Super,Hyper;"
64 "interpret.useModMapMods=AnyLevel;interpret.repeat=False;"
65 "interpret ISO_Level2_Latch+Exactly(Shift){useModMapMods=level1;"
66 "action=LatchMods(modifiers=Shift,clearLocks,latchToLock);};"
67 "interpret Shift_Lock+AnyOf(Shift+Lock){action=LockMods(modifiers=Shift);};"
68 "interpret Num_Lock+AnyOf(all){virtualModifier=NumLock;"
69 "action=LockMods(modifiers=NumLock);};"
70 "interpret ISO_Level3_Shift+AnyOf(all){virtualModifier=LevelThree;"
71 "useModMapMods=level1;action=SetMods(modifiers=LevelThree,clearLocks);};"
72 "interpret ISO_Level3_Latch+AnyOf(all){"
73 "virtualModifier=LevelThree;useModMapMods=level1;"
74 "action=LatchMods(modifiers=LevelThree,clearLocks,latchToLock);};"
75 "interpret ISO_Level3_Lock+AnyOf(all){virtualModifier=LevelThree;"
76 "useModMapMods=level1;action=LockMods(modifiers=LevelThree);};"
77 "interpret Alt_L+AnyOf(all){virtualModifier=Alt;"
78 "action=SetMods(modifiers=modMapMods,clearLocks);};"
79 "interpret Alt_R+AnyOf(all){virtualModifier=Alt;"
80 "action=SetMods(modifiers=modMapMods,clearLocks);};"
81 "interpret Meta_L+AnyOf(all){virtualModifier=Meta;"
82 "action=SetMods(modifiers=modMapMods,clearLocks);};"
83 "interpret Meta_R+AnyOf(all){virtualModifier=Meta;"
84 "action=SetMods(modifiers=modMapMods,clearLocks);};"
85 "interpret Super_L+AnyOf(all){virtualModifier=Super;"
86 "action=SetMods(modifiers=modMapMods,clearLocks);};"
87 "interpret Super_R+AnyOf(all){virtualModifier=Super;"
88 "action=SetMods(modifiers=modMapMods,clearLocks);};"
89 "interpret Hyper_L+AnyOf(all){virtualModifier=Hyper;"
90 "action=SetMods(modifiers=modMapMods,clearLocks);};"
91 "interpret Hyper_R+AnyOf(all){virtualModifier=Hyper;"
92 "action=SetMods(modifiers=modMapMods,clearLocks);};"
93 "interpret Mode_switch+AnyOfOrNone(all){virtualModifier=AltGr;"
94 "useModMapMods=level1;action=SetGroup(group=+1);};"
95 "interpret ISO_Level3_Shift+AnyOfOrNone(all){"
96 "action=SetMods(modifiers=LevelThree,clearLocks);};"
97 "interpret ISO_Level3_Latch+AnyOfOrNone(all){"
98 "action=LatchMods(modifiers=LevelThree,clearLocks,latchToLock);};"
99 "interpret ISO_Level3_Lock+AnyOfOrNone(all){"
100 "action=LockMods(modifiers=LevelThree);};"
101 "interpret Alt_L+AnyOfOrNone(all){"
102 "action=SetMods(modifiers=Alt,clearLocks);};"
103 "interpret Alt_R+AnyOfOrNone(all){"
104 "action=SetMods(modifiers=Alt,clearLocks);};"
105 "interpret Meta_L+AnyOfOrNone(all){"
106 "action=SetMods(modifiers=Meta,clearLocks);};"
107 "interpret Meta_R+AnyOfOrNone(all){"
108 "action=SetMods(modifiers=Meta,clearLocks);};"
109 "interpret Super_L+AnyOfOrNone(all){"
110 "action=SetMods(modifiers=Super,clearLocks);};"
111 "interpret Super_R+AnyOfOrNone(all){"
112 "action=SetMods(modifiers=Super,clearLocks);};"
113 "interpret Hyper_L+AnyOfOrNone(all){"
114 "action=SetMods(modifiers=Hyper,clearLocks);};"
115 "interpret Hyper_R+AnyOfOrNone(all){"
116 "action=SetMods(modifiers=Hyper,clearLocks);};"
117 "interpret Shift_L+AnyOfOrNone(all){"
118 "action=SetMods(modifiers=Shift,clearLocks);};"
119 "interpret XF86Switch_VT_1+AnyOfOrNone(all){repeat=True;"
120 "action=SwitchScreen(screen=1,!same);};"
121 "interpret XF86Switch_VT_2+AnyOfOrNone(all){repeat=True;"
122 "action=SwitchScreen(screen=2,!same);};"
123 "interpret XF86Switch_VT_3+AnyOfOrNone(all){repeat=True;"
124 "action=SwitchScreen(screen=3,!same);};"
125 "interpret XF86Switch_VT_4+AnyOfOrNone(all){repeat=True;"
126 "action=SwitchScreen(screen=4,!same);};"
127 "interpret Caps_Lock+AnyOfOrNone(all){action=LockMods(modifiers=Lock);};"
128 "interpret Any+Exactly(Lock){action=LockMods(modifiers=Lock);};"
129 "interpret Any+AnyOf(all){action=SetMods(modifiers=modMapMods,clearLocks);"
130 "};};"
131 "xkb_symbols \"pc_us_inet(evdev)\"{name[group1]=\"English (US)\";"
132 "key<ESC>{[Escape]};key<AE01>{[1,exclam]};key<AE02>{[2,at]};"
133 "key<AE03>{[3,numbersign]};key<AE04>{[4,dollar]};key<AE05>{[5,percent]};"
134 "key<AE06>{[6,asciicircum]};key<AE07>{[7,ampersand]};"
135 "key<AE08>{[8,asterisk]};key<AE09>{[9,parenleft]};"
136 "key<AE10>{[0,parenright]};key<AE11>{[minus,underscore]};"
137 "key<AE12>{[equal,plus]};key<BKSP>{[BackSpace,BackSpace]};"
138 "key<TAB>{[Tab,ISO_Left_Tab]};key<AD01>{[q,Q]};key<AD02>{[w,W]};"
139 "key<AD03>{[e,E]};key<AD04>{[r,R]};key<AD05>{[t,T]};key<AD06>{[y,Y]};"
140 "key<AD07>{[u,U]};key<AD08>{[i,I]};key<AD09>{[o,O]};key<AD10>{[p,P]};"
141 "key<AD11>{[bracketleft,braceleft]};key<AD12>{[bracketright,braceright]};"
142 "key<RTRN>{[Return]};key<LCTL>{[Control_L]};key<AC01>{[a,A]};"
143 "key<AC02>{[s,S]};key<AC03>{[d,D]};key<AC04>{[f,F]};key<AC05>{[g,G]};"
144 "key<AC06>{[h,H]};key<AC07>{[j,J]};key<AC08>{[k,K]};key<AC09>{[l,L]};"
145 "key<AC10>{[semicolon,colon]};key<AC11>{[apostrophe,quotedbl]};"
146 "key<TLDE>{[grave,asciitilde]};key<LFSH>{[Shift_L]};"
147 "key<BKSL>{[backslash,bar]};key<AB01>{[z,Z]};key<AB02>{[x,X]};"
148 "key<AB03>{[c,C]};key<AB04>{[v,V]};key<AB05>{[b,B]};key<AB06>{[n,N]};"
149 "key<AB07>{[m,M]};key<AB08>{[comma,less]};key<AB09>{[period,greater]};"
150 "key<AB10>{[slash,question]};key<RTSH>{[Shift_R]};"
151 "key<KPMU>{[KP_Multiply,KP_Multiply]};key<LALT>{[Alt_L,Meta_L]};"
152 "key<SPCE>{[space]};key<CAPS>{[Caps_Lock]};key<FK01>{[F1,F1]};"
153 "key<FK02>{[F2,F2]};key<FK03>{[F3,F3]};key<FK04>{[F4,F4]};"
154 "key<FK05>{[F5,F5]};key<FK06>{[F6,F6]};key<FK07>{[F7,F7]};"
155 "key<FK08>{[F8,F8]};key<FK09>{[F9,F9]};key<FK10>{[F10,F10]};"
156 "key<FK11>{[F11,F11]};key<FK12>{[F12,F12]};key<FK13>{[F13,F13]};"
157 "key<FK14>{[F14,F14]};key<FK15>{[F15,F15]};key<FK16>{[F16,F16]};"
158 "key<FK17>{[F17,F17]};key<FK18>{[F18,F18]};key<FK19>{[F19,F19]};"
159 "key<FK20>{[F20,F20]};key<FK21>{[F21,F21]};key<FK22>{[F22,F22]};"
160 "key<FK23>{[F23,F23]}; key<FK24>{[F24,F24]};"
161 "key<NMLK>{[Num_Lock]};key<SCLK>{[Scroll_Lock]};"
162 "key<KP7>{[KP_Home,KP_7]};key<KP8>{[KP_Up,KP_8]};key<KP9>{[KP_Prior,KP_9]};"
163 "key<KPSU>{[KP_Subtract,KP_Subtract]};key<KP4>{[KP_Left,KP_4]};"
164 "key<KP5>{[KP_Begin,KP_5]};key<KP6>{[KP_Right,KP_6]};"
165 "key<KPAD>{[KP_Add,KP_Add]};key<KP1>{[KP_End,KP_1]};"
166 "key<KP2>{[KP_Down,KP_2]};key<KP3>{[KP_Next,KP_3]};"
167 "key<KP0>{[KP_Insert,KP_0]};key<KPDL>{[KP_Delete,KP_Decimal]};"
168 "key<LVL3>{[ISO_Level3_Shift]};key<LSGT>{[less,greater, bar,brokenbar]};"
169 "key<FK11>{[F11,F11]};key<FK12>{[F12,F12]};key<KATA>{[Katakana]};"
170 "key<HIRA>{[Hiragana]};key<HENK>{[Henkan_Mode]};"
171 "key<HKTG>{[Hiragana_Katakana]};key<MUHE>{[Muhenkan]};"
172 "key<KPEN>{[KP_Enter]};key<RCTL>{[Control_R]};key<MDSW>{[Mode_switch]};"
173 "key<KPDV>{[KP_Divide,KP_Divide]};key<PRSC>{[Print,Sys_Req]};"
174 "key<RALT>{type=\"TWO_LEVEL\",symbols[Group1]=[Alt_R,Meta_R]};"
175 "key<LNFD>{[Linefeed]};key<HOME>{[Home]};key<UP>{[Up]};key<PGUP>{[Prior]};"
176 "key<LEFT>{[Left]};key<RGHT>{[Right]};key<END>{[End]};key<DOWN>{[Down]};"
177 "key<PGDN>{[Next]};key<INS>{[Insert]};key<DELE>{[Delete]};"
178 "key<MUTE>{[XF86AudioMute]};key<VOL->{[XF86AudioLowerVolume]};"
179 "key<VOL+>{[XF86AudioRaiseVolume]};key<POWR>{[XF86PowerOff]};"
180 "key<ALT>{[NoSymbol,Alt_L]};key<META>{[NoSymbol,Meta_L]};"
181 "key<SUPR>{[NoSymbol,Super_L]};key<HYPR>{[NoSymbol,Hyper_L]};"
182 "key<LWIN>{[Super_L,Super_L]};key<RWIN>{[Super_R,Super_R]};"
183 "modifier_map Control{<LCTL>};modifier_map Shift{<LFSH>};"
184 "modifier_map Shift{<RTSH>};modifier_map Mod1{<LALT>};"
185 "modifier_map Lock{<CAPS>};modifier_map Mod2{<NMLK>};"
186 "modifier_map Mod5{<LVL3>};modifier_map Control{<RCTL>};"
187 "modifier_map Mod1{<RALT>};modifier_map Mod5{<MDSW>};"
188 "modifier_map Mod1{<META>};modifier_map Mod4{<SUPR>};"
189 "modifier_map Mod4{<LWIN>};modifier_map Mod4{<RWIN>};"
190 "modifier_map Mod4{<HYPR>};};};";
191
192 DomKey CharacterToDomKey(base::char16 character) {
193 switch (character) {
194 case 0x08:
195 return DomKey::BACKSPACE;
196 case 0x09:
197 return DomKey::TAB;
198 case 0x0A:
199 case 0x0D:
200 return DomKey::ENTER;
201 case 0x1B:
202 return DomKey::ESCAPE;
203 default:
204 return DomKey::CHARACTER;
205 }
206 }
207
208 KeyboardCode DifficultKeyboardCode(DomCode dom_code,
209 int flags,
210 DomKey dom_key,
211 base::char16 character) {
212 // TODO(kpschoedel): correct key_code for non-US layouts along the lines
213 // of KeyboardCodeFromXKeyEvent()
214 return DomCodeToKeyboardCode(dom_code);
215 }
216
217 } // anonymous namespace
218
219 XkbKeyCodeConverter::XkbKeyCodeConverter() {
220 }
221
222 XkbKeyCodeConverter::~XkbKeyCodeConverter() {
223 }
224
225 XkbKeyboardLayoutEngine::XkbKeyboardLayoutEngine(
226 const XkbKeyCodeConverter& converter)
227 : key_code_converter_(converter) {
228 // TODO: add XKB_CONTEXT_NO_ENVIRONMENT_NAMES
229 xkb_context_.reset(xkb_context_new(XKB_CONTEXT_NO_DEFAULT_INCLUDES));
230
231 // Temporary initial keymap to avoid file I/O on initialization.
232 // TODO: remove this after SetCurrentLayoutByName() is implemented.
233 xkb_keymap* keymap = xkb_keymap_new_from_string(
234 xkb_context_.get(), temporary_initial_keymap, XKB_KEYMAP_FORMAT_TEXT_V1,
235 XKB_KEYMAP_COMPILE_NO_FLAGS);
236 SetKeymap(keymap);
237 }
238
239 XkbKeyboardLayoutEngine::~XkbKeyboardLayoutEngine() {
240 }
241
242 bool XkbKeyboardLayoutEngine::CanSetCurrentLayout() const {
243 #if defined(OS_CHROMEOS)
244 return true;
245 #else
246 return false;
247 #endif
248 }
249
250 bool XkbKeyboardLayoutEngine::SetCurrentLayoutByName(
251 const std::string& layout_name) {
252 #if defined(OS_CHROMEOS)
253 // TODO(fengyuan)
254 // End successful set with SetKeymap(keymap) to update other fields.
255 return false;
256 #else
257 return false;
258 #endif
259 }
260
261 bool XkbKeyboardLayoutEngine::UsesISOLevel5Shift() const {
262 // NOTIMPLEMENTED();
263 return false;
264 }
265
266 bool XkbKeyboardLayoutEngine::UsesAltGr() const {
267 // NOTIMPLEMENTED();
268 return false;
269 }
270
271 bool XkbKeyboardLayoutEngine::Lookup(DomCode dom_code,
272 int flags,
273 DomKey* dom_key,
274 base::char16* character,
275 KeyboardCode* key_code) const {
276 xkb_keycode_t xkb_keycode = key_code_converter_.DomCodeToXkbKeyCode(dom_code);
277 if (xkb_keycode == key_code_converter_.InvalidXkbKeyCode()) {
278 LOG(ERROR) << "No XKB keycode for DomCode 0x" << std::hex
279 << static_cast<int>(dom_code) << " '"
280 << KeycodeConverter::DomCodeToCodeString(dom_code) << "'";
281 return false;
282 }
283 xkb_mod_mask_t xkb_flags = EventFlagsToXkbFlags(flags);
284 xkb_keysym_t xkb_keysym;
285 if (!XkbLookup(xkb_keycode, xkb_flags, &xkb_keysym, character))
286 return false;
287 *dom_key = XkbKeySymToDomKey(xkb_keysym);
288 if (*dom_key == DomKey::NONE) {
289 *dom_key = CharacterToDomKey(*character);
290 *key_code = DifficultKeyboardCode(dom_code, flags, *dom_key, *character);
291 } else if (*dom_key == DomKey::DEAD) {
292 *character = XkbKeySymDeadKey(xkb_keysym);
293 *key_code = DomCodeToKeyboardCode(dom_code);
294 } else {
295 *key_code = NonPrintableDomKeyToKeyboardCode(*dom_key);
296 if (*key_code == VKEY_UNKNOWN)
297 *key_code = DomCodeToKeyboardCode(dom_code);
298 }
299 return true;
300 }
301
302 void XkbKeyboardLayoutEngine::SetKeymap(xkb_keymap* keymap) {
303 xkb_state_.reset(xkb_state_new(keymap));
304 // Update flag map.
305 static const struct {
306 int ui_flag;
307 const char* xkb_name;
308 } flags[] = {{ui::EF_CONTROL_DOWN, XKB_MOD_NAME_CTRL},
309 {ui::EF_SHIFT_DOWN, XKB_MOD_NAME_SHIFT},
310 {ui::EF_ALT_DOWN, XKB_MOD_NAME_ALT},
311 {ui::EF_CAPS_LOCK_DOWN, XKB_MOD_NAME_CAPS},
312 {ui::EF_COMMAND_DOWN, XKB_MOD_NAME_LOGO},
313 {ui::EF_NUMPAD_KEY, XKB_MOD_NAME_NUM},
314 {ui::EF_MOD3_DOWN, "Mod3"},
315 {ui::EF_ALTGR_DOWN, "Mod5"}};
316 xkb_flag_map_.clear();
317 xkb_flag_map_.resize(arraysize(flags));
318 for (size_t i = 0; i < arraysize(flags); ++i) {
319 xkb_mod_index_t index = xkb_keymap_mod_get_index(keymap, flags[i].xkb_name);
320 if (index == XKB_MOD_INVALID) {
321 DVLOG(3) << "XKB keyboard layout does not contain " << flags[i].xkb_name;
322 } else {
323 xkb_mod_mask_t flag = static_cast<xkb_mod_mask_t>(1) << index;
324 XkbFlagMapEntry e = {flags[i].ui_flag, flag};
325 xkb_flag_map_.push_back(e);
326 }
327 }
328 }
329
330 xkb_mod_mask_t XkbKeyboardLayoutEngine::EventFlagsToXkbFlags(
331 int ui_flags) const {
332 xkb_mod_mask_t xkb_flags = 0;
333 for (const auto& entry : xkb_flag_map_) {
334 if (ui_flags & entry.ui_flag)
335 xkb_flags |= entry.xkb_flag;
336 }
337 return xkb_flags;
338 }
339
340 bool XkbKeyboardLayoutEngine::XkbLookup(xkb_keycode_t xkb_keycode,
341 xkb_mod_mask_t xkb_flags,
342 xkb_keysym_t* xkb_keysym,
343 base::char16* character) const {
344 if (!xkb_state_) {
345 LOG(ERROR) << "No current XKB state";
346 return false;
347 }
348 xkb_state_update_mask(xkb_state_.get(), xkb_flags, 0, 0, 0, 0, 0);
349 *xkb_keysym = xkb_state_key_get_one_sym(xkb_state_.get(), xkb_keycode);
350 if (*xkb_keysym == XKB_KEY_NoSymbol)
351 return false;
352 uint32_t c = xkb_state_key_get_utf32(xkb_state_.get(), xkb_keycode);
353 DLOG_IF(ERROR, c != (c & 0xFFFF)) << "Non-BMP character:" << c;
354 *character = static_cast<base::char16>(c);
355 return true;
356 }
357
358 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.h ('k') | ui/ozone/platform/dri/ozone_platform_dri.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698