diff --git a/.gitignore b/.gitignore index 112d3025..f58d94d6 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ gotools /dotfiles/emacs.d/.cache/ /dotfiles/config/fontconfig/conf.d/10-hm-fonts.conf /dotfiles/config/fontconfig/conf.d/52-hm-default-fonts.conf +/dotfiles/config/taffybar/_scratch/ diff --git a/dotfiles/config/taffybar/Justfile b/dotfiles/config/taffybar/Justfile index c8b43479..90fa6620 100644 --- a/dotfiles/config/taffybar/Justfile +++ b/dotfiles/config/taffybar/Justfile @@ -15,3 +15,7 @@ screenshot: # Capture the reserved top area on all monitors (one file per monitor). screenshot-all: @scripts/taffybar-screenshot-all + +# Crop the top bar out of an existing screenshot (defaults to 56px high). +crop in out="": + @if [[ -n "{{out}}" ]]; then scripts/taffybar-crop-bar "{{in}}" "{{out}}"; else scripts/taffybar-crop-bar "{{in}}"; fi diff --git a/dotfiles/config/taffybar/palette.css b/dotfiles/config/taffybar/palette.css index 5f8f4ab0..66ed8cac 100644 --- a/dotfiles/config/taffybar/palette.css +++ b/dotfiles/config/taffybar/palette.css @@ -1,18 +1,7 @@ -@define-color accent #f1b2b2; -@define-color bar-background rgba(12, 15, 24, 0.55); -@define-color bar-gradient-start rgba(20, 26, 40, 0.68); -@define-color bar-gradient-end rgba(12, 18, 30, 0.68); -@define-color bar-border rgba(255, 255, 255, 0.06); -/* Temporary: keep menus high-contrast and readable while debugging theme issues. */ -@define-color menu-background-color #ffffff; -@define-color menu-font-color #000000; -@define-color menu-highlight rgba(0, 0, 0, 0.08); -@define-color font-color #e7e4ee; -@define-color font-muted #b8b1c6; -@define-color pill-background rgba(48, 52, 69, 0.92); -@define-color pill-border rgba(92, 95, 120, 0.85); -@define-color pill-highlight rgba(255, 255, 255, 0.10); -@define-color pill-shadow rgba(0, 0, 0, 0.28); -@define-color transparent rgba(0.0, 0.0, 0.0, 0.0); -@define-color white #ffffff; -@define-color black #000000; +/* Compatibility wrapper. + * + * Historically this config loaded "palette.css". Keep that stable, but source + * all actual color definitions from "theme.css". + */ +@import url("theme.css"); + diff --git a/dotfiles/config/taffybar/scripts/taffybar-restart b/dotfiles/config/taffybar/scripts/taffybar-restart index f2bce305..ecaa164d 100755 --- a/dotfiles/config/taffybar/scripts/taffybar-restart +++ b/dotfiles/config/taffybar/scripts/taffybar-restart @@ -6,6 +6,24 @@ root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" pkill -u "$USER" -x taffybar || true cd "$root" + +# Hyprland can restart and change the instance signature, leaving old shells with +# a stale HYPRLAND_INSTANCE_SIGNATURE. Fix it before launching taffybar so any +# `hyprctl` calls inside the bar work. +if command -v hyprctl >/dev/null 2>&1 && command -v jq >/dev/null 2>&1; then + if ! hyprctl monitors -j >/dev/null 2>&1; then + if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then + inst="$(hyprctl instances -j | jq -r --arg sock "$WAYLAND_DISPLAY" '.[] | select(.wl_socket == $sock) | .instance' | head -n1)" + else + inst="$(hyprctl instances -j | jq -r '.[0].instance // empty')" + fi + + if [[ -n "${inst:-}" ]]; then + export HYPRLAND_INSTANCE_SIGNATURE="$inst" + fi + fi +fi + setsid -f direnv exec . cabal run >/tmp/taffybar.log 2>&1 echo "Started taffybar in the background. Logs: /tmp/taffybar.log" diff --git a/dotfiles/config/taffybar/scripts/taffybar-run b/dotfiles/config/taffybar/scripts/taffybar-run index 832862c8..f9ebda62 100755 --- a/dotfiles/config/taffybar/scripts/taffybar-run +++ b/dotfiles/config/taffybar/scripts/taffybar-run @@ -4,4 +4,21 @@ set -euo pipefail root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$root" +# Hyprland can restart and change the instance signature, leaving old shells with +# a stale HYPRLAND_INSTANCE_SIGNATURE. Fix it before launching taffybar so any +# `hyprctl` calls inside the bar work. +if command -v hyprctl >/dev/null 2>&1 && command -v jq >/dev/null 2>&1; then + if ! hyprctl monitors -j >/dev/null 2>&1; then + if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then + inst="$(hyprctl instances -j | jq -r --arg sock "$WAYLAND_DISPLAY" '.[] | select(.wl_socket == $sock) | .instance' | head -n1)" + else + inst="$(hyprctl instances -j | jq -r '.[0].instance // empty')" + fi + + if [[ -n "${inst:-}" ]]; then + export HYPRLAND_INSTANCE_SIGNATURE="$inst" + fi + fi +fi + exec direnv exec . cabal run diff --git a/dotfiles/config/taffybar/scripts/taffybar-screenshot b/dotfiles/config/taffybar/scripts/taffybar-screenshot index 51dd22bc..c1f22916 100755 --- a/dotfiles/config/taffybar/scripts/taffybar-screenshot +++ b/dotfiles/config/taffybar/scripts/taffybar-screenshot @@ -1,7 +1,23 @@ #!/usr/bin/env bash set -euo pipefail -monitors="$(hyprctl monitors -j)" +hyprctl_cmd=(hyprctl) + +# Hyprland can restart and change the instance signature, leaving old shells with +# a stale HYPRLAND_INSTANCE_SIGNATURE. Detect the live instance and use it. +if ! hyprctl monitors -j >/dev/null 2>&1; then + if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then + inst="$(hyprctl instances -j | jq -r --arg sock "$WAYLAND_DISPLAY" '.[] | select(.wl_socket == $sock) | .instance' | head -n1)" + else + inst="$(hyprctl instances -j | jq -r '.[0].instance // empty')" + fi + + if [[ -n "${inst:-}" ]]; then + hyprctl_cmd=(hyprctl --instance "$inst") + fi +fi + +monitors="$("${hyprctl_cmd[@]}" monitors -j)" height="$(jq -r '.[] | select(.focused) | .reserved[1]' <<<"$monitors")" geo="$(jq -r '.[] | select(.focused) | "\(.x),\(.y) \(.width)x\(.reserved[1])"' <<<"$monitors")" @@ -11,6 +27,7 @@ if [[ -z "$geo" || "$height" == "0" ]]; then exit 1 fi -out="/tmp/taffybar-$(date +%Y%m%d-%H%M%S).png" +# Include nanoseconds so consecutive screenshots don't overwrite each other. +out="/tmp/taffybar-$(date +%Y%m%d-%H%M%S-%N).png" grim -g "$geo" "$out" echo "$out" diff --git a/dotfiles/config/taffybar/scripts/taffybar-screenshot-all b/dotfiles/config/taffybar/scripts/taffybar-screenshot-all index 16449fae..ddb1bd86 100755 --- a/dotfiles/config/taffybar/scripts/taffybar-screenshot-all +++ b/dotfiles/config/taffybar/scripts/taffybar-screenshot-all @@ -1,7 +1,24 @@ #!/usr/bin/env bash set -euo pipefail -ts="$(date +%Y%m%d-%H%M%S)" +hyprctl_cmd=(hyprctl) + +# Hyprland can restart and change the instance signature, leaving old shells with +# a stale HYPRLAND_INSTANCE_SIGNATURE. Detect the live instance and use it. +if ! hyprctl monitors -j >/dev/null 2>&1; then + if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then + inst="$(hyprctl instances -j | jq -r --arg sock "$WAYLAND_DISPLAY" '.[] | select(.wl_socket == $sock) | .instance' | head -n1)" + else + inst="$(hyprctl instances -j | jq -r '.[0].instance // empty')" + fi + + if [[ -n "${inst:-}" ]]; then + hyprctl_cmd=(hyprctl --instance "$inst") + fi +fi + +# Include nanoseconds so consecutive screenshots don't overwrite each other. +ts="$(date +%Y%m%d-%H%M%S-%N)" found="0" while IFS=$'\t' read -r name geo; do @@ -9,7 +26,7 @@ while IFS=$'\t' read -r name geo; do out="/tmp/taffybar-${name}-${ts}.png" grim -g "$geo" "$out" echo "$out" -done < <(hyprctl monitors -j | jq -r '.[] | select(.reserved[1] > 0) | "\(.name)\t\(.x),\(.y) \(.width)x\(.reserved[1])"') +done < <("${hyprctl_cmd[@]}" monitors -j | jq -r '.[] | select(.reserved[1] > 0) | "\(.name)\t\(.x),\(.y) \(.width)x\(.reserved[1])"') if [[ "$found" == "0" ]]; then echo "No monitors with a top reserved area found." >&2 diff --git a/dotfiles/config/taffybar/taffybar.css b/dotfiles/config/taffybar/taffybar.css index a3aceba0..32eacc15 100644 --- a/dotfiles/config/taffybar/taffybar.css +++ b/dotfiles/config/taffybar/taffybar.css @@ -1,41 +1,50 @@ -/* Top level styling */ - -.taffy-window { - background-color: @bar-background; - background-image: linear-gradient(to bottom, @bar-gradient-start, @bar-gradient-end); - border-bottom: 1px solid @bar-border; - box-shadow: 0 6px 18px rgba(0, 0, 0, 0.45); -} +/* Widget/layout styling for taffybar. + * + * Colors live in `theme.css` (loaded via `palette.css`). + */ .taffy-window * { - font-family: "Iosevka Aile", "Noto Sans", sans-serif; + /* Most text should come from Iosevka Aile; icon glyphs (Font Awesome / Nerd + Font PUA) should come from a Nerd Font family to avoid tiny fallback glyphs. */ + font-family: "Iosevka Aile", "Iosevka Nerd Font", "Iosevka NF", "Noto Sans", sans-serif; font-size: 9pt; font-weight: 600; color: @font-color; - background-color: @transparent; + /* Bar background is painted on `.taffy-box`; most widget nodes stay + transparent so pills (outer-pad) read as "solid". */ + background-color: transparent; text-shadow: none; } + .taffy-box { border-width: 0px; - background-color: @transparent; + + + padding: 0px; margin: 0px; border-radius: 0px; box-shadow: none; + background-color: @bar-background; + background-image: linear-gradient(to bottom, @bar-gradient-start, @bar-gradient-end); } .outer-pad { background-color: @pill-background; - border: 1px solid @pill-border; - border-radius: 6px; + border: 0px; + border-radius: 12px; margin: 4px 6px; - box-shadow: 0 1px 0 @pill-highlight, 0 6px 14px @pill-shadow; + /* No white outline; define shape with subtle inner highlight + dark stroke. */ + box-shadow: + inset 0 1px 0 @pill-highlight, + inset 0 0 0 1px @pill-border, + 0 10px 24px @pill-shadow; } .inner-pad { - padding: 1px 8px; - border-radius: 5px; + padding: 2px 10px; + border-radius: 9px; } .contents { @@ -44,6 +53,44 @@ opacity: 1; } +/* Make each widget's squircle background feel "solid": avoid GTK nodes and + labels painting their own backgrounds on top of `.outer-pad`. */ +.outer-pad *, +.inner-pad, +.inner-pad *, +.contents, +.contents * { + background-color: transparent; +} + +/* Right side widget palette overrides */ +.outer-pad.audio { + background-color: @widget-audio-bg; + border-color: @widget-audio-border; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); +} +.outer-pad.audio * { + color: @widget-audio-fg; +} + +.outer-pad.network { + background-color: @widget-network-bg; + border-color: @widget-network-border; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); +} +.outer-pad.network * { + color: @widget-network-fg; +} + +.outer-pad.mpris { + background-color: @widget-mpris-bg; + border-color: @widget-mpris-border; + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06), 0 10px 24px rgba(0, 0, 0, 0.30); +} +.outer-pad.mpris * { + color: @widget-mpris-fg; +} + /* Workspaces styling */ .workspaces .inner-pad { @@ -61,17 +108,46 @@ } .workspace-label { - padding-right: 6px; - padding-left: 2px; - padding-top: 0px; - font-size: 9pt; - opacity: 0.95; - font-weight: 600; + /* Overlay label (workspace number) that sits inside the icon "squircle". */ + padding: 1px 3px; + margin: 0px; + font-size: 10pt; + opacity: 0.92; + font-weight: 700; transition: color .2s; + background-color: @transparent; +} + +/* The workspace label is overlaid bottom-left over the workspace icon strip. */ +.workspaces .overlay-box { + transition: background-color .2s, border-color .2s; + + /* The workspace widget's outer-pad has margin; without this, the overlay + sits in the margin area and looks "outside" the squircle. */ + margin-left: 10px; + margin-bottom: 10px; + + background-color: transparent; + border: none; + padding: 0px; +} + +.workspaces .overlay-box .workspace-label { + /* GtkLabel often doesn't paint its own background, so style the eventbox and + keep the label itself transparent. */ + background-color: transparent; + border: none; + padding: 0px; + color: rgba(255, 255, 255, 0.92); +} + +.workspaces .active .overlay-box { + background-color: transparent; + border-color: transparent; } .contents .window-icon { - border-width: 1px; + border-width: 3px; } .active .contents .window-icon { @@ -80,25 +156,34 @@ .active .contents { background-color: rgba(255, 255, 255, 0.10); - border-radius: 999px; opacity: 1; } -.overlay-box { - transition: background-color .5s; -} - -.active .overlay-box { - padding: 0px; - border-color: @transparent; - border-width: 0px; - opacity: 1; -} +/* (Handled above for workspaces.) */ .visible .contents { background-color: rgba(255, 255, 255, 0.06); } +.workspaces .window-icon-container, +.workspaces .window-icon-container.active { + /* Don't give each window icon its own background/border; the workspace + squircle is the background. */ + background-color: transparent; + border: 0px; + box-shadow: none; + padding: 0px 2px; +} + +.workspaces .active .contents, +.workspaces .visible .contents { + background-color: transparent; +} + +.workspaces .window-icon { + border-width: 0px; +} + .window-icon-container { transition: opacity .2s, box-shadow .2s; opacity: 1; @@ -135,12 +220,13 @@ /* Button styling */ -.taffy-window button { + .taffy-window button { all: initial; background-color: @transparent; border-width: 0px; border-radius: 0px; -} + } + .taffy-window button:checked, .taffy-window button:hover .Contents:hover { box-shadow: inset 0 -2px @accent; @@ -293,6 +379,6 @@ popover modelbutton:hover * { letter-spacing: 0.2px; } -.mpris label { +r.mpris label { color: @font-muted; } diff --git a/dotfiles/config/taffybar/taffybar.hs b/dotfiles/config/taffybar/taffybar.hs index ab170300..06902808 100644 --- a/dotfiles/config/taffybar/taffybar.hs +++ b/dotfiles/config/taffybar/taffybar.hs @@ -43,6 +43,8 @@ import System.Taffybar.Widget import System.Taffybar.Widget.Generic.Icon import System.Taffybar.Widget.Generic.PollingGraph import System.Taffybar.Widget.Generic.PollingLabel +import qualified System.Taffybar.Widget.NetworkManager as NetworkManager +import qualified System.Taffybar.Widget.PulseAudio as PulseAudio import System.Taffybar.Widget.Util import qualified System.Taffybar.Widget.HyprlandWorkspaces as Hyprland import qualified System.Taffybar.Widget.Workspaces as X11Workspaces @@ -285,147 +287,101 @@ main = do let relativeFiles = fromMaybe ["palette.css", "taffybar.css"] $ lookup hostName cssFilesByHostname cssFiles <- mapM (getUserConfigFile "taffybar") relativeFiles - let myCPU = deocrateWithSetClassAndBoxes "cpu" $ - pollingGraphNew cpuCfg 5 cpuCallback - myMem = deocrateWithSetClassAndBoxes "mem" $ - pollingGraphNew memCfg 5 memCallback - myNet = deocrateWithSetClassAndBoxes "net" $ - networkGraphNew netCfg Nothing + let myCPU = + ( deocrateWithSetClassAndBoxes "cpu" $ + pollingGraphNew cpuCfg 5 cpuCallback + ) :: TaffyIO Gtk.Widget + myMem = + ( deocrateWithSetClassAndBoxes "mem" $ + pollingGraphNew memCfg 5 memCallback + ) :: TaffyIO Gtk.Widget + myNet = + ( deocrateWithSetClassAndBoxes "net" $ + networkGraphNew netCfg Nothing + ) :: TaffyIO Gtk.Widget + myAudio = deocrateWithSetClassAndBoxes "audio" $ + PulseAudio.pulseAudioLabelNew + myNetwork = deocrateWithSetClassAndBoxes "network" $ + NetworkManager.networkManagerWifiLabelNew myLayout = deocrateWithSetClassAndBoxes "layout" $ - layoutNew defaultLayoutConfig + layoutNew defaultLayoutConfig myWindows = deocrateWithSetClassAndBoxes "windows" $ - windowsNew defaultWindowsConfig + windowsNew defaultWindowsConfig myWorkspaces = flip widgetSetClassGI "workspaces" =<< - X11Workspaces.workspacesNew X11Workspaces.defaultWorkspacesConfig - { X11Workspaces.minIcons = 1 - , X11Workspaces.getWindowIconPixbuf = - X11Workspaces.scaledWindowIconPixbufGetter $ - X11Workspaces.getWindowIconPixbufFromChrome <|||> - X11Workspaces.unscaledDefaultGetWindowIconPixbuf <|||> - (\size _ -> fallbackIconPixbuf size) - , X11Workspaces.widgetGap = 0 - , X11Workspaces.showWorkspaceFn = X11Workspaces.hideEmpty - , X11Workspaces.updateRateLimitMicroseconds = 100000 - , X11Workspaces.labelSetter = workspaceNamesLabelSetter - , X11Workspaces.widgetBuilder = X11Workspaces.buildLabelOverlayController - } + X11Workspaces.workspacesNew X11Workspaces.defaultWorkspacesConfig + { X11Workspaces.minIcons = 1 + , X11Workspaces.getWindowIconPixbuf = + X11Workspaces.scaledWindowIconPixbufGetter $ + X11Workspaces.getWindowIconPixbufFromChrome <|||> + X11Workspaces.unscaledDefaultGetWindowIconPixbuf <|||> + (\size _ -> fallbackIconPixbuf size) + , X11Workspaces.widgetGap = 0 + , X11Workspaces.showWorkspaceFn = X11Workspaces.hideEmpty + , X11Workspaces.updateRateLimitMicroseconds = 100000 + , X11Workspaces.labelSetter = workspaceNamesLabelSetter + , X11Workspaces.widgetBuilder = X11Workspaces.buildLabelOverlayController + } myHyprWorkspaces = flip widgetSetClassGI "workspaces" =<< - Hyprland.hyprlandWorkspacesNew Hyprland.defaultHyprlandWorkspacesConfig - { Hyprland.widgetGap = 0 - , Hyprland.minIcons = 1 - -- Don't show Hyprland "special:*" workspaces. - , Hyprland.showWorkspaceFn = - (\ws -> Hyprland.workspaceState ws /= X11Workspaces.Empty && - not (isSpecialHyprWorkspace ws)) - , Hyprland.getWindowIconPixbuf = - hyprlandManualIconGetter <|||> - Hyprland.defaultHyprlandGetWindowIconPixbuf <|||> - hyprlandFallbackIcon - } + Hyprland.hyprlandWorkspacesNew Hyprland.defaultHyprlandWorkspacesConfig + { Hyprland.widgetGap = 0 + , Hyprland.minIcons = 1 + -- Don't show Hyprland "special:*" workspaces. + , Hyprland.showWorkspaceFn = + (\ws -> Hyprland.workspaceState ws /= X11Workspaces.Empty && + not (isSpecialHyprWorkspace ws)) + , Hyprland.getWindowIconPixbuf = + hyprlandManualIconGetter <|||> + Hyprland.defaultHyprlandGetWindowIconPixbuf <|||> + hyprlandFallbackIcon + } myClock = deocrateWithSetClassAndBoxes "clock" $ - textClockNewWith - defaultClockConfig - { clockUpdateStrategy = RoundedTargetInterval 60 0.0 - , clockFormatString = "%a %b %_d, 🕑%I:%M %p" - } - -- Disabled for now: StatusNotifierWatcher errors under Hyprland. - -- myTray = deocrateWithSetClassAndBoxes "tray" $ - -- sniTrayNewFromParams defaultTrayParams { trayLeftClickAction = PopupMenu - -- , trayRightClickAction = Activate - -- } - myMpris = mpris2NewWithConfig - MPRIS2Config { mprisWidgetWrapper = deocrateWithSetClassAndBoxes "mpris" . return - , updatePlayerWidget = - simplePlayerWidget - defaultPlayerConfig - { setNowPlayingLabel = playingText 20 20 } - } + textClockNewWith + defaultClockConfig + { clockUpdateStrategy = RoundedTargetInterval 60 0.0 + , clockFormatString = "%a %b %_d, 🕑%I:%M %p" + } + myMpris = + mpris2NewWithConfig + MPRIS2Config + { mprisWidgetWrapper = deocrateWithSetClassAndBoxes "mpris" . return + , updatePlayerWidget = + simplePlayerWidget + defaultPlayerConfig + { setNowPlayingLabel = playingText 20 20 + } + } myBatteryIcon = deocrateWithSetClassAndBoxes "battery-icon" batteryIconNew myBatteryText = deocrateWithSetClassAndBoxes "battery-text" $ textBatteryNew "$percentage$%" - batteryWidgets = [myBatteryIcon, myBatteryText] - baseEndWidgets = - [ myMpris - ] - fullEndWidgets = baseEndWidgets ++ [ myCPU, myMem, myNet, myMpris ] + batteryWidgets = [ myBatteryIcon, myBatteryText ] + baseEndWidgets = [ myAudio, myNetwork, myMpris ] laptopEndWidgets = batteryWidgets ++ baseEndWidgets - baseConfigX11 = - defaultSimpleTaffyConfig - { startWidgets = [ myWorkspaces, myLayout, myWindows ] - , endWidgets = baseEndWidgets - , barPosition = Top - , widgetSpacing = 0 - , barPadding = 4 - , barHeight = ScreenRatio $ 1/36 - , cssPaths = cssFiles - , centerWidgets = [ myClock ] - } - baseConfigWayland = - defaultSimpleTaffyConfig - { startWidgets = [ myHyprWorkspaces ] - , endWidgets = baseEndWidgets - , barPosition = Top - , widgetSpacing = 0 - , barPadding = 4 - , barHeight = ScreenRatio $ 1/36 - , cssPaths = cssFiles - , centerWidgets = [ myClock ] - } - x11Overrides = - [ ( "uber-loaner" - , baseConfigX11 { endWidgets = laptopEndWidgets } - ) - , ( "adell" - , baseConfigX11 { endWidgets = laptopEndWidgets } - ) - , ( "stevie-nixos" - , baseConfigX11 { endWidgets = laptopEndWidgets - , startWidgets = [ myWorkspaces, myLayout ] - } - ) - , ( "strixi-minaj" - , baseConfigX11 { endWidgets = laptopEndWidgets } - ) - , ( "jay-lenovo" - , baseConfigX11 { endWidgets = laptopEndWidgets } - ) - , ( "nixquick" - , baseConfigX11 { endWidgets = [ myMpris ] } - ) - ] - waylandOverrides = - [ ( "uber-loaner" - , baseConfigWayland { endWidgets = laptopEndWidgets } - ) - , ( "adell" - , baseConfigWayland { endWidgets = laptopEndWidgets } - ) - , ( "stevie-nixos" - , baseConfigWayland { endWidgets = laptopEndWidgets } - ) - , ( "strixi-minaj" - , baseConfigWayland { endWidgets = laptopEndWidgets } - ) - , ( "jay-lenovo" - , baseConfigWayland { endWidgets = laptopEndWidgets } - ) - , ( "nixquick" - , baseConfigWayland { endWidgets = [ myMpris ] } - ) - ] - selectedConfig = + startWidgetsForBackend = case backend of - BackendX11 -> - fromMaybe baseConfigX11 $ lookup hostName x11Overrides - BackendWayland -> - fromMaybe baseConfigWayland $ lookup hostName waylandOverrides - simpleTaffyConfig = selectedConfig - { centerWidgets = [ myClock ] - -- , endWidgets = [] - -- , startWidgets = [] - } + BackendX11 -> [ myWorkspaces, myLayout, myWindows ] + BackendWayland -> [ myHyprWorkspaces ] + baseConfig = + defaultSimpleTaffyConfig + { startWidgets = startWidgetsForBackend + , endWidgets = baseEndWidgets + , barPosition = Top + , widgetSpacing = 0 + , barPadding = 4 + , barHeight = ScreenRatio $ 1 / 36 + , cssPaths = cssFiles + , centerWidgets = [ myClock ] + } + hostOverrides = + [ ("uber-loaner", \cfg -> cfg { endWidgets = laptopEndWidgets }) + , ("adell", \cfg -> cfg { endWidgets = laptopEndWidgets }) + , ("stevie-nixos", \cfg -> cfg { endWidgets = laptopEndWidgets }) + , ("strixi-minaj", \cfg -> cfg { endWidgets = laptopEndWidgets }) + , ("jay-lenovo", \cfg -> cfg { endWidgets = laptopEndWidgets }) + ] + simpleTaffyConfig = + fromMaybe baseConfig $ ($ baseConfig) <$> lookup hostName hostOverrides startTaffybar $ withLogServer $ withToggleServer $ diff --git a/nix-darwin/flake.lock b/nix-darwin/flake.lock index 610f2784..d4c056cb 100644 --- a/nix-darwin/flake.lock +++ b/nix-darwin/flake.lock @@ -70,16 +70,16 @@ ] }, "locked": { - "lastModified": 1770321000, - "narHash": "sha256-g5Q2VES3eKkLiHfRTeuhmStxZvgb+/oTtRnSEXrPZQk=", - "owner": "colonelpanic8", + "lastModified": 1770406581, + "narHash": "sha256-5EBQV4crivXXwhrA+1s9ApMWryES/eadcNETtHin6Ko=", + "owner": "sadjow", "repo": "codex-cli-nix", - "rev": "9386e1dfd5555b949bb934f062e8cb7971868f8d", + "rev": "d3abf748ac6a06016a6fff14b5a99dedacf72378", "type": "github" }, "original": { - "owner": "colonelpanic8", - "ref": "fix/add-libcap-to-rpath", + "owner": "sadjow", + "ref": "main", "repo": "codex-cli-nix", "type": "github" } diff --git a/nix-darwin/flake.nix b/nix-darwin/flake.nix index c9feb8a9..a6e85d0e 100644 --- a/nix-darwin/flake.nix +++ b/nix-darwin/flake.nix @@ -23,7 +23,8 @@ home-manager.inputs.nixpkgs.follows = "nixpkgs"; codex-cli-nix = { - url = "github:colonelpanic8/codex-cli-nix/fix/add-libcap-to-rpath"; + # Default branch is `main` on GitHub (not `master`). + url = "github:sadjow/codex-cli-nix/main"; inputs.nixpkgs.follows = "nixpkgs"; }; diff --git a/nixos/flake.lock b/nixos/flake.lock index 0cd0c28f..c8ea1706 100644 --- a/nixos/flake.lock +++ b/nixos/flake.lock @@ -153,16 +153,16 @@ ] }, "locked": { - "lastModified": 1770321000, - "narHash": "sha256-g5Q2VES3eKkLiHfRTeuhmStxZvgb+/oTtRnSEXrPZQk=", - "owner": "colonelpanic8", + "lastModified": 1770406581, + "narHash": "sha256-5EBQV4crivXXwhrA+1s9ApMWryES/eadcNETtHin6Ko=", + "owner": "sadjow", "repo": "codex-cli-nix", - "rev": "9386e1dfd5555b949bb934f062e8cb7971868f8d", + "rev": "d3abf748ac6a06016a6fff14b5a99dedacf72378", "type": "github" }, "original": { - "owner": "colonelpanic8", - "ref": "fix/add-libcap-to-rpath", + "owner": "sadjow", + "ref": "main", "repo": "codex-cli-nix", "type": "github" } diff --git a/nixos/flake.nix b/nixos/flake.nix index 0747a780..f7179533 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -132,7 +132,8 @@ nixtheplanet.url = "github:matthewcroughan/nixtheplanet"; codex-cli-nix = { - url = "github:colonelpanic8/codex-cli-nix/fix/add-libcap-to-rpath"; + # Default branch is `main` on GitHub (not `master`). + url = "github:sadjow/codex-cli-nix/main"; inputs.nixpkgs.follows = "nixpkgs"; };