From ab0f6a8f2ce2eb1db3beccc065a907bd8cfb888e Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Mon, 20 Jul 2026 18:35:19 -0700 Subject: [PATCH] Fast-poll Tailscale and Dropbox at shell startup so icons go live promptly Both services fire one status poll when the shell starts, but after a fresh boot that lands before tailscaled has connected or dropboxd has finished its respawn dance, leaving the bar icons stale for a full 30s/60s refresh interval. Re-poll every 2s until the service shows up (or ~30s pass), then hand off to the normal periodic refresh. Co-Authored-By: Claude Fable 5 --- shell/plugins/panels/dropbox/Service.qml | 17 +++++++++++++++++ shell/plugins/panels/tailscale/Service.qml | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/shell/plugins/panels/dropbox/Service.qml b/shell/plugins/panels/dropbox/Service.qml index 13f7e4bd..f4d56f4f 100644 --- a/shell/plugins/panels/dropbox/Service.qml +++ b/shell/plugins/panels/dropbox/Service.qml @@ -166,6 +166,23 @@ Item { onTriggered: root.refresh() } + Timer { + // After a fresh boot the startup poll usually lands before dropboxd has + // finished its respawn dance, which left the icon stale until the next + // periodic refresh. Poll quickly until the daemon shows up, or give up + // after ~30 seconds. + id: startupRamp + property int ticks: 0 + interval: 2000 + repeat: true + running: true + onTriggered: { + ticks += 1 + if (root.running || ticks >= 15) startupRamp.running = false + else root.refresh() + } + } + Timer { id: delayedRefresh interval: 1000 diff --git a/shell/plugins/panels/tailscale/Service.qml b/shell/plugins/panels/tailscale/Service.qml index f1ef912e..ffb5eb17 100644 --- a/shell/plugins/panels/tailscale/Service.qml +++ b/shell/plugins/panels/tailscale/Service.qml @@ -363,6 +363,22 @@ Item { onTriggered: root.refresh() } + Timer { + // After a fresh boot the startup poll usually lands before tailscaled has + // connected, which left the icon stale until the next periodic refresh. + // Poll quickly until the service shows up, or give up after ~30 seconds. + id: startupRamp + property int ticks: 0 + interval: 2000 + repeat: true + running: true + onTriggered: { + ticks += 1 + if (root.running || ticks >= 15) startupRamp.running = false + else root.refresh() + } + } + Timer { id: delayedRefresh interval: 600