6.8 KiB
6.8 KiB
🧪 Development Track — Kiwy Signage Player (Windows Edition)
This file tracks every change, bug fix, tested solution, build info, and pending issues for the Windows port. Read this FIRST before starting any debugging or coding session.
📅 Current Session — 2026-07-24
| Field | Value |
|---|---|
| Branch | Windows-Player |
| Python | 3.12.9 — C:\Users\Dell-PC\AppData\Local\Programs\Python\Python312\python.exe |
| Venv | windows\venv312\ (pre-built, all deps installed) |
| Kivy | 2.3.1 |
| PyInstaller | 6.21.0 |
| Last .exe build | 2026-07-24 13:47 — windows\dist\KiwySignagePlayer\KiwySignagePlayer.exe (96 MB) |
| Build command | Set-Location windows; venv312\Scripts\python.exe -m PyInstaller build.spec --clean --noconfirm |
⚠️ Python Version Constraints
- Python 3.12.9 — ✅ Confirmed working. Has pre-built Kivy 2.3.1 wheels.
- Python 3.13 — ❌ Kivy wheels NOT available for Windows.
- Python 3.14 — ❌ Tested 2026-07-24.
kivy_deps.sdl2_dev~=0.8.0has no cp314 wheel. → Solution: removed Python 3.14 from system, keeping only 3.12.9.
🐛 Bug Tracker
[BUG-001] RecursionError: play_current_media ↔ restart_playlist
- Status: ✅ Fixed 2026-07-24
- Symptom: Pressing "Restart Player" in settings with empty playlist causes
infinite recursion:
play_current_media → restart_playlist → play_current_media → ... - Fix: Added empty-playlist guard in both
play_current_media()andrestart_playlist()→ they return early instead of calling each other. - Files:
src/main.py— lines ~1304 and ~2073 - Test: Verified no Python syntax errors via
ast.parse.
[BUG-002] Settings fields cut off on small screens
- Status: ✅ Fixed 2026-07-24
- Symptom: "Screen Name", "Quickconnect" and other fields at the top of the settings popup are invisible on smaller resolutions because content overflows the popup.
- Fix: Wrapped settings content in a
ScrollView. Moved "Save & Close" / "Cancel" buttons outside the scroll (always visible). Reduced row heights. - Files:
src/signage_player.kv—<SettingsPopup@Popup>block
[BUG-003] Chromium not fullscreen on Windows
- Status: ✅ Fixed 2026-07-24
- Symptom: Web links open in a small window instead of fullscreen.
- Fix: Changed launch args from
--kioskto--start-maximized --app=URL- explicit
--window-size=WxH.--kioskuses Wayland exclusive-fullscreen protocol which doesn't work on Windows.
- explicit
- Tested rejected solutions:
- ❌
--kioskalone → small window, no fullscreen - ❌
--start-fullscreenalone → not reliable - ✅
--start-maximized --app=URL --window-size=...→ works
- ❌
- Files:
windows/run_win.py—_windows_play_weblink()
[BUG-004] Desktop flash when switching between Chromium and Kivy
- Status: ✅ Fixed 2026-07-24
- Symptom: When Chrome closes, the desktop is briefly visible before Kivy reappears. Also when Chrome opens, there's a flash.
- Fix: Added
_Win32Overlayclass — a fullscreen black Win32 window that covers the screen during transitions. Shown BEFORE closing Chrome / opening Chrome, hidden AFTER Kivy is ready. - Tested rejected solutions:
- ❌
Window.raise_window()alone → still shows flash - ✅ Win32 black overlay → smooth masking
- ❌
- Files:
windows/run_win.py—_Win32Overlayclass
[BUG-005] Chrome processes linger after closing weblink
- Status: ✅ Fixed 2026-07-24
- Symptom: After a weblink item ends, Chrome child processes (GPU, renderer) remain running → blank windows accumulate.
- Fix: Use
taskkill /F /T /PID <pid>to kill the entire process tree. - Tested rejected solutions:
- ❌
proc.terminate()→ leaves children running - ❌
proc.kill()→ same problem - ✅
taskkill /F /T→ kills everything
- ❌
- Files:
windows/run_win.py—_windows_kill_process_tree()
[BUG-006] Video plays in background behind Chromium
- Status: 🟡 Known, needs investigation
- Symptom: When transitioning from a weblink back to a video, the video starts playing while Chromium is still visible (audio plays, video is behind Chrome window).
- Possible causes:
_kill_weblink_after_framedelay is too short — Kivy renders the video before Chrome is killedWindow.raise_window()is not working reliably on Windows to bring Kivy to front- Chrome's
--kiosk/--start-maximizedkeeps it on top - The
content_area.opacitymanipulation happens too early/late
- Current approach:
_windows_kill_weblink_after_frame()shows overlay, kills Chrome tree, raises Kivy, hides overlay. - Next thing to test: Use
user32.SetForegroundWindow(KivyHwnd)instead ofWindow.raise_window(). Get Kivy's HWND viaWindow.get_window_info().
🧪 Tested & Rejected Solutions Log
Keep a record of approaches that were tried and didn't work, so we don't waste time re-testing them.
| Date | What was tested | Result | Reason it failed |
|---|---|---|---|
| 2026-07-24 | Python 3.14 with Kivy | ❌ | kivy_deps.sdl2_dev~=0.8.0 has no cp314 wheel |
| 2026-07-24 | --kiosk Chrome flag on Windows |
❌ | Not fullscreen, Wayland exclusive-fullscreen not available |
| 2026-07-24 | --start-fullscreen alone |
❌ | Inconsistent, sometimes not full |
| 2026-07-24 | proc.terminate() for Chrome |
❌ | Leaves child processes running |
| 2026-07-24 | proc.kill() for Chrome |
❌ | Same as terminate — children survive |
| 2026-07-24 | Window.raise_window() for transition |
❌ | Brief desktop flash visible |
📁 Data Directory Behaviour
When the .exe runs:
- Runtime hook (
pyi_runtime_hook.py) setsKIWY_DATA_DIR = exe_dir run_win.pypatchesSignagePlayer.__init__to useKIWY_DATA_DIR- Local folders created next to the .exe:
KiwySignagePlayer.exe config/ app_config.json resources/ (icons, intro video) certs/ (SSL certificates) media/ edited_media/ playlists/ logs/ .kivy/ (Kivy home) .player_heartbeat
🔧 Build Cheatsheet
# Build the .exe (from project root or windows/)
Set-Location windows
& .\venv312\Scripts\python.exe -m PyInstaller build.spec --clean --noconfirm
# Run in dev mode (no build needed)
& .\venv312\Scripts\python.exe run_win.py
# Test imports only
& .\venv312\Scripts\python.exe test_import_fix.py
📝 Notes for the Next Session
- Investigate [BUG-006] — video playing behind Chromium
- Test if
SetForegroundWindowworks better thanWindow.raise_window() - Consider adding a startup
.batfile that users can double-click - Check if the intro video plays correctly on Windows
- Test card reader fallback behaviour (evdev not available)