This commit is contained in:
James Whyte 2026-02-01 22:00:15 +00:00 committed by GitHub
commit b430a49aa2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 13 additions and 9 deletions

View File

@ -13,6 +13,9 @@ const char* const KeyboardEntryActivity::keyboard[NUM_ROWS] = {
const char* const KeyboardEntryActivity::keyboardShift[NUM_ROWS] = {"~!@#$%^&*()_+", "QWERTYUIOP{}|", "ASDFGHJKL:\"", const char* const KeyboardEntryActivity::keyboardShift[NUM_ROWS] = {"~!@#$%^&*()_+", "QWERTYUIOP{}|", "ASDFGHJKL:\"",
"ZXCVBNM<>?", "SPECIAL ROW"}; "ZXCVBNM<>?", "SPECIAL ROW"};
// Shift state strings
const char* const KeyboardEntryActivity::shiftString[3] = {"shift", "SHIFT", "LOCK"};
void KeyboardEntryActivity::taskTrampoline(void* param) { void KeyboardEntryActivity::taskTrampoline(void* param) {
auto* self = static_cast<KeyboardEntryActivity*>(param); auto* self = static_cast<KeyboardEntryActivity*>(param);
self->displayTaskLoop(); self->displayTaskLoop();
@ -80,7 +83,7 @@ int KeyboardEntryActivity::getRowLength(const int row) const {
} }
char KeyboardEntryActivity::getSelectedChar() const { char KeyboardEntryActivity::getSelectedChar() const {
const char* const* layout = shiftActive ? keyboardShift : keyboard; const char* const* layout = shiftState ? keyboardShift : keyboard;
if (selectedRow < 0 || selectedRow >= NUM_ROWS) return '\0'; if (selectedRow < 0 || selectedRow >= NUM_ROWS) return '\0';
if (selectedCol < 0 || selectedCol >= getRowLength(selectedRow)) return '\0'; if (selectedCol < 0 || selectedCol >= getRowLength(selectedRow)) return '\0';
@ -92,8 +95,8 @@ void KeyboardEntryActivity::handleKeyPress() {
// Handle special row (bottom row with shift, space, backspace, done) // Handle special row (bottom row with shift, space, backspace, done)
if (selectedRow == SPECIAL_ROW) { if (selectedRow == SPECIAL_ROW) {
if (selectedCol >= SHIFT_COL && selectedCol < SPACE_COL) { if (selectedCol >= SHIFT_COL && selectedCol < SPACE_COL) {
// Shift toggle // Shift toggle (0 = lower case, 1 = upper case, 2 = shift lock)
shiftActive = !shiftActive; shiftState = (shiftState + 1) % 3;
return; return;
} }
@ -130,9 +133,9 @@ void KeyboardEntryActivity::handleKeyPress() {
if (maxLength == 0 || text.length() < maxLength) { if (maxLength == 0 || text.length() < maxLength) {
text += c; text += c;
// Auto-disable shift after typing a letter // Auto-disable shift after typing a character in non-lock mode
if (shiftActive && ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))) { if (shiftState == 1) {
shiftActive = false; shiftState = 0;
} }
} }
} }
@ -297,7 +300,7 @@ void KeyboardEntryActivity::render() const {
constexpr int keyHeight = 18; constexpr int keyHeight = 18;
constexpr int keySpacing = 3; constexpr int keySpacing = 3;
const char* const* layout = shiftActive ? keyboardShift : keyboard; const char* const* layout = shiftState ? keyboardShift : keyboard;
// Calculate left margin to center the longest row (13 keys) // Calculate left margin to center the longest row (13 keys)
constexpr int maxRowWidth = KEYS_PER_ROW * (keyWidth + keySpacing); constexpr int maxRowWidth = KEYS_PER_ROW * (keyWidth + keySpacing);
@ -318,7 +321,7 @@ void KeyboardEntryActivity::render() const {
// SHIFT key (logical col 0, spans 2 key widths) // SHIFT key (logical col 0, spans 2 key widths)
const bool shiftSelected = (selectedRow == 4 && selectedCol >= SHIFT_COL && selectedCol < SPACE_COL); const bool shiftSelected = (selectedRow == 4 && selectedCol >= SHIFT_COL && selectedCol < SPACE_COL);
renderItemWithSelector(currentX + 2, rowY, shiftActive ? "SHIFT" : "shift", shiftSelected); renderItemWithSelector(currentX + 2, rowY, shiftString[shiftState], shiftSelected);
currentX += 2 * (keyWidth + keySpacing); currentX += 2 * (keyWidth + keySpacing);
// Space bar (logical cols 2-6, spans 5 key widths) // Space bar (logical cols 2-6, spans 5 key widths)

View File

@ -70,7 +70,7 @@ class KeyboardEntryActivity : public Activity {
// Keyboard state // Keyboard state
int selectedRow = 0; int selectedRow = 0;
int selectedCol = 0; int selectedCol = 0;
bool shiftActive = false; int shiftState = 0; // 0 = lower case, 1 = upper case, 2 = shift lock)
// Callbacks // Callbacks
OnCompleteCallback onComplete; OnCompleteCallback onComplete;
@ -81,6 +81,7 @@ class KeyboardEntryActivity : public Activity {
static constexpr int KEYS_PER_ROW = 13; // Max keys per row (rows 0 and 1 have 13 keys) static constexpr int KEYS_PER_ROW = 13; // Max keys per row (rows 0 and 1 have 13 keys)
static const char* const keyboard[NUM_ROWS]; static const char* const keyboard[NUM_ROWS];
static const char* const keyboardShift[NUM_ROWS]; static const char* const keyboardShift[NUM_ROWS];
static const char* const shiftString[3];
// Special key positions (bottom row) // Special key positions (bottom row)
static constexpr int SPECIAL_ROW = 4; static constexpr int SPECIAL_ROW = 4;