P0 leak fixes: context/action menus destroyed on deactivate, config
callbacks unregistered in settings widgets, recorder and server signal
IDs stored and disconnected, bluetooth client closed and unsubscribed,
rfkill timer removed, seek timers cancelled, dropdown and options menus
freed, app name cache LRU-bounded.
Fix desktop 'Edit Widgets' and settings menu regressions by deferring
destroy out of Gtk signal handlers via GLib.idle_add.
Fix settings entry fields by connecting the activate signal explicitly
(Enter saves the value).
- Move all settings into [general], [dock], [panel], [switcher], [notification]
- Remove [desktop_widgets] section, move items to panel/general
- Add dot notation support to config service for nested keys
- Update all config references across codebase
- shlex.quote() in kill_process prevents shell injection
- find_binary now uses shutil.which() instead of spawning 'which'
- Add shell_split() helper for environment.py
- Remove inline import re from escape_markup_text
- wallpapers_dir: read from config, fallback ~/Pictures/Wallpapers
- osd: skip show_audio_osd/show_brightness_osd when disabled
- window_switcher: skip show_switcher when disabled
- global_menu_cache_enabled: bypass GTK class cache when false
- global_menu_method: control discovery strategies (auto/hyprland/dbus)
All keys added to constants.py defaults, settings UI, and config.toml
Split the monolithic ScreenCapture service into focused Screenshot and
ScreenRecorder services behind a pluggable capture backend.
- Add shared/capture.py: CaptureBackend abstraction + HyprlandCaptureBackend
(hyprshot/grim/slurp/wf-recorder) and reusable CaptureNotifier
- Add services/screenshot.py and services/screenrecorder.py with Fabric
properties/signals; recording state kept in memory (no /tmp files)
- Keep services/screencapture.py as a backwards-compatible facade so
existing widgets and signals keep working
- Resolve monitors via Hyprland IPC helpers in services/modus.py instead of
spawning `hyprctl monitors -j` per capture
- Implement real window recording (slurp window boxes) and split the
record-window / record-region UI mappings
- Register screenshot_service / screen_recorder_service singletons
- Remove dead src/utils/inhibit.py duplicate; minor modus.lua quoting fix
- mpris: native MediaArt cache lookup, dedupe play/pause emission, safe
cleanup, artwork polling for already-playing browser players, drop
os.system seek fallback
- spotlight: scope plugin keyword and detect() matches to a single plugin
via search_single instead of global search; register clipboard keywords
(clip/clipboard)
Drop unused dbusmenu.py and related files, update pyproject.toml and requirements.txt to reflect new dependencies, and add pure‑Python uinput click helper.
Remove several default configuration entries that are no longer required, cleaning up dead code and reducing configuration surface.
- Cleanup: drop unused constants
- Maintenance: simplify DEFAULT dict
Why: Modernize HTTP client usage and expose currency symbols for conversion.
New Features
- Added `CURRENCY_SYMBOLS` mapping from symbols to currency codes.
- Switched all external requests to `httpx` with custom headers and redirects.
Enhancements
- Increased timeout to 10 seconds and enabled `follow_redirects=True`.
- Centralized error handling with explicit status‑code checks.
Bug Fixes
- Added proper exception handling for JSON parsing to avoid silent failures.
- Improved error messages for non‑200 responses.