Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
6 changes: 0 additions & 6 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,6 +0,0 @@
[submodule "lvgl"]
path = lvgl
url = https://github.com/lvgl/lvgl.git
[submodule "micropython/pycparser"]
path = pycparser
url = https://github.com/eliben/pycparser.git
1 change: 1 addition & 0 deletions lv_conf.h
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ extern void mp_lv_deinit_gc();
#define LV_FONT_MONTSERRAT_44 0
#define LV_FONT_MONTSERRAT_46 0
#define LV_FONT_MONTSERRAT_48 0
#define LV_FONT_SIYUAN_HEITI_MEDIUM_16 1

/*Demonstrate special features*/
#define LV_FONT_MONTSERRAT_28_COMPRESSED 0 /*bpp = 3*/
Expand Down
1 change: 0 additions & 1 deletion lvgl
Submodule lvgl deleted from 773860
27 changes: 27 additions & 0 deletions lvgl/.devcontainer/__CMakeLists.txt__
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
cmake_minimum_required(VERSION 3.12)
project (lv_emscripten)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 -s USE_SDL=2")

include_directories(${PROJECT_SOURCE_DIR})

add_subdirectory(lvgl)
file(GLOB MY_SOURCES "./*.c")
set(SOURCES ${MY_SOURCES})

add_executable(index ${SOURCES} ${INCLUDES})

if(NOT LVGL_CHOSEN_DEMO)
set(LVGL_CHOSEN_DEMO lv_demo_widgets)
endif()
set_source_files_properties(main.c PROPERTIES COMPILE_FLAGS -DCHOSEN_DEMO=${LVGL_CHOSEN_DEMO})

set(CMAKE_EXECUTABLE_SUFFIX ".html")
target_link_libraries(index
lvgl
lvgl_examples
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Unconditional linking to optional LVGL targets (examples/demos/thorvg) can fail CMake configuration when those targets are disabled by LVGL options.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lvgl/.devcontainer/__CMakeLists.txt__, line 22:

<comment>Unconditional linking to optional LVGL targets (examples/demos/thorvg) can fail CMake configuration when those targets are disabled by LVGL options.</comment>

<file context>
@@ -0,0 +1,27 @@
+set(CMAKE_EXECUTABLE_SUFFIX ".html")
+target_link_libraries(index
+    lvgl
+    lvgl_examples
+    lvgl_demos
+    lvgl_thorvg
</file context>
Fix with Cubic

lvgl_demos
lvgl_thorvg
SDL2
)
set_target_properties(index PROPERTIES LINK_FLAGS "--shell-file ${PROJECT_SOURCE_DIR}/lvgl/.devcontainer/lvgl_shell.html -s SINGLE_FILE=1")
5 changes: 5 additions & 0 deletions lvgl/.devcontainer/__build_all.sh__
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
cd build
emcmake cmake ..
emmake make -j$(nproc)
echo "Built succesfully, opening index.html"
code index.html
17 changes: 17 additions & 0 deletions lvgl/.devcontainer/__c_cpp_properties.json__
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/local/emsdk/upstream/emscripten/cache/sysroot/include/"
],
"defines": [],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-x64"
}
],
"version": 4
}
107 changes: 107 additions & 0 deletions lvgl/.devcontainer/__main.c__
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@

/**
* @file main
*
*/

/*********************
* INCLUDES
*********************/
#include <stdlib.h>
#include <unistd.h>
#define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/
#include <SDL2/SDL.h>
#include <emscripten.h>
#include "lvgl/lvgl.h"
#include "lvgl/demos/lv_demos.h"
#include "lvgl/examples/lv_examples.h"

/*********************
* DEFINES
*********************/

/*On OSX SDL needs different handling*/
#if defined(__APPLE__) && defined(TARGET_OS_MAC)
# if __APPLE__ && TARGET_OS_MAC
#define SDL_APPLE
# endif
#endif

/**********************
* TYPEDEFS
**********************/

/**********************
* STATIC PROTOTYPES
**********************/
static void hal_init(void);
static int tick_thread(void * data);
static void memory_monitor(lv_timer_t * param);

/**********************
* STATIC VARIABLES
**********************/
static lv_display_t * disp1;

