diff options
Diffstat (limited to 'main/keyboard.c')
| -rw-r--r-- | main/keyboard.c | 72 |
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 | ||
| 31 | static 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 | |||
| 31 | void kb_state_init(kb_state_t *st) { | 40 | void 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 | ||
| 47 | void kb_set_layout(const kb_layout_t *layout) { | ||
| 48 | if (layout) s_layout = *layout; | ||
| 49 | } | ||
| 50 | |||
| 51 | const kb_layout_t *kb_get_layout(void) { | ||
| 52 | return &s_layout; | ||
| 53 | } | ||
| 54 | |||
| 38 | static const char **get_layer(kb_layer_t layer) { | 55 | static 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 | ||
| 46 | static 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 | |||
| 50 | int kb_get_row_keys(int row, kb_layer_t layer, const char **keys_out) { | 63 | int 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 | ||
| 61 | static int row_x_offset(int row) { | 74 | static 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 | ||
| 71 | static int key_width_at(int row, int col, int total_keys) { | 89 | static 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 | ||
| 81 | kb_result_t kb_hit_test(int tx, int ty, kb_layer_t layer) { | 103 | kb_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; |