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).
GIO inherits the caller's working directory when a desktop file has no
Path= entry, so terminals and file managers opened in the Modus project
dir. chdir to the desktop file's Path= or $HOME before launching.
Zen Browser doesn't expose bookmark submenu children through DBusMenu.
Fall back to reading places.sqlite for Bookmarks Toolbar and
Other Bookmarks folders. Truncate to 25 items to avoid menu overflow.
Remove _ICON_SVG_MAP and _icon_to_svg. Use Gtk themed icons directly
via fabric Image widget with set_from_icon_name instead of loading
custom SVG files. Fixes crash when plugin icon SVG is missing.
- Update configuration.md with new section-based format
- Update architecture.md with new config key paths
- Update faqs_tips.md with new config key paths
- Update README.md to mention config sections
- 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
- Replace three synced dicts with single WidgetInfo dataclass
- Add type hints, unregister(), is_registered(), keys(), widgets()
- Add DEFAULT_SIZE constant, duplicate-registration warning
- Extract _make_fade_animator() to remove duplicated animator setup
- Use public registry API in main.py instead of accessing _widgets
Add _dead set to _IntrospectionCache to track paths that timeout.
Failed introspections are skipped on future lookups, reducing
timeout blocks from 300-500ms to near-zero.
Extract _create_system_menu and _create_title_menu factories.
Use ModusDropdown and dropdown_option for system menu.
Convert _build_gtk_menu_from_children to show_all.
Add _make_click_handler method, remove dead _has_extracted_menu.
Use logger.exception for all error logging.
Replace layer-shell AppletWindow-based dropdown with Gtk.Menu approach.
Adds hide signal for button state reset, dropdown_option factory,
append/clear methods, and popup_at_widget/popup aliases.
- Add secondary color and font-sm to app name
- Add font-xs timestamp style
- Add bottom margin to notification header
- Clean up summary and button-label selectors
- Show FlatScale slider (20-100%) next to charge limit toggle
- Display current threshold value as label
- Only rendered when sysfs charge_control path is detected
- Read charge_control_end/charge_control from /sys/class/power_supply/BAT*
- Store threshold value and sysfs path in ChargeLimit dataclass
- Fall back to UPower D-Bus when sysfs unavailable
- Remove opacity transition (Revealer handles visibility now)
- Bump min-size from 20px to 24px to match SwayNotificationCenter
- Zero padding for circular button appearance
- Use @glass-hover/@glass-active for consistent theme colors
- Replace CSS opacity toggle with Gtk.Revealer CROSSFADE for close button
- Add 80ms delayed hide to prevent race condition on boundary crossing
- Fix _refresh_group_widget to sync expanded list in-place instead of
destroy/recreate when group is expanded
- Scope show_all() to expanded_container only to prevent collapsed state
from becoming visible alongside expanded state
- Replace CSS opacity toggle with Gtk.Revealer CROSSFADE for close button
- Wrap close button in EventBox for reliable hover detection
- Add 80ms delayed hide to prevent race condition on boundary crossing
- Implement swipe-right-to-dismiss with _fixed.move() for smooth 60fps
- Skip SlideRevealer.hide() on swipe dismiss to prevent skeleton flash
- volume_scale/brightness_scale disconnect_by_func may fail if signals
were never connected (e.g. on first hide before resources init)
- Downgrade from error to silent pass
- Timeouts are expected for services without introspection support
- _dbus_get_pid and _dbus_introspect now log at debug level
- Cache already stores empty results; invalidation on service appear
causes retries which is correct behavior
- Replace system-search-symbolic with misc/search.svg
- Add _ICON_SVG_MAP for GTK theme to SVG path resolution
- Move all imports to top of file (fix E402)