Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
6ac20a6
Add mobile and desktop WMs with a phone UI
jserv Oct 18, 2026
15882ff
Fix tween finish, TTF metrics, Pixman transforms
jserv Oct 18, 2026
d57ceb8
Fix phone gesture, tween and calculator edge cases
jserv Oct 18, 2026
7a8300f
Harden headless control, font tool and tests
jserv Oct 18, 2026
07a45f4
Correct backend and phone documentation
jserv Oct 18, 2026
3ca1a99
Return custom widget sizes in pixels
jserv Oct 18, 2026
561fa1f
Repaint every widget when a toplevel redraws
jserv Oct 18, 2026
fb5fdd6
Build one window manager, run all apps on it
jserv Oct 18, 2026
6a56fbf
Advance animation frames only on its timer
jserv Oct 18, 2026
fd6fa63
Start desktop apps in their former order
jserv Oct 18, 2026
979c232
Convert negative sfixed values without shifts
jserv Oct 18, 2026
49ab608
Fail demo starts cleanly on widget failure
jserv Oct 18, 2026
5ab02b9
Close demo windows when the phone shuts down
jserv Oct 18, 2026
2cbed9c
Test demos under keyboard inset, gate CI
jserv Oct 18, 2026
548ab10
Test out-of-memory starts under each policy
jserv Oct 18, 2026
0e00a68
Fix the window manager at build time
jserv Oct 18, 2026
df5a661
Share demo test helpers and trim repaint work
jserv Oct 18, 2026
4575851
Hide bars again on every relayout
jserv Oct 18, 2026
ada8aca
Reject malformed GIFs instead of hanging
jserv Oct 18, 2026
2560e68
Poll Linux input on the main thread
jserv Oct 18, 2026
d14c8bd
Take cursor hotspots in pixels
jserv Oct 18, 2026
3508f1c
Call the built window manager directly
jserv Oct 18, 2026
7b3e0c9
Trim the public API to what applications use
jserv Oct 18, 2026
ecce94a
Put WM feature comments above their defines
jserv Oct 18, 2026
02a92fc
Spare RV32IM per-pixel divides and float
jserv Oct 18, 2026
62fe56c
Shrink resident and static memory
jserv Oct 18, 2026
38dc26f
Restyle the phone in the Sage visual language
jserv Oct 18, 2026
bc80af1
Give every app the registry's start signature
jserv Oct 18, 2026
37a1b87
Share one core between the fbdev and DRM backends
jserv Oct 18, 2026
fe0fd30
Keep window order in the none policy
jserv Oct 18, 2026
f107c07
Read transformed RGB16 pixmaps from the right rows
jserv Oct 18, 2026
73d288f
Free the screen's cursor with the screen
jserv Oct 18, 2026
3aef094
Reject custom widget data sizes that overflow
jserv Oct 18, 2026
f131d1b
Keep a lifetime test mid-gesture
jserv Oct 18, 2026
7c5118e
Test the TinyVG hairline pen
jserv Oct 18, 2026
e6df6e7
Blend dimmed windows straight onto the background
jserv Oct 18, 2026
7ae3882
Speed up the shadow beside a sliding window
jserv Oct 18, 2026
066eec7
Inline the pixel address helper
jserv Oct 18, 2026
11cc07d
Rasterize large paths in bands from one edge list
jserv Oct 18, 2026
30c9f9c
Flatten arcs to the tolerance the rasterizer shows
jserv Oct 18, 2026
0f5f626
Paint before redisplay and defer revealed windows
jserv Oct 18, 2026
5dd2070
Read each texel once when scaling images
jserv Oct 18, 2026
19962dc
Keep photo thumbnails as RGB16
jserv Oct 18, 2026
fe0d825
Speed up the Multi demo and mark opaque windows
jserv Oct 18, 2026
ddb6602
Merge occlusion spans in place
jserv Oct 18, 2026
0ee82e8
Share one premultiplied over helper
jserv Oct 18, 2026
220ebb8
Draw the Vectors image over its background
jserv Oct 18, 2026
122acdc
Paint toplevel backgrounds and declare them opaque
jserv Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/headless-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ jobs:
test -x ./headless-ctl || (echo "headless-ctl not built" && exit 1)
echo "Build outputs verified successfully"

- name: Run headless test suites
run: |
make check

- name: Run basic headless test
run: |
# Start demo in background, capture stderr for memory stats
Expand Down Expand Up @@ -121,6 +125,7 @@ jobs:

- name: Memory leak detection with Valgrind
run: |
export DEBUGINFOD_URLS=
# Run with Valgrind for leak detection
timeout 15s valgrind \
--leak-check=full \
Expand Down Expand Up @@ -157,3 +162,53 @@ jobs:
exit 1
fi
echo "No definite memory leaks detected"

- name: Rebuild with the mobile window manager
run: |
python3 tools/kconfig/setconfig.py --kconfig configs/Kconfig WM_MOBILE=y
python3 tools/kconfig/genconfig.py configs/Kconfig
make -j$(nproc)
make check

