Park the indicators just left of the clock

The lineup now reads toward the clock instead of away from it, so Stay
Awake sits nearest the time, then do-not-disturb, night light, reminder,
screen recording, dictation, and tmux alerts trailing off to the left.

Active indicators render after the hover-revealed ones so they stay
against the clock, and a newly active indicator joins on the far side
rather than shoving the ones already showing sideways.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
David Heinemeier Hansson
2026-07-25 07:14:58 -07:00
co-authored by Claude Opus 5
parent ec1553d720
commit 896beb0c85
4 changed files with 83 additions and 39 deletions
+3
View File
@@ -18,6 +18,9 @@
} }
], ],
"center": [ "center": [
{
"id": "omarchy.indicators"
},
{ {
"id": "omarchy.clock", "id": "omarchy.clock",
"format": "dddd HH:mm", "format": "dddd HH:mm",
+39
View File
@@ -0,0 +1,39 @@
echo "Move the bar indicators to the left of the clock"
config_file="$HOME/.config/omarchy/shell.json"
if [[ -s $config_file ]] && omarchy-cmd-present jq; then
tmp=$(mktemp)
jq '
def entry_id:
if type == "string" then
.
elif type == "object" then
(.id // "")
else
""
end;
def entry_index($id):
[range(0; length) as $i | select((.[$i] | entry_id) == $id) | $i][0];
def place_indicators_before_clock:
if type != "array" then
.
else
(entry_index("omarchy.clock")) as $clock_index |
(entry_index("omarchy.indicators")) as $indicators_index |
if $clock_index == null or $indicators_index == null or $indicators_index < $clock_index then
.
else
. as $entries |
($entries[$indicators_index]) as $indicators_entry |
($entries | del(.[$indicators_index])) as $without_indicators |
($without_indicators | entry_index("omarchy.clock")) as $new_clock_index |
$without_indicators[0:$new_clock_index] + [$indicators_entry] + $without_indicators[$new_clock_index:]
end
end;
.bar.layout.center |= place_indicators_before_clock
' "$config_file" >"$tmp" && mv "$tmp" "$config_file" || rm -f "$tmp"
fi
@@ -26,30 +26,15 @@
"placeholderText": "Search indicators...", "placeholderText": "Search indicators...",
"emptyText": "No indicators", "emptyText": "No indicators",
"options": [ "options": [
{
"value": "StayAwake",
"label": "Stay awake",
"description": "Idle lock and screensaver override"
},
{
"value": "Dnd",
"label": "Do not disturb",
"description": "Notification silencing"
},
{
"value": "Reminder",
"label": "Reminder",
"description": "Queued reminder status"
},
{ {
"value": "TmuxAlert", "value": "TmuxAlert",
"label": "Tmux alert", "label": "Tmux alert",
"description": "Tmux windows waiting for attention" "description": "Tmux windows waiting for attention"
}, },
{ {
"value": "NightLight", "value": "Dictation",
"label": "Night light", "label": "Dictation",
"description": "Blue-light filter" "description": "Voice typing status"
}, },
{ {
"value": "ScreenRecording", "value": "ScreenRecording",
@@ -57,9 +42,24 @@
"description": "GPU screen recorder status" "description": "GPU screen recorder status"
}, },
{ {
"value": "Dictation", "value": "Reminder",
"label": "Dictation", "label": "Reminder",
"description": "Voice typing status" "description": "Queued reminder status"
},
{
"value": "NightLight",
"label": "Night light",
"description": "Blue-light filter"
},
{
"value": "Dnd",
"label": "Do not disturb",
"description": "Notification silencing"
},
{
"value": "StayAwake",
"label": "Stay awake",
"description": "Idle lock and screensaver override"
} }
] ]
}, },
+20 -18
View File
@@ -8,7 +8,7 @@ BarWidget {
id: root id: root
moduleName: "omarchy.indicators" moduleName: "omarchy.indicators"
readonly property var defaultIndicatorEntries: [ "StayAwake", "Dnd", "Reminder", "TmuxAlert", "NightLight", "ScreenRecording", "Dictation" ] readonly property var defaultIndicatorEntries: [ "TmuxAlert", "Dictation", "ScreenRecording", "Reminder", "NightLight", "Dnd", "StayAwake" ]
readonly property var indicatorEntries: indicatorEntriesFromSettings(settings) readonly property var indicatorEntries: indicatorEntriesFromSettings(settings)
property var activeIndicatorIds: [] property var activeIndicatorIds: []
property var indicatorActiveStates: ({}) property var indicatorActiveStates: ({})
@@ -142,7 +142,9 @@ BarWidget {
indicatorActiveStates = states indicatorActiveStates = states
var ids = orderedActiveIds(states, activeIndicatorIds) var ids = orderedActiveIds(states, activeIndicatorIds)
if (active && ids.indexOf(id) === -1 && hasIndicatorId(id)) ids.push(id) // The active block sits closest to the clock, so newcomers go on the far
// side of it. Appending would shove everything already showing sideways.
if (active && ids.indexOf(id) === -1 && hasIndicatorId(id)) ids.unshift(id)
activeIndicatorIds = ids activeIndicatorIds = ids
syncActiveIndicatorModel() syncActiveIndicatorModel()
} }
@@ -192,14 +194,6 @@ BarWidget {
onHoveredChanged: root.setIndicatorAreaHovered(hovered) onHoveredChanged: root.setIndicatorAreaHovered(hovered)
} }
ActiveIndicatorBlock {
id: activeHorizontalBlock
indicatorsModule: root
indicatorModel: activeIndicatorModel
horizontal: true
reportActiveState: !root.vertical
}
Item { Item {
id: inactiveHorizontalArea id: inactiveHorizontalArea
@@ -223,6 +217,14 @@ BarWidget {
onHoveredChanged: root.setIndicatorAreaHovered(hovered) onHoveredChanged: root.setIndicatorAreaHovered(hovered)
} }
} }
ActiveIndicatorBlock {
id: activeHorizontalBlock
indicatorsModule: root
indicatorModel: activeIndicatorModel
horizontal: true
reportActiveState: !root.vertical
}
} }
Column { Column {
@@ -235,14 +237,6 @@ BarWidget {
onHoveredChanged: root.setIndicatorAreaHovered(hovered) onHoveredChanged: root.setIndicatorAreaHovered(hovered)
} }
ActiveIndicatorBlock {
id: activeVerticalBlock
indicatorsModule: root
indicatorModel: activeIndicatorModel
horizontal: false
reportActiveState: root.vertical
}
Item { Item {
id: inactiveVerticalArea id: inactiveVerticalArea
@@ -266,6 +260,14 @@ BarWidget {
onHoveredChanged: root.setIndicatorAreaHovered(hovered) onHoveredChanged: root.setIndicatorAreaHovered(hovered)
} }
} }
ActiveIndicatorBlock {
id: activeVerticalBlock
indicatorsModule: root
indicatorModel: activeIndicatorModel
horizontal: false
reportActiveState: root.vertical
}
} }
HoverHandler { HoverHandler {