@@ -238,35 +238,63 @@ static void keyboardDrawRegular(nbgl_keyboard_t *keyboard)
238
238
return ;
239
239
}
240
240
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
+ }
243
272
244
273
// mode is defined, so draw the proper 3 letters (or icons)
245
274
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' ) {
248
276
keyboardDrawIcon (keyboard -> obj .area .x0 + 2 * i * KEYBOARD_KEY_WIDTH ,
249
277
keyboard -> obj .area .y0 ,
250
278
(i == 1 ),
251
279
& C_icon_classes );
252
280
}
253
- else if (keys [ charIndex ] == '\n' ) {
281
+ else if (keysToDraw [ i ] == '\n' ) {
254
282
keyboardDrawIcon (keyboard -> obj .area .x0 + 2 * i * KEYBOARD_KEY_WIDTH ,
255
283
keyboard -> obj .area .y0 ,
256
284
(i == 1 ),
257
285
& C_icon_validate_10 );
258
286
}
259
- else if (keys [ charIndex ] == '\b' ) {
287
+ else if (keysToDraw [ i ] == '\b' ) {
260
288
keyboardDrawIcon (keyboard -> obj .area .x0 + 2 * i * KEYBOARD_KEY_WIDTH ,
261
289
keyboard -> obj .area .y0 ,
262
290
(i == 1 ),
263
291
& C_icon_backspace );
264
292
}
265
- else {
293
+ else if ( keysToDraw [ i ] != 0 ) {
266
294
keyboardDrawChar (keyboard -> obj .area .x0 + 2 * i * KEYBOARD_KEY_WIDTH ,
267
295
keyboard -> obj .area .y0 ,
268
296
(i == 1 ),
269
- & keys [ charIndex ]);
297
+ & keysToDraw [ i ]);
270
298
}
271
299
}
272
300
}
@@ -349,7 +377,8 @@ void nbgl_keyboardCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent)
349
377
else {
350
378
keyboard -> selectedCharIndex = nbMax ;
351
379
}
352
- } while (keyboard -> keyMask & (1 << keyboard -> selectedCharIndex ));
380
+ } while ((keyboard -> mode != MODE_NONE )
381
+ && (keyboard -> keyMask & (1 << keyboard -> selectedCharIndex )));
353
382
}
354
383
else if (buttonEvent == BUTTON_RIGHT_PRESSED ) {
355
384
do {
@@ -359,7 +388,8 @@ void nbgl_keyboardCallback(nbgl_obj_t *obj, nbgl_buttonEvent_t buttonEvent)
359
388
else {
360
389
keyboard -> selectedCharIndex = 0 ;
361
390
}
362
- } while (keyboard -> keyMask & (1 << keyboard -> selectedCharIndex ));
391
+ } while ((keyboard -> mode != MODE_NONE )
392
+ && (keyboard -> keyMask & (1 << keyboard -> selectedCharIndex )));
363
393
}
364
394
else {
365
395
return ;
0 commit comments