flakes: switch codex-cli-nix back to sadjow/main

This commit is contained in:
2026-02-06 13:05:26 -08:00
committed by Kat Huang
parent 3a68b8e23d
commit ac4fa3b189
13 changed files with 309 additions and 202 deletions

1
.gitignore vendored
View File

@@ -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/

View File

@@ -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

View File

@@ -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");

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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,12 +287,22 @@ main = do
let relativeFiles = fromMaybe ["palette.css", "taffybar.css"] $ lookup hostName cssFilesByHostname
cssFiles <- mapM (getUserConfigFile "taffybar") relativeFiles
let myCPU = deocrateWithSetClassAndBoxes "cpu" $
let myCPU =
( deocrateWithSetClassAndBoxes "cpu" $
pollingGraphNew cpuCfg 5 cpuCallback
myMem = deocrateWithSetClassAndBoxes "mem" $
) :: TaffyIO Gtk.Widget
myMem =
( deocrateWithSetClassAndBoxes "mem" $
pollingGraphNew memCfg 5 memCallback
myNet = deocrateWithSetClassAndBoxes "net" $
) :: 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
myWindows = deocrateWithSetClassAndBoxes "windows" $
@@ -330,102 +342,46 @@ main = do
{ 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
myMpris =
mpris2NewWithConfig
MPRIS2Config
{ mprisWidgetWrapper = deocrateWithSetClassAndBoxes "mpris" . return
, updatePlayerWidget =
simplePlayerWidget
defaultPlayerConfig
{ setNowPlayingLabel = playingText 20 20 }
{ 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 $

12
nix-darwin/flake.lock generated
View File

@@ -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"
}

View File

@@ -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";
};

12
nixos/flake.lock generated
View File

@@ -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"
}

View File

@@ -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";
};