Implementiere drei Hilfsfunktionen in _settings.py:
- check_hotkey_conflict(): Prüft mit Win32 RegisterHotKey ob eine Taste belegt ist
- list_microphones(): Gibt alle Eingabegeräte als (name, index) Tupel zurück
- pynput_to_evdev_key(): Konvertiert pynput Keys zu evdev Key-Namen
Alle Tests (9 neue + 9 existierende) bestehen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements Task 5 of the TDD plan: creates the tray package with
AppState enum (WAITING, RECORDING, TRANSCRIBING) and a create_icon()
function that generates colorized microphone icons via Pillow.
- whisper_local/tray/__init__.py: empty package marker
- whisper_local/tray/_tray.py: AppState enum
- whisper_local/tray/_icon.py: icon generation with state-specific colors
- tests/test_tray.py: comprehensive test coverage for icon creation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Holding the hotkey caused dozens of on_press callbacks due to OS key-repeat.
Added a _pressed guard flag so only the first press and actual release fire.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace wtype (unsupported on KDE) with ydotool key for Ctrl+V
simulation. Use wl-copy for clipboard-based insertion to avoid
ydotool type's QWERTZ/QWERTY layout mismatch. Use DEVNULL instead
of PIPE for wl-copy to prevent hanging on its forked background
process.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>