- name: Phone end-to-end
run: |
# Boot the phone shell, unlock, open Calculator, type, screenshot
timeout 30s ./demo-headless 2>phone_stderr.log &
PID=$!
sleep 2
./headless-ctl shot phone_lock.png
# Slide to unlock: drag the knob along the track
./headless-ctl mouse down 33 295 1
for x in 60 100 140 180 220 230; do
./headless-ctl mouse move $x 295 1
sleep 0.05
done
./headless-ctl mouse up 230 295 1
sleep 1
./headless-ctl shot phone_home.png
# Calculator icon (second row, first column)
./headless-ctl mouse down 40 128 1
./headless-ctl mouse up 40 128 1
sleep 1
./headless-ctl type "12+30="
sleep 1
./headless-ctl shot phone_calc.png
./headless-ctl shutdown || true
wait $PID || true
for f in phone_lock.png phone_home.png phone_calc.png; do
identify "$f" > /dev/null || (echo "$f invalid" && exit 1)
done
# The three screens must differ
for a in "phone_lock.png phone_home.png" "phone_home.png phone_calc.png"; do
set -- $a
DIFF=$(compare -metric AE $1 $2 null: 2>&1 | grep -oE '^[0-9]+' | head -1)
echo "$1 vs $2: $DIFF pixels differ"
[ "${DIFF:-0}" -gt 1000 ] || (echo "navigation did not change the screen" && exit 1)
done

- name: Upload phone screenshots
if: always()
uses: actions/upload-artifact@v4
with:
name: phone-screenshots
path: phone_*.png
99 changes: 98 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,15 @@ jobs:
with:
files: |
.ci/**
.github/workflows/**
mk/**
include/**
src/**
backend/**
apps/**
tools/**
tests/**
configs/**
.clang-format
Makefile
- name: Set has_code_related_changes
Expand All @@ -44,10 +47,104 @@ jobs:
sudo apt-get update -q -y
sudo apt-get install -y libsdl2-dev libjpeg-dev libpng-dev libcairo2-dev
shell: bash
- name: default build
- name: default build (desktop window manager)
run: |
make defconfig
make
- name: headless tests
run: |
make check
- name: headless tests under Valgrind
run: |
sudo apt-get install -y -q valgrind
for t in test-core test-wm test-lifetime test-demos; do
DEBUGINFOD_URLS= valgrind -q --error-exitcode=1 \
--leak-check=full --errors-for-leak-kinds=definite ./$t
done
shell: bash
- name: mobile build (phone and demos)
Comment thread
cubic-dev-ai[bot] marked this conversation as resolved.
run: |
python3 tools/kconfig/setconfig.py --kconfig configs/Kconfig WM_MOBILE=y
python3 tools/kconfig/genconfig.py configs/Kconfig
make
- name: headless tests (mobile)
run: |
make check
- name: headless tests under Valgrind (mobile)
run: |
for t in test-core test-wm test-lifetime test-demos test-cellphone; do
DEBUGINFOD_URLS= valgrind -q --error-exitcode=1 \
--leak-check=full --errors-for-leak-kinds=definite ./$t
done
shell: bash

sanitizers:
needs: [detect-code-related-file-changes]
if: needs.detect-code-related-file-changes.outputs.has_code_related_changes == 'true'
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: install-dependencies
run: |
sudo apt-get update -q -y
sudo apt-get install -y libsdl2-dev libjpeg-dev libpng-dev
- name: AddressSanitizer + UndefinedBehaviorSanitizer
run: |
for wm in WM_DESKTOP WM_MOBILE WM_NONE; do
make defconfig
python3 tools/kconfig/setconfig.py --kconfig configs/Kconfig $wm=y
python3 tools/kconfig/genconfig.py configs/Kconfig
make clean
make check \
CFLAGS="-O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer -fno-sanitize-recover=undefined" \
LDFLAGS="-fsanitize=address,undefined"
done
shell: bash

config-matrix:
needs: [detect-code-related-file-changes]
if: needs.detect-code-related-file-changes.outputs.has_code_related_changes == 'true'
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
include:
- name: no window manager
options: WM_NONE=y
- name: no coverage cache
options: WM_MOBILE=y CACHE_SIZE=0
- name: no mobile eviction
options: WM_MOBILE=y WM_MOBILE_EVICT=n
- name: no shadows
options: DROP_SHADOW=n
- name: no allocator stats
options: MEMORY_STATS=n
- name: no widget toolkit
options: WM_MOBILE=y WIDGETS=n
- name: RGB565 phone surfaces
options: WM_MOBILE=y DEMO_CELLPHONE_RGB16=y
- name: TLSF heap
options: WM_MOBILE=y MEM_TLSF=y MEM_TLSF_POOL_SIZE=4194304
- name: Pixman renderer
options: WM_MOBILE=y RENDERER_PIXMAN=y
- name: Pixman renderer, desktop
options: RENDERER_PIXMAN=y
- name: size-optimized, heap masks only
options: WM_MOBILE=y OPTIMIZE_SIZE=y SCRATCH_SIZE=0
name: config (${{ matrix.name }})
steps:
- uses: actions/checkout@v6
- name: install-dependencies
run: |
sudo apt-get update -q -y
sudo apt-get install -y libsdl2-dev libjpeg-dev libpng-dev libpixman-1-dev
Comment thread
jserv marked this conversation as resolved.
- name: build and test
run: |
make defconfig
python3 tools/kconfig/setconfig.py --kconfig configs/Kconfig ${{ matrix.options }}
python3 tools/kconfig/genconfig.py configs/Kconfig
make
make check

coding-style:
needs: [detect-code-related-file-changes]
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
demo-*
.demo-*
mado-perf
test-*
!tests/test-*.c
.test-*
*.fail.ppm
.mado-perf
font-edit
.font-edit
src/composite-decls.h
src/shadow-gaussian-lut.h

# Swap
[._]*.s[a-v][a-z]
Expand Down
Loading
Loading