Refresh bar widgets on every monitor, not just one

A bar surface is built per monitor, so a widget in the layout is live once
per screen — but an IPC target only ever routes to the handler that
registered first. `omarchy.indicators refresh` therefore reached a single
bar, and since indicators only re-read their state on that signal, the
other screens kept showing a stale reminder count, tmux alert, or DND
state until the next reload. Clock and system-update refreshes had the
same reach.

Let the bar resolve every live instance of a widget id and relay the call
to all of them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
David Heinemeier Hansson
2026-07-24 14:16:22 -07:00
co-authored by Claude Opus 5
parent 49efe2dafa
commit d2e1587ceb
6 changed files with 36 additions and 9 deletions
+16 -2
View File
@@ -384,11 +384,25 @@ Item {
return true
}
// Every live instance of a widget id. A bar surface is built per monitor, so
// a widget that appears once in the layout is still live once per screen.
function moduleWidgets(pluginId) {
var id = String(pluginId || "")
var items = []
if (!id) return items
for (var i = 0; i < moduleSlots.length; i++) {
var slot = moduleSlots[i]
if (!slot || !slot.activeItem || slot.moduleName !== id) continue
items.push(slot.activeItem)
}
return items
}
// Resolve the live bar-widget instance for a plugin id (e.g. "omarchy.bluetooth").
// Only widgets that expose popup open/close methods count; plain indicators
// (clock, workspaces, tray) return null. Used by shell.summon/toggle so
// panel hotkeys route through the bar instead of a per-target IpcHandler
// that goes stale when the bar reloads its widget instances.
// panel hotkeys route through the bar instead of a per-target IPC handler
// that only reaches whichever per-monitor instance claimed the target.
function findPanelWidget(pluginId) {
var id = String(pluginId || "")
if (!id) return null
+1 -1
View File
@@ -49,7 +49,7 @@ BarWidget {
IpcHandler {
target: "omarchy.clock"
function refresh(): void { root.refresh() }
function refresh(): void { root.broadcast("refresh") }
}
WidgetButton {
+3 -1
View File
@@ -152,6 +152,8 @@ BarWidget {
syncActiveIndicatorModel()
}
function refresh() { root.refreshRequested() }
onIndicatorEntriesChanged: syncActiveIndicatorOrder()
implicitWidth: root.vertical
@@ -165,7 +167,7 @@ BarWidget {
target: "omarchy.indicators"
function refresh(): void {
root.refreshRequested()
root.broadcast("refresh")
}
}
+2 -2
View File
@@ -28,11 +28,11 @@ BarWidget {
target: "omarchy.system-update"
function refresh(): void {
root.refresh()
root.broadcast("refresh")
}
function clear(): void {
root.clear()
root.broadcast("clear")
}
}