int monitor_hor_res, monitor_ver_res;

/**********************
* MACROS
**********************/

/**********************
* GLOBAL FUNCTIONS
**********************/
void do_loop(void *arg);

/* Allows disabling CHOSEN_DEMO */
static void lv_example_noop(void) {
}

int main(int argc, char ** argv)
{

monitor_hor_res = 800;
monitor_ver_res = 480;
printf("Starting with screen resolution of %dx%d px\n", monitor_hor_res, monitor_ver_res);
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: printf is used without including <stdio.h>, which can cause implicit-declaration diagnostics and strict-build failures.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lvgl/.devcontainer/__main.c__, line 66:

<comment>`printf` is used without including `<stdio.h>`, which can cause implicit-declaration diagnostics and strict-build failures.</comment>

<file context>
@@ -0,0 +1,107 @@
+
+    monitor_hor_res = 800;
+    monitor_ver_res = 480;
+    printf("Starting with screen resolution of %dx%d px\n", monitor_hor_res, monitor_ver_res);
+
+    /*Initialize LittlevGL*/
</file context>
Fix with Cubic


/*Initialize LittlevGL*/
lv_init();

/*Initialize the HAL (display, input devices, tick) for LittlevGL*/
hal_init();

lv_demo_widgets();

emscripten_set_main_loop_arg(do_loop, NULL, -1, true);
}

void do_loop(void *arg)
{
/* Periodically call the lv_timer handler.
* It could be done in a timer interrupt or an OS task too.*/
lv_timer_handler();
}

/**********************
* STATIC FUNCTIONS
**********************/


/**
* Initialize the Hardware Abstraction Layer (HAL) for the Littlev graphics library
*/
static void hal_init(void)
{
lv_display_t * disp = lv_sdl_window_create(monitor_hor_res, monitor_ver_res);

lv_group_t * g = lv_group_create();
lv_group_set_default(g);

lv_sdl_mouse_create();
lv_indev_t * mousewheel = lv_sdl_mousewheel_create();
lv_indev_set_group(mousewheel, lv_group_get_default());

lv_indev_t * keyboard = lv_sdl_keyboard_create();
lv_indev_set_group(keyboard, lv_group_get_default());
}
5 changes: 5 additions & 0 deletions lvgl/.devcontainer/__settings.json__
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"files.associations": {
"sdl.h": "c"
}
}
28 changes: 28 additions & 0 deletions lvgl/.devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"image": "mcr.microsoft.com/devcontainers/universal:2",
"features": {
"ghcr.io/ebaskoro/devcontainer-features/emscripten:1": {}
},
"postCreateCommand": "chmod +x /workspace/lvgl_app/lvgl/.devcontainer/setup.sh; /workspace/lvgl_app/lvgl/.devcontainer/setup.sh",
"postStartCommand": ". /usr/local/emsdk/emsdk_env.sh;",
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Sourcing emsdk_env.sh in postStartCommand is non-persistent, so Emscripten environment vars may not be available in regular developer terminals/tasks.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lvgl/.devcontainer/devcontainer.json, line 7:

<comment>Sourcing `emsdk_env.sh` in `postStartCommand` is non-persistent, so Emscripten environment vars may not be available in regular developer terminals/tasks.</comment>

<file context>
@@ -0,0 +1,28 @@
+    "ghcr.io/ebaskoro/devcontainer-features/emscripten:1": {}
+  },
+  "postCreateCommand": "chmod +x /workspace/lvgl_app/lvgl/.devcontainer/setup.sh; /workspace/lvgl_app/lvgl/.devcontainer/setup.sh",
+  "postStartCommand": ". /usr/local/emsdk/emsdk_env.sh;",
+   
+  // Configure tool-specific properties.
</file context>
Fix with Cubic


// Configure tool-specific properties.
"customizations": {
// Configure properties specific to VS Code.
"vscode": {
// Add the IDs of extensions you want installed when the container is created.
"extensions": [
//"searKing.preview-vscode"
"analytic-signal.preview-html"
]
}
},

"hostRequirements": {
"cpus": 4
},

