Skip to content

Commit 01c286e

Browse files
MposKeyboard: fix crash when changing mode
1 parent 39234d9 commit 01c286e

File tree

1 file changed

+37
-12
lines changed

1 file changed

+37
-12
lines changed

internal_filesystem/lib/mpos/ui/keyboard.py

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def __init__(self, parent):
6060
self._setup_layouts()
6161

6262
# Set default mode to lowercase
63+
self._keyboard.set_map(self.MODE_LOWERCASE, self._lowercase_map, self._lowercase_ctrl)
6364
self._keyboard.set_mode(self.MODE_LOWERCASE)
6465

6566
# Add event handler for custom behavior
@@ -75,44 +76,40 @@ def _setup_layouts(self):
7576
"""Configure all keyboard layout modes."""
7677

7778
# Lowercase letters
78-
lowercase_map = [
79+
self._lowercase_map = [
7980
"q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "\n",
8081
"a", "s", "d", "f", "g", "h", "j", "k", "l", "\n",
8182
lv.SYMBOL.UP, "z", "x", "c", "v", "b", "n", "m", lv.SYMBOL.BACKSPACE, "\n",
8283
self.LABEL_NUMBERS_SPECIALS, ",", self.LABEL_SPACE, ".", lv.SYMBOL.NEW_LINE, None
8384
]
84-
lowercase_ctrl = [10] * len(lowercase_map)
85-
self._keyboard.set_map(self.MODE_LOWERCASE, lowercase_map, lowercase_ctrl)
85+
self._lowercase_ctrl = [10] * len(self._lowercase_map)
8686

8787
# Uppercase letters
88-
uppercase_map = [
88+
self._uppercase_map = [
8989
"Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "\n",
9090
"A", "S", "D", "F", "G", "H", "J", "K", "L", "\n",
9191
lv.SYMBOL.DOWN, "Z", "X", "C", "V", "B", "N", "M", lv.SYMBOL.BACKSPACE, "\n",
9292
self.LABEL_NUMBERS_SPECIALS, ",", self.LABEL_SPACE, ".", lv.SYMBOL.NEW_LINE, None
9393
]
94-
uppercase_ctrl = [10] * len(uppercase_map)
95-
self._keyboard.set_map(self.MODE_UPPERCASE, uppercase_map, uppercase_ctrl)
94+
self._uppercase_ctrl = [10] * len(self._uppercase_map)
9695

9796
# Numbers and common special characters
98-
numbers_map = [
97+
self._numbers_map = [
9998
"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "\n",
10099
"@", "#", "$", "_", "&", "-", "+", "(", ")", "/", "\n",
101100
self.LABEL_SPECIALS, "*", "\"", "'", ":", ";", "!", "?", lv.SYMBOL.BACKSPACE, "\n",
102101
self.LABEL_LETTERS, ",", self.LABEL_SPACE, ".", lv.SYMBOL.NEW_LINE, None
103102
]
104-
numbers_ctrl = [10] * len(numbers_map)
105-
self._keyboard.set_map(self.MODE_NUMBERS, numbers_map, numbers_ctrl)
103+
self._numbers_ctrl = [10] * len(self._numbers_map)
106104

107105
# Additional special characters with emoticons
108-
specials_map = [
106+
self._specials_map = [
109107
"~", "`", "|", "•", ":-)", ";-)", ":-D", "\n",
110108
":-(" , ":'-(", "^", "°", "=", "{", "}", "\\", "\n",
111109
self.LABEL_NUMBERS_SPECIALS, ":-o", ":-P", "[", "]", lv.SYMBOL.BACKSPACE, "\n",
112110
self.LABEL_LETTERS, "<", self.LABEL_SPACE, ">", lv.SYMBOL.NEW_LINE, None
113111
]
114-
specials_ctrl = [10] * len(specials_map)
115-
self._keyboard.set_map(self.MODE_SPECIALS, specials_map, specials_ctrl)
112+
self._specials_ctrl = [10] * len(self._specials_map)
116113

117114
def _handle_events(self, event):
118115
"""
@@ -140,21 +137,25 @@ def _handle_events(self, event):
140137

141138
elif text == lv.SYMBOL.UP:
142139
# Switch to uppercase
140+
self._keyboard.set_map(self.MODE_UPPERCASE, self._uppercase_map, self._uppercase_ctrl)
143141
self._keyboard.set_mode(self.MODE_UPPERCASE)
144142
return # Don't modify text
145143

146144
elif text == lv.SYMBOL.DOWN or text == self.LABEL_LETTERS:
147145
# Switch to lowercase
146+
self._keyboard.set_map(self.MODE_LOWERCASE, self._lowercase_map, self._lowercase_ctrl)
148147
self._keyboard.set_mode(self.MODE_LOWERCASE)
149148
return # Don't modify text
150149

151150
elif text == self.LABEL_NUMBERS_SPECIALS:
152151
# Switch to numbers/specials
152+
self._keyboard.set_map(self.MODE_NUMBERS, self._numbers_map, self._numbers_ctrl)
153153
self._keyboard.set_mode(self.MODE_NUMBERS)
154154
return # Don't modify text
155155

156156
elif text == self.LABEL_SPECIALS:
157157
# Switch to additional specials
158+
self._keyboard.set_map(self.MODE_SPECIALS, self._specials_map, self._specials_ctrl)
158159
self._keyboard.set_mode(self.MODE_SPECIALS)
159160
return # Don't modify text
160161

@@ -178,6 +179,30 @@ def _handle_events(self, event):
178179
# Update textarea
179180
ta.set_text(new_text)
180181

182+
def set_mode(self, mode):
183+
"""
184+
Set keyboard mode with proper map configuration.
185+
186+
This method ensures set_map() is called before set_mode() to prevent
187+
LVGL crashes when switching between custom keyboard modes.
188+
189+
Args:
190+
mode: One of MODE_LOWERCASE, MODE_UPPERCASE, MODE_NUMBERS, MODE_SPECIALS
191+
"""
192+
# Map mode constants to their corresponding map arrays
193+
mode_maps = {
194+
self.MODE_LOWERCASE: (self._lowercase_map, self._lowercase_ctrl),
195+
self.MODE_UPPERCASE: (self._uppercase_map, self._uppercase_ctrl),
196+
self.MODE_NUMBERS: (self._numbers_map, self._numbers_ctrl),
197+
self.MODE_SPECIALS: (self._specials_map, self._specials_ctrl),
198+
}
199+
200+
if mode in mode_maps:
201+
key_map, ctrl_map = mode_maps[mode]
202+
self._keyboard.set_map(mode, key_map, ctrl_map)
203+
204+
self._keyboard.set_mode(mode)
205+
181206
# ========================================================================
182207
# Python magic method for automatic method forwarding
183208
# ========================================================================

0 commit comments

Comments
 (0)