1
0

feat: migrate terminal to ghostty and overhaul picom animations

- **Terminal**:
    - Complete migration from WezTerm to Ghostty
    - Updated `setup.sh` to install and configure Ghostty instead of WezTerm
    - Removed all WezTerm configuration files and themes
- **i3**:
    - Switched default terminal binding to Ghostty
    - Refactored scratchpad rules to use `instance` instead of `class` for more precise targeting
    - Updated scratchpad launches to use Ghostty-specific flags (`--x11-instance-name`)
- **Picom**:
    - Overhauled animation system with new cubic-bezier curves for open, close, and geometry changes
    - Increased `corner-radius` to 10px and refined exclusion list
    - Switched backend to `glx` for better performance and enabled `vsync` and `unredir-if-possible`
    - Updated opacity rules for Ghostty and improved shadow exclusions for UI elements
- **Scripts**:
    - `launch-scratchpad.sh`: Improved logic to toggle scratchpads; now hides the window if it's already focused
    - `window-wait.sh`: Updated to track window `instance` properties for reliability

Signed-off-by: erick-alcachofa <erick@artichoke.dev>
This commit is contained in:
erick-alcachofa 2026-05-14 01:15:02 -06:00
parent fc7236a328
commit 80f1d28d02
Signed by: me
GPG Key ID: 6FA5F8643444BAFA
13 changed files with 180 additions and 315 deletions

17
gui/ghostty/config/config Normal file
View File

@ -0,0 +1,17 @@
theme = Gruvbox Dark Hard
background-opacity = 0.8
mouse-scroll-multiplier = precision:1,discrete:1
font-size = 12
font-family = Maple Mono Normal NL NF
font-feature = -calt, -liga, -dlig, -cv01, -cv02, -cv03, -cv31, -cv32, -ss06, -ss04
gtk-titlebar = false
gtk-wide-tabs = false
# gtk-toolbar-style = flat
gtk-single-instance = false
gtk-custom-css = tabs.css
copy-on-select = clipboard
selection-clear-on-copy = true

View File

@ -0,0 +1,43 @@
/* Flat, minimal tab bar */
tabbar {
font-family: "Maple Mono Normal NL NF", monospace;
box-shadow: none;
border-radius: 0;
margin: 0px;
padding: 0px;
}
tabbox {
box-shadow: none;
border-radius: 0;
margin: 0px;
padding: 0px;
}
tabboxchild {
box-shadow: none;
border-radius: 0;
margin: 6px 0px 0px 0px;
padding: 0px;
}
/* Tab buttons - minimal styling */
tabbar tab {
border-radius: 0;
margin: 0px;
padding: 0px;
}
/* Active tab */
tabbar tab:selected {
border-radius: 0;
margin: 0px;
padding: 0px;
}
/* Tab hover */
tabbar tab:hover {
border-radius: 0;
margin: 0px;
padding: 0px;
}

16
gui/ghostty/setup.sh Normal file
View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
if [ -z "$DOTFILES" ]; then
export DOTFILES=$HOME/dotfiles
source $DOTFILES/env.sh
fi
yay -Syu
yay -S --needed ghostty
mkdir -p $CONFIG/ghostty
ln -f -s $DOTFILES/gui/ghostty/config/config $CONFIG/ghostty/config
ln -f -s $DOTFILES/gui/ghostty/config/tabs.css $CONFIG/ghostty/tabs.css

View File

