diff --git a/src/activities/util/KeyboardEntryActivity.cpp b/src/activities/util/KeyboardEntryActivity.cpp index 3a6befac..e419953b 100644 --- a/src/activities/util/KeyboardEntryActivity.cpp +++ b/src/activities/util/KeyboardEntryActivity.cpp @@ -13,6 +13,9 @@ const char* const KeyboardEntryActivity::keyboard[NUM_ROWS] = { const char* const KeyboardEntryActivity::keyboardShift[NUM_ROWS] = {"~!@#$%^&*()_+", "QWERTYUIOP{}|", "ASDFGHJKL:\"", "ZXCVBNM<>?", "SPECIAL ROW"}; +// Shift state strings +const char* const KeyboardEntryActivity::shiftString[3] = {"shift", "SHIFT", "LOCK"}; + void KeyboardEntryActivity::taskTrampoline(void* param) { auto* self = static_cast(param); self->displayTaskLoop(); @@ -80,7 +83,7 @@ int KeyboardEntryActivity::getRowLength(const int row) 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 (selectedCol < 0 || selectedCol >= getRowLength(selectedRow)) return '\0'; @@ -92,8 +95,8 @@ void KeyboardEntryActivity::handleKeyPress() { // Handle special row (bottom row with shift, space, backspace, done) if (selectedRow == SPECIAL_ROW) { if (selectedCol >= SHIFT_COL && selectedCol < SPACE_COL) { - // Shift toggle - shiftActive = !shiftActive; + // Shift toggle (0 = lower case, 1 = upper case, 2 = shift lock) + shiftState = (shiftState + 1) % 3; return; } @@ -130,9 +133,9 @@ void KeyboardEntryActivity::handleKeyPress() { if (maxLength == 0 || text.length() < maxLength) { text += c; - // Auto-disable shift after typing a letter - if (shiftActive && ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))) { - shiftActive = false; + // Auto-disable shift after typing a character in non-lock mode + if (shiftState == 1) { + shiftState = 0; } } } @@ -297,7 +300,7 @@ void KeyboardEntryActivity::render() const { constexpr int keyHeight = 18; 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) 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) 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); // Space bar (logical cols 2-6, spans 5 key widths) diff --git a/src/activities/util/KeyboardEntryActivity.h b/src/activities/util/KeyboardEntryActivity.h index 1c1b1f3e..0f05bae5 100644 --- a/src/activities/util/KeyboardEntryActivity.h +++ b/src/activities/util/KeyboardEntryActivity.h @@ -70,7 +70,7 @@ class KeyboardEntryActivity : public Activity { // Keyboard state int selectedRow = 0; int selectedCol = 0; - bool shiftActive = false; + int shiftState = 0; // 0 = lower case, 1 = upper case, 2 = shift lock) // Callbacks 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 const char* const keyboard[NUM_ROWS]; static const char* const keyboardShift[NUM_ROWS]; + static const char* const shiftString[3]; // Special key positions (bottom row) static constexpr int SPECIAL_ROW = 4;