- Use Gio.FileMonitor on sysfs brightness file
- Event-driven via inotify instead of periodic polling
- _on_brightness_file_changed callback for file modifications
- spinner now checks exit code and shows cross on failure
- Removed unused print_packages function
- Fixed launch: backgrounded uwsm always returned 0, else branch was
dead code. Now runs in background and checks with pgrep.
Added 13 packages required by the codebase:
- networkmanager, network-manager-applet: network management + GI bindings
- blueman: bluetooth manager GUI
- qalculate-gtk: spotlight calculator engine
- wtype: Wayland keyboard paste simulation
- pipewire, libpulse: audio playback and volume control
- pciutils: GPU detection in About dialog
- gtk-layer-shell: Wayland layer-shell for popup windows
- librsvg: SVG rendering for dock icons
- flatpak: flatpak app registration for global menu
- wayland: wayland-client/wayland-scanner for app-capture build
- gobject-introspection: GIR compilation for app-capture typelib
CI Arch container doesn't have g-i installed. The GIR/typelib is only
needed for Python bindings — shared library builds fine without it.
Both gir dependency and g-ir-compiler are now required: false.
Without tick_widget the Animator falls back to GLib.timeout_add which
fires even when the widget is hidden, wasting CPU on invisible scroll
windows (WiFi/BT connection lists).
Handler was connected twice — once in __init__ and again in
_initialize_resources. Every device-ready event fired on_network_ready
twice. Removed the __init__ connection (the lazy one is correct).
- 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
- get_connectivity was compared as method object (always True), wired
icon always showed no-route when activated
- NM import now catches GLib.Error and ImportError, not just ValueError
- Sets NM = None on failure instead of leaving undefined
- Move _initialized flag to end of __init__ so partial construction
leaves the singleton retryable
- Add unregister_reload_callback() method and off_config_change() helper
- Enables proper cleanup of reload listeners on widget destroy
Replace @foreground, @primary, @error, @outline, @shadow, @secondary
and their var() equivalents with semantic glass-* tokens across 22 files.
Colors without glass equivalents (@on-primary, @cyan, etc.) left as-is.
- Add osd_show_audio/osd_show_brightness methods on OSDWindow
- Register as standalone functions in __main__ for fabric-cli exec
- Keybinds now chain fabric-cli exec after wpctl/brightnessctl
- Emit brightness signal on threshold bypass for small changes
- Drop rfkill from bluetooth toggle (redundant with D-Bus Powered,
was causing stale cache on next read)
- Force toggle switch and icon to target state immediately after
setting, don't wait for D-Bus callback
- Fix nightlight icon race: flip local is_active instead of
re-querying async kill state
- Guard wifi on_network_ready against ethernet-first device loop
(emits device-ready per device; wifi_device None on first)
- Share single NetworkClient between main panel and wifi popup
(eliminates async-init race of two independent instances)
- Strip connected: prefix from wlan label initial display
- Add _pending_toggle pattern to wifi notify handler to
suppress stale-cache revert; same for bluetooth switch lock
Add libcairo2-dev and pkg-config to the dependency-audit.yml workflow so that pycairo can be installed correctly on CI runners. This prevents the build error when installing Python packages that require the Cairo library.
When control center hides, PlayerBox.suspend() blocks all signal
handlers. On resume(), clearing the flag wasn't enough — stale
state lingered until next fabricator poll (up to 5s). Now resume()
immediately syncs play/pause icon, metadata, and artwork.
on_entry_changed uses @debounce(300). When user presses Enter before
debounce fires, _current_results is empty so nothing activates.
Now on_entry_accept triggers an immediate search_single when active
plugin has no results, and activates the first result on callback.
_on_entry_accept checked _active_plugin_entry before _current_results.
Keyword plugins (emoji, clipboard) are always active when prefix typed,
so on_submit (no-op base) swallowed Enter before result.action() fired.
Now results are checked first. on_submit only as fallback when no results.
- 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
Add CaptureNotifier import and send notifications when caffeine is enabled or disabled. Introduce is_active() static method to check inhibition status via PID file and process cmdline. Replace previous _read_pid() usage with is_active(). Enhance _humanize to properly format "0s" and hour-only durations. Update activation logic to use the new method and trigger appropriate notifications.
Add support for managing systemd‑inhibit processes via a PID file; introduce _caffeine_is_active helper; modify _check_initial_states and toggle_caffeine to start/stop inhibition and update UI icons and labels.
Modified default active app name in ModusService initialization and update logic to "Modus" to align with the project's branding and avoid confusion with macOS Finder.
Remove legacy color definition blocks and replace with new glass-surface, glass-panel, and interactive state tokens. Update all component styles to reference new variables.
Uses systemd-inhibit with a pinned sleep process and PID file so
the inhibition survives Spotlight dismiss. Supports on/off and
duration presets (5m/15m/30m/1h) plus free-form parsing.
SpotlightWindow now exposed via SpotlightService (fabric Service) on the
session bus (dev.modus.Spotlight /Toggle). On-demand process forwards to
the running instance over DBus instead of a unix socket; still quits on
dismiss. Behaviour unchanged.
Weather: move networking, caching and scheduling out of the Weather widget
into a WeatherService singleton. Reuse one httpx.Client for the app lifetime,
drop the 4-worker pool and the multi-entry dict caches (single-value fields),
query Nominatim only on location change, remove debounce and the /tmp-style
polling. Widget now observes the `updated` signal and never hits the network.
GameMode: turn the standalone CLI script into a GameModeService (Service
singleton) exposing an `enabled` Property and `changed` signal. Drive Hyprland
via `hyprctl eval hl.config(...)` instead of the deprecated `hyprctl keyword`
batch (rejected under the Lua config in Hyprland 0.55+), read state via
`hl.get_config`, and keep `hyprctl reload` for disable. Fix game-mode state
parsing so unrecognized `hl.get_config` output no longer falsely reports
active. BatteryWidget's GameModeButton now subscribes to the service.
Remove now-unused LOCATION_CACHE_TIMEOUT.
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)
- Update ruff to 0.15.2 in requirements.txt
- Add pre-commit to requirements.txt
- Update uv.lock with new dependencies
- Add config/plugins/ to gitignore, remove src/window/launcher
- Expand architecture overview with plugin system details
- Update configuration guide with new spotlight settings
- Improve FAQs with troubleshooting tips
- Remove docs/README.md (content merged into main README)
- Add on_clicked handler to search button in panel
- Add set_spotlight_toggle() method on Panel
- Connect spotlight.toggle in main.py after both are created
- Add -y/--yes flag to skip interactive prompts
- Replace cd/cd- with subshell in app-capture build
- Replace fragile grep -v pipe with stderr redirect for git output
- Total steps still matches progress calls
- Replace /home/sankalp/ with $INSTALL_DIR in MODUS_MODULE_LINE
- Fix TOTAL_STEPS 11→12 to match actual progress calls
- Move 'Launching Modus' to end (stop + start in one block)
- Remove orphaned 'Starting Modus' step from under Matugen
_check_icon_to_type now queries Gtk.IconTheme for the icon name
(with -symbolic suffix) before falling back to a hardcoded mapping.
_get_icon_for_device simplified since type property now returns
GTK icon names directly.
Add Pomodoro component with UI controls and state management,
modify Panel to instantiate and cache Pomodoro and TodoList widgets,
hook datetime button to toggle Pomodoro and handle right‑click on todo list,
extend destroy logic to cleanly close Pomodoro and Todo instances.
The lockscreen module in src/lock.py has been removed to clean up unused code and simplify the project structure. This change does not affect current functionality but prepares the codebase for future enhancements.
Drop unused dbusmenu.py and related files, update pyproject.toml and requirements.txt to reflect new dependencies, and add pure‑Python uinput click helper.
Rename CSS IDs from #application-switcher-* to #app-switcher-* for consistency.
Update padding, margin, and hover states to match new design.
Add new classes for hovered and selected states with appropriate styling.
Switch layouts are now stored in TOML, added proper error handling and a static method to trigger switching, replaced JSON handling, updated imports and fixed related services.
Expose KeyboardLayout.switch_keyboard_layout as a public method and integrate it into the main application to enable dynamic keyboard layout changes at runtime.
- Replace commented-out launcher shortcuts with active screen capture and keyboard layout switcher.
- Update keybinding logic to use new method signatures.
Add @Signal fullscreen_changed(), expose a read‑write fullscreen Property that triggers the signal on change, set its default to False, connect Hyprland’s fullscreen event to update the property, and store it on the service instance.
Added a new window class that integrates with the capture service, provides a toolbar of tool buttons for region, screen, window, and recording modes, includes an options button to toggle settings, and implements save directory selection, delay, cursor, thumbnail, and microphone controls. The implementation follows the existing widget architecture and updates related modules to expose the new functionality.
Simplify stop_recording by removing redundant process kills and file handling
Add guard to prevent reinitialization
Replace exec_shell_command_async with Gio.Subprocess and track pending screenshot
Refactor screenshot method to eliminate multi‑display special case
Clean up conversion logic and remove unused imports
The imports now use toml_file to load dock.toml and launcher.toml directly, removing the get_relative_path utility and simplifying path handling. This reduces indirect dependencies and clarifies configuration loading.
- Escape markup text for summary and body to prevent injection
- Simplify Label creation for body with conditional null check
- Increase max_chars_width for summary and body lines
- Remove wrap and wrap_mode settings
- introduced LERP_FACTOR, IDLE_THRESHOLD, ANIM_FPS and related layout constants
- added DockItem dataclass with render geometry and scale state
- refactored on_hover_enter/leave to schedule delayed hide with ticket comparison
- updated setup_occlusion_monitoring with typed check_dock_occlusion returning bool
- cleaned up destroy to remove canvas and timer IDs
Add new NumLock service to monitor NumLock LED state changes.
Refactor Battery service documentation and property cache handling.
Update imports to include NumLock.
- Implement _on_button_press to show Gtk.Menu on right‑click.
- Provide Pair, Trust/Untrust, and Remove commands.
- Connect notify::connected-devices signal to refresh device list.
- Ensure graceful cleanup when device is removed.
Reduce bar count from 10 to 8 and adjust height limits, add CustomImage widget for artwork, update visibility handling to show/hide fallback and artwork
Replace random-based bar generation with deterministic sine animation, rename internal state and constants, split visualizer logic into explicit methods, update drawing to use style colors, consolidate signal and timer handling, and streamline idle/reset behavior.
Add guard flag `_pos_polling` and wrapper methods `_start_pos_fabricator` and `_stop_pos_fabricator` to prevent multiple fabricator starts.
Update all calls to use the new wrappers for consistent lifecycle management.
- Change status fabricator interval from 250ms to 5000ms
- Change position fabricator interval from 1000ms to 2000ms
- Update poll_from and on_changed callbacks to match the new intervals
Add Mods.terminal configuration for terminal icons and actions, bump version in pyproject.toml, and update dependencies including fabric from a specific commit.
Remove redundant import duplication, replace uuid with os.urandom, rename completion_rate to active, update property decorator, and clean up callback handling. Also removed unused stop_config_service function.
Add detailed configuration documentation in README, describing TOML files, their purpose, and usage. Update the TODO checklist to reflect completed items and remove outdated entries.
Refactor ModPopup to use shell -c for commands, adjust icon size default, and improve button click handling. Remove unused GoogleLensIndicator component and related import/usage.
Migrate launcher configuration from JSON to TOML format, add new `launcher.toml` and `mods.toml` files, remove `launcher.json`, and update project metadata in `pyproject.toml` to version 0.2.0.
Monitor CSS files and their subdirectories for changes by walking the styles directory and connecting change events to each monitor. Simplify the `set_css` function by removing the unnecessary empty line and directly passing the path to `set_stylesheet_from_file`. This enhances file change detection and reduces redundant code.
Change title of create_control_window to "modus-controlcenter" and adjust Panel title to "mdous-bar". Update import ordering and remove redundant imports for clarity.
Add _on_map handler and connect "map" signal to update playing state.
Refactor button handling to use change-value signal and dynamic child management.
Update playback status notification to avoid duplicates and use current_status variable.
Add internal property cache to reduce DBus round‑trips and streamline signal handling.
It also adjusts proxy flags and error handling for better robustness.
- Consolidate logger disabling, cache empty menus with TTL, and move name resolution to a dedicated resolver to reduce duplication and improve performance
Add captured PID to logs, DBus client discovery, and fallback path selection to improve consistency and avoid race conditions; use PID inheritance checks for accurate client matching.
Pre-warm DBus PID cache using a ThreadPoolExecutor to instantly resolve service PIDs, centralize registry locking, and improve robustness and performance.
│ network_service abstraction │
│ │
│ Updated logic to delegate network operations through NetworkService, renamed │
│ signal listeners, and simplified connectivity checks focusing on service │
│ availability rather than session object emission.
Updated logic to delegate network operations through NetworkService, renamed signal listeners, and simplified connectivity checks focusing on service availability rather than session object emission.
Introduce consistent design tokens for radii and colors, replacing alpha() and hardcoded values with theme variables for easier theming and maintenance.
- New Features: - Add CSS variable usage for radii (var(--radius-*)) and color tokens (@border-subtle, @text-main, @accent)
- Enhancements:
- Replace hardcoded border, radius, and color definitions with variable references
- Align styling with the project's theme system
- Bug Fixes:
- No bug fixes included
This change adds automatic configuration of Matugen templates for Modus themes, ensuring a consistent look‑and‑feel across Hyprland and terminal setups. It introduces checks to prevent duplicate entries and provides user feedback via progress and success messages.
- New Features:
- Added Modus template blocks for Matugen (modus and hyprland)
- Integrated progress and success messaging for template installation
- Enhancements:
- Updated Hyprland Lua path to an absolute location
- Added validation for existing Matugen config file
- Bug Fixes:
- None
The refactor introduces persistent indicator widgets and updates how visibility and layout are managed based on configuration changes.
New Features
- Added BatteryIndicator, NetworkIndicator and BluetoothIndicator as persistent panel children.
- Implemented visibility toggling for each indicator according to configuration and battery presence.
- Added debug prints when an indicator’s visibility changes or a battery is not detected.
Enhancements
- Updated dropdown actions to use `get_about_window()` and `get_settings_window()` for About and System Settings entries.
- Switched layout rebuilding to use `get_config_all()` and now only rebuilds when specific keys actually change.
- Removed manual recreation of indicators; visibility is controlled via `show()`/`set_visible()`.
- Consolidated changed‑key detection and added logging of rebuild reasons.
- Streamlined config key checks to use `config_data.get(..., True)`.
Bug Fixes
- Fixed BatteryIndicator to hide and log when no battery is detected.
- Corrected use of `config_data.get()` with appropriate fallback values.
- Updated layout updates to use `show()` and trigger a resize queue instead of `show_all()`.
- New Settings window implementation with styling and layout
- Updated visibility configuration to use direct configuration keys
- Simplified layer‑shell positioning logic and improved reliability
Enhancements- Refactored MouseCapture geometry calculations for cleaner code
- Integrated size‑allocate handler to maintain input region sync
- Added global About window singleton and improved toggle behavior
Bug Fixes
- Fixed potential index errors in MouseCapture coordinate calculations- Resolved missing imports and path issues for icon assets
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
Add ability to persist current configuration to disk and trigger reloads, expose set() and save() methods, monitor the config directory for changes, and adjust notification history based on config modifications.
- New Features
- Implement `save()` method to write config to file and trigger reload
- Add `set()` method for in‑memory config updates
- Extend file monitoring to include parent directory
- Rename `get_all_config` to `get_config_all`
- Enhancements
- Refine reload logic to correctly capture previous state via `_last_notified_config`
- Trigger reloads on additional file‑monitor events (CREATED, DELETED)
- Prune cached notifications according to config changes (`notification_ignored_apps`, `notification_limited_apps_history`)
- Bug Fixes
- Resolve race condition where reload‑pending flag could be left set
- Ensure callbacks are notified on every reload request
- Fix stale comparison of config values in `has_changed`
Removed pyotp, pyzbar, and thefuzz from pyproject.toml and requirements.txt to simplify dependencies.
- Enhancements
- Cleaned up redundant dependencies.
- Bug Fixes
- None.
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.
- New Feature: Replace urllib.request with httpx for fetching artwork URLs, providing timeout and redirect support.
- Enhancement: Added proper HTTP status code handling and early exit on download cancellation.
- Bug Fix: Gracefully handle non‑200 responses and prevent resource leaks during network operations.
Add httpx>=0.28.1 as a new HTTP client dependency.
New Features- Added httpx>=0.28.1 to pyproject.toml and requirements.txt.
Enhancements
- Updated uv.lock to include httpx package metadata.
Bug Fixes
- None.
The updated regex now matches non‑numeric unit prefixes, and units are normalized before conversion, improving accuracy and preventing mismatches.
- Bug Fixes: Fixed incorrect unit detection that caused failed conversions.
- Enhancements: Added unit cleaning (`converter.clean_type`) to standardize input.
- New Features: None.
- New Features
- Incremented project version to 0.2.0
- Enhancements
- Fixed image reference to use src/assets/modus.png
- Pinned pywayland to exact version 0.4.18
- Added explicit version constraints for new dependencies
- Bug Fixes
- None
- New Features: Added tracking of config/ files and removed stale asset ignores.
- Enhancements: Regenerated uv.lock with updated dependency versions, including cffi and click.
- Bug Fixes: Eliminated ignore rules that could unintentionally exclude new project files.
Introduce helper functions to invoke the primary application and lock entry points, enhancing modularity and testability.
New Features
- run_app(): launches the main application.
- run_lock(): launches the lock module.
Enhancements
- Refactor start.py to isolate command execution logic.
This change adds a mechanism to refresh the todo list dynamically when the underlying service updates, improving UI responsiveness and user experience. It also updates documentation and removes deprecated files.
- New Features:
- Added `_refresh_todos` method to rebuild the todo list when `get_todo_service().todos` changes.
- Introduced `TodoListCapture` class for mouse capture handling of the todo list window.
- Enhancements:
- Updated README with corrected image paths, installation tips, and manual installation commands.
- Introduced `start.py` to launch the application or lock mode.
- Removed deprecated `config.json` and `debug_memory.py`.
- Bug Fixes:
- Fixed lock screen screenshot path in README.
- delete gamemode.sh, hyprpicker.sh, and screen-capture.sh as they are no longer used
- cleanup of dead code simplifies project structure and reduces maintenance overhead
Replace transparent background with theme variable and tidy up CSS.
- New Features
- Enhancements
- Use `@bg` instead of `alpha(#fff, 0.07)`
- Remove unused comment blocks
- Bug Fixes
- Clean up duplicated CSS comments and whitespace
- Removed redundant checks for "unknown" in title and wmclass
- Streamlined cleanup to treat "unknown" as empty strings
- Always call format_app_name with update=True to sync service state
- Improves readability and reduces edge‑case bugs
Changed the default layer used by `create_dropdown_with_capture` from `"bottom"` to `"top"` and updated the call site accordingly. Added safety checks to set `_pointing_widget` on indicator windows when they exist, preventing potential errors when the windows are not created.
- Enhancements:
- Updated default `layer` parameter in `create_dropdown_with_capture` to `"top"`.
- Bug Fixes:
- Ensured `BluetoothIndicator`, `NetworkIndicator`, and `BatteryIndicator` properly assign `_pointing_widget` to their respective buttons when the associated windows are present.
Why: Refactor mouse capture logic to use robust input‑region handling, add support for multi‑click events, and align layer usage with the passed layer parameter; update dropdown to use an Escape keybinding instead of a button‑press hide.
New Features:
- Support button‑press, double‑click, and triple‑click events.
- Introduce `_get_child_window_bounds` helper and window‑local coordinate detection for accurate click placement.
- Add cursor‑feedback styling updates on the trigger widget.
Enhancements:
- Make overlay layer configurable via the passed `layer` argument.
- Replace direct `button-press-event` connection with an Escape keybinding in the dropdown.
- Update imports to use `Gdk` and new utilities (`HyprlandWithMonitors`, `modus_service`).
Bug Fixes:
- Resolve race condition that could hide child windows on external clicks.
- Ensure immediate hide when clicking outside the child window to avoid timing issues.
- Correct click‑inside detection logic and properly consume events.
- Removed outdated TODO comment and placeholder signal definition that caused type conversion errors
- Added Signal with explicit GObject.TYPE_INT64 argument type and correct parameter extraction using .get_int64()
- Ensured reliable emission of seeked signal to upstream DBus handler
- New Features
- Expand search terms to handle reverse DNS and decorated names, increasing match coverage
- Introduce priority‑based matching (exact window_class, name, executable) before falling back to fuzzier containment
- Early exit when no search terms are available
- Enhancements
- Refactor search term collection and normalization for better readability and performance
- Add handling for common wrapper executables to prevent false positives
- Implement fuzzy containment matching for partial name matches
- Bug Fixes
- Fix return logic when search terms are empty to avoid unintended None returns
- Correct order of priority checks to prioritize exact matches over fuzzy matches
- Refactor `_get_icon_from_desktop_file` to ignore file errors and fallback to the default icon.
- Replace regex‑based lookup in `_get_desktop_file` with normalized search IDs and explicit filename matching.
- Add support for matching `StartupWMClass`/`Name` fields within desktop files.
Enhancements
- Improve icon theme lookup in `_compositor_find_icon` with suffix handling and direct matches.
- Add defensive checks for empty `app_id` and exception handling throughout.
Bug Fixes
- Handle exceptions when reading desktop files and log errors gracefully.
This test validates that MprisPlayer correctly emits the `seeked` signal with both small and large value ranges, using a mocked DBus helper to avoid runtime DBus dependencies.
- New Features:
- Add `scratch/test_mpris_fix.py` to test signal emission edge cases.
- Enhancements:
- None
- Bug Fixes:
- None
New Features
- Introduce a random ticket mechanism to prevent rapid hide/show cycles.
- Add `_get_dock_config` helper to centralize position‑specific configuration.
- Refactor `_create_pinned_button` and `_populate_pinned_apps` for clarity and reuse.
Enhancements- Replace manual child removal with `clear_children` utility.
- Extract `_get_app_icon` to simplify icon resolution.
- Streamline imports and use explicit imports.
Bug Fixes
- Resolve hover race condition using ticket comparison.
- Ensure occlusion checks respect `DOCK_ALWAYS_OCCLUDED` correctly.
- New Feature: Introduce dock styling with background, padding, and rounded corners- Enhancement: Add smooth transition animations for show/hide states
- Enhancement: Implement interactive hover and activate effects on dock items
This change introduces the Dock component to the application, enhancing UI consistency and providing system‑level dock management capabilities.
- **New Features**: Instantiated `Dock` and integrated it into the launcher widget list.
- **Enhancements**: Early initialization of Dock for smoother startup and better configuration flow.
- **Bug Fixes**: None.
Replace external `requests` calls with `urllib` to eliminate third‑party dependency, add robust timeout handling, and improve error reporting. This also standardises URL fetching across the module and updates the process name configuration.
Enhancements:
- Added default request timeout fallback and ensured proper cleanup of response objects
- Enriched exception messages for better debugging
Bug Fixes:
- Fixed potential timeout‑related crashes in `CurrencyCache` and `Conversion`
- Corrected process name setting via `set_process_name` in the entry point
- Refactored Deskwidgets to no longer inherit from Window, now managing windows via attributes.
- Removed unnecessary initialization parameters and size settings.
- Updated class comment to reflect the new responsibilities.
Add UI positioning windows and streamline dependency list to improve maintainability.
- New Features:
- Added deskwidget.top_left and deskwidget.bottom_left to main.py.
- Enhancements:
- Updated pyproject.toml and requirements.txt: removed unused packages and pinned pywayland==0.4.18.
- refreshed uv.lock metadata.
The updates improve visual consistency by increasing padding, adjusting border radii, adding transition effects, and introducing new selection and workspace label styling for clearer UI feedback.
New Features- Added .switcher-selection-label and .switcher-workspace-label selectors with appropriate styling- Introduced .switcher-icon-box with border radius and padding
Enhancements
- Increased #switcher-button padding and border radius
- Adjusted #window-button active background and radius- Added transition effect to #switcher-buttonBug Fixes
- None
- New Features
- Added gradient background classes for various weather conditions
- Enhancements
- Updated transition timing and border radius for smoother animations
- Improved typography spacing and color contrast
- Bug Fixes
- Fixed missing newline at end of file
- Corrected background rendering for gradient classes
The update reorganizes the weather widget UI, adds a header for city and icon, a body for values, adjusts alignment and sizing, and applies a gradient class to the parent container.
- New Features: Structured header/footer layout for weather information
- Enhancements: Realigned text order, increased max_chars_width, resized icon, improved spacing- Bug Fixes: None
- New Feature: Added support for passing `wmclass` to `AboutApp`.
- Enhancements: Safely fetch `current_active_wm_class` using `getattr` with a default empty string.
- Bug Fixes: Prevent potential error when `current_active_wm_class` attribute is absent.
New Features
- Introduced StartupWMClass matching and content‑based fallback for .desktop files
- Added ordered search terms with exact, prefix, and contains strategies- Implemented multi‑step icon retrieval: resolver, direct path, emoji fallback
Enhancements
- Replaced list‑based match attempts with priority‑ordered search flow
- Streamlined parsing of desktop entries by section and key handling- Improved error resilience by using continue on exceptionsBug Fixes
- Fixed potential missing icon assignment when pixbuf lookup fails
- Corrected comment fallback logic to use GenericName when Comment is empty
- New Features
- Added `current_active_wm_class_changed` signal and `current_active_wm_class` read‑write property.
- Implemented setter that emits the signal when the value changes.
- Initialized `_current_active_wm_class` and integrated it into active window updates.
- Enhancements
- Extended active window handling to include window class information.
- Bug Fixes
- Corrected default active application name from "Hyprland" to "Finder".
New Features
- Enable dynamic hiding of tray items using the `systray_ignore` configuration.
Enhancements
- Track tray item instances for hot‑reload and refresh visibility on config changes.
- Improve logging, tooltip handling, and icon lookup for better debugging.
Bug Fixes
- None
New Features
- Add structured `notification_limited_apps_history` entries.
- Introduce `systray_ignore` to filter background applications.
Enhancements
- Refactor `notification_ignored_apps` array layout for clearer presentation.
- Adjust comma and field ordering in the configuration file.
Bug Fixes- None.
This update ensures the panel's tray is hidden when there are no visible items and updatesits visibility automatically when the configuration changes or when notifications are added
or removed.
New Features:
- Add `_update_tray_visibility` method that hides the tray when empty and updates UI
accordingly.
- Connect `tray` "add" and "remove" signals to trigger visibility updates.
- Adjust chevron button visibility, icon, and left margin based on tray state.
Enhancements:
- Invoke visibility update on panel initialization, DND changes, and configuration changes.
- Reset visual elements (chevron icon, margin) when the tray becomes hidden.
- Preserve layout spacing improvements when tray is hidden.
Bug Fixes:
- Prevent stale tray visibility state after configuration updates.
- Updated README to use `uv run lock.py` for lock‑screen binding
- Replaced pip install with `uv sync` and migrated to an uv‑managed Python virtual environment- Marked Installation Script and migration as completed in the TODO checklist
- Enhancements: Use viewBox, drop inline CSS, and simplify path data
- Enhancements: Ensure consistent white fill and improve scaling behavior
- Bug Fixes: Remove theme‑specific color class references that could cause rendering issues
Enhancements:
- Add optimized night‑variant detection for weather icons using a predefined list
- Replace `Svg` usage with direct `svg_file` calls throughout the todo widget, removing redundant relative‑path logic
- Update dock and battery modules to load assets via direct paths, eliminating unnecessary `get_relative_path` calls- Introduce `WEATHER_CACHE_TIMEOUT` constant and tidy up unused imports (`WEATHER_EMOJI_MAP` removed)
- Minor formatting and structural clean‑ups that improve code readability
Bug Fixes:
- Remove dead import of `WEATHER_EMOJI_MAP` and unused constant `WEATHER_EMOJI_MAP`
- Correct syntax of `condition_em` initialization to avoid potential rendering issues
New Features:
- None.
New Features
- Added uv as the primary package manager and introduced new system packages awww, apple-fonts, swappy, and wl-clipboard.
- Removed many redundant Python packages from the install script.
Enhancements
- Replaced Pillow-based QR code detection with GdkPixbuf, eliminating the python-pillow dependency.
- Fixed a typo in the import (`ConfigServic` → `ConfigService`) and corrected service imports.
- Updated the application launch to use `uwsm app -- uv run main.py` for uv-managed execution.
Bug Fixes
- Resolved import typo that prevented proper ConfigService initialization.
- Adjusted QR-code decoding logic to correctly handle image pixel channels, improving robustness.
Why: replaced emoji-based weather icons with a dynamic SVG mapping, introduced WEATHER_ICON_MAP, updated format_weather_data and Weather class to use icon names and svg_file, removed unused constants and clarified day/night variant handling.
- New Features
- Added WEATHER_ICON_MAP linking weather codes to SVG identifiers and supporting night variants.
- Updated format_weather_data to return icon_name and use svg_file for dynamic icon resolution.
- Modified Weather widget to set condition label via dynamic SVG files instead of emoji.
- Enhancements
- Implemented day/night icon variant logic using optimistic naming based on known variants.
- Removed unused constant imports and simplified label update logic.
- Improved error handling with explicit fallbacks for missing weather fields.
- Bug Fixes
- Fixed potential missing icon fallback by using .get with default values.
- Corrected label assignment order to match new data structure.
Add missing icons for caps lock and keyboard layout to enhance settings UI.
New Features
- Add caps-lock-off.svg, caps-lock.svg, and keyboard-layout.svg.
The import is now performed lazily within load_config to avoid early import errors and unnecessary loading during module initialization.
- Enhancement: Lazy loading of configuration service
- Bug Fix: Prevent ImportError when services.config is unavailable during startup
- rename `#osd` selectors to `#osd-container` for better encapsulation
- add `min-width: 180px` to the container definition
- update muted styling rules to use `#osd-container.muted` instead of element‑specific classes
- replace deprecated `#brighntess-icons.muted` with `#osd-image.muted`
- clean up stray braces and whitespace in the stylesheet
Enhancements
- Replace bare `except:` with `except Exception:` in multiple modules- Cast step calculation to `int` for consistent type
- Simplify `get_battery_icon_file` to return a string directly
- Use `get_todo_service()` instead of module-level `todo_service` throughout todo widget
- Remove unused `"zen": "zen-browser"` mapping entry
Bug Fixes
- Prevent bare exception swallowing by catching `Exception` explicitly
- Ensure proper cleanup of timer IDs and other resources
- Delete unused modules/osdd components
New Features
- None
Introduce a new OSDWindow implementation, expose keyboard layout configuration, and modernize dependency handling and helper utilities.
- **New Features**
- Added `keyboard_layouts` list (`us`, `np`) to `config.json`
- Created `OSDWindow` class and updated `main.py` to use it
- Introduced new service modules (`battery`, `brightness`, `capslock`, `network`, `mpris`, `todo`, `modus`) and expanded `services/__init__.py`
- Added `CommandResult` and `run_command` helper in `utils/functions.py`
- **Enhancements**
- Upgraded numerous dependencies to newer versions and switched `fabric` to a git source
- Replaced bare `except:` with `except Exception:` in `WiFiPasswordDialog`
- Improved type hints (`NamedTuple`, `TypeVar`) and refactored JSON file helpers
- Added property notifications for battery percentage, state, and presence
- **Bug Fixes**
- Fixed incorrect return type annotation in `read_json_file`
- Corrected tick‑handler logic to avoid double registration
- Properly notify listeners on battery property changes
- Ensured proper exception handling and cleanup in utility functions
New Features
- Introduced OSD functionality integrated into the application.
Enhancements
- Removed unused stylesheet imports from main.css and corrected the stylesheet path to `styles/main.css`.
- Adjusted the lambda in the network service for consistent method invocation.
Bug Fixes
- Ensured `on_access_point_activated` is properly called when the active access point changes.
Remove dead code and redundant blank lines, simplify timer interval selection, and ensure proper realization handling. This improves readability and prevents potential runtime issues.
New Features
-
Enhancements
- Refined timer interval calculation for clarity
- Consolidated easing function stubs for consistency
Bug Fixes
- Fixed missing realize handler connection in SlideRevealer
- Eliminated stray blank line that could affect indentation
- Refactor dock update loop to use explicit parentheses and improve readability
- Fix closure capture in OTP plugin action to correctly pass current code
- Remove redundant lambda wrapper in player label binding
- Update logger messages with full exception context
- Adjust imports and naming for consistency across modules
- Minor code style updates and whitespace cleanup
New Features
- Introduce `debounce` async decorator to delay coroutine execution until a specified delay elapses.
- Add `sync_debounce` wrapper that uses GLib timeout for synchronous functions, supporting immediate execution and repeat counts.
New Features
- Introduce WEATHER_GRADIENT_MAP and WEATHER_EMOJI_MAP for condition‑to‑emoji mapping.
- Add SYSTEM_UPDATE_INTERVAL, WEATHER_UPDATE_INTERVAL, CALENDAR_UPDATE_INTERVAL constants and extend cache timeouts.
- Implement CpuInfo and RamInfo widgets with real‑time CPU percentage, temperature, and RAM usage display.
Enhancements
- Extend LOCATION_CACHE_TIMEOUT to 7 days.
- Integrate progress bar updates for CPU and memory usage.
- Organize desktop widget manager with separate top‑left and bottom‑right windows.
Bug Fixes
- None
The Deskwidgets module is now imported, instantiated, and integrated into the main application, expanding desktop widget capabilities.
New Features
- Added Deskwidgets import and instantiation.
- Integrated Deskwidgets into the Application instance.
Enhancements
- Removed stale comments and activated the component.
Bug Fixes
- None
Commented out deprecated keybinds and removed an unused layerrule to clean up configuration and avoid accidental triggers.
New Features
-
Enhancements
- Streamlined layerrules and removed unused definitions.
Bug Fixes
- Avoided accidental execution of stale keybinds.
The about.py module was deprecated and replaced by newer implementations; its removal cleans up dead code.
New Features
- No new feature introduced
Enhancements
- No functional enhancements
Bug Fixes
- No bug fixes
- New Features
- Add Bluetooth and Wi‑Fi icon sets for applet UI.
- Enhancements
- Introduce scalable SVG assets with color scheme support.
- Bug Fixes
- None
New Features
- Introduce `get_battery_icon_file` to generate battery icons based on percentage and charging state.
- Add fallback Bluetooth control using `rfkill` when Fabric Bluetooth fails.
Enhancements
- Refactor layout management with `_rebuild_layout_from_config` and dynamic indicator instantiation.
- Replace large `EnergyModeButton` class with lightweight utility functions.
- Simplify notification icon updates using `dynamic_file`.
Bug Fixes
- No explicit bug fixes; changes focus on feature additions and refactoring.
Migrate import statements to align with updated fabric utilities.
- New Features
- Enhancements
- Consolidate imports from gi.repository into fabric.utils for cleaner dependency management.
- Bug Fixes
The changes introduce a new GioDBusHelper class for D-Bus interactions and expand utils/functions.py with utilities for timeout parsing, cursor hover handling, animated scale widgets, and SVG loading, improving functionality and maintainability.
- New Features
- Add GioDBusHelper for method calls and signal subscription.
- Enhancements
- Add parse_timeout_string and replace placeholder set_process_name implementation.
- Implement AnimatedScale widget and related utilities.
- Provide svg_file helper with dynamic style updates.
- Bug Fixes
- None
Introduce a new config.json, modernize CSS for dock, battery, and about windows, and clean up obsolete styling.
New Features
- Add `config.json` with wallpaper directory, dock position, and UI flags.
- Create `styles/constant.css` for shared color definitions.
- Rename and style `styles/battery.css` with new visual rules.
- Update hover background in `styles/about.css`.
Enhancements
- Remove deprecated dock CSS to simplify the stylesheet.
- Streamline layer window setup and input handling.
Bug Fixes
- Resolve hover styling conflict in about.css.
- Ensure consistent theming across new style files.
New Features
- Added `set_process_name` function to set the process name via `prctl`.
Enhancements
- Replaced `loguru` logger import with `fabric.utils.logger` and removed the unused dependency.
- Added explicit imports of `ctypes`, `html`, and `json` for clarity and future use.
Bug Fixes
- No bug fixes included in this change.
Add explicit pyproject.toml with project metadata, dependency groups, and uv lock configuration.
- New Features
- Introduce pyproject.toml defining package name, version, description, and runtime dependencies.
- Declare dependencies in a structured list and development groups.
- Enhancements
- Consolidate and clean up imports in lock.py and main.py.
- Replace hard‑coded logger disable entries with targeted fabric module names.
- Streamline Application initialization by removing unused components.
- Bug Fixes
- Resolve missing imports that caused NameError.
- Correct import ordering for static analysis compliance.
- Align dependency versions with uv.lock for reproducibility.
Remove unused auth module and associated screenshot/OQR code logic.
Clean up network import statements and unused dependencies.
Minor cleanup in todo service to eliminate trailing whitespace.
New Features
- None
Enhancements
- Refactored network module imports.
- Streamlined todo service by removing dead code.
Bug Fixes
- None
- Enhancements: Refactored import section to remove unused modules, added explicit parentheses in hash generation for clarity, and updated debug logging messages for cache cleanup.
- Bug Fixes: Ensured consistent encoding of hash inputs and improved error handling in image dimension hashing.
- Style: Applied consistent formatting and spacing throughout the notification module.