Repository navigation
Simple Program Launcher v1.2.0
What's New
Bulletproof on Python 3.14 + Tcl 9.0
Complete architectural overhaul of the GUI threading model. The launcher now runs flawlessly on the latest Python and Tcl stack, where previous versions would crash with SIGILL on the second popup invocation.
How It Works Now
The main thread owns the Tk event loop. The evdev input listener runs in a background thread and communicates trigger events through a lock-free queue. The main thread polls the queue every 50ms and creates popups as Toplevel windows — all GUI operations happen on a single thread, exactly as Tcl 9.0 requires.
┌─────────────────┐ queue.Queue ┌──────────────────────┐
│ evdev thread │ ──── put(position) ───→ │ main thread (Tk) │
│ L+R detection │ │ poll → popup.show() │
└─────────────────┘ └──────────────────────┘
Launched Apps Run Free
Programs started from the launcher now run in their own process session (start_new_session=True). No more interference from the launcher's signal handling — launched apps survive launcher restarts and Ctrl+C.
Console-Free Operation
The launcher auto-detects when it's running without a terminal and redirects all output to ~/.cache/launcher.log. Combined with the included KDE autostart desktop entry, it runs completely invisible — no console window, no tray icon, no taskbar entry. Just L+R click when you need it.
Clean Shutdown
Ctrl+C or SIGINT triggers a graceful shutdown — stops the input listener, exits the Tk event loop, no orphaned processes.
Upgrade
Drop-in replacement — same config, same behavior, no migration needed.
cd ~/simple_program_launcher && git pullThe autostart desktop entry at ~/.config/autostart/launcher.desktop handles the rest on next login.
21 commits of refinement. Zero footprint. Always ready.