upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/main/keyboard.c
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-05-19 01:44:11 +0530
committerYour Name <you@example.com>2026-05-19 01:44:11 +0530
commit58a0b5fd115d9687a1292e5e82e6b9fa8454b930 (patch)
treedd9f18903d0237edcf5844c58fcb88bcf737b22c /main/keyboard.c
parent699fc6c03899c3b1ff853d8c7c6cf32173436354 (diff)
Dynamic layout for WiFi setup: landscape rotation, responsive render, highlight feedback
- Render functions use axs15231b_get_width/height() instead of hardcoded coords - render_wifi_setup_list: dynamic item widths, screen-relative cancel button - render_wifi_setup_password: dynamic field/eye/keyboard from kb_get_layout() - render_wifi_setup_result: centered on screen, dynamic button placement - handle_wifi_setup_touch: matching dynamic hit areas, highlight_rect() feedback - Rotation lifecycle: enter_wifi_setup_rotation/exit wired into all entry/exit paths - display_enter_wifi_setup + READY/ERROR touch + SUCCESS auto-return + LIST cancel - Added kb_result_t typedef to keyboard.h (was only in .c) - Fixed test_keyboard.c: use computed offsets from kb_layout_t defaults - All 101 unit tests pass (touch:19, keyboard:46, wifi_setup:36)
Diffstat (limited to 'main/keyboard.c')
-rw-r--r--main/keyboard.c72
1 files changed, 49 insertions, 23 deletions
diff --git a/main/keyboard.c b/main/keyboard.c
index 33365de..d16135f 100644
--- a/main/keyboard.c
+++ b/main/keyboard.c
@@ -28,6 +28,15 @@ static const char *s_numsym[] = {
28#define CTRL_DONE '\004' 28#define CTRL_DONE '\004'
29#define CTRL_BS '\b' 29#define CTRL_BS '\b'
30 30
31static kb_layout_t s_layout = {
32 .key_w = 28,
33 .key_h = 36,
34 .key_gap = 2,
35 .start_y = 70,
36 .screen_w = 320,
37 .row_count = 4,
38};
39
31void kb_state_init(kb_state_t *st) { 40void kb_state_init(kb_state_t *st) {
32 if (!st) return; 41 if (!st) return;
33 memset(st, 0, sizeof(*st)); 42 memset(st, 0, sizeof(*st));
@@ -35,6 +44,14 @@ void kb_state_init(kb_state_t *st) {
35 st->reveal = false; 44 st->reveal = false;
36} 45}
37 46
47void kb_set_layout(const kb_layout_t *layout) {
48 if (layout) s_layout = *layout;
49}
50
51const kb_layout_t *kb_get_layout(void) {
52 return &s_layout;
53}
54
38static const char **get_layer(kb_layer_t layer) { 55static const char **get_layer(kb_layer_t layer) {
39 switch (layer) { 56 switch (layer) {
40 case KB_ALPHA_UPPER: return s_alpha_upper; 57 case KB_ALPHA_UPPER: return s_alpha_upper;
@@ -43,12 +60,8 @@ static const char **get_layer(kb_layer_t layer) {
43 } 60 }
44} 61}
45 62
46static int key_is_ctrl(char c) {
47 return c == CTRL_SHIFT || c == CTRL_LAYER || c == CTRL_SPACE || c == CTRL_DONE || c == CTRL_BS;
48}
49
50int kb_get_row_keys(int row, kb_layer_t layer, const char **keys_out) { 63int kb_get_row_keys(int row, kb_layer_t layer, const char **keys_out) {
51 if (row < 0 || row >= KB_ROW_COUNT) { 64 if (row < 0 || row >= s_layout.row_count) {
52 *keys_out = NULL; 65 *keys_out = NULL;
53 return 0; 66 return 0;
54 } 67 }
@@ -58,46 +71,59 @@ int kb_get_row_keys(int row, kb_layer_t layer, const char **keys_out) {
58 return (int)strlen(row_str); 71 return (int)strlen(row_str);
59} 72}
60 73
61static int row_x_offset(int row) { 74static int row_x_offset(int row, int total_keys) {
75 int kw = s_layout.key_w;
76 int gap = s_layout.key_gap;
77 int total_w = total_keys * kw + (total_keys - 1) * gap;
78 int margin = (s_layout.screen_w - total_w) / 2;
79 if (margin < 2) margin = 2;
62 switch (row) { 80 switch (row) {
63 case 0: return 5; 81 case 0: return margin;
64 case 1: return 14; 82 case 1: return margin + kw / 2;
65 case 2: return 23; 83 case 2: return margin + kw;
66 case 3: return 5; 84 case 3: return margin;
67 default: return 0; 85 default: return margin;
68 } 86 }
69} 87}
70 88
71static int key_width_at(int row, int col, int total_keys) { 89static int key_width_at(int row, int col, int total_keys) {
72 (void)col; 90 int kw = s_layout.key_w;
73 if (row == 3) { 91 if (row == 3) {
74 if (col == 0) return 42; 92 int gap = s_layout.key_gap;
75 if (col == total_keys - 1) return 50; 93 int margin = row_x_offset(3, total_keys);
76 return 168; 94 int available = s_layout.screen_w - margin * 2;
95 int side_w = (available - gap) / 4;
96 if (col == 0) return side_w;
97 if (col == total_keys - 1) return side_w;
98 return available - side_w * 2 - gap * 2;
77 } 99 }
78 return KB_KEY_W; 100 return kw;
79} 101}
80 102
81kb_result_t kb_hit_test(int tx, int ty, kb_layer_t layer) { 103kb_result_t kb_hit_test(int tx, int ty, kb_layer_t layer) {
82 kb_result_t result = {KB_ACTION_NONE, 0}; 104 kb_result_t result = {KB_ACTION_NONE, 0};
105 int sy = s_layout.start_y;
106 int kw = s_layout.key_w;
107 int kh = s_layout.key_h;
108 int gap = s_layout.key_gap;
83 109
84 if (ty < KB_START_Y || ty >= KB_START_Y + KB_ROW_COUNT * (KB_KEY_H + KB_KEY_GAP)) { 110 if (ty < sy || ty >= sy + s_layout.row_count * (kh + gap)) {
85 return result; 111 return result;
86 } 112 }
87 113
88 int row = (ty - KB_START_Y) / (KB_KEY_H + KB_KEY_GAP); 114 int row = (ty - sy) / (kh + gap);
89 if (row < 0 || row >= KB_ROW_COUNT) return result; 115 if (row < 0 || row >= s_layout.row_count) return result;
90 116
91 const char *row_str; 117 const char *row_str;
92 int total_keys = kb_get_row_keys(row, layer, &row_str); 118 int total_keys = kb_get_row_keys(row, layer, &row_str);
93 if (total_keys == 0) return result; 119 if (total_keys == 0) return result;
94 120
95 int x_off = row_x_offset(row); 121 int x_off = row_x_offset(row, total_keys);
96 int cx = x_off; 122 int cx = x_off;
97 123
98 for (int col = 0; col < total_keys; col++) { 124 for (int col = 0; col < total_keys; col++) {
99 int kw = key_width_at(row, col, total_keys); 125 int key_w = key_width_at(row, col, total_keys);
100 if (tx >= cx && tx < cx + kw) { 126 if (tx >= cx && tx < cx + key_w) {
101 char c = row_str[col]; 127 char c = row_str[col];
102 if (c == CTRL_SHIFT) { 128 if (c == CTRL_SHIFT) {
103 result.action = KB_ACTION_SHIFT; 129 result.action = KB_ACTION_SHIFT;
@@ -116,7 +142,7 @@ kb_result_t kb_hit_test(int tx, int ty, kb_layer_t layer) {
116 } 142 }
117 return result; 143 return result;
118 } 144 }
119 cx += kw + KB_KEY_GAP; 145 cx += key_w + gap;
120 } 146 }
121 147
122 return result; 148 return result;