- Cache saved SSIDs and refresh them off the main thread; keep in sync via
the Settings proxy's Connections property-change notify, so is_network_saved
never issues a blocking D-Bus GetSettings round-trip on the GTK main loop.
This prevented the panel and control-center popup from freezing while wifi
devices were switched.
- Treat AddAndActivateConnection/ActivateConnection results as success by
truthiness instead of requiring a two-element tuple (only the ...2 variant
returns one). The old check always evaluated False, so even a successful
password connect was reported as a failure and re-prompted the password
dialog.
GTK3 apps like nwg-look export their menubar model under
/org/appmenu/gtk/window/menus/menubar/N on unique bus names (:1.x).
The fast probe previously only walked [wm_class, /org/gtk/Application],
missing this path entirely. The full crawl then skips all unique-name
services (svc.startswith(':')), so the menu was never discovered despite
being correctly exported.
device-ready fired before NetworkIndicator subscribes, so Wifi.changed
never reached the panel icon. Auto-reconnect to saved network left icon
stale at wifi-off.
Track connected device paths and connect existing devices at init.
Wired devices were tracked as a single slot, so USB tethering on a
second port never got an Ethernet service object and the indicator
kept showing wifi-off while online. Track all wired devices like
wifi devices, prefer the one with an active connection, treat BT PAN
(type 5) as wired, and refresh on device removal.
Upstream fabric now resolves tray icons correctly, so the local
pixbuf fallback patch is gone. The patch keeps only config-based
item hiding by wrapping do_update_properties.
GIMP reports WM_CLASS "Gimp" but desktop file is gimp.desktop.
Exact-case lookup missed, so bar fell back to raw window title
(e.g. "0 (RGB color, 8-bit, non-linear integer)").
Nested-widget crossing events can be delivered with INFERIOR detail when
the pointer moves onto the close-button overlay, stranding _is_hovered
as True and leaving the timeout killed so the notification never
auto-dismisses. Track surface-level enter/leave on the popup window and
reconcile the hover state from there as a reliable backstop.
- probe once per app instead of per matched bus service
- skip unique :1.x names, which can be stale and never answer DBus
- give fresh apps a 6s probe budget so late-exporting menubars are caught
- fix app-age computed as inf when unregistered unique names poison the
first-seen min, disabling the fresh path entirely
- cache no-menu per app/service so re-focus returns instantly
- skip oversized action menus and truncate top-level menu to 32 items
- parse org.gtk.Actions state via explicit child walk (av unwrap was
fragile on apps like Inkscape)
Wrapped location reflow never reaches the layer-shell toplevel through
Gtk.Fixed, so the card stays at "Loading..." height and clips the second
line of a wrapped location on first init. Queue the toplevel after
updating labels so the taller allocation is applied.
Drop max_chars_width/ellipsization so location and condition wrap
instead of being cut off, and let the card auto-size vertically so the
big temperature no longer clips the bottom text.
Update timer used fixed ms-until-midnight computed at import. Once
midnight passed, the fixed interval re-armed an elapsed timeout, busy
looping update_calendar and destroying/recreating every label until
GTK3 stopped rendering them. Timer now recomputes the interval each
day and the grid mutates pre-built labels in place via set_label /
set_name instead of rebuild.
Also added missing year check for today highlight.
A Gtk.Fixed child resize only bubbles to the toplevel when the window
itself is queued, so move() kept the old allocation until a rebuild.
Queue the window after each reposition so the dragged widget follows
the cursor and lands at the drop position live.
Dropped remove()+put() which never repainted in the layer-shell window.
active shelled out to pidof on every read, blocking the main loop and
missing our own recorder handle. Track the spawned Gio.Subprocess for
an exact answer and cache the external pidof probe for 2s.
Resets the cache at ownership boundaries (start/stop).
Repeated set_label() on every tick destroys and recreates the button's
internal label; after enough redraws GTK3 drops its visibility. Capture
the label once and update via set_text() instead.
run_auth_dialog now returns a thread-safe dismiss callable so polkitd
cancellations can close the dialog from any thread. connect_sysauth_service
wires the agent signals to the dialog: show on begin, respond on submit,
re-prompt on failure, dismiss on cancel.
polkitd ends the authentication session the moment the BeginAuthentication
D-Bus reply returns, so replying immediately aborted every attempt with
'No session for cookie'. The invocation is now held until respond() or
cancel() resolves it, and cancelled sessions return
org.freedesktop.PolicyKit1.Error.Cancelled.
Also export the agent on the system bus (polkitd addresses agents by the
system-bus unique name used for registration) and authenticate through
polkit-agent-helper-1 via socket activation or setuid fallback so PAM
runs as root, instead of the old direct Respond call that only works
for uid 0.
Break self -> animator -> lambda cycles in smooth switch and flat scale
by stopping animators and disconnecting value handlers on destroy. Drop
mutual OSD window/osd refs and clear the applet active-popup class ref.
Suspend the dock animation loop when nothing animates, pause the desktop
system info poller while unmapped, replace the OSD watchdog polling with
a single shot at expiry, lower the notch visualizer tick rate, and
cancel outstanding dock occlusion/rebuild timers on teardown.
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.