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:
co-authored by
Claude Opus 5
parent
49efe2dafa
commit
d2e1587ceb
@@ -22,6 +22,18 @@ Item {
|
|||||||
readonly property bool vertical: bar ? bar.vertical : false
|
readonly property bool vertical: bar ? bar.vertical : false
|
||||||
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
|
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
|
||||||
|
|
||||||
|
// Run `method` on every live instance of this widget. An IPC target only
|
||||||
|
// ever routes to one handler, but a bar surface exists per monitor, so the
|
||||||
|
// instance that owns the target relays the call to its peers — otherwise a
|
||||||
|
// refresh would land on a single screen and leave the others stale.
|
||||||
|
function broadcast(method) {
|
||||||
|
var items = bar && typeof bar.moduleWidgets === "function"
|
||||||
|
? bar.moduleWidgets(moduleName) : [root]
|
||||||
|
for (var i = 0; i < items.length; i++) {
|
||||||
|
if (items[i] && typeof items[i][method] === "function") items[i][method]()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Read a single value from this widget's inline shell.json entry, with a
|
// Read a single value from this widget's inline shell.json entry, with a
|
||||||
// fallback for missing/null values. Every widget that takes user-tunable
|
// fallback for missing/null values. Every widget that takes user-tunable
|
||||||
// settings needs this; defining it once on the base keeps the wiring
|
// settings needs this; defining it once on the base keeps the wiring
|
||||||
|
|||||||
@@ -384,11 +384,25 @@ Item {
|
|||||||
return true
|
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").
|
// 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
|
// Only widgets that expose popup open/close methods count; plain indicators
|
||||||
// (clock, workspaces, tray) return null. Used by shell.summon/toggle so
|
// (clock, workspaces, tray) return null. Used by shell.summon/toggle so
|
||||||
// panel hotkeys route through the bar instead of a per-target IpcHandler
|
// panel hotkeys route through the bar instead of a per-target IPC handler
|
||||||
// that goes stale when the bar reloads its widget instances.
|
// that only reaches whichever per-monitor instance claimed the target.
|
||||||
function findPanelWidget(pluginId) {
|
function findPanelWidget(pluginId) {
|
||||||
var id = String(pluginId || "")
|
var id = String(pluginId || "")
|
||||||
if (!id) return null
|
if (!id) return null
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ BarWidget {
|
|||||||
|
|
||||||
IpcHandler {
|
IpcHandler {
|
||||||
target: "omarchy.clock"
|
target: "omarchy.clock"
|
||||||
function refresh(): void { root.refresh() }
|
function refresh(): void { root.broadcast("refresh") }
|
||||||
}
|
}
|
||||||
|
|
||||||
WidgetButton {
|
WidgetButton {
|
||||||
|
|||||||
@@ -152,6 +152,8 @@ BarWidget {
|
|||||||
syncActiveIndicatorModel()
|
syncActiveIndicatorModel()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function refresh() { root.refreshRequested() }
|
||||||
|
|
||||||
onIndicatorEntriesChanged: syncActiveIndicatorOrder()
|
onIndicatorEntriesChanged: syncActiveIndicatorOrder()
|
||||||
|
|
||||||
implicitWidth: root.vertical
|
implicitWidth: root.vertical
|
||||||
@@ -165,7 +167,7 @@ BarWidget {
|
|||||||
target: "omarchy.indicators"
|
target: "omarchy.indicators"
|
||||||
|
|
||||||
function refresh(): void {
|
function refresh(): void {
|
||||||
root.refreshRequested()
|
root.broadcast("refresh")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ BarWidget {
|
|||||||
target: "omarchy.system-update"
|
target: "omarchy.system-update"
|
||||||
|
|
||||||
function refresh(): void {
|
function refresh(): void {
|
||||||
root.refresh()
|
root.broadcast("refresh")
|
||||||
}
|
}
|
||||||
|
|
||||||
function clear(): void {
|
function clear(): void {
|
||||||
root.clear()
|
root.broadcast("clear")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -423,9 +423,8 @@ ShellRoot {
|
|||||||
// Bar-widget panels (audio, bluetooth, network, power, monitor, etc.)
|
// Bar-widget panels (audio, bluetooth, network, power, monitor, etc.)
|
||||||
// are mounted inside the bar, not via the panel loader below. Route
|
// are mounted inside the bar, not via the panel loader below. Route
|
||||||
// summon/hide/toggle to the live bar instance so panel hotkeys survive
|
// summon/hide/toggle to the live bar instance so panel hotkeys survive
|
||||||
// plugin/bar reloads: the bar re-creates the widget, while a fixed
|
// plugin/bar reloads: the bar re-creates the widget, while a fixed IPC
|
||||||
// IpcHandler target would go stale ("first handler wins" leaves a
|
// target only ever routes to one of the per-monitor instances.
|
||||||
// destroyed instance's handler active and the new one rejected).
|
|
||||||
function isBarWidgetPanelPlugin(pluginId) {
|
function isBarWidgetPanelPlugin(pluginId) {
|
||||||
var plugins = shell.pluginRegistry.installedPlugins
|
var plugins = shell.pluginRegistry.installedPlugins
|
||||||
var m = plugins[String(pluginId || "")]
|
var m = plugins[String(pluginId || "")]
|
||||||
|
|||||||
Reference in New Issue
Block a user