You've already forked MicroPythonOS
mirror of
https://github.com/m5stack/MicroPythonOS.git
synced 2026-05-20 11:51:27 -07:00
Compatibility fixes for LVGL 9.3
This commit is contained in:
@@ -1,3 +1,7 @@
|
||||
0.1.0
|
||||
=====
|
||||
- Update to MicroPython 1.25.1 and LVGL 9.3
|
||||
|
||||
0.0.11
|
||||
======
|
||||
- Merge official Fri3d Camp 2024 Badge support
|
||||
|
||||
@@ -97,7 +97,7 @@ class CameraApp(Activity):
|
||||
self.status_label_cont.set_style_border_width(0, 0)
|
||||
self.status_label = lv.label(self.status_label_cont)
|
||||
self.status_label.set_text("No camera found.")
|
||||
self.status_label.set_long_mode(lv.label.LONG.WRAP)
|
||||
self.status_label.set_long_mode(lv.label.LONG_MODE.WRAP)
|
||||
self.status_label.set_width(lv.pct(100))
|
||||
self.status_label.center()
|
||||
self.setContentView(main_screen)
|
||||
|
||||
@@ -92,10 +92,10 @@ class IMU(Activity):
|
||||
gx = 45
|
||||
gy = 50
|
||||
gz = 55
|
||||
self.sliderx.set_value(axp, lv.ANIM.OFF)
|
||||
self.slidery.set_value(ayp, lv.ANIM.OFF)
|
||||
self.sliderz.set_value(azp, lv.ANIM.OFF)
|
||||
self.slidergx.set_value(gx, lv.ANIM.OFF)
|
||||
self.slidergy.set_value(gy, lv.ANIM.OFF)
|
||||
self.slidergz.set_value(gz, lv.ANIM.OFF)
|
||||
self.sliderx.set_value(axp, False)
|
||||
self.slidery.set_value(ayp, False)
|
||||
self.sliderz.set_value(azp, False)
|
||||
self.slidergx.set_value(gx, False)
|
||||
self.slidergy.set_value(gy, False)
|
||||
self.slidergz.set_value(gz, False)
|
||||
|
||||
|
||||
@@ -14,8 +14,8 @@ import mpos.clipboard
|
||||
TFT_HOR_RES=320
|
||||
TFT_VER_RES=240
|
||||
|
||||
TFT_HOR_RES=640
|
||||
TFT_VER_RES=480
|
||||
#TFT_HOR_RES=640
|
||||
#TFT_VER_RES=480
|
||||
|
||||
# 4:3 DVD resolution:
|
||||
#TFT_HOR_RES=720
|
||||
@@ -33,6 +33,385 @@ TFT_VER_RES=480
|
||||
#TFT_HOR_RES=1920
|
||||
#TFT_VER_RES=1080
|
||||
|
||||
# Copyright (c) 2024 - 2025 Kevin G. Schlosser
|
||||
|
||||
from micropython import const # NOQA
|
||||
import micropython # NOQA # NOQA
|
||||
import keypad_framework
|
||||
|
||||
KEY_UNKNOWN = 0
|
||||
KEY_BACKSPACE = 8 # LV_KEY_BACKSPACE
|
||||
KEY_TAB = 9 # LV_KEY_NEXT
|
||||
KEY_CLEAR = 12
|
||||
KEY_RETURN = 13 # LV_KEY_ENTER
|
||||
KEY_PAUSE = 19 #
|
||||
KEY_ESCAPE = 27 # LV_KEY_ESC
|
||||
KEY_SPACE = 32 # " "
|
||||
KEY_EXCLAIM = 33 # !
|
||||
KEY_QUOTEDBL = 34 # "
|
||||
KEY_HASH = 35 # #
|
||||
KEY_DOLLAR = 36 # $
|
||||
KEY_AMPERSAND = 38 # &
|
||||
KEY_QUOTE = 39 # '
|
||||
KEY_LEFTPAREN = 40 # (
|
||||
KEY_RIGHTPAREN = 41 # )
|
||||
KEY_ASTERISK = 42 # *
|
||||
KEY_PLUS = 43 # +
|
||||
KEY_COMMA = 44 # ,
|
||||
KEY_MINUS = 45 # -
|
||||
KEY_PERIOD = 46 # .
|
||||
KEY_SLASH = 47 # /
|
||||
|
||||
KEY_0 = 48 # 0
|
||||
KEY_1 = 49 # 1
|
||||
KEY_2 = 50 # 2
|
||||
KEY_3 = 51 # 3
|
||||
KEY_4 = 52 # 4
|
||||
KEY_5 = 53 # 5
|
||||
KEY_6 = 54 # 6
|
||||
KEY_7 = 55 # 7
|
||||
KEY_8 = 56 # 8
|
||||
KEY_9 = 57 # 9
|
||||
|
||||
KEY_COLON = 58 # :
|
||||
KEY_SEMICOLON = 59 # ;
|
||||
KEY_LESS = 60 # <
|
||||
KEY_EQUALS = 61 # =
|
||||
KEY_GREATER = 62 # >
|
||||
KEY_QUESTION = 63 # ?
|
||||
KEY_AT = 64 # @
|
||||
KEY_LEFTBRACKET = 91 # [
|
||||
KEY_BACKSLASH = 92 # \
|
||||
KEY_RIGHTBRACKET = 93 # ]
|
||||
KEY_CARET = 94 # ^
|
||||
KEY_UNDERSCORE = 95 # _
|
||||
KEY_BACKQUOTE = 96 # `
|
||||
KEY_a = 97 # a
|
||||
KEY_z = 122 # z
|
||||
KEY_DELETE = 127 # LV_KEY_DEL
|
||||
|
||||
# Numeric keypad
|
||||
# if MOD_KEY_NUM then it's numbers.
|
||||
|
||||
KEYPAD_0 = 256 # 0/INS
|
||||
KEYPAD_1 = 257 # 1/END LV_KEY_END
|
||||
KEYPAD_2 = 258 # 2/DOWN LV_KEY_DOWN
|
||||
KEYPAD_3 = 259 # 3/PAGEDOWN
|
||||
KEYPAD_4 = 260 # 4/LEFT LV_KEY_LEFT
|
||||
KEYPAD_5 = 261 # 5
|
||||
KEYPAD_6 = 262 # 6/RIGHT LV_KEY_RIGHT
|
||||
KEYPAD_7 = 263 # 7/HOME LV_KEY_HOME
|
||||
KEYPAD_8 = 264 # 8/UP LV_KEY_UP
|
||||
KEYPAD_9 = 265 # 9/PAGEUP
|
||||
KEYPAD_PERIOD = 266 # ./DEL LV_KEY_DEL
|
||||
KEYPAD_DIVIDE = 267 # /
|
||||
KEYPAD_MULTIPLY = 268 # *
|
||||
KEYPAD_MINUS = 269 # -
|
||||
KEYPAD_PLUS = 270 # +
|
||||
KEYPAD_ENTER = 271 # LV_KEY_ENTER
|
||||
KEYPAD_EQUALS = 272 # =
|
||||
|
||||
# Arrows + Home/End pad
|
||||
|
||||
KEY_UP = 273 # LV_KEY_UP
|
||||
KEY_DOWN = 274 # LV_KEY_DOWN
|
||||
KEY_RIGHT = 275 # LV_KEY_RIGHT
|
||||
KEY_LEFT = 276 # LV_KEY_LEFT
|
||||
KEY_INSERT = 277
|
||||
KEY_HOME = 278 # LV_KEY_HOME
|
||||
KEY_END = 279 # LV_KEY_END
|
||||
KEY_PAGEUP = 280
|
||||
KEY_PAGEDOWN = 281
|
||||
|
||||
KEY_F1 = 282
|
||||
KEY_F2 = 283
|
||||
KEY_F3 = 284
|
||||
KEY_F4 = 285
|
||||
KEY_F5 = 286
|
||||
KEY_F6 = 287
|
||||
KEY_F7 = 288
|
||||
KEY_F8 = 289
|
||||
KEY_F9 = 290
|
||||
KEY_F10 = 291
|
||||
KEY_F11 = 292
|
||||
KEY_F12 = 293
|
||||
KEY_F13 = 294
|
||||
KEY_F14 = 295
|
||||
KEY_F15 = 296
|
||||
|
||||
KEY_NUMLOCK = 300
|
||||
KEY_CAPSLOCK = 301
|
||||
KEY_SCROLLOCK = 302
|
||||
KEY_RSHIFT = 303
|
||||
KEY_LSHIFT = 304
|
||||
KEY_RCTRL = 305
|
||||
KEY_LCTRL = 306
|
||||
KEY_RALT = 307
|
||||
KEY_LALT = 308
|
||||
KEY_RMETA = 309
|
||||
KEY_LMETA = 310
|
||||
|
||||
# Left "Windows" key
|
||||
KEY_LSUPER = 311
|
||||
|
||||
# Right "Windows" key
|
||||
KEY_RSUPER = 312
|
||||
|
||||
# Alt Gr" key
|
||||
KEY_MODE = 313
|
||||
# Multi-key compose key
|
||||
KEY_COMPOSE = 314
|
||||
|
||||
KEY_HELP = 315
|
||||
KEY_PRINT = 316
|
||||
KEY_SYSREQ = 317
|
||||
KEY_BREAK = 318
|
||||
KEY_MENU = 319
|
||||
# Power Macintosh power key
|
||||
KEY_POWER = 320
|
||||
# Some european keyboards
|
||||
KEY_EURO = 321
|
||||
# Atari keyboard has Undo
|
||||
KEY_UNDO = 322
|
||||
|
||||
MOD_KEY_NONE = 0x0000
|
||||
MOD_KEY_LSHIFT = 0x0001
|
||||
MOD_KEY_RSHIFT = 0x0002
|
||||
MOD_KEY_LCTRL = 0x0040
|
||||
MOD_KEY_RCTRL = 0x0080
|
||||
MOD_KEY_LALT = 0x0100
|
||||
MOD_KEY_RALT = 0x0200
|
||||
MOD_KEY_LMETA = 0x0400
|
||||
MOD_KEY_RMETA = 0x0800
|
||||
MOD_KEY_NUM = 0x1000
|
||||
MOD_KEY_CAPS = 0x2000
|
||||
MOD_KEY_MODE = 0x4000
|
||||
MOD_KEY_CTRL = MOD_KEY_LCTRL | MOD_KEY_RCTRL
|
||||
MOD_KEY_SHIFT = MOD_KEY_LSHIFT | MOD_KEY_RSHIFT
|
||||
MOD_KEY_ALT = MOD_KEY_LALT | MOD_KEY_RALT
|
||||
MOD_KEY_META = MOD_KEY_LMETA | MOD_KEY_RMETA
|
||||
|
||||
# SDL keycode ranges
|
||||
SDL_NAV_KEY_START = 1073741897 # Insert
|
||||
SDL_NAV_KEY_END = 1073741906 # Down Arrow
|
||||
SDL_FUNC_KEY_START = 1073741882 # F1
|
||||
SDL_FUNC_KEY_END = 1073741893 # F12
|
||||
SDL_KEYPAD_KEY_START = 1073741908 # Keypad /
|
||||
SDL_KEYPAD_KEY_END = 1073741923 # Keypad .
|
||||
|
||||
# Shift key mappings for QWERTY layout
|
||||
SHIFT_KEY_MAP = {
|
||||
KEY_1: KEY_EXCLAIM, # 1 -> !
|
||||
KEY_2: KEY_AT, # 2 -> @
|
||||
KEY_3: KEY_HASH, # 3 -> #
|
||||
KEY_4: KEY_DOLLAR, # 4 -> $
|
||||
KEY_5: 37, # 5 -> % (ASCII 37)
|
||||
KEY_6: KEY_CARET, # 6 -> ^
|
||||
KEY_7: KEY_AMPERSAND, # 7 -> &
|
||||
KEY_8: KEY_ASTERISK, # 8 -> *
|
||||
KEY_9: KEY_LEFTPAREN, # 9 -> (
|
||||
KEY_0: KEY_RIGHTPAREN, # 0 -> )
|
||||
KEY_MINUS: KEY_UNDERSCORE, # - -> _
|
||||
KEY_EQUALS: KEY_PLUS, # = -> +
|
||||
KEY_LEFTBRACKET: 123, # [ -> { (ASCII 123)
|
||||
KEY_RIGHTBRACKET: 125, # ] -> } (ASCII 125)
|
||||
KEY_BACKSLASH: 124, # \ -> | (ASCII 124)
|
||||
KEY_SEMICOLON: KEY_COLON, # ; -> :
|
||||
KEY_QUOTE: KEY_QUOTEDBL, # ' -> "
|
||||
KEY_COMMA: KEY_LESS, # , -> <
|
||||
KEY_PERIOD: KEY_GREATER, # . -> >
|
||||
KEY_SLASH: KEY_QUESTION, # / -> ?
|
||||
KEY_BACKQUOTE: 126, # ` -> ~ (ASCII 126)
|
||||
}
|
||||
|
||||
|
||||
class MySDLKeyboard(keypad_framework.KeypadDriver):
|
||||
|
||||
def __init__(self, *args, **kwargs): # NOQA
|
||||
super().__init__()
|
||||
self.__last_key = -1
|
||||
self.__current_state = self.RELEASED
|
||||
|
||||
self.group = lv.group_create()
|
||||
self.group.set_default() # NOQA
|
||||
self.set_group(self.group)
|
||||
self.set_mode(lv.INDEV_MODE.EVENT) # NOQA
|
||||
|
||||
self._py_disp_drv._data_bus.register_keypad_callback(self._keypad_cb) # NOQA
|
||||
|
||||
self.paste_text_callback = None
|
||||
|
||||
def set_paste_text_callback(self, callback):
|
||||
self.paste_text_callback = callback
|
||||
|
||||
def set_mode(self, mode):
|
||||
self._indev_drv.set_mode(mode) # NOQA
|
||||
|
||||
def _keypad_cb(self, *args):
|
||||
if len(args) == 5: # Special case for paste
|
||||
_, state, key, mod, clipboard_text = args
|
||||
print(f"got clipboard paste arg: {clipboard_text}")
|
||||
if self.paste_text_callback and state == 1 and key == 118 and mod & MOD_KEY_CTRL: # CTRL-V
|
||||
self.paste_text_callback(clipboard_text)
|
||||
return
|
||||
else:
|
||||
_, state, key, mod = args
|
||||
print(f"sdl_keyboard.py _keypad_cb got {_}, {state} {key} {mod}")
|
||||
|
||||
# Skip modifier keys and SDL-specific large keycodes (>= 2^30), except keypad, nav, and func keys
|
||||
if (key in {KEY_LSHIFT, KEY_RSHIFT, KEY_LCTRL, KEY_RCTRL, KEY_LALT, KEY_RALT,
|
||||
KEY_LMETA, KEY_RMETA, KEY_LSUPER, KEY_RSUPER, KEY_MODE, KEY_COMPOSE,
|
||||
KEY_NUMLOCK, KEY_CAPSLOCK, KEY_SCROLLOCK} or
|
||||
(key >= 1 << 30 and not (SDL_NAV_KEY_START <= key <= SDL_NAV_KEY_END or
|
||||
SDL_FUNC_KEY_START <= key <= SDL_FUNC_KEY_END or
|
||||
SDL_KEYPAD_KEY_START <= key <= SDL_KEYPAD_KEY_END))):
|
||||
self.__last_key = -1 # Do not send modifier keys to LVGL
|
||||
return
|
||||
|
||||
if key == KEY_PAUSE:
|
||||
return
|
||||
|
||||
# Handle numeric keypad keys (SDL keycodes and original KEYPAD_* range)
|
||||
if (KEYPAD_0 <= key <= KEYPAD_EQUALS or
|
||||
SDL_KEYPAD_KEY_START <= key <= SDL_KEYPAD_KEY_END):
|
||||
if mod & MOD_KEY_NUM:
|
||||
mapping = {
|
||||
KEYPAD_0: KEY_0,
|
||||
KEYPAD_1: KEY_1,
|
||||
KEYPAD_2: KEY_2,
|
||||
KEYPAD_3: KEY_3,
|
||||
KEYPAD_4: KEY_4,
|
||||
KEYPAD_5: KEY_5,
|
||||
KEYPAD_6: KEY_6,
|
||||
KEYPAD_7: KEY_7,
|
||||
KEYPAD_8: KEY_8,
|
||||
KEYPAD_9: KEY_9,
|
||||
KEYPAD_PERIOD: KEY_PERIOD,
|
||||
KEYPAD_DIVIDE: KEY_SLASH,
|
||||
KEYPAD_MULTIPLY: KEY_ASTERISK,
|
||||
KEYPAD_MINUS: KEY_MINUS,
|
||||
KEYPAD_PLUS: KEY_PLUS,
|
||||
KEYPAD_ENTER: KEY_EQUALS,
|
||||
KEYPAD_EQUALS: KEY_EQUALS,
|
||||
1073741908: KEY_SLASH, # Keypad /
|
||||
1073741909: KEY_ASTERISK, # Keypad *
|
||||
1073741910: KEY_MINUS, # Keypad -
|
||||
1073741911: KEY_PLUS, # Keypad +
|
||||
1073741912: lv.KEY.ENTER, # Keypad ENTER
|
||||
1073741913: KEY_1, # Keypad 1
|
||||
1073741914: KEY_2, # Keypad 2
|
||||
1073741915: KEY_3, # Keypad 3
|
||||
1073741916: KEY_4, # Keypad 4
|
||||
1073741917: KEY_5, # Keypad 5
|
||||
1073741918: KEY_6, # Keypad 6
|
||||
1073741919: KEY_7, # Keypad 7
|
||||
1073741920: KEY_8, # Keypad 8
|
||||
1073741921: KEY_9, # Keypad 9
|
||||
1073741922: KEY_0, # Keypad 0
|
||||
1073741923: KEY_PERIOD # Keypad .
|
||||
}
|
||||
else:
|
||||
mapping = {
|
||||
KEYPAD_0: KEY_INSERT,
|
||||
KEYPAD_1: lv.KEY.END, # NOQA
|
||||
KEYPAD_2: lv.KEY.DOWN, # NOQA
|
||||
KEYPAD_3: lv.KEY.PREV, # NOQA
|
||||
KEYPAD_4: lv.KEY.LEFT, # NOQA
|
||||
KEYPAD_5: KEY_5,
|
||||
KEYPAD_6: lv.KEY.RIGHT, # NOQA
|
||||
KEYPAD_7: lv.KEY.HOME, # NOQA
|
||||
KEYPAD_8: lv.KEY.UP, # NOQA
|
||||
KEYPAD_9: lv.KEY.NEXT, # NOQA
|
||||
KEYPAD_PERIOD: lv.KEY.DEL, # NOQA
|
||||
KEYPAD_DIVIDE: KEY_SLASH,
|
||||
KEYPAD_MULTIPLY: KEY_ASTERISK,
|
||||
KEYPAD_MINUS: KEY_MINUS,
|
||||
KEYPAD_PLUS: KEY_PLUS,
|
||||
KEYPAD_ENTER: lv.KEY.ENTER, # NOQA
|
||||
KEYPAD_EQUALS: KEY_EQUALS,
|
||||
1073741908: KEY_SLASH, # Keypad /
|
||||
1073741909: KEY_ASTERISK, # Keypad *
|
||||
1073741910: KEY_MINUS, # Keypad -
|
||||
1073741911: KEY_PLUS, # Keypad +
|
||||
1073741912: lv.KEY.ENTER, # Keypad ENTER
|
||||
1073741913: lv.KEY.END, # Keypad 1
|
||||
1073741914: lv.KEY.DOWN, # Keypad 2
|
||||
1073741915: lv.KEY.PREV, # Keypad 3
|
||||
1073741916: lv.KEY.LEFT, # Keypad 4
|
||||
1073741917: KEY_5, # Keypad 5
|
||||
1073741918: lv.KEY.RIGHT, # Keypad 6
|
||||
1073741919: lv.KEY.HOME, # Keypad 7
|
||||
1073741920: lv.KEY.UP, # Keypad 8
|
||||
1073741921: lv.KEY.NEXT, # Keypad 9
|
||||
1073741922: KEY_INSERT, # Keypad 0
|
||||
1073741923: lv.KEY.DEL # Keypad .
|
||||
}
|
||||
|
||||
self.__last_key = mapping[key]
|
||||
# Apply Shift for keypad symbols if applicable
|
||||
if mod & MOD_KEY_SHIFT and self.__last_key in SHIFT_KEY_MAP:
|
||||
self.__last_key = SHIFT_KEY_MAP[self.__last_key]
|
||||
else:
|
||||
mapping = {
|
||||
KEY_BACKSPACE: lv.KEY.BACKSPACE, # NOQA
|
||||
KEY_TAB: lv.KEY.NEXT, # NOQA
|
||||
KEY_RETURN: lv.KEY.ENTER, # NOQA
|
||||
KEY_ESCAPE: lv.KEY.ESC, # NOQA
|
||||
KEY_DELETE: lv.KEY.DEL, # NOQA
|
||||
KEY_UP: lv.KEY.UP, # NOQA
|
||||
KEY_DOWN: lv.KEY.DOWN, # NOQA
|
||||
KEY_RIGHT: lv.KEY.RIGHT, # NOQA
|
||||
KEY_LEFT: lv.KEY.LEFT, # NOQA
|
||||
KEY_HOME: lv.KEY.HOME, # NOQA
|
||||
KEY_END: lv.KEY.END, # NOQA
|
||||
KEY_PAGEDOWN: lv.KEY.PREV, # NOQA
|
||||
KEY_PAGEUP: lv.KEY.NEXT, # NOQA
|
||||
1073741897: KEY_INSERT, # SDL Insert
|
||||
1073741898: lv.KEY.HOME, # SDL Home
|
||||
1073741899: lv.KEY.PREV, # SDL PageUp
|
||||
1073741900: lv.KEY.DEL, # SDL Delete (unconfirmed)
|
||||
1073741901: lv.KEY.END, # SDL End
|
||||
1073741902: lv.KEY.NEXT, # SDL PageDown
|
||||
1073741903: lv.KEY.RIGHT, # SDL Right Arrow
|
||||
1073741904: lv.KEY.LEFT, # SDL Left Arrow
|
||||
1073741905: lv.KEY.UP, # SDL Up Arrow
|
||||
1073741906: lv.KEY.DOWN, # SDL Down Arrow
|
||||
1073741882: KEY_F1, # SDL F1
|
||||
1073741883: KEY_F2, # SDL F2
|
||||
1073741884: KEY_F3, # SDL F3
|
||||
1073741885: KEY_F4, # SDL F4
|
||||
1073741886: KEY_F5, # SDL F5
|
||||
1073741887: KEY_F6, # SDL F6
|
||||
1073741888: KEY_F7, # SDL F7
|
||||
1073741889: KEY_F8, # SDL F8
|
||||
1073741890: KEY_F9, # SDL F9
|
||||
1073741891: KEY_F10, # SDL F10
|
||||
1073741892: KEY_F11, # SDL F11
|
||||
1073741893: KEY_F12 # SDL F12
|
||||
}
|
||||
|
||||
# Handle Shift or Caps Lock for letters and symbols
|
||||
if mod & (MOD_KEY_SHIFT | MOD_KEY_CAPS) and KEY_a <= key <= KEY_z:
|
||||
# Convert lowercase to uppercase
|
||||
self.__last_key = key - 32 # ASCII lowercase to uppercase
|
||||
elif mod & MOD_KEY_SHIFT and key in SHIFT_KEY_MAP:
|
||||
# Apply Shift mapping for numbers and punctuation
|
||||
self.__last_key = SHIFT_KEY_MAP[key]
|
||||
else:
|
||||
# Use standard mapping or key as-is
|
||||
self.__last_key = mapping.get(key, key)
|
||||
|
||||
if state:
|
||||
self.__current_state = self.PRESSED
|
||||
else:
|
||||
self.__current_state = self.RELEASED
|
||||
|
||||
micropython.schedule(MySDLKeyboard.read, self)
|
||||
|
||||
def _get_key(self):
|
||||
return self.__current_state, self.__last_key
|
||||
|
||||
|
||||
bus = lcd_bus.SDLBus(flags=0)
|
||||
|
||||
buf1 = bus.allocate_framebuffer(TFT_HOR_RES * TFT_VER_RES * 2, 0)
|
||||
@@ -54,15 +433,18 @@ def catch_escape_key(indev, indev_data):
|
||||
#state = indev_data.state
|
||||
#print(f"indev_data: {state} and {key}") # this catches the previous key release instead of the next key press
|
||||
pressed, code = sdlkeyboard._get_key() # get the current key and state
|
||||
print(f"catch_escape_key caught: {pressed}, {code}")
|
||||
#print(f"catch_escape_key caught: {pressed}, {code}")
|
||||
if pressed == 1 and code == 27:
|
||||
mpos.ui.back_screen()
|
||||
sdlkeyboard._read(indev, indev_data)
|
||||
|
||||
import sdl_keyboard
|
||||
sdlkeyboard = sdl_keyboard.SDLKeyboard()
|
||||
#import sdl_keyboard
|
||||
sdlkeyboard = MySDLKeyboard()
|
||||
sdlkeyboard._indev_drv.set_read_cb(catch_escape_key) # check for escape
|
||||
sdlkeyboard.set_paste_text_callback(mpos.clipboard.paste_text)
|
||||
try:
|
||||
sdlkeyboard.set_paste_text_callback(mpos.clipboard.paste_text)
|
||||
except Exception as e:
|
||||
print("Warning: could not set paste_text callback for sdlkeyboard, copy-paste won't work")
|
||||
|
||||
#def keyboard_cb(event):
|
||||
# global canvas
|
||||
@@ -71,3 +453,6 @@ sdlkeyboard.set_paste_text_callback(mpos.clipboard.paste_text)
|
||||
#keyboard.add_event_cb(keyboard_cb, lv.EVENT.ALL, None)
|
||||
|
||||
print("boot_unix.py finished")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -319,16 +319,16 @@ class AppDetail(Activity):
|
||||
self.install_button.add_state(lv.STATE.DISABLED)
|
||||
self.install_label.set_text("Please wait...") # TODO: Put "Cancel" if cancellation is possible
|
||||
self.progress_bar.remove_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.progress_bar.set_value(33, lv.ANIM.ON)
|
||||
self.progress_bar.set_value(33, True)
|
||||
try:
|
||||
import shutil
|
||||
shutil.rmtree(app_folder)
|
||||
self.progress_bar.set_value(66, lv.ANIM.ON)
|
||||
self.progress_bar.set_value(66, True)
|
||||
except Exception as e:
|
||||
print(f"Removing app_folder {app_folder} got error: {e}")
|
||||
self.progress_bar.set_value(100, lv.ANIM.OFF)
|
||||
self.progress_bar.set_value(100, False)
|
||||
self.progress_bar.add_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.progress_bar.set_value(0, lv.ANIM.OFF)
|
||||
self.progress_bar.set_value(0, False)
|
||||
self.set_install_label(app_fullname)
|
||||
self.install_button.remove_state(lv.STATE.DISABLED)
|
||||
if self.is_builtin_app(app_fullname):
|
||||
@@ -340,7 +340,7 @@ class AppDetail(Activity):
|
||||
self.install_button.add_state(lv.STATE.DISABLED)
|
||||
self.install_label.set_text("Please wait...") # TODO: Put "Cancel" if cancellation is possible
|
||||
self.progress_bar.remove_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.progress_bar.set_value(20, lv.ANIM.ON)
|
||||
self.progress_bar.set_value(20, True)
|
||||
try:
|
||||
# Step 1: Download the .mpk file
|
||||
print(f"Downloading .mpk file from: {zip_url}")
|
||||
@@ -349,7 +349,7 @@ class AppDetail(Activity):
|
||||
print("Download failed: Status code", response.status_code)
|
||||
response.close()
|
||||
self.set_install_label(app_fullname)
|
||||
self.progress_bar.set_value(40, lv.ANIM.ON)
|
||||
self.progress_bar.set_value(40, True)
|
||||
# Save the .mpk file to a temporary location
|
||||
try:
|
||||
os.remove(temp_zip_path)
|
||||
@@ -364,7 +364,7 @@ class AppDetail(Activity):
|
||||
# TODO: check free available space first!
|
||||
with open(temp_zip_path, "wb") as f:
|
||||
f.write(response.content)
|
||||
self.progress_bar.set_value(60, lv.ANIM.ON)
|
||||
self.progress_bar.set_value(60, True)
|
||||
response.close()
|
||||
print("Downloaded .mpk file, size:", os.stat(temp_zip_path)[6], "bytes")
|
||||
except Exception as e:
|
||||
@@ -378,7 +378,7 @@ class AppDetail(Activity):
|
||||
print("Unzipping it to:", dest_folder)
|
||||
with zipfile.ZipFile(temp_zip_path, "r") as zip_ref:
|
||||
zip_ref.extractall(dest_folder)
|
||||
self.progress_bar.set_value(80, lv.ANIM.ON)
|
||||
self.progress_bar.set_value(80, True)
|
||||
print("Unzipped successfully")
|
||||
# Step 3: Clean up
|
||||
os.remove(temp_zip_path)
|
||||
@@ -387,9 +387,9 @@ class AppDetail(Activity):
|
||||
print(f"Unzip and cleanup failed: {e}")
|
||||
# Would be good to show error message here if it fails...
|
||||
# Success:
|
||||
self.progress_bar.set_value(100, lv.ANIM.OFF)
|
||||
self.progress_bar.set_value(100, False)
|
||||
self.progress_bar.add_flag(lv.obj.FLAG.HIDDEN)
|
||||
self.progress_bar.set_value(0, lv.ANIM.OFF)
|
||||
self.progress_bar.set_value(0, False)
|
||||
self.set_install_label(app_fullname)
|
||||
self.install_button.remove_state(lv.STATE.DISABLED)
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ class Launcher(mpos.apps.Activity):
|
||||
image.set_size(icon_size, icon_size)
|
||||
label = lv.label(app_cont)
|
||||
label.set_text(app_name) # Use app_name directly
|
||||
label.set_long_mode(lv.label.LONG.WRAP)
|
||||
label.set_long_mode(lv.label.LONG_MODE.WRAP)
|
||||
label.set_width(iconcont_width)
|
||||
label.align(lv.ALIGN.BOTTOM_MID, 0, 0)
|
||||
label.set_style_text_align(lv.TEXT_ALIGN.CENTER, 0)
|
||||
@@ -127,7 +127,7 @@ class Launcher(mpos.apps.Activity):
|
||||
#print(f"app_cont {app_cont} focused, setting border...")
|
||||
app_cont.set_style_border_color(lv.theme_get_color_primary(None),lv.PART.MAIN)
|
||||
app_cont.set_style_border_width(1, lv.PART.MAIN)
|
||||
app_cont.scroll_to_view(lv.ANIM.ON) # scroll to bring it into view
|
||||
app_cont.scroll_to_view(True) # scroll to bring it into view
|
||||
|
||||
def defocus_app_cont(self, app_cont):
|
||||
#print(f"app_cont {app_cont} defocused, unsetting border...")
|
||||
|
||||
@@ -101,7 +101,7 @@ class OSUpdate(Activity):
|
||||
self.progress_bar.set_size(200, 20)
|
||||
self.progress_bar.align(lv.ALIGN.BOTTOM_MID, 0, -50)
|
||||
self.progress_bar.set_range(0, 100)
|
||||
self.progress_bar.set_value(0, lv.ANIM.OFF)
|
||||
self.progress_bar.set_value(0, False)
|
||||
try:
|
||||
_thread.stack_size(mpos.apps.good_stack_size())
|
||||
_thread.start_new_thread(self.update_with_lvgl, (download_url,))
|
||||
@@ -111,7 +111,7 @@ class OSUpdate(Activity):
|
||||
def progress_callback(self, percent):
|
||||
print(f"OTA Update: {percent:.1f}%")
|
||||
lv.async_call(lambda l: self.progress_label.set_text(f"OTA Update: {percent:.2f}%"), None)
|
||||
lv.async_call(lambda l: self.progress_bar.set_value(int(percent), lv.ANIM.ON), None)
|
||||
lv.async_call(lambda l: self.progress_bar.set_value(int(percent), True), None)
|
||||
time.sleep_ms(100)
|
||||
|
||||
# Custom OTA update with LVGL progress
|
||||
|
||||
@@ -108,7 +108,7 @@ class SettingsActivity(Activity):
|
||||
print(f"container {container} focused, setting border...")
|
||||
container.set_style_border_color(lv.theme_get_color_primary(None),lv.PART.MAIN)
|
||||
container.set_style_border_width(1, lv.PART.MAIN)
|
||||
container.scroll_to_view(lv.ANIM.ON) # scroll to bring it into view
|
||||
container.scroll_to_view(True) # scroll to bring it into view
|
||||
|
||||
def defocus_container(self, container):
|
||||
print(f"container {container} defocused, unsetting border...")
|
||||
|
||||
@@ -1 +1 @@
|
||||
CURRENT_OS_VERSION = "0.0.11"
|
||||
CURRENT_OS_VERSION = "0.1.0"
|
||||
|
||||
@@ -215,7 +215,7 @@ def setContentView(new_activity, new_screen):
|
||||
#print(f"ui.py setContentView: new_activity.onResume took {end_time}ms")
|
||||
|
||||
def remove_and_stop_current_activity():
|
||||
current_activity, current_screen = screen_stack.pop() # Remove current screen
|
||||
current_activity, current_screen = screen_stack.pop() # Get current activity and its screen
|
||||
if current_activity:
|
||||
current_activity.onPause(current_screen)
|
||||
current_activity.onStop(current_screen)
|
||||
|
||||
@@ -25,7 +25,7 @@ class WidgetAnimator:
|
||||
anim.init()
|
||||
anim.set_var(widget)
|
||||
anim.set_values(0, 255)
|
||||
anim.set_time(duration)
|
||||
anim.set_duration(duration)
|
||||
anim.set_delay(delay)
|
||||
anim.set_custom_exec_cb(lambda anim, value: widget.set_style_opa(value, 0))
|
||||
anim.set_path_cb(lv.anim_t.path_ease_in_out)
|
||||
@@ -40,7 +40,7 @@ class WidgetAnimator:
|
||||
anim.init()
|
||||
anim.set_var(widget)
|
||||
anim.set_values(original_y - height, original_y)
|
||||
anim.set_time(duration)
|
||||
anim.set_duration(duration)
|
||||
anim.set_delay(delay)
|
||||
anim.set_custom_exec_cb(lambda anim, value: widget.set_y(value))
|
||||
anim.set_path_cb(lv.anim_t.path_ease_in_out)
|
||||
@@ -55,7 +55,7 @@ class WidgetAnimator:
|
||||
anim.init()
|
||||
anim.set_var(widget)
|
||||
anim.set_values(original_y + height, original_y)
|
||||
anim.set_time(duration)
|
||||
anim.set_duration(duration)
|
||||
anim.set_delay(delay)
|
||||
anim.set_custom_exec_cb(lambda anim, value: widget.set_y(value))
|
||||
anim.set_path_cb(lv.anim_t.path_ease_in_out)
|
||||
@@ -75,7 +75,7 @@ class WidgetAnimator:
|
||||
anim.init()
|
||||
anim.set_var(widget)
|
||||
anim.set_values(255, 0)
|
||||
anim.set_time(duration)
|
||||
anim.set_duration(duration)
|
||||
anim.set_delay(delay)
|
||||
anim.set_custom_exec_cb(lambda anim, value: widget.set_style_opa(value, 0))
|
||||
anim.set_path_cb(lv.anim_t.path_ease_in_out)
|
||||
@@ -90,7 +90,7 @@ class WidgetAnimator:
|
||||
anim.init()
|
||||
anim.set_var(widget)
|
||||
anim.set_values(original_y, original_y + height)
|
||||
anim.set_time(duration)
|
||||
anim.set_duration(duration)
|
||||
anim.set_delay(delay)
|
||||
anim.set_custom_exec_cb(lambda anim, value: widget.set_y(value))
|
||||
anim.set_path_cb(lv.anim_t.path_ease_in_out)
|
||||
@@ -105,7 +105,7 @@ class WidgetAnimator:
|
||||
anim.init()
|
||||
anim.set_var(widget)
|
||||
anim.set_values(original_y, original_y - height)
|
||||
anim.set_time(duration)
|
||||
anim.set_duration(duration)
|
||||
anim.set_delay(delay)
|
||||
anim.set_custom_exec_cb(lambda anim, value: widget.set_y(value))
|
||||
anim.set_path_cb(lv.anim_t.path_ease_in_out)
|
||||
|
||||
@@ -38,7 +38,7 @@ def open_drawer():
|
||||
open_bar()
|
||||
drawer_open=True
|
||||
WidgetAnimator.show_widget(drawer, anim_type="slide_down", duration=1000, delay=0)
|
||||
drawer.scroll_to(0,0,lv.ANIM.OFF) # make sure it's at the top, not scrolled down
|
||||
drawer.scroll_to(0,0,False) # make sure it's at the top, not scrolled down
|
||||
|
||||
def close_drawer(to_launcher=False):
|
||||
global drawer_open, drawer
|
||||
@@ -189,7 +189,7 @@ def create_notification_bar():
|
||||
hide_bar_animation.init()
|
||||
hide_bar_animation.set_var(notification_bar)
|
||||
hide_bar_animation.set_values(0, -NOTIFICATION_BAR_HEIGHT)
|
||||
hide_bar_animation.set_time(2000)
|
||||
hide_bar_animation.set_duration(2000)
|
||||
hide_bar_animation.set_custom_exec_cb(lambda not_used, value : notification_bar.set_y(value))
|
||||
|
||||
# show bar animation
|
||||
@@ -198,7 +198,7 @@ def create_notification_bar():
|
||||
show_bar_animation.init()
|
||||
show_bar_animation.set_var(notification_bar)
|
||||
show_bar_animation.set_values(show_bar_animation_start_value, show_bar_animation_end_value)
|
||||
show_bar_animation.set_time(1000)
|
||||
show_bar_animation.set_duration(1000)
|
||||
show_bar_animation.set_custom_exec_cb(lambda not_used, value : notification_bar.set_y(value))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user