diff --git a/AGENTS.md b/AGENTS.md index 4a9c3d71..6bda1a7f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -95,7 +95,7 @@ Exceptions are allowed for bootstrap, preflight, migration, and package-helper s # Visual Changes -When making visual changes, such as Waybar styles or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use `omarchy capture screenshot fullscreen save` for fullscreen screenshots. +When making visual changes, such as omarchy-shell styling or desktop appearance, always take and analyze a screenshot after applying the change to verify the result. Use `omarchy capture screenshot fullscreen save` for fullscreen screenshots. For interactive UI work, use `wtype` to simulate keyboard input when available. Example: start the UI in the background, wait briefly for focus, then run `wtype -k Right -k Return` to exercise keyboard selection and confirm the resulting command output or state change. Prefer this over manual-only verification when a UI returns a selected value or changes a symlink/config. diff --git a/bin/omarchy-capture-screenrecording b/bin/omarchy-capture-screenrecording index 90d27279..6e2bf1a2 100755 --- a/bin/omarchy-capture-screenrecording +++ b/bin/omarchy-capture-screenrecording @@ -250,9 +250,7 @@ stop_screenrecording() { } toggle_screenrecording_indicator() { - pkill -RTMIN+8 waybar - OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy} - quickshell ipc -p "$OMARCHY_PATH/default/quickshell/omarchy-shell" call bar refreshScreenRecording >/dev/null 2>&1 || true + omarchy-shell-ipc --if-running bar refreshScreenRecording >/dev/null 2>&1 || true } screenrecording_active() { diff --git a/bin/omarchy-refresh-waybar b/bin/omarchy-refresh-waybar deleted file mode 100755 index 347a5936..00000000 --- a/bin/omarchy-refresh-waybar +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# omarchy:summary=Reset Waybar config to Omarchy defaults -# omarchy:examples=omarchy refresh waybar - -WAYBAR_CONFIG="$HOME/.config/waybar/config.jsonc" - -position=$(sed -nE 's/.*"position"[[:space:]]*:[[:space:]]*"(top|bottom|left|right)".*/\1/p' "$WAYBAR_CONFIG" 2>/dev/null | head -n 1) -height=$(sed -nE 's/.*"height"[[:space:]]*:[[:space:]]*([0-9]+).*/\1/p' "$WAYBAR_CONFIG" 2>/dev/null | head -n 1) -width=$(sed -nE 's/.*"width"[[:space:]]*:[[:space:]]*([0-9]+).*/\1/p' "$WAYBAR_CONFIG" 2>/dev/null | head -n 1) - -omarchy-refresh-config waybar/config.jsonc -omarchy-refresh-config waybar/style.css - -[[ -n $position ]] && sed -i -E "s/(\"position\"[[:space:]]*:[[:space:]]*\")[a-z]+(\")/\\1${position}\\2/" "$WAYBAR_CONFIG" -[[ -n $height ]] && sed -i -E "s/(\"height\"[[:space:]]*:[[:space:]]*)[0-9]+/\\1${height}/" "$WAYBAR_CONFIG" -[[ -n $width ]] && sed -i -E "s/(\"width\"[[:space:]]*:[[:space:]]*)[0-9]+/\\1${width}/" "$WAYBAR_CONFIG" - -omarchy-restart-waybar diff --git a/bin/omarchy-restart-waybar b/bin/omarchy-restart-waybar deleted file mode 100755 index 3a2f4203..00000000 --- a/bin/omarchy-restart-waybar +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -# omarchy:summary=Restart Waybar -# omarchy:examples=omarchy restart waybar - -pkill -9 -x waybar -setsid uwsm-app -- waybar >/dev/null 2>&1 & diff --git a/bin/omarchy-shell-ipc b/bin/omarchy-shell-ipc index 2639ee3b..d6d60de9 100755 --- a/bin/omarchy-shell-ipc +++ b/bin/omarchy-shell-ipc @@ -5,9 +5,11 @@ if [[ $# -eq 0 || $1 == "-h" || $1 == "--help" ]]; then cat < [args...] +Usage: omarchy-shell-ipc [--if-running] [args...] -Starts omarchy-shell if not running, then forwards a quickshell ipc call. +Forwards a quickshell ipc call to omarchy-shell. Starts the shell if it +isn't already running, unless --if-running is passed (in which case the +call is silently skipped when no shell instance exists). Examples: omarchy-shell-ipc shell ping @@ -16,30 +18,45 @@ Examples: omarchy-shell-ipc shell listPlugins omarchy-shell-ipc shell listShellConfig omarchy-shell-ipc shell rescanPlugins + omarchy-shell-ipc --if-running bar refreshIndicators omarchy-shell-ipc image-selector ping omarchy-shell-ipc image-selector cancel "" USAGE exit 0 fi +if_running=0 +if [[ $1 == "--if-running" ]]; then + if_running=1 + shift +fi + OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}" SHELL_DIR="$OMARCHY_PATH/default/quickshell/omarchy-shell" -# Serialize concurrent invocations so two CLI callers don't both spawn the shell -# when no instance is running yet. -lockfile="${XDG_RUNTIME_DIR:-/tmp}/omarchy-shell-ipc.lock" -{ - flock 9 - if ! quickshell list -p "$SHELL_DIR" 2>/dev/null | grep -q '^Instance '; then - # 9<&- so the spawned shell does not inherit (and keep) the lock fd; the - # spawned process is long-lived and would otherwise hold the lock for the - # remainder of the session, deadlocking every subsequent helper invocation. - setsid uwsm-app -- env OMARCHY_PATH="$OMARCHY_PATH" quickshell -p "$SHELL_DIR" >/dev/null 2>&1 9<&- & - for _ in 1 2 3 4 5 6 7 8 9 10; do - sleep 0.2 - quickshell list -p "$SHELL_DIR" 2>/dev/null | grep -q '^Instance ' && break - done - fi -} 9>"$lockfile" +shell_running() { + quickshell list -p "$SHELL_DIR" 2>/dev/null | grep -q '^Instance ' +} + +if (( if_running )); then + shell_running || exit 0 +else + # Serialize concurrent invocations so two CLI callers don't both spawn the shell + # when no instance is running yet. + lockfile="${XDG_RUNTIME_DIR:-/tmp}/omarchy-shell-ipc.lock" + { + flock 9 + if ! shell_running; then + # 9<&- so the spawned shell does not inherit (and keep) the lock fd; the + # spawned process is long-lived and would otherwise hold the lock for the + # remainder of the session, deadlocking every subsequent helper invocation. + setsid uwsm-app -- env OMARCHY_PATH="$OMARCHY_PATH" quickshell -p "$SHELL_DIR" >/dev/null 2>&1 9<&- & + for _ in 1 2 3 4 5 6 7 8 9 10; do + sleep 0.2 + shell_running && break + done + fi + } 9>"$lockfile" +fi exec quickshell ipc -p "$SHELL_DIR" call "$@" diff --git a/bin/omarchy-style-waybar-position b/bin/omarchy-style-waybar-position deleted file mode 100755 index 4146d60c..00000000 --- a/bin/omarchy-style-waybar-position +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# omarchy:summary=Set Waybar position -# omarchy:args= -# omarchy:examples=omarchy-style-waybar-position top | omarchy style waybar-position bottom - -set -e - -WAYBAR_CONFIG="$HOME/.config/waybar/config.jsonc" - -position=$1 - -if [[ ! $position =~ ^(top|bottom|left|right)$ ]]; then - echo "Usage: omarchy-style-waybar-position top|bottom|left|right" >&2 - exit 1 -fi - -if [[ $position == "left" || $position == "right" ]]; then - height=0 - width=28 -else - height=26 - width=0 -fi - -sed -i -E "s/(\"position\"[[:space:]]*:[[:space:]]*\")[a-z]+(\")/\\1${position}\\2/" "$WAYBAR_CONFIG" -sed -i -E "s/(\"height\"[[:space:]]*:[[:space:]]*)[0-9]+/\\1${height}/; s/(\"width\"[[:space:]]*:[[:space:]]*)[0-9]+/\\1${width}/" "$WAYBAR_CONFIG" - -omarchy-restart-waybar diff --git a/bin/omarchy-theme-set b/bin/omarchy-theme-set index 756869f5..3a0e6bac 100755 --- a/bin/omarchy-theme-set +++ b/bin/omarchy-theme-set @@ -50,9 +50,6 @@ if [[ $OMARCHY_THEME_SKIP_BACKGROUND != "1" ]]; then fi # Restart components to apply new theme -if pgrep -x waybar >/dev/null; then - omarchy-restart-waybar -fi omarchy-restart-swayosd omarchy-restart-terminal omarchy-restart-hyprctl diff --git a/bin/omarchy-toggle-idle b/bin/omarchy-toggle-idle index 22b2cf26..28eb948d 100755 --- a/bin/omarchy-toggle-idle +++ b/bin/omarchy-toggle-idle @@ -10,6 +10,4 @@ else notify-send -a omarchy-action -u low "󱫖 Now locking computer when idle" fi -pkill -RTMIN+9 waybar -OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy} -quickshell ipc -p "$OMARCHY_PATH/default/quickshell/omarchy-shell" call bar refreshIndicators >/dev/null 2>&1 || true +omarchy-shell-ipc --if-running bar refreshIndicators >/dev/null 2>&1 || true diff --git a/bin/omarchy-toggle-nightlight b/bin/omarchy-toggle-nightlight index 6085667b..fa6e49a3 100755 --- a/bin/omarchy-toggle-nightlight +++ b/bin/omarchy-toggle-nightlight @@ -15,18 +15,10 @@ fi # Query the current temperature CURRENT_TEMP=$(hyprctl hyprsunset temperature 2>/dev/null | grep -oE '[0-9]+') -restart_nightlighted_waybar() { - if grep -q "custom/nightlight" ~/.config/waybar/config.jsonc; then - omarchy-restart-waybar # restart waybar in case user has waybar module for hyprsunset - fi -} - if [[ $CURRENT_TEMP == $OFF_TEMP ]]; then hyprctl hyprsunset temperature $ON_TEMP notify-send -a omarchy-action -u low " Nightlight screen temperature" - restart_nightlighted_waybar else hyprctl hyprsunset temperature $OFF_TEMP notify-send -a omarchy-action -u low " Daylight screen temperature" - restart_nightlighted_waybar fi diff --git a/bin/omarchy-toggle-notification-silencing b/bin/omarchy-toggle-notification-silencing index c40d6a2b..7257969f 100755 --- a/bin/omarchy-toggle-notification-silencing +++ b/bin/omarchy-toggle-notification-silencing @@ -9,5 +9,4 @@ on) omarchy-notification-send "Silenced notifications" -g 󰂛 -e ;; off) omarchy-notification-send "Enabled notifications" -g 󰂚 -e ;; esac -pkill -RTMIN+10 waybar 2>/dev/null || true -omarchy-shell-ipc bar refreshIndicators >/dev/null 2>&1 || true +omarchy-shell-ipc --if-running bar refreshIndicators >/dev/null 2>&1 || true diff --git a/bin/omarchy-toggle-waybar b/bin/omarchy-toggle-waybar deleted file mode 100755 index b441f011..00000000 --- a/bin/omarchy-toggle-waybar +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# omarchy:summary=Toggle Waybar visibility -# omarchy:examples=omarchy toggle waybar - -omarchy-toggle waybar-off - -if pgrep -x waybar >/dev/null; then - pkill -x waybar -else - uwsm-app -- waybar >/dev/null 2>&1 & -fi diff --git a/bin/omarchy-tz-select b/bin/omarchy-tz-select index 6ddb26c2..6c8ffe49 100755 --- a/bin/omarchy-tz-select +++ b/bin/omarchy-tz-select @@ -6,4 +6,3 @@ timezone=$(timedatectl list-timezones | gum filter --height 20 --header "Set timezone") || exit 1 sudo timedatectl set-timezone "$timezone" echo "Timezone is now set to $timezone" -omarchy-restart-waybar diff --git a/bin/omarchy-update-available-reset b/bin/omarchy-update-available-reset index da0c1c4e..d034fdbe 100755 --- a/bin/omarchy-update-available-reset +++ b/bin/omarchy-update-available-reset @@ -2,7 +2,5 @@ # omarchy:summary=Ensure the status bar icon offering the available update is removed -pkill -RTMIN+7 waybar -OMARCHY_PATH=${OMARCHY_PATH:-$HOME/.local/share/omarchy} -quickshell ipc -p "$OMARCHY_PATH/default/quickshell/omarchy-shell" call bar refreshUpdate >/dev/null 2>&1 || true +omarchy-shell-ipc --if-running bar refreshUpdate >/dev/null 2>&1 || true exit 0 diff --git a/bin/omarchy-voxtype-config b/bin/omarchy-voxtype-config index 57665be4..68b0e7b3 100755 --- a/bin/omarchy-voxtype-config +++ b/bin/omarchy-voxtype-config @@ -4,6 +4,4 @@ set -e -# Used by Voxtype waybar module to open config on right click - exec omarchy-launch-editor ~/.config/voxtype/config.toml diff --git a/bin/omarchy-voxtype-install b/bin/omarchy-voxtype-install index 2faa340f..22929e80 100755 --- a/bin/omarchy-voxtype-install +++ b/bin/omarchy-voxtype-install @@ -20,9 +20,6 @@ if gum confirm "Install Voxtype + AI model (~150MB) to enable dictation?"; then fi voxtype setup systemd - if pgrep -x waybar >/dev/null; then - omarchy-restart-waybar - fi omarchy-restart-quickshell notify-send -a omarchy-action " Voxtype Dictation Ready" "Hold F9 to dictate (or toggle with Super + Ctrl + X)." -t 10000 fi diff --git a/bin/omarchy-voxtype-model b/bin/omarchy-voxtype-model index b811a5b0..97ce1658 100755 --- a/bin/omarchy-voxtype-model +++ b/bin/omarchy-voxtype-model @@ -5,7 +5,4 @@ set -e omarchy-launch-floating-terminal-with-presentation "voxtype setup model" -if pgrep -x waybar >/dev/null; then - omarchy-restart-waybar -fi omarchy-restart-quickshell diff --git a/bin/omarchy-voxtype-status b/bin/omarchy-voxtype-status index 31769092..8cfafa0a 100755 --- a/bin/omarchy-voxtype-status +++ b/bin/omarchy-voxtype-status @@ -1,6 +1,6 @@ #!/bin/bash -# omarchy:summary=Clean up the voxtype --follow child when Waybar reloads +# omarchy:summary=Stream voxtype --follow status as bar-friendly JSON if omarchy-cmd-present voxtype; then coproc VOXTYPE_STATUS { voxtype status --follow --extended --format json; } diff --git a/config/waybar/config.jsonc b/config/waybar/config.jsonc deleted file mode 100644 index ab6026df..00000000 --- a/config/waybar/config.jsonc +++ /dev/null @@ -1,202 +0,0 @@ -{ - "reload_style_on_change": true, - "layer": "top", - "position": "top", - "spacing": 0, - "height": 26, - "width": 0, - "modules-left": ["custom/omarchy", "hyprland/workspaces"], - "modules-center": ["clock#horizontal", "clock#vertical", "custom/weather", "custom/update", "custom/voxtype", "custom/screenrecording-indicator", "custom/idle-indicator", "custom/notification-silencing-indicator"], - "modules-right": [ - "group/tray-expander", - "bluetooth", - "network", - "pulseaudio", - "cpu", - "battery" - ], - "hyprland/workspaces": { - "on-click": "activate", - "format": "{icon}", - "format-icons": { - "default": "", - "1": "1", - "2": "2", - "3": "3", - "4": "4", - "5": "5", - "6": "6", - "7": "7", - "8": "8", - "9": "9", - "10": "0", - "active": "󱓻" - }, - "persistent-workspaces": { - "1": [], - "2": [], - "3": [], - "4": [], - "5": [] - } - }, - "custom/omarchy": { - "format": "\ue900", - "on-click": "omarchy-menu", - "on-click-right": "xdg-terminal-exec", - "tooltip-format": "Omarchy Menu\n\nSuper + Alt + Space" - }, - "custom/update": { - "format": "", - "exec": "omarchy-update-available", - "on-click": "omarchy-launch-floating-terminal-with-presentation omarchy-update", - "tooltip-format": "Omarchy update available", - "signal": 7, - "interval": 21600 - }, - - "cpu": { - "interval": 5, - "format": "󰍛", - "on-click": "omarchy-launch-or-focus-tui btop", - "on-click-right": "alacritty" - }, - "clock#horizontal": { - "format": "{:L%A %H:%M}", - "format-alt": "{:L%d %B W%V %Y}", - "tooltip": false, - "on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select" - }, - "clock#vertical": { - "format": "{:%H\n  —\n%M}", - "format-alt": "{:L%d %B W%V %Y}", - "tooltip": false, - "on-click-right": "omarchy-launch-floating-terminal-with-presentation omarchy-tz-select" - }, - "custom/weather": { - "exec": "$OMARCHY_PATH/default/waybar/weather.sh", - "return-type": "json", - "interval": 60, - "tooltip": false, - "on-click": "notify-send -u low \"$(omarchy-weather-status)\"" - }, - "network": { - "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], - "format": "{icon}", - "format-wifi": "{icon}", - "format-ethernet": "󰀂", - "format-disconnected": "󰤮", - "tooltip-format-wifi": "{essid} ({frequency} GHz)", - "tooltip-format-ethernet": "Connected", - "tooltip-format-disconnected": "Disconnected", - "interval": 3, - "spacing": 1, - "on-click": "omarchy-launch-wifi" - }, - "battery": { - "format": "{capacity}% {icon}", - "format-discharging": "{icon}", - "format-charging": "{icon}", - "format-plugged": "", - "format-icons": { - "charging": ["󰢜", "󰂆", "󰂇", "󰂈", "󰢝", "󰂉", "󰢞", "󰂊", "󰂋", "󰂅"], - "default": ["󰁺", "󰁻", "󰁼", "󰁽", "󰁾", "󰁿", "󰂀", "󰂁", "󰂂", "󰁹"] - }, - "format-full": "󰂅", - "tooltip-format-discharging": "{power:>1.0f}W↓ {capacity}%", - "tooltip-format-charging": "{power:>1.0f}W↑ {capacity}%", - "interval": 5, - "on-click": "omarchy-menu power", - "on-click-right": "notify-send -u low \"$(omarchy-battery-status)\"", - "states": { - "warning": 20, - "critical": 10 - } - }, - "bluetooth": { - "format": "", - "format-off": "󰂲", - "format-disabled": "󰂲", - "format-connected": "󰂱", - "format-no-controller": "", - "tooltip-format": "Devices connected: {num_connections}", - "on-click": "omarchy-launch-bluetooth" - }, - "pulseaudio": { - "format": "{icon}", - "on-click": "omarchy-launch-audio", - "on-click-right": "pamixer -t", - "tooltip-format": "Playing at {volume}%", - "scroll-step": 5, - "format-muted": "", - "format-icons": { - "headphone": "", - "headset": "", - "default": ["", "", ""] - } - }, - "group/tray-expander": { - "orientation": "inherit", - "drawer": { - "transition-duration": 600, - "children-class": "tray-group-item" - }, - "modules": ["group/expand-icons", "tray"] - }, - "group/expand-icons": { - "orientation": "inherit", - "modules": ["custom/expand-icon#horizontal", "custom/expand-icon#vertical"] - }, - "custom/expand-icon#horizontal": { - "format": "", - "tooltip": false, - "on-scroll-up": "", - "on-scroll-down": "", - "on-scroll-left": "", - "on-scroll-right": "" - }, - "custom/expand-icon#vertical": { - "format": "", - "rotate": 270, - "tooltip": false, - "on-scroll-up": "", - "on-scroll-down": "", - "on-scroll-left": "", - "on-scroll-right": "" - }, - "custom/screenrecording-indicator": { - "on-click": "omarchy-capture-screenrecording", - "exec": "$OMARCHY_PATH/default/waybar/indicators/screen-recording.sh", - "signal": 8, - "return-type": "json" - }, - "custom/idle-indicator": { - "on-click": "omarchy-toggle-idle", - "exec": "$OMARCHY_PATH/default/waybar/indicators/idle.sh", - "signal": 9, - "return-type": "json" - }, - "custom/notification-silencing-indicator": { - "on-click": "omarchy-toggle-notification-silencing", - "exec": "$OMARCHY_PATH/default/waybar/indicators/notification-silencing.sh", - "signal": 10, - "return-type": "json" - }, - "custom/voxtype": { - "exec": "omarchy-voxtype-status", - "return-type": "json", - "format": "{icon}", - "format-icons": { - "idle": "", - "recording": "󰍬", - "transcribing": "󰔟" - }, - "tooltip": true, - "on-click-right": "omarchy-voxtype-config", - "on-click": "omarchy-voxtype-model" - }, - "tray": { - "icon-size": 12, - "spacing": 17 - } -} diff --git a/config/waybar/style.css b/config/waybar/style.css deleted file mode 100644 index 64bf240f..00000000 --- a/config/waybar/style.css +++ /dev/null @@ -1,189 +0,0 @@ -@import "../omarchy/current/theme/waybar.css"; - -* { - background-color: @background; - color: @foreground; - - border: none; - border-radius: 0; - min-height: 0; - font-family: 'JetBrainsMono Nerd Font'; - font-size: 12px; -} - -.modules-left { - margin-left: 8px; -} - -.modules-right { - margin-right: 8px; -} - -#workspaces button { - all: initial; - padding: 0 6px; - margin: 0 1.5px; - min-width: 9px; -} - -#workspaces button.empty { - opacity: 0.5; -} - -#cpu, -#battery, -#pulseaudio, -#custom-omarchy, -#custom-update { - min-width: 12px; - margin: 0 7.5px; -} - -#tray { - margin-right: 16px; -} - -#bluetooth { - margin-right: 17px; -} - -#network { - margin-right: 13px; -} - -#custom-expand-icon { - margin-right: 18px; -} - -tooltip { - padding: 2px; -} - -#custom-update { - font-size: 10px; -} - -#clock { - margin-left: 8.75px; -} - -#custom-weather { - margin-left: 7.5px; - margin-right: 7.5px; - min-width: 14px; -} - -#custom-weather.unavailable { - min-width: 0; - margin: 0; - padding: 0; -} - -.hidden { - opacity: 0; -} - -#custom-screenrecording-indicator, -#custom-idle-indicator, -#custom-notification-silencing-indicator { - min-width: 12px; - margin-left: 5px; - margin-right: 0; - font-size: 10px; - padding-bottom: 1px; -} - -#custom-screenrecording-indicator.active { - color: #a55555; -} - -#custom-idle-indicator.active, -#custom-notification-silencing-indicator.active { - color: #a55555; -} - -#custom-voxtype { - min-width: 12px; - margin: 0 0 0 7.5px; -} - -#custom-voxtype.recording { - color: #a55555; -} - -.left .modules-left, .right .modules-left { margin: 8px 0 0 0; } -.left .modules-right, .right .modules-right { margin: 0 0 8px 0; } - -.left #workspaces button, .right #workspaces button { - padding: 6px 0; - margin: 1.5px 0; -} - -.left #cpu, .right #cpu, -.left #battery, .right #battery, -.left #pulseaudio, .right #pulseaudio, -.left #custom-omarchy, .right #custom-omarchy, -.left #custom-update, .right #custom-update { - margin: 1.5px 0; - padding: 6px 0; - min-width: 0; - min-height: 12px; -} - -.left #tray, .right #tray { margin: 0 0 16px 0; } -.left #bluetooth, .right #bluetooth { margin: 1.5px 0; padding: 6px 0; min-height: 12px; } -.left #network, .right #network { margin: 1.5px 0; padding: 6px 0; min-height: 12px; } -.left #custom-expand-icon, .right #custom-expand-icon { margin: 1.5px 0; padding: 6px 0; min-height: 12px; } -.left #clock, .right #clock { margin: 8.75px 0 0 0; } -.left #custom-weather, .right #custom-weather { margin: 1.5px 0; padding: 6px 0; min-height: 12px; min-width: 14px; margin-right: 4px; } - -.left #custom-screenrecording-indicator, .right #custom-screenrecording-indicator, -.left #custom-idle-indicator, .right #custom-idle-indicator, -.left #custom-notification-silencing-indicator, .right #custom-notification-silencing-indicator { - margin: 5px 0 0 0; - min-width: 0; - min-height: 12px; -} - -.left #custom-voxtype, .right #custom-voxtype { margin: 7.5px 0 0 0; min-width: 0; min-height: 12px; } - -#custom-expand-icon.vertical, -.left #custom-expand-icon.horizontal, -.right #custom-expand-icon.horizontal { - opacity: 0; - font-size: 0; - min-width: 0; - min-height: 0; - margin: 0; - padding: 0; -} - -.left #custom-expand-icon.vertical, -.right #custom-expand-icon.vertical { - opacity: 1; - font-size: inherit; - min-width: 0; - min-height: 12px; - margin: 1.5px 0; - padding: 6px 0; -} - -#clock.vertical, -.left #clock.horizontal, -.right #clock.horizontal { - opacity: 0; - font-size: 0; - min-width: 0; - min-height: 0; - margin: 0; - padding: 0; -} - -.left #clock.vertical, -.right #clock.vertical { - opacity: 1; - font-size: inherit; - min-width: 0; - min-height: 12px; - margin: 8.75px 0 0 0; -} diff --git a/default/omarchy-skill/SKILL.md b/default/omarchy-skill/SKILL.md index 0beaab5f..9bb1ea03 100644 --- a/default/omarchy-skill/SKILL.md +++ b/default/omarchy-skill/SKILL.md @@ -2,12 +2,12 @@ name: omarchy description: > REQUIRED for end-user customization of Linux desktop, window manager, or system config. - Use when editing ~/.config/hypr/, ~/.config/waybar/, ~/.config/walker/, - ~/.config/alacritty/, ~/.config/foot/, ~/.config/kitty/, ~/.config/ghostty/, - or ~/.config/omarchy/. Triggers: Hyprland, window rules, animations, keybindings, - monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes, - background, night light, idle, lock screen, screenshots, reminders, layer rules, - workspace settings, display config, and user-facing omarchy commands. Excludes Omarchy + Use when editing ~/.config/hypr/, ~/.config/omarchy/, ~/.config/walker/, + ~/.config/alacritty/, ~/.config/foot/, ~/.config/kitty/, or ~/.config/ghostty/. + Triggers: Hyprland, window rules, animations, keybindings, monitors, gaps, borders, + blur, opacity, omarchy-shell, bar, walker, terminal config, themes, background, + night light, idle, lock screen, screenshots, reminders, layer rules, workspace + settings, display config, and user-facing omarchy commands. Excludes Omarchy source development in ~/.local/share/omarchy/ and `omarchy dev` workflows. --- @@ -23,7 +23,7 @@ It is not for contributing to Omarchy source code. **ALWAYS invoke this skill for end-user requests involving ANY of these:** - Editing ANY file in `~/.config/hypr/` (window rules, animations, keybindings, monitors, etc.) -- Editing ANY file in `~/.config/waybar/`, `~/.config/walker/` +- Editing `~/.config/omarchy/shell.json` (status bar layout, widgets) or `~/.config/walker/` - Editing terminal configs (alacritty, foot, kitty, ghostty) - Editing ANY file in `~/.config/omarchy/` - Window behavior, animations, opacity, blur, gaps, borders @@ -57,7 +57,7 @@ This directory contains Omarchy's source files managed by git. Any changes will **Reading `~/.local/share/omarchy/` is SAFE and useful** - do it freely to: - Understand how omarchy commands work: `omarchy theme set --help` or `cat $(which omarchy-theme-set)` -- See default configs before customizing: `cat ~/.local/share/omarchy/config/waybar/config.jsonc` +- See default configs before customizing: `cat ~/.local/share/omarchy/default/quickshell/omarchy-shell/shell-defaults.json` - Check stock theme files to copy for customization - Reference default hyprland settings: `cat ~/.local/share/omarchy/default/hypr/*` @@ -76,7 +76,7 @@ Omarchy is built on: |-----------|---------|-----------------| | **Arch Linux** | Base OS | `/etc/`, `~/.config/` | | **Hyprland** | Wayland compositor/WM | `~/.config/hypr/` | -| **Waybar** | Status bar | `~/.config/waybar/` | +| **Omarchy shell** | Status bar + notifications (Quickshell) | `~/.config/omarchy/shell.json` | | **Walker** | App launcher | `~/.config/walker/` | | **Alacritty/Foot/Kitty/Ghostty** | Terminals | `~/.config//` | | **SwayOSD** | On-screen display | `~/.config/swayosd/` | @@ -110,8 +110,8 @@ Run `omarchy --help` for the full list. The most common groups: | Group | Purpose | Example | |-------|---------|---------| -| `omarchy refresh` | Reset config to defaults (backs up first) | `omarchy refresh waybar` | -| `omarchy restart` | Restart a service/app | `omarchy restart waybar` | +| `omarchy refresh` | Reset config to defaults (backs up first) | `omarchy refresh shell` | +| `omarchy restart` | Restart a service/app | `omarchy restart shell` | | `omarchy toggle` | Toggle feature on/off | `omarchy toggle nightlight` | | `omarchy theme` | Theme management | `omarchy theme set ` | | `omarchy install` | Install optional software / packages | `omarchy install docker dbs` | @@ -147,17 +147,20 @@ Run `omarchy --help` for the full list. The most common groups: - If `hyprctl configerrors` reports errors, address them and rerun validation until clean or until a real blocker is identified - Use `omarchy refresh hyprland` to reset to defaults -### Waybar (Status Bar) +### Omarchy shell (Status Bar + Notifications) + +The bar, notification daemon, settings panel, and assorted overlays all run +inside a single long-running Quickshell process (`omarchy-shell`). ``` -~/.config/waybar/ -├── config.jsonc # Bar layout and modules (JSONC format) -└── style.css # Styling +~/.config/omarchy/shell.json # User overrides: bar.position, bar.layout, plugins[] +~/.local/share/omarchy/default/quickshell/omarchy-shell/shell-defaults.json # Canonical defaults ``` -**Waybar does NOT auto-reload.** You MUST run `omarchy restart waybar` after any config changes. +The shell hot-reloads `shell.json` on save — no restart needed for layout +changes. For more invasive changes (new plugin, packaged update): -**Commands:** `omarchy restart waybar`, `omarchy refresh waybar`, `omarchy toggle waybar` +**Commands:** `omarchy restart shell`, `omarchy refresh shell`, `omarchy launch settings` ### Terminals @@ -198,7 +201,7 @@ cp ~/.config/hypr/bindings.conf ~/.config/hypr/bindings.conf.bak.$(date +%s) # 4. Apply changes # - Hyprland: auto-reloads on save, but MUST validate with `hyprctl reload` and `hyprctl configerrors` -# - Waybar: MUST restart with `omarchy restart waybar` +# - Omarchy shell: shell.json hot-reloads; use `omarchy restart shell` for plugin/widget code changes # - Walker: MUST restart with `omarchy restart walker` # - Terminals: MUST restart with `omarchy restart terminal` ``` @@ -236,7 +239,7 @@ When customizations go wrong: ```bash # Reset specific config (creates backup automatically) -omarchy refresh waybar +omarchy refresh shell omarchy refresh hyprland # The refresh command: @@ -388,4 +391,4 @@ This skill intentionally does not cover Omarchy source development. Do not use t - "Clear all reminders" -> `omarchy reminder clear` - "Customize the catppuccin theme colors" -> Create `~/.config/omarchy/themes/catppuccin-custom/` by copying from stock, then edit - "Run a script every time I change themes" -> Create `~/.config/omarchy/hooks/theme-set` -- "Reset waybar to defaults" -> `omarchy refresh waybar` +- "Reset shell/bar to defaults" -> `omarchy refresh shell` diff --git a/default/omarchy/omarchy-menu.jsonc b/default/omarchy/omarchy-menu.jsonc index 17eee1fd..22379a69 100644 --- a/default/omarchy/omarchy-menu.jsonc +++ b/default/omarchy/omarchy-menu.jsonc @@ -157,7 +157,7 @@ "setup.default.editor.emacs": {"icon":"","label":"Emacs","when":"omarchy-cmd-present emacs","checked":"default_editor_is emacs","action":"omarchy-default-editor emacs"}, "setup.dns": {"icon":"󰱔","label":"DNS","keywords":"network","action":"present_terminal omarchy-setup-dns"}, "setup.security": {"icon":"","label":"Security","keywords":"fingerprint fido2"}, - "setup.config": {"icon":"","label":"Config","keywords":"files hyprland bar quickshell walker waybar"}, + "setup.config": {"icon":"","label":"Config","keywords":"files hyprland bar quickshell walker"}, "setup.security.fingerprint": {"icon":"󰈷","label":"Fingerprint","action":"present_terminal omarchy-setup-security-fingerprint"}, "setup.security.fido2": {"icon":"","label":"Fido2","keywords":"key","action":"present_terminal omarchy-setup-security-fido2"}, "setup.config.hyprland": {"icon":"","label":"Hyprland","action":"open_in_editor \"$(hypr_config_file hyprland)\""}, diff --git a/default/quickshell/omarchy-shell/plugins/bar/Bar.qml b/default/quickshell/omarchy-shell/plugins/bar/Bar.qml index f4ac8fb4..47ca7893 100644 --- a/default/quickshell/omarchy-shell/plugins/bar/Bar.qml +++ b/default/quickshell/omarchy-shell/plugins/bar/Bar.qml @@ -750,7 +750,7 @@ Item { Process { id: weatherProc - command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/waybar/weather.sh"))] + command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/quickshell/omarchy-shell/scripts/weather.sh"))] stdout: StdioCollector { waitForEnd: true onStreamFinished: root.updateWeather(text) @@ -795,7 +795,7 @@ Item { Process { id: screenRecordingProc - command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/waybar/indicators/screen-recording.sh"))] + command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/quickshell/omarchy-shell/scripts/indicators/screen-recording.sh"))] stdout: StdioCollector { waitForEnd: true onStreamFinished: root.updateIndicator("screenRecording", text) @@ -804,7 +804,7 @@ Item { Process { id: idleProc - command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/waybar/indicators/idle.sh"))] + command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/quickshell/omarchy-shell/scripts/indicators/idle.sh"))] stdout: StdioCollector { waitForEnd: true onStreamFinished: root.updateIndicator("idle", text) @@ -813,7 +813,7 @@ Item { Process { id: notificationSilencingProc - command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/waybar/indicators/notification-silencing.sh"))] + command: ["bash", "-lc", root.commandWithOmarchyPath(root.shellQuote(root.omarchyPath + "/default/quickshell/omarchy-shell/scripts/indicators/notification-silencing.sh"))] stdout: StdioCollector { waitForEnd: true onStreamFinished: root.updateIndicator("notifications", text) diff --git a/default/waybar/indicators/idle.sh b/default/quickshell/omarchy-shell/scripts/indicators/idle.sh similarity index 100% rename from default/waybar/indicators/idle.sh rename to default/quickshell/omarchy-shell/scripts/indicators/idle.sh diff --git a/default/waybar/indicators/notification-silencing.sh b/default/quickshell/omarchy-shell/scripts/indicators/notification-silencing.sh similarity index 100% rename from default/waybar/indicators/notification-silencing.sh rename to default/quickshell/omarchy-shell/scripts/indicators/notification-silencing.sh diff --git a/default/waybar/indicators/screen-recording.sh b/default/quickshell/omarchy-shell/scripts/indicators/screen-recording.sh similarity index 100% rename from default/waybar/indicators/screen-recording.sh rename to default/quickshell/omarchy-shell/scripts/indicators/screen-recording.sh diff --git a/default/waybar/weather.sh b/default/quickshell/omarchy-shell/scripts/weather.sh similarity index 100% rename from default/waybar/weather.sh rename to default/quickshell/omarchy-shell/scripts/weather.sh diff --git a/install/omarchy-base.packages b/install/omarchy-base.packages index 770599ea..34dd56ff 100644 --- a/install/omarchy-base.packages +++ b/install/omarchy-base.packages @@ -135,7 +135,6 @@ ufw-docker unzip usage uwsm -waybar whois wireless-regdb wiremix diff --git a/install/packaging/fonts.sh b/install/packaging/fonts.sh index 8d5a35ec..38569582 100644 --- a/install/packaging/fonts.sh +++ b/install/packaging/fonts.sh @@ -1,4 +1,4 @@ -# Omarchy logo in a font for Waybar use +# Omarchy logo glyphs as a font (used by the omarchy-shell bar's left module) mkdir -p ~/.local/share/fonts cp ~/.local/share/omarchy/config/omarchy.ttf ~/.local/share/fonts/ fc-cache diff --git a/test/omarchy-cli-test.sh b/test/omarchy-cli-test.sh index 8e9fd341..51f7226f 100644 --- a/test/omarchy-cli-test.sh +++ b/test/omarchy-cli-test.sh @@ -88,7 +88,7 @@ assert_output_contains "bare group includes browser route" "$output" "omarchy in output=$("$CLI" toggle) assert_output_contains "bare root command with children renders help" "$output" "Toggle commands" -assert_output_contains "bare toggle help includes child route" "$output" "omarchy toggle waybar" +assert_output_contains "bare toggle help includes child route" "$output" "omarchy toggle nightlight" output=$("$CLI" pkg --help) assert_output_contains "package group includes pkg add fallback route" "$output" "omarchy pkg add "