@ -15,7 +15,7 @@ floating_modifier $mod
tiling_drag modifier titlebar
bindsym $mod+Return exec wezterm
bindsym $mod+Return exec ghostty
bindsym $mod+Shift+q kill
@ -117,8 +117,8 @@ for_window [window_role="pop-up"] floating enable
for_window [window_role="task_dialog"] floating enable
for_window [class="Lutris"] floating enable
for_window [class="vol"] floating enable, resize set 800 500, move to scratchpad
for_window [class="ttrm|sys"] floating enable, resize set 1000 680, move to scratchpad
for_window [instance="vol"] floating enable, resize set 800 500, move to scratchpad
for_window [instance="ttrm|sys"] floating enable, resize set 1000 680, move to scratchpad
for_window [class="scrcpy"] floating enable, move to scratchpad
for_window [class="Proton Pass"] floating enable, resize set 900 680, move position center
for_window [class="Protonvpn-app"] floating enable, resize set 400 700, move position center
@ -181,7 +181,7 @@ exec_always --no-startup-id "nitrogen --restore"
exec_always --no-startup-id ~/dotfiles/gui/scripts/polybar.sh
bindsym $mod+t exec "~/dotfiles/gui/scripts/launch-scratchpad.sh '/usr/bin/wezterm-gui start --class ttrm' 'ttrm'"
bindsym $mod+p exec "~/dotfiles/gui/scripts/launch-scratchpad.sh '/usr/bin/wezterm-gui start --class vol -e pulsemixer' 'vol'"
bindsym $mod+o exec "~/dotfiles/gui/scripts/launch-scratchpad.sh '/usr/bin/wezterm-gui start --class sys -e btop' 'sys'"
bindsym $mod+t exec "~/dotfiles/gui/scripts/launch-scratchpad.sh '/usr/bin/ghostty --gtk-single-instance=false --x11-instance-name=ttrm' 'ttrm'"
bindsym $mod+p exec "~/dotfiles/gui/scripts/launch-scratchpad.sh '/usr/bin/ghostty --gtk-single-instance=false --x11-instance-name=vol -e pulsemixer' 'vol'"
bindsym $mod+o exec "~/dotfiles/gui/scripts/launch-scratchpad.sh '/usr/bin/ghostty --gtk-single-instance=false --x11-instance-name=sys -e btop' 'sys'"
bindsym $mod+u exec "~/dotfiles/gui/scripts/launch-scratchpad.sh 'scrcpy -m 2048 -S -t' 'scrcpy'"

View File

