Skip to content

Commit a98c5b8

Browse files
author
Jamie C. Driver
committed
gui: update wordlist active/selected keyboard buttons atomically
1 parent ed2a565 commit a98c5b8

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

main/gui.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -515,6 +515,36 @@ static void select_action(gui_activity_t* activity)
515515
}
516516
}
517517

518+
// Mark a collection of nodes as active or inactive, select one, and redraw the entire activity.
519+
void gui_activity_set_active_selection(gui_activity_t* activity, gui_view_node_t** nodes, const size_t num_nodes,
520+
const bool* active, gui_view_node_t* selected)
521+
{
522+
JADE_ASSERT(activity);
523+
JADE_ASSERT(nodes);
524+
JADE_ASSERT(num_nodes);
525+
JADE_ASSERT(active);
526+
JADE_ASSERT(selected);
527+
528+
bool set_selected = false;
529+
JADE_SEMAPHORE_TAKE(gui_mutex);
530+
for (size_t i = 0; i < num_nodes; ++i) {
531+
JADE_ASSERT(nodes[i]->activity == activity);
532+
set_tree_active(nodes[i], active[i]);
533+
if (nodes[i] == selected) {
534+
JADE_ASSERT(active[i]); // can only select active node
535+
gui_select_node(nodes[i]);
536+
set_selected = true;
537+
}
538+
}
539+
JADE_SEMAPHORE_GIVE(gui_mutex);
540+
541+
// 'selected' should have been seen in 'nodes'
542+
JADE_ASSERT(set_selected);
543+
544+
// May as well repaint the whole activity
545+
gui_repaint(activity->root_node);
546+
}
547+
518548
// push a selectable element to the `selectables` list of `activity`
519549
static void push_selectable(gui_activity_t* activity, gui_view_node_t* node, uint16_t x, uint16_t y)
520550
{

main/gui.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,8 @@ bool gui_activity_wait_event(gui_activity_t* activity, const char* event_base, u
455455

456456
void gui_set_activity_initial_selection(gui_view_node_t* node);
457457
void gui_set_active(gui_view_node_t* node, bool value);
458-
void gui_select_node(gui_view_node_t* node);
458+
void gui_activity_set_active_selection(
459+
gui_activity_t* activity, gui_view_node_t** nodes, size_t num_nodes, const bool* active, gui_view_node_t* selected);
459460

460461
void gui_set_activity_title(gui_activity_t* activity, const char* title);
461462

main/process/mnemonic.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -489,16 +489,21 @@ static void enable_relevant_chars(const bool is_mnemonic, const char* word, cons
489489
JADE_ASSERT(num_enabled > 0);
490490

491491
// Select a random active letter as the selected one
492-
uint8_t selected = get_uniform_random_byte(num_enabled);
492+
uint8_t iselected = get_uniform_random_byte(num_enabled);
493+
gui_view_node_t* selected = NULL;
493494
for (size_t i = 0; i < btns_len; ++i) {
494495
JADE_ASSERT(btns[i]->activity == act);
495-
gui_set_active(btns[i], enabled[i]);
496496

497-
// If we haven't set a selected item yet, set it now
498-
if (enabled[i] && !selected--) {
499-
gui_select_node(btns[i]);
497+
// Set item to select
498+
if (enabled[i] && !iselected--) {
499+
JADE_ASSERT(!selected);
500+
selected = btns[i];
500501
}
501502
}
503+
JADE_ASSERT(selected);
504+
505+
// Update the ui
506+
gui_activity_set_active_selection(act, btns, btns_len, enabled, selected);
502507
}
503508

504509
// NOTE: only the English wordlist is supported.

0 commit comments

Comments
 (0)