Two things, both closing gaps in work that was already reported done. GNOME's Multitasking panel, in Hyprland's terms: tiling layout, split behaviour, floating-window snapping, workspace wrap-around and back-and-forth, whether applications may take focus, and whether the pointer changes the active display. Hyprland creates and destroys workspaces as you use them, so there is no fixed count to expose, and the page says so rather than leaving a conspicuous absence. The Desktop page described the first two of these as read-only facts -- "Layout: Tiling", "Workspace movement: Dynamic" -- which was never true. Both are ordinary Hyprland options that happened to have no controls, and TextRow's own documentation says a setting the user could reasonably change does not belong in it. Schema defaults are Panama's shipped values from looks.lua rather than Hyprland's own, so restoring defaults returns the desktop to how it ships. 43 mapped options now, from 35. The launcher had no light theme. vicinae.json already selected a theme per system appearance, but both entries pointed at Moon, so choosing light mode left the most frequently opened window on the desktop dark -- a hole in the light/dark work, not a missing feature. Day is authored from the same palette as the kitty Day theme so the two cannot drift, and link-dotfiles now installs every authored theme rather than only the dark one, which is why the gap survived being noticed. Its placeholder colour is not Tokyo Night Day's own: that measures 2.54:1 against the background, below the 3:1 floor for secondary text. This is 3.25:1, the same value used for neovim's light comments. Claude-Session: https://claude.ai/code/session_01BRvzt4H8XXLPVH5MyYdk9L
157 lines
5.9 KiB
Bash
Executable File
157 lines
5.9 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"
|
|
mkdir -p "$VICINAE_THEME_DIR"
|
|
|
|
# Every authored theme, not just the dark one: vicinae.json selects a theme per
|
|
# system appearance, so linking only Moon left the launcher falling back to its
|
|
# stock palette whenever Panama was in light mode.
|
|
for theme_src in "$PANAMA_DOT"/vicinae/themes/*.toml; do
|
|
[ -e "$theme_src" ] || continue
|
|
theme_dst="$VICINAE_THEME_DIR/$(basename "$theme_src")"
|
|
|
|
if [ -L "$theme_dst" ]; then
|
|
rm "$theme_dst"
|
|
fi
|
|
|
|
if [ -e "$theme_dst" ]; then
|
|
log "Keeping existing Vicinae theme at $theme_dst"
|
|
else
|
|
ln -s "$theme_src" "$theme_dst"
|
|
log "Linked Vicinae theme → $theme_dst"
|
|
fi
|
|
done
|
|
|
|
# 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
|