@ -1,64 +1,74 @@
#################################
# Animations #
#################################
animations = (
{
triggers = ["close", "hide"];
opacity = {
curve = "cubic-bezier(0.2, 1, 0.2, 1)";
duration = 0.05;
start = "window-raw-opacity-before";
end = 0;
};
blur-opacity = "opacity";
shadow-opacity = "opacity";
},
{
# OPEN: Drift in from the left + Scale Up
triggers = ["open", "show"];
opacity = {
curve = "cubic-bezier(0.2, 1, 0.2, 1)";
duration = 0.5;
curve = "linear";
duration = 0.2;
start = 0;
end = "window-raw-opacity";
};
blur-opacity = "opacity";
shadow-opacity = "opacity";
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
offset-x = {
curve = "cubic-bezier(0, 0.55, 0.45, 1)";
duration = 0.2;
start = -40; # Drifts 40px from the left
end = 0;
};
scale-x = {
curve = "cubic-bezier(0.2, 1.3, 0.2, 1)";
duration = 0.5;
start = 0.6;
curve = "cubic-bezier(0.34, 1.56, 0.64, 1)";
duration = 0.2;
start = 0.9;
end = 1;
};
scale-y = "scale-x";
shadow-offset-x = "offset-x";
shadow-scale-x = "scale-x";
shadow-scale-y = "scale-y";
shadow-offset-x = "offset-x";
shadow-offset-y = "offset-y";
},
{
# CLOSE: Quick Sink & Fade
triggers = ["close", "hide"];
opacity = {
curve = "linear";
duration = 0.15;
start = "window-raw-opacity-before";
end = 0;
};
offset-y = {
curve = "ease-in";
duration = 0.15;
start = 0;
end = 20; # Sinks slightly down as it vanishes
};
},
{
# GEOMETRY: The i3 Swap (Fixed Syntax)
triggers = ["geometry"];
scale-x = {
curve = "cubic-bezier(0.2, 0, 0.2, 1.2)";
duration = 0.22;
curve = "cubic-bezier(0.05, 0.9, 0.1, 1.05)";
duration = 0.22; # Kept your proven 0.22s speed
start = "window-width-before / window-width";
end = 1;
};
scale-y = {
curve = "cubic-bezier(0.2, 0, 0.2, 1.2)";
curve = "cubic-bezier(0.05, 0.9, 0.1, 1.05)";
duration = 0.22;
start = "window-height-before / window-height";
end = 1;
};
offset-x = {
curve = "cubic-bezier(0.2, 0, 0.2, 1.2)";
curve = "cubic-bezier(0.05, 0.9, 0.1, 1.05)";
duration = 0.22;
start = "window-x-before - window-x";
end = 0;
};
offset-y = {
curve = "cubic-bezier(0.2, 0, 0.2, 1.2)";
curve = "cubic-bezier(0.05, 0.9, 0.1, 1.05)";
duration = 0.22;
start = "window-y-before - window-y";
end = 0;
@ -70,7 +80,6 @@ animations = (
}
);
#################################
# Shadows #
#################################
@ -82,6 +91,17 @@ shadow-offset-x = -8;
shadow-offset-y = -8;
shadow-color = "#111111";
shadow-exclude = [
"name = 'Notification'",
"class_g = 'Conky'",
"class_g ?= 'Notify-osd'",
"class_g = 'Cairo-clock'",
"_GTK_FRAME_EXTENTS@:c",
"window_type = 'menu'",
"window_type = 'dropdown_menu'",
"window_type = 'popup_menu'",
"window_type = 'tooltip'"
];
#################################
# Fading #
@ -91,20 +111,19 @@ fading = true;
fade-in-step = 0.02;
fade-out-step = 0.02;
fade-delta = 4;
no-fading-openclose = true;
no-fading-openclose = false;
#################################
# Transparency / Opacity #
#################################
# inactive-opacity = 0.95;
inactive-opacity-override = false;
frame-opacity = 1.0;
active-opacity = 1.0;
focus-exclude = [];
opacity-rule = [
"100:class_g = 'kitty' && !_NET_WM_STATE@:32a",
"95:class_g = 'ghostty' && !_NET_WM_STATE@:32a",
"0:_NET_WM_STATE@[0]:32a *= '_NET_WM_STATE_HIDDEN'",
"0:_NET_WM_STATE@[1]:32a *= '_NET_WM_STATE_HIDDEN'",
"0:_NET_WM_STATE@[2]:32a *= '_NET_WM_STATE_HIDDEN'",
@ -116,49 +135,61 @@ opacity-rule = [
# Corners #
#################################
corner-radius = 5;
rounded-corners-exclude = [];
corner-radius = 10;
rounded-corners-exclude = [
"class_g = 'i3-frame'",
"window_type = 'dock'",
"window_type = 'desktop'",
"window_type = 'menu'",
"window_type = 'dropdown_menu'",
"window_type = 'popup_menu'",
"window_type = 'tooltip'",
];
#################################
# Background Blurring #
#################################
blur-method = "dual_kawase";
blur-size = 12;
blur-deviation = true;
blur-strength = 5;
blur-background = true;
blur-background-frame = false;
blur-background-fixed = false;
blur-xern = "3x3box";
# blur-method = "dual_kawase";
# blur-strength = 1;
# blur-size = 20;
# blur-background = true;
# blur-background-frame = false;
# blur-background-fixed = false;
blur-background-exclude = [
#"window_type = 'dock'",
#"window_type = 'desktop'",
"window_type = 'dock'",
"window_type = 'desktop'",
"window_type = 'menu'",
"window_type = 'dropdown_menu'",
"window_type = 'popup_menu'",
"window_type = 'tooltip'",
"_GTK_FRAME_EXTENTS@:c"
];
#################################
# General Settings #
#################################
backend = "xrender";
dithered-present = false;
backend = "glx";
vsync = true;
mark-wmwin-focused = false;
mark-ovredir-focused = false;
use-damage = true;
unredir-if-possible = true;
xrender-sync-fence = true;
mark-wmwin-focused = true;
mark-ovredir-focused = true;
detect-rounded-corners = true;
detect-client-opacity = true;
use-ewmh-active-win = true;
detect-transient = true;
use-damage = true;
log-level = "warn";
detect-client-leader = true;
use-ewmh-active-win = true;
wintypes:
{
tooltip = {
fade = true;
shadow = true;
shadow = false;
opacity = 1.0;
focus = true;
full-shadow = false;
@ -171,9 +202,11 @@ wintypes:
shadow = false;
}
popup_menu = {
shadow = false;
opacity = 1.0;
}
dropdown_menu = {
shadow = false;
opacity = 1.0;
}
};

View File

@ -10,13 +10,17 @@ if [ -z "$start" ]; then
fi
if pgrep -f "^$match" >/dev/null; then
i3-msg "[class=\"$i3match\"] scratchpad show"
i3-msg "[class=\"$i3match\"] move position center"
IS_FOCUSED=$(i3-msg -t get_tree | jq ".. | select(.focused? == true and .window_properties?.instance == \"$i3match\")")
if [ -n "$IS_FOCUSED" ]; then
i3-msg "[instance=\"$i3match\"] move scratchpad"
else
i3-msg "[instance=\"$i3match\"] move scratchpad; [instance=\"$i3match\"] scratchpad show, move position center"
fi
else
bash -c "$start &>/dev/null & disown"
~/dotfiles/gui/scripts/run-until-output.sh true ~/dotfiles/gui/scripts/window-wait.sh $i3match
i3-msg "[class=\"$i3match\"] scratchpad show"
i3-msg "[class=\"$i3match\"] move position center"
i3-msg "[instance=\"$i3match\"] move scratchpad; [instance=\"$i3match\"] scratchpad show, move position center"
fi

View File

@ -3,4 +3,4 @@
i3match=$1
i3-msg -m -t subscribe '["window"]' \
| jq 'if .change == "new" and .container.window_properties.class == "'$i3match'" then true else false end'
| jq 'if .change == "new" and .container.window_properties.instance == "'$i3match'" then true else false end'

View File

@ -30,7 +30,7 @@ yay -S --needed \
. $DOTFILES/gui/dunst/setup.sh
. $DOTFILES/gui/polybar/setup.sh
. $DOTFILES/gui/rofi/setup.sh
. $DOTFILES/gui/wezterm/setup.sh
. $DOTFILES/gui/ghostty/setup.sh
yay -S --needed \
obs-studio \

View File

@ -1,84 +0,0 @@
[colors]
ansi = [
"#1c1e1b",
"#e75a7c",
"#8fb573",
"#dbb651",
"#57a5e5",
"#aaaaff",
"#70c2be",
"#f1e9d2",
]
background = "#252623"
brights = [
"#5b5e5a",
"#e75a7c",
"#8fb573",
"#dbb651",
"#57a5e5",
"#aaaaff",
"#70c2be",
"#fff8f0",
]
cursor_bg = "#fff8f0"
cursor_border = "#fff8f0"
cursor_fg = "#0f0800"
foreground = "#f1e9d2"
scrollbar_thumb = "#1c1e1b"
selection_bg = "#5b5e5a"
selection_fg = "#f1e9d2"
split = "#838781"
compose_cursor = "#ff9966"
visual_bell = "#383b35"
[colors.indexed]
[colors.tab_bar]
background = "#1c1e1b"
inactive_tab_edge = "#3a3d37"
[colors.tab_bar.active_tab]
bg_color = "#f1e9d2"
fg_color = "#111210"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.inactive_tab]
bg_color = "#3a3d37"
fg_color = "#5b5e5a"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.inactive_tab_hover]
bg_color = "#2f312c"
fg_color = "#838781"
intensity = "Normal"
italic = true
strikethrough = false
underline = "None"
[colors.tab_bar.new_tab]
bg_color = "#5b5e5a"
fg_color = "#f1e9d2"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[colors.tab_bar.new_tab_hover]
bg_color = "#838781"
fg_color = "#f1e9d2"
intensity = "Normal"
italic = false
strikethrough = false
underline = "None"
[metadata]
name = 'Bamboo'
author = 'Riley Bruins'
origin_url = "https://github.com/ribru17/bamboo.nvim"

View File

@ -1,30 +0,0 @@
[colors]
ansi = [
"#27272a",
"#ea83a5",
"#90b99f",
"#e6b99d",
"#85b8ba",
"#9ca2cf",
"#e29eca",
"#c9c7cd",
]
background = "#161617"
foreground = "#c9c7cd"
brights = [
"#353539",
"#ed96b3",
"#a7c8b3",
"#eac5ac",
"#97c0c4",
"#acb1d7",
"#e8b0d4",
"#c9c7cd",
]
cursor_bg = "#c9c7cd"
cursor_border = "#c9c7cd"
[metadata]
name = 'OldWorld'
author = 'dgox16'
origin_url = "https://github.com/dgox16/oldworld.nvim"

View File

@ -1,34 +0,0 @@
[colors]
ansi = [
'#1f1f1f',
'#f44747',
'#608b4e',
'#dcdcaa',
'#569cd6',
'#c678dd',
'#56b6c2',
'#d4d4d4',
]
background = '#1f1f1f'
brights = [
'#808080',
'#f44747',
'#608b4e',
'#dcdcaa',
'#569cd6',
'#c678dd',
'#56b6c2',
'#d4d4d4',
]
cursor_bg = '#d4d4d4'
cursor_border = '#d4d4d4'
cursor_fg = '#1f1f1f'
foreground = '#d4d4d4'
selection_bg = '#dcdcaa'
selection_fg = '#1f1f1f'
[colors.indexed]
[metadata]
name = 'vscode'
origin_url = 'https://github.com/Mofiqul/vscode.nvim'

View File

@ -1,86 +0,0 @@
local wezterm = require('wezterm')
local config = wezterm.config_builder()
config.audible_bell = "Disabled"
config.window_background_opacity = 0.8
config.font = wezterm.font('Maple Mono NL NF')
config.font_size = 12
config.harfbuzz_features = {
'calt=0', 'clig=0', 'liga=0',
'cv01', 'cv02', 'cv03', 'cv31',
'cv32', 'ss06', 'ss04'
}
config.color_scheme = 'Gruvbox Material (Gogh)'
config.hide_tab_bar_if_only_one_tab = true
config.use_fancy_tab_bar = false
config.tab_bar_at_bottom = true
config.window_padding = {
left = 0,
right = 0,
bottom = 0,
top = 0,
}
config.leader = {
key = 'Space',
mods = 'ALT',
timeout_milliseconds = 1000
}
config.keys = {
{
key = 's',
mods = 'LEADER',
action = wezterm.action.SplitPane { direction = 'Right' }
},
{
key = 'v',
mods = 'LEADER',
action = wezterm.action.SplitPane { direction = 'Down' }
},
{
key = 'x',
mods = 'LEADER',
action = wezterm.action.CloseCurrentPane { confirm = true }
},
{
key = 'k',
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection 'Up'
},
{
key = 'h',
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection 'Left'
},
{
key = 'l',
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection 'Right'
},
{
key = 'j',
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection 'Down'
},
{
key = 'z',
mods = 'LEADER',
action = wezterm.action.TogglePaneZoomState
}
}
wezterm.plugin.require('https://gitlab.com/xarvex/presentation.wez')
.apply_to_config(
config,
{
font_size_multiplier = 1.5
}
)
return config

View File

@ -1,14 +0,0 @@
#!/usr/bin/env bash
if [ -z "$DOTFILES" ]; then
export DOTFILES=$HOME/dotfiles
source $DOTFILES/env.sh
fi
yay -Syu
yay -S --needed wezterm
mkdir -p $CONFIG/wezterm
ln -f -s $DOTFILES/gui/wezterm/config/wezterm.lua $CONFIG/wezterm/wezterm.lua