Skip to content

Commit 5d7af1c

Browse files
Merge pull request #1141 from LedgerHQ/fix-nano-nbgl-keyboard-masking
Fix usage of keys masking in NBGL keyboard for Nano
2 parents 9093a00 + 8f4c286 commit 5d7af1c

File tree

1 file changed

+40
-10
lines changed

1 file changed

+40
-10
lines changed

lib_nbgl/src/nbgl_obj_keyboard_nanos.c

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -238,35 +238,63 @@ static void keyboardDrawRegular(nbgl_keyboard_t *keyboard)
238238
return;
239239
}
240240

241-
const char *keys = keysByMode[keyboard->mode];
242-
uint8_t maxLen = strlen(keys);
241+
// if all keys are masked, exit immediately
242+
if ((keyboard->keyMask & 0x1FFFFFFF) == 0x1FFFFFFF) {
243+
return;
244+
}
245+
246+
const char *keys = keysByMode[keyboard->mode];
247+
uint8_t maxLen = strlen(keys);
248+
char keysToDraw[3] = {0};
249+
250+
// fill the keys to draw in a temporary array, depending of keyMask
251+
// start with central and right ones
252+
uint8_t charIndex = keyboard->selectedCharIndex;
253+
for (i = 1; i < 3; i++) {
254+
while (keyboard->keyMask & (1 << charIndex)) {
255+
charIndex++;
256+
charIndex %= maxLen;
257+
}
258+
keysToDraw[i] = keys[charIndex];
259+
charIndex++;
260+
charIndex %= maxLen;
261+
}
262+
// then left one
263+
charIndex = (keyboard->selectedCharIndex + maxLen - 1) % maxLen;
264+
while (keyboard->keyMask & (1 << charIndex)) {
265+
if (charIndex > 0) {
266+
charIndex--;
267+
}
268+
else {
269+
charIndex = maxLen - 1;
270+
}
271+
}
243272

244273
// mode is defined, so draw the proper 3 letters (or icons)
245274
for (i = 0; i < 3; i++) {
246-
uint8_t charIndex = (keyboard->selectedCharIndex + maxLen - 1 + i) % maxLen;
247-
if (keys[charIndex] == '\r') {
275+
if (keysToDraw[i] == '\r') {
248276
keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
249277
keyboard->obj.area.y0,
250278
(i == 1),
251279
&C_icon_classes);
252280
}
253-
else if (keys[charIndex] == '\n') {
281+
else if (keysToDraw[i] == '\n') {
254282
keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
255283
keyboard->obj.area.y0,
256284
(i == 1),
257285
&C_icon_validate_10);
258286
}
259-
else if (keys[charIndex] == '\b') {
287+
else if (keysToDraw[i] == '\b') {
260288
keyboardDrawIcon(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
261289
keyboard->obj.area.y0,
262290
(i == 1),
263291
&C_icon_backspace);
264292
}
265-
else {
293+
else if (keysToDraw[i] != 0) {
266294
keyboardDrawChar(keyboard->obj.area.x0 + 2 * i * KEYBOARD_KEY_WIDTH,
267295
keyboard->obj.area.y0,
268296
(i == 1),
269-
&keys[charIndex]);
297+
&keysToDraw[i]);
270298
}
271299
}
272300
}
@@ -349,7 +377,8 @@ void nbgl_keyboardCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent)
349377
else {
350378
keyboard->selectedCharIndex = nbMax;
351379
}
352-
} while (keyboard->keyMask & (1 << keyboard->selectedCharIndex));
380+
} while ((keyboard->mode != MODE_NONE)
381+
&& (keyboard->keyMask & (1 << keyboard->selectedCharIndex)));
353382
}
354383
else if (buttonEvent == BUTTON_RIGHT_PRESSED) {
355384
do {
@@ -359,7 +388,8 @@ void nbgl_keyboardCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent)
359388
else {
360389
keyboard->selectedCharIndex = 0;
361390
}
362-
} while (keyboard->keyMask & (1 << keyboard->selectedCharIndex));
391+
} while ((keyboard->mode != MODE_NONE)
392+
&& (keyboard->keyMask & (1 << keyboard->selectedCharIndex)));
363393
}
364394
else {
365395
return;

0 commit comments

Comments
 (0)