Tokyo Night no Artix: i3wm, Polybar, Picom e tudo mais
Depois de ter o Artix instalado e funcional, chegou a hora de transformar o desktop em algo que eu realmente quisesse olhar. O que era pra ser "umas horas ajustando o tema" virou dois dias de sessões longas, vários bugs inesperados e uma quantidade absurda de i3-msg reload.
O resultado final foi um setup coeso com tema Tokyo Night em absolutamente tudo: i3, Polybar, Picom, Conky, Rofi, GTK, Terminator, Ranger e até a tela de login do LightDM. Aqui está como chegou lá.
1. Gaps e bordas, o ponto de partida
A primeira coisa que incomodava era o visual das janelas: sem espaço, encostando direto nas bordas, e o Polybar sendo sobreposto às vezes. A configuração inicial tinha gaps outer -13 pra cancelar o inner nas bordas externas, mas ficava feia em monitores maiores.
A versão final que ficou em ~/.config/i3/config:
gaps inner 10 gaps outer 10 gaps top 40
A lógica é simples: inner é o espaço entre janelas, outer é o espaço entre as janelas e as bordas do monitor em todos os lados, e gaps top sobrescreve o topo com 28px (altura da Polybar) + 12px de folga pra respirar. Sem esse gaps top explícito, as janelas ficam coladas embaixo da barra.
Para as bordas visíveis com cor neon:
default_border pixel 2 default_floating_border pixel 2 client.focused #7aa2f7 #1a1b26 #c0caf5 #bb9af7 #7aa2f7 client.focused_inactive #3b4261 #1a1b26 #565f89 #3b4261 #3b4261 client.unfocused #1e2030 #1a1b26 #414868 #1e2030 #1e2030 client.urgent #f7768e #1a1b26 #f7768e #f7768e #f7768e
2. Polybar, redesign completo
A Polybar tinha dois problemas: o launch.sh ainda apontava pro arquivo legado config (em vez do config.ini que eu estava editando), e as cores eram de um tema antigo.
Correção no launch.sh:
polybar minhabarra --config="$HOME/.config/polybar/config.ini" &
O redesign do config.ini trocou as cores antigas por Tokyo Night puro e adicionou ícones Nerd Font por categoria:
Módulo Ícone Cor
| CPU | verde | #9ece6a
| Temperatura | amarelo | #e0af68
| RAM | ciano | #7dcfff
| Rede | roxo | #bb9af7
| Data / Hora | roxo/azul | centralizados
A altura ficou em 28px, reduzi de 34px porque com 34 o espaço visual entre a barra e as janelas ficava pequeno demais.
Módulo Ícone Cor
| CPU | verde | #9ece6a
| Temperatura | amarelo | #e0af68
| RAM | ciano | #7dcfff
| Rede | roxo | #bb9af7
| Data / Hora | roxo/azul | centralizados
A altura ficou em 28px, reduzi de 34px porque com 34 o espaço visual entre a barra e as janelas ficava pequeno demais.
3. Picom, glow neon e o bug do NVIDIA 390
O glow
Com shadow-offset-x = 0 e shadow-offset-y = 0, a sombra não projeta em direção nenhuma — ela envolve a janela por igual, criando um efeito de brilho difuso azul. Junto com corner-radius = 10, o resultado fica bem diferente de uma sombra comum.
Com shadow-offset-x = 0 e shadow-offset-y = 0, a sombra não projeta em direção nenhuma — ela envolve a janela por igual, criando um efeito de brilho difuso azul. Junto com corner-radius = 10, o resultado fica bem diferente de uma sombra comum.
shadow = true; shadow-radius = 22; shadow-offset-x = 0; shadow-offset-y = 0; shadow-opacity = 0.75; shadow-color = "#7aa2f7"; corner-radius = 10;
O bug que travava a tela
Esse foi o mais chato de debugar. Depois de 10 minutos com o monitor apagado (DPMS), ao voltar a tela ficava congelada: o mouse se movia, mas não dava pra clicar em nada, não trocava workspace, não tinha jeito, só matando o Xorg.
A causa eram dois problemas no Picom interagindo com o driver NVIDIA legado 390 (GeForce GT 730):
Config Antes Depois Motivo
| vsync | true | false | O Picom travava esperando vsync de um monitor desligado
| use-damage | true | false | O driver 390 não envia eventos de damage ao acordar, então o Picom não redesenhava a tela
Esse foi o mais chato de debugar. Depois de 10 minutos com o monitor apagado (DPMS), ao voltar a tela ficava congelada: o mouse se movia, mas não dava pra clicar em nada, não trocava workspace, não tinha jeito, só matando o Xorg.
A causa eram dois problemas no Picom interagindo com o driver NVIDIA legado 390 (GeForce GT 730):
Config Antes Depois Motivo
| vsync | true | false | O Picom travava esperando vsync de um monitor desligado
| use-damage | true | false | O driver 390 não envia eventos de damage ao acordar, então o Picom não redesenhava a tela
vsync = false; use-damage = false;
use-damage = false força redesenho completo a cada frame, levemente mais pesado, mas imperceptível com essa GPU e necessário com driver legado.
Para garantir que o Picom nunca ficasse morto silenciosamente, criei dois scripts. Um pra iniciar limpo:
~/.local/bin/picom-start.sh:
pkill -x picom 2>/dev/null sleep 0.3 picom --config ~/.config/picom/picom.conf -b
E um watchdog que roda em loop e reinicia se morrer:
~/.local/bin/picom-watchdog.sh:
~/.local/bin/picom-watchdog.sh:
while true; do
if ! pgrep -x picom > /dev/null; then
sleep 1
picom --config ~/.config/picom/picom.conf -b
fi
sleep 3
done4. Bordas animadas, i3-border-pulse
Queria que a borda da janela focada pulsasse entre azul e roxo. O problema: o client.focused no i3 é uma diretiva de config, não tem como mudar via IPC sem fazer reload do i3 inteiro.
A solução foi um script que edita o config com sed e chama i3-msg reload a cada ciclo:
~/.local/bin/i3-border-pulse:
#!/bin/bash
COLORS=("#7aa2f7" "#9d9cf7" "#bb9af7" "#9d9cf7")
CONFIG="$HOME/.config/i3/config"
idx=0
while true; do
c="${COLORS[$idx]}"
sed -i "s|^client\.focused.*|client.focused $c #1a1b26 #c0caf5 #bb9af7 $c|" "$CONFIG"
i3-msg -q reload 2>/dev/null
idx=$(( (idx + 1) % ${#COLORS[@]} ))
sleep 1.5
doneO ciclo completo dura ~6s: azul → azul-roxo → roxo → azul-roxo → repete.
Mas muito cansativo isso e desnecessario quase fiquei cego e removi
Mas muito cansativo isso e desnecessario quase fiquei cego e removi
5. Conky, ASCII Art + info do sistema
O Conky ficou no canto inferior direito com own_window_type = override (fica atrás de todas as janelas) e transparência real via Picom (own_window_argb_value = 220).
O tema principal tokyo-night.conf exibe:
- ASCII Art do Artix Linux com gradiente de cores Tokyo Night
- Info do sistema: OS, Kernel, Uptime, Shell, CPU, GPU, Pacotes
- CPU: barra geral + grid com os 24 núcleos individuais
- Memória: RAM, Swap e Disco com barras de progresso
- Rede: WiFi (SSID, sinal, IP), velocidade ↑↓
- Top 5 processos: coloridos por ranking
Criei mais dois temas adicionais para quando o wallpaper é claro: transparent-light.conf e transparent-dark.conf. A troca entre os três fica em Mod+Shift+c via script em carrossel, com o estado salvo em ~/.cache/conky_mode pra persistir entre reinicializações.
6. Rofi, tema e controle de volume
O tema ~/.config/rofi/tema_clean.rasi foi reescrito do zero com a paleta Tokyo Night sincronizada com Conky e Polybar. O detalhe que faz diferença visual é o item selecionado ter uma borda esquerda de 3px em azul #7aa2f7 — dá um visual de "aba ativa" diferente de simplesmente mudar a cor de fundo.
A transparência da janela (#1a1b26e6 = 90% opaco) depende do Picom estar rodando. Sem compositor, o alpha no hex é ignorado.
O script de volume ~/.local/bin/rofi-volume foi reescrito com barras visuais ████░░░ e layout em duas colunas (saída + microfone). O menu fica aberto ao ajustar via keybindings:
Tecla Ação
| Alt+↑ / ↓ | Saída ±5%
| Alt+Shift+↑ / ↓ | Mic ±5%
| Alt+m | Toggle mute saída
| Alt+Shift+m | Toggle mute mic
7. GTK, Terminator e Brave
GTK: tokyonight-gtk-theme-git via AUR, configurado pelo lxappearance e exportado:
export GTK_THEME=Tokyonight-Dark
O Brave pega automaticamente via brave://settings/appearance → Tema → GTK+. Não precisa de extensão nenhuma.
Terminator: fundo #1a1b26 com 92% de opacidade (o 8% de transparência dá profundidade sem prejudicar legibilidade), texto #c0caf5, cursor #7aa2f7 piscando, fonte JetBrainsMono Nerd Font 11. A paleta ANSI completa de 16 cores foi configurada manualmente pra seguir Tokyo Night, sem isso alguns programas de terminal ficam com cores estranhas.
Terminator: fundo #1a1b26 com 92% de opacidade (o 8% de transparência dá profundidade sem prejudicar legibilidade), texto #c0caf5, cursor #7aa2f7 piscando, fonte JetBrainsMono Nerd Font 11. A paleta ANSI completa de 16 cores foi configurada manualmente pra seguir Tokyo Night, sem isso alguns programas de terminal ficam com cores estranhas.
8. LightDM sincronizado com o desktop
O LightDM roda como usuário lightdm e não tem acesso à ~/wallpaper/. A solução foi criar um diretório dedicado com permissão do usuário:
sudo mkdir -p /etc/lightdm/wallpaper sudo chown $USER:$USER /etc/lightdm/wallpaper
Com isso, o script wallpaper-cycle.sh copia automaticamente o wallpaper atual pra /etc/lightdm/wallpaper/current.png a cada troca via Mod+Shift+w — sem sudo, sem intervenção:
LIGHTDM_BG="/etc/lightdm/wallpaper/current.png"
if [ -w "$(dirname "$LIGHTDM_BG")" ]; then
cp "$NEXT" "$LIGHTDM_BG"
fiO lightdm-gtk-greeter.conf ficou assim:
[greeter] background=/etc/lightdm/wallpaper/current.png user-background=false theme-name=Tokyonight-Dark font-name=JetBrainsMono Nerd Font 11 clock-format=%H:%M — %d/%m/%Y indicators=~host;~spacer;~clock;~spacer;~session;~power
Para adicionar a foto do usuário: o home drwx------ impede o lightdm de ler ~/.face, então tem que usar o AccountsService. Um detalhe importante: imagens grandes causam falha silenciosa no greeter, redimensionar pra 200×200px antes de copiar.
sudo mkdir -p /var/lib/AccountsService/icons
sudo cp ~/.face /var/lib/AccountsService/icons/$USER
sudo bash -c "printf '[User]\nIcon=/var/lib/AccountsService/icons/$USER\nSystemAccount=false\n' \
> /var/lib/AccountsService/users/$USER"Pra testar sem reiniciar o sistema inteiro: dm-tool switch-to-greeter.
9. Autotiling
Com python-i3ipc instalado via yay, o autotiling.py monitora eventos de foco e decide o split baseado nas dimensões da janela atual:
- Largura > Altura → split h → próxima janela abre à direita
- Altura > Largura → split v → próxima janela abre abaixo
Na prática: ao abrir a segunda janela ela vai pra direita, e ao abrir a terceira ela empilha na área menor. É a feature que eu mais uso no dia a dia.
O script usa um delay de 100ms antes de decidir o split. Sem esse delay, a decisão é baseada nas dimensões antigas da janela, antes do i3 finalizar o layout.
10. Ranger com Tokyo Night
O colorscheme fica em ~/.config/ranger/colorschemes/tokyonight.py. Para os ícones Nerd Font:
git clone https://github.com/alexanderjeurissen/ranger_devicons ~/.config/ranger/plugins/ranger_devicons
~/.config/ranger/rc.conf:
set colorscheme tokyonight set preview_images false default_linemode devicons
O preview_images false é necessário porque o Terminator não suporta inline image preview. Se quiser preview de imagens, precisa do Kitty com preview_images_method kitty.
11. Acentos estilo macOS no teclado 40%
O teclado que uso é um 40% (DNA59) sem Caps Lock, sem Right Alt, sem teclas dedicadas de acento. Queria o comportamento do macOS: Alt+e → dead_acute → vogal = á.
O layout us(mac) do XKB já tem exatamente esses dead keys no Level 3. O problema é mapear o Alt esquerdo como ISO_Level3_Shift sem quebrar os atalhos do i3 que usam Mod1.
~/.Xmodmap:
O layout us(mac) do XKB já tem exatamente esses dead keys no Level 3. O problema é mapear o Alt esquerdo como ISO_Level3_Shift sem quebrar os atalhos do i3 que usam Mod1.
~/.Xmodmap:
keycode 64 = ISO_Level3_Shift clear mod1 add mod1 = Alt_L Meta_L
clear mod1 + add mod1 = Alt_L Meta_L é necessário pra remover o keycode 64 do mod1. Sem isso, o Alt ainda é tratado como Mod1 e o Level3 não dispara.
~/.local/bin/keyboard-setup.sh:
#!/bin/bash setxkbmap us mac sleep 0.5 # aguarda o setxkbmap terminar antes do xmodmap xmodmap ~/.Xmodmap
O sleep 0.5 é essencial, o xmodmap aplicado imediatamente após o setxkbmap não funciona porque o mapa ainda não foi carregado.
12. Dunst, notificações
~/.config/dunst/dunstrc com timeout = 0 em todos os níveis de urgência (a notificação fica até você fechar). Clique esquerdo fecha, clique direito fecha todas.
Sons via scripts externos:
- dunst-sound.sh — 880Hz pra notificações normais
- dunst-sound-urgent.sh — 440Hz pra críticas
O WhatsDesk e Chrome/Gmail integram automaticamente via D-Bus/libnotify sem configuração adicional.
13. O i3 config que zerou
Um dos momentos mais irritantes da sessão: o arquivo ~/.config/i3/config foi zerado. O motivo foi usar ; e && diretamente no exec_always.
O i3 não usa shell no exec_always. Qualquer &&, ;, | ou redirecionamento é interpretado de forma inesperada e pode corromper o arquivo.
# ERRADO — vai causar problema exec_always --no-startup-id setxkbmap us mac && xmodmap ~/.Xmodmap # CERTO — sempre usar script wrapper exec_always --no-startup-id ~/.local/bin/keyboard-setup.sh
O config foi reconstruído do zero. Lição aprendida da pior forma.
Startup completo
Startup completo
exec_always --no-startup-id feh --bg-scale ~/wallpaper/cyber-1.png exec_always --no-startup-id ~/.config/polybar/launch.sh exec_always --no-startup-id ~/.local/bin/picom-start.sh exec_always --no-startup-id ~/.local/bin/picom-watchdog-start.sh exec_always --no-startup-id ~/.local/bin/conky-start.sh exec_always --no-startup-id ~/.local/bin/autotiling-start.sh exec_always --no-startup-id ~/.local/bin/i3-border-pulse exec_always --no-startup-id ~/.local/bin/keyboard-setup.sh exec_always --no-startup-id ~/.local/bin/dunst-start.sh
Atalhos adicionados
Atalho Ação
| Mod+Shift+w | Cicla wallpapers em ~/wallpaper/
| Mod+Shift+c | Cicla tema do Conky (3 modos)
| Mod+Shift+f | Abre Ranger no Terminator
| Mod+d | Rofi launcher
O que ficou pendente
Atalho Ação
| Mod+Shift+w | Cicla wallpapers em ~/wallpaper/
| Mod+Shift+c | Cicla tema do Conky (3 modos)
| Mod+Shift+f | Abre Ranger no Terminator
| Mod+d | Rofi launcher
O que ficou pendente
- Screenshot integrado com Flameshot
- Ajustar o Conky pra mostrar temperatura da GPU separada da CPU
- Testar o Kitty pra habilitar preview de imagens no Ranger
