Add widget kit, input layer with Compose Key, Launcher and demo apps

Steps 5 and 6 of M0.
- lib/ui (host-tested): ListModel, LineEditor (UTF-8, byte-limited),
  wrapText, ToastQueue, DialogModel
- lib/input (host-tested): KeyMapper turns keyboard state into logical
  keys (Fn arrows, ` Back, Fn+` Home) and composes accents with opt
- src/ui: off-screen 16-bit frame pushed in one transfer (fixes the
  flicker), Status Bar, list, text, line editor, dialog, Toast widgets,
  Notifier (Toast + beep + LED), vendored public-domain Latin-1 fonts
- Apps: minimal Launcher, Widget demo, Diagnostics (SD erase now
  behind a confirmation dialog)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
2026-10-02 10:35:48 +02:00
co-authored by Claude Opus 5.5
parent 36ebd23417
commit 879cb0d0b6
39 changed files with 2119 additions and 92 deletions
+23
View File
@@ -0,0 +1,23 @@
#pragma once
#include "app.h"
#include "app_manager.h"
#include "list_model.h"
#include "ui/theme.h"
namespace roro {
// Home screen: lists the visible Apps; Select opens one.
class LauncherApp : public App {
public:
void setManager(AppManager& manager) { manager_ = &manager; }
void onEnter() override;
bool onKey(const KeyEvent& e) override;
void draw(Canvas& c) override;
private:
AppManager* manager_ = nullptr;
ListModel list_{theme::kContent.h / theme::kLineHeight};
};
} // namespace roro