- 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)
- Replace GTK theme notifications icon with SVG
- Fix load_and_cache_theme_icon to use Gtk.IconTheme directly
instead of IconResolver (designed for app IDs, not theme names)
- Add suffix fallbacks for theme icon resolution
- Replace GTK theme battery icons with SVG from assets/icons/battery/
- Replace back button icon with misc/chevron-left.svg
- Remove unused get_battery_theme_icon function
- Add attach_battery_proxy() for devices where Battery1 appears after Device1
- Handle BLUEZ_BATTERY_IFACE in InterfacesAdded signal
- Search existing devices by object path to attach late battery proxy
- Replace Svg.has_style_class (nonexistent) with _anim_state flag
- Add on_show handler to trigger scan+refresh when wifi widget mapped
- Fix other_networks snap_to_size when section visible with children
- Add destroyed widget guards on connection callbacks
Switch from the abandoned package to .
Patch into sys.modules before importing pam since
python-pam uses it internally but doesn't declare it as a dependency.
Update authenticate call to use pam.pam().authenticate().
This commit fully migrates the Python network service away from external wlan0: connected to Amar 2GNet
"MEDIATEK MT7921 802.11ax"
wifi (mt7921e), 2C:98:11:76:9B:2B, hw, mtu 1500
ip4 default, ip6 default
inet4 192.168.18.70/24
route4 192.168.18.0/24 metric 600
route4 default via 192.168.18.1 metric 600
inet6 2405:acc0:1306:351c:ac94:2135:f9a8:5c89/64
inet6 fe80::4057:8edd:a684:5e33/64
route6 fe80::/64 metric 1024
route6 2405:acc0:1306:351c::/64 metric 600
route6 default via fe80::1 metric 600
lo: connected (externally) to lo
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
inet4 127.0.0.1/8
inet6 ::1/128
docker0: connected (externally) to docker0
"docker0"
bridge, 0A:89:72:7F:4D:75, sw, mtu 1500
inet4 172.17.0.1/16
route4 172.17.0.0/16 metric 0
p2p-dev-wlan0: disconnected
"p2p-dev-wlan0"
wifi-p2p, hw
enp2s0: unavailable
"Realtek RTL8111/8168/8211/8411"
ethernet (r8169), 40:C2:BA:53:D5:E4, hw, mtu 1500
DNS configuration:
servers: 192.168.18.1
interface: wlan0
servers: fe80::1
interface: wlan0
Use "nmcli device show" to get complete information about known devices and
"nmcli connection show" to get an overview on active connection profiles.
Consult nmcli(1) and nmcli-examples(7) manual pages for complete usage details.
subprocess calls, implementing native D-Bus communication for a more robust and
integrated architecture.
Key changes:
- :
- Implemented native D-Bus methods for , , and .
- Updated to track , , and state.
- Fixed a bug where D-Bus returned a tuple, preventing known networks from being parsed correctly.
- :
- Wired UI events to the new D-Bus connection methods.
- Fixed a race condition in initialization where it missed the synchronous signal, leaving the UI permanently disabled.
- Removed the early-return optimization in that was preventing the active CSS state from applying to already-known networks.
- Cleaned up unused variables to satisfy linting and removed redundant blocks.
- :
- Removed the 5-second timeout hack, as the new D-Bus service properly fires callbacks upon connection success/failure.
- Removed hardcoded WPA2 text to make the dialog security-type agnostic.
- :
- Cleaned up active state styling so only the SVG icon box highlights (using ) when a network is connected.
Use raw D-Bus via Gio.DBusProxy instead of libplayerctl. All MPRIS
interactions now go through standard D-Bus property reads and method calls.
- Filter out playerctld proxy (duplicates active player)
- Validate art URLs (http/https/file only)
- Track failed cover downloads to avoid retry loops
- Remove excessive try/except around safe property reads
- Add public metadata property for consumers
- Fix consumer references to removed _player.props.metadata
- Merge game-mode/charge-limit CSS into shared selectors
- Rewrite Battery service with IntEnum states and charge-limit support
- Add ChargeLimitButton with active-state styling
- Drop ddcutil from dependencies (unused)
- Use org.freedesktop.login1.Session.SetBrightness for kernel backlight
- Remove ddcutil dependency entirely
- Fix OSD: use signal percentage value directly (like audio OSD)
- Fix controlcenter: stop dividing percentage by max_screen again