"workspaceMount": "source=${localWorkspaceFolder},target=/workspace/lvgl_app/lvgl,type=bind",
"workspaceFolder": "/workspace/lvgl_app"

}
70 changes: 70 additions & 0 deletions lvgl/.devcontainer/lv_conf.defaults
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
LV_COLOR_DEPTH 32
LV_MEM_SIZE (1024 * 1024)
LV_DRAW_THREAD_STACK_SIZE (64 * 1024)
LV_USE_MATRIX 1
LV_USE_FLOAT 1
LV_USE_LOTTIE 1

LV_USE_DRAW_SW_COMPLEX_GRADIENTS 1
LV_OBJ_STYLE_CACHE 1
LV_USE_LOG 1
LV_LOG_PRINTF 1
LV_USE_PERF_MONITOR 1
LV_USE_SYSMON 1

LV_USE_ASSERT_MEM_INTEGRITY 1
LV_USE_ASSERT_OBJ 1
LV_USE_ASSERT_STYLE 1
LV_FONT_MONTSERRAT_12 1
LV_FONT_MONTSERRAT_14 1
LV_FONT_MONTSERRAT_16 1
LV_FONT_MONTSERRAT_18 1
LV_FONT_MONTSERRAT_20 1
LV_FONT_MONTSERRAT_22 1
LV_FONT_MONTSERRAT_24 1
LV_FONT_MONTSERRAT_26 1
LV_FONT_MONTSERRAT_28 1
LV_FONT_MONTSERRAT_30 1
LV_FONT_MONTSERRAT_32 1
LV_FONT_MONTSERRAT_34 1
LV_FONT_MONTSERRAT_36 1
LV_FONT_MONTSERRAT_38 1
LV_FONT_MONTSERRAT_40 1
LV_FONT_MONTSERRAT_42 1
LV_FONT_MONTSERRAT_44 1
LV_FONT_MONTSERRAT_46 1
LV_FONT_MONTSERRAT_48 1
LV_FONT_MONTSERRAT_28_COMPRESSED 1
LV_FONT_DEJAVU_16_PERSIAN_HEBREW 1
LV_FONT_SIMSUN_16_CJK 1
LV_FONT_UNSCII_8 1

LV_USE_IMGFONT 1
LV_USE_FS_STDIO 1
LV_FS_STDIO_LETTER 'A'
LV_USE_FS_MEMFS 1
LV_FS_MEMFS_LETTER 'M'
LV_USE_THORVG_INTERNAL 1
LV_USE_LZ4_INTERNAL 1
LV_USE_VECTOR_GRAPHIC 1
LV_USE_TINY_TTF 1
LV_USE_BARCODE 1
LV_USE_QRCODE 1
LV_USE_RLE 1
LV_BIN_DECODER_RAM_LOAD 1
LV_USE_TJPGD 1
LV_USE_BMP 1
LV_USE_LODEPNG 1
LV_USE_SDL 1

LV_USE_DEMO_WIDGETS 1
LV_USE_DEMO_KEYPAD_AND_ENCODER 1
LV_USE_DEMO_BENCHMARK 1
LV_USE_DEMO_RENDER 1
LV_USE_DEMO_STRESS 1
LV_USE_DEMO_MUSIC 1
LV_USE_DEMO_FLEX_LAYOUT 1
LV_USE_DEMO_MULTILANG 1
LV_USE_DEMO_TRANSFORM 1
LV_USE_DEMO_SCROLL 1

85 changes: 85 additions & 0 deletions lvgl/.devcontainer/lvgl_shell.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
<html>
<head>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no'/>
<style type="text/css">
html, body {
margin: 0;

width: 100%;
height: 100%;
min-width: 100%;
min-height: 100%;
}

body {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

.git-commit-info {
font-family: Consolas, 'Courier New', Courier, monospace;
background-color: #f1f1f1;
padding: 2px;
text-align: left;
}
#git-hash {
text-align: center;
}
#output {
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="git-hash"></div>
<p id="output">
<canvas id="canvas"></canvas>
</p>
<script src="gitrev.js"></script>
<script>
var siteURL = new URL(window.location.href);
var w = siteURL.searchParams.get("w") || "800";
var h = siteURL.searchParams.get("h") || "480";
var canvas = document.getElementById('canvas');
canvas.setAttribute("width", w);
canvas.setAttribute("height", h);
console.log("Requested " + w + "x" + h + " px");
var Module = {
print: function(text) {
console.log(text);
},
printErr: function(text) {
console.error(text);
},
canvas: (function() {
return canvas;
})(),
arguments: [ siteURL.searchParams.get("w") || "800", siteURL.searchParams.get("h") || "480", siteURL.searchParams.get("example") ?? "default" ]
};
if(typeof window.git_hash != 'undefined') {
var gitHashDiv = document.querySelector("#git-hash");
var gitLink = document.createElement("div");
var gitHashComponents = window.git_hash.split(" ").filter(component => component.trim().length > 0);
for(var i = 0; i < gitHashComponents.length; i++) {
console.log(gitHashComponents[i], gitHashComponents[i].length);
/* This is an extremely lazy way of checking for a Git hash, but it works */
if(gitHashComponents[i].length == 40) {
gitHashComponents[i] = `<a href="https://github.com/lvgl/${gitHashComponents[i+1]}/commit/${gitHashComponents[i]}">${gitHashComponents[i]}</a>`;
} else {
/* Repository name */
gitHashComponents[i] += "<br/>";
}
}
gitLink.classList.add("git-commit-info");
gitLink.innerHTML = gitHashComponents.join(" ");
gitHashDiv.textContent = "LVGL compiled to Emscripten. Git commit information:";
gitHashDiv.appendChild(gitLink);
}
window.addEventListener("click", () => window.focus());
</script>
{{{ SCRIPT }}}
</body>
</html>
19 changes: 19 additions & 0 deletions lvgl/.devcontainer/setup.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/bin/sh

echo ". /usr/local/emsdk/emsdk_env.sh" >> /home/codespace/.bashrc

cd /workspace/lvgl_app
sudo chmod 777 .
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: chmod 777 on the project directory is overly permissive and makes the workspace world-writable.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lvgl/.devcontainer/setup.sh, line 6:

<comment>`chmod 777` on the project directory is overly permissive and makes the workspace world-writable.</comment>

<file context>
@@ -0,0 +1,19 @@
+echo ". /usr/local/emsdk/emsdk_env.sh" >> /home/codespace/.bashrc
+
+cd /workspace/lvgl_app
+sudo chmod 777 .
+mkdir build
+mkdir vscode
</file context>
Fix with Cubic

mkdir build
mkdir vscode
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot Feb 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: Creates "vscode" but copies into ".vscode"; the destination directory doesn’t exist so the cp commands will fail. Create .vscode or copy into the created directory.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lvgl/.devcontainer/setup.sh, line 8:

<comment>Creates "vscode" but copies into ".vscode"; the destination directory doesn’t exist so the cp commands will fail. Create .vscode or copy into the created directory.</comment>

<file context>
@@ -0,0 +1,19 @@
+cd /workspace/lvgl_app
+sudo chmod 777 .
+mkdir build
+mkdir vscode
+
+cd lvgl/.devcontainer
</file context>
Fix with Cubic

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot Mar 18, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: The script creates a "vscode" directory but later copies files into ".vscode". If .vscode does not already exist in /workspace/lvgl_app, these cp commands will fail and editor config won't be set up.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At lvgl/.devcontainer/setup.sh, line 8:

<comment>The script creates a "vscode" directory but later copies files into ".vscode". If .vscode does not already exist in /workspace/lvgl_app, these cp commands will fail and editor config won't be set up.</comment>

<file context>
@@ -0,0 +1,19 @@
+cd /workspace/lvgl_app
+sudo chmod 777 .
+mkdir build
+mkdir vscode
+
+cd lvgl/.devcontainer
</file context>
Fix with Cubic


cd lvgl/.devcontainer
cp __CMakeLists.txt__ ../../CMakeLists.txt
cp __main.c__ ../../main.c
cp __build_all.sh__ ../../build_all.sh
cp __c_cpp_properties.json__ ../../.vscode/c_cpp_properties.json
cp __settings.json__ ../../.vscode/settings.json
touch ../../lv_conf.h
../scripts/generate_lv_conf.py --template ../lv_conf_template.h --config ../../lv_conf.h

chmod +x ../../build_all.sh
Loading
Loading