The scheme switch already reached everything that reads org.freedesktop.appearance -- GTK4, Qt6, Chromium, Electron -- because ColorScheme.qml writes the gsettings key those all watch. Applications carrying their own palettes did not follow, so choosing light mode left the two windows actually used all day, kitty and neovim, still dark. kitty: the 32 colours move out of kitty.conf into themes/, and kitty.conf ends with `include current-theme.conf`. The generated file is machine state rather than configuration, so it is gitignored and link-dotfiles seeds it on install -- otherwise a fresh checkout starts by complaining about a missing include. Running terminals are re-coloured in place over their control sockets; a restart is not needed. neovim: reads settings.json directly, since it neither watches the portal nor keeps a socket open. Tokyo Night ships Day in the same family as Moon, so light mode keeps the editor's identity instead of turning it into a different-looking application. The existing readability overrides were written against Moon and are now dark-only -- applied to Day they would have put light grey on a light background, the same problem they exist to fix, inverted. Light mode gets one override of its own: tokyonight's shipped comment colour measures 2.54:1 against Day's background, under the 3:1 floor for secondary text, so it is replaced with 3.25:1 -- readable, still dimmer than Normal's 4.52:1. An editor already open when the scheme flips re-applies on FocusGained, which is cheap and fires exactly when the mismatch would be noticed. Verified both directions: kitty re-coloured 4 live terminals, and neovim starts as tokyonight-day with background=light and tokyonight-moon with background=dark. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
150 lines
5.6 KiB
Bash
Executable File
150 lines
5.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
# --- Helper functions ---
|
|
log() { echo -e "\033[1;34m[INFO]\033[0m $*"; }
|
|
|
|
# Define paths as they have not been defined by new bashrc yet!
|
|
PANAMA_PATH="${PANAMA_PATH:-$HOME/.local/share/Panama}"
|
|
PANAMA_BASH="${PANAMA_BASH:-$PANAMA_PATH/config/bash}"
|
|
PANAMA_DOT="$PANAMA_PATH/config/dot"
|
|
PANAMA_OLD="$PANAMA_PATH/config/old"
|
|
CONFIG="$HOME/.config"
|
|
|
|
# Make backup folder if it doesn't exist
|
|
mkdir -p "$PANAMA_OLD"
|
|
|
|
# --- Bashrc ---
|
|
echo -e "\n--- Replacing .bashrc ---"
|
|
# Backup existing .bashrc if it's a regular file
|
|
if [ -f "$HOME/.bashrc" ] && [ ! -L "$HOME/.bashrc" ]; then
|
|
log "Backing up existing .bashrc"
|
|
mv "$HOME/.bashrc" "$PANAMA_OLD/.bashrc"
|
|
fi
|
|
# Remove old symlink if it exists and points somewhere else
|
|
if [ -L "$HOME/.bashrc" ]; then
|
|
log "Removing old .bashrc symlink"
|
|
rm "$HOME/.bashrc"
|
|
fi
|
|
# Symlink Panama .bashrc file to ~/.bashrc
|
|
log "Symlinking Panama .bashrc file to ~/.bashrc"
|
|
ln -s "$PANAMA_BASH/.bashrc" "$HOME/.bashrc"
|
|
|
|
# Each entry is symlinked as ~/.config/<name> -> $PANAMA_DOT/<name>.
|
|
# "forge" is the GNOME tiling extension; "hypr"/"quickshell"/"wofi" are the
|
|
# Hyprland desktop. They coexist deliberately — the GNOME session keeps working
|
|
# while Hyprland is being used, so you can log back into either.
|
|
dirs=("espanso" "forge" "ghostty" "gtk-3.0" "gtk-4.0" "hypr" "kitty" "nvim" \
|
|
"quickshell" "tmux" "uwsm" "vicinae" "wofi" "xdg-desktop-portal")
|
|
|
|
# --- Vim vimrc ---
|
|
echo -e "\n--- Setting up vim ---"
|
|
mkdir -p "$HOME/.vim"
|
|
if [ -L "$HOME/.vim/vimrc" ]; then
|
|
rm "$HOME/.vim/vimrc"
|
|
log "Removed old symlink at ~/.vim/vimrc"
|
|
fi
|
|
if [ -f "$HOME/.vim/vimrc" ]; then
|
|
mv "$HOME/.vim/vimrc" "$PANAMA_OLD/vimrc"
|
|
log "Moved existing ~/.vim/vimrc to $PANAMA_OLD/vimrc"
|
|
fi
|
|
ln -s "$PANAMA_DOT/vim/vimrc" "$HOME/.vim/vimrc"
|
|
log "Linked $PANAMA_DOT/vim/vimrc → ~/.vim/vimrc"
|
|
|
|
for dir in "${dirs[@]}"; do
|
|
echo -e "\n--- Setting up $dir ---"
|
|
|
|
# Remove old symlink if it exists
|
|
if [ -L "$CONFIG/$dir" ]; then
|
|
rm "$CONFIG/$dir"
|
|
log "Removed old symlink at $CONFIG/$dir"
|
|
fi
|
|
|
|
# Backup existing directory if it exists
|
|
if [ -d "$CONFIG/$dir" ]; then
|
|
mv "$CONFIG/$dir" "$PANAMA_OLD/$dir"
|
|
log "Moved existing $dir config to $PANAMA_OLD/$dir"
|
|
fi
|
|
|
|
# Create symlink
|
|
ln -s "$PANAMA_DOT/$dir" "$CONFIG/$dir"
|
|
log "Linked $PANAMA_DOT/$dir → $CONFIG/$dir"
|
|
done
|
|
|
|
# kitty.conf ends with `include current-theme.conf`, and that file is generated
|
|
# from the desktop colour scheme rather than committed -- it is machine state.
|
|
# A fresh checkout therefore has no such file, and kitty starts by complaining
|
|
# about a missing include and falling back to its stock colours. Seed it from
|
|
# the scheme in settings.json (dark unless the user has chosen otherwise) so a
|
|
# first launch is themed; ColorScheme.qml overwrites it on every change after.
|
|
KITTY_THEME="$PANAMA_DOT/kitty/current-theme.conf"
|
|
if [ -e "$KITTY_THEME" ]; then
|
|
log "Keeping existing kitty theme at $KITTY_THEME"
|
|
else
|
|
scheme="dark"
|
|
settings="${XDG_CONFIG_HOME:-$HOME/.config}/panama/settings.json"
|
|
if [ -r "$settings" ]; then
|
|
stored="$(jq -r '.colorScheme // "dark"' "$settings" 2>/dev/null || echo dark)"
|
|
[ "$stored" = "light" ] && scheme="light"
|
|
fi
|
|
[ "$scheme" = "light" ] && theme="tokyonight-day" || theme="tokyonight-moon"
|
|
cp "$PANAMA_DOT/kitty/themes/$theme.conf" "$KITTY_THEME"
|
|
log "Seeded kitty $scheme theme ($theme) → $KITTY_THEME"
|
|
fi
|
|
|
|
# Vicinae 0.26 discovers user themes from its XDG data directory rather than
|
|
# from ~/.config/vicinae. Keep the authored theme in Panama with the rest of
|
|
# the launcher config and expose only that file at Vicinae's runtime path.
|
|
VICINAE_THEME_DIR="$HOME/.local/share/vicinae/themes"
|
|
VICINAE_THEME="$VICINAE_THEME_DIR/tokyonight-moon.toml"
|
|
mkdir -p "$VICINAE_THEME_DIR"
|
|
|
|
if [ -L "$VICINAE_THEME" ]; then
|
|
rm "$VICINAE_THEME"
|
|
fi
|
|
|
|
if [ -e "$VICINAE_THEME" ]; then
|
|
log "Keeping existing Vicinae theme at $VICINAE_THEME"
|
|
else
|
|
ln -s "$PANAMA_DOT/vicinae/themes/tokyonight-moon.toml" "$VICINAE_THEME"
|
|
log "Linked Tokyo Night Moon theme → $VICINAE_THEME"
|
|
fi
|
|
|
|
# Panama-native applications live in the user data directory so launchers can
|
|
# discover them alongside system desktop entries. Keep each authored file in
|
|
# the repository and expose it with a narrow per-file symlink.
|
|
# Panama ships its own application icons. Without these the desktop entries fall
|
|
# back to a generic symbolic glyph, which is drawn for 16px toolbar use and
|
|
# looks wrong beside full-colour application icons in the dock.
|
|
PANAMA_ICON_DIR="$PANAMA_PATH/config/local/share/icons/hicolor/scalable/apps"
|
|
USER_ICON_DIR="$HOME/.local/share/icons/hicolor/scalable/apps"
|
|
mkdir -p "$USER_ICON_DIR"
|
|
for icon_file in "$PANAMA_ICON_DIR"/*.svg; do
|
|
[[ -e "$icon_file" ]] || continue
|
|
icon_name="$(basename "$icon_file")"
|
|
icon_target="$USER_ICON_DIR/$icon_name"
|
|
if [[ -L "$icon_target" ]]; then
|
|
rm "$icon_target"
|
|
elif [[ -e "$icon_target" ]]; then
|
|
mv "$icon_target" "$icon_target.bak"
|
|
fi
|
|
ln -s "$icon_file" "$icon_target"
|
|
done
|
|
gtk-update-icon-cache -f -t "$HOME/.local/share/icons/hicolor" 2>/dev/null || true
|
|
|
|
PANAMA_APPLICATION_DIR="$PANAMA_PATH/config/local/share/applications"
|
|
USER_APPLICATION_DIR="$HOME/.local/share/applications"
|
|
mkdir -p "$USER_APPLICATION_DIR"
|
|
for desktop_file in "$PANAMA_APPLICATION_DIR"/*.desktop; do
|
|
[[ -e "$desktop_file" ]] || continue
|
|
desktop_name="$(basename "$desktop_file")"
|
|
desktop_target="$USER_APPLICATION_DIR/$desktop_name"
|
|
if [[ -L "$desktop_target" ]]; then
|
|
rm "$desktop_target"
|
|
elif [[ -e "$desktop_target" ]]; then
|
|
log "Keeping existing desktop entry at $desktop_target"
|
|
continue
|
|
fi
|
|
ln -s "$desktop_file" "$desktop_target"
|
|
log "Linked $desktop_name → $desktop_target"
|
|
done
|