Em meados de 2023, decidi abandonar minha instalação do Fedora com XFCE e dar uma chance ao i3, que eu constantemente via o theprimeagen usar. Nunca antes tinha utilizado um tiling window manager (TWM), mas o argumento de que as aplicações podem ser acessadas a partir de uma combinação de teclas, me conquistou. A ideia de um TWM é a seguinte: a navegação entre os programas abertos (ou janelas) no seu sistema se dá basicamente pelo teclado. Desse modo, é possível alternar, redimensionar e mover as aplicações sem precisar do mouse.

Em um TWM nós temos diversos workspaces. Cada workspace tem seu próprio conjunto de janelas e layout. Nós podemos então organizar janelas relacionadas em um mesmo workspace, que é acessível por uma combinação de teclas. No meu setup, por exemplo, eu organizo todo desenvolvimento de código backend no workspace 7. Dessa forma, eu sei que sempre que eu quiser codificar algo no backend, basta apertar ALT+7. Essa organização permite uma produtividade maior, uma vez que não preciso ficar procurando visualmente em uma barra de tarefas onde a IDE está.

Logo assim que migrei para o i3, a primeira coisa que fiz foi definir em qual workspace as aplicações que mais utilizo ficariam. Após algumas experimentações, cheguei na seguinte configuração:

  • Workspace 1: Terminal / NeoVim
  • Workspace 2: Zen / Comunicação pessoal
  • Workspace 3: Chrome / Comunicação corporativa
  • Workspace 4: DBeaver
  • Workspace 5: Obsidian
  • Workspace 6: IDE frontend / Postman
  • Workspace 7: IDE backend

Por algum tempo, usei o i3 “cru”, apenas com essas definições de qual workspace teria qual programa. Com o uso no dia a dia, passei a ter necessidade de duas funcionalidades.

Mover o workspace ativo de um monitor para o outro Link para o cabeçalho

Para fazer isso, criei o script ~/.local/scripts/move-workspace-to-next-screen.sh com o seguinte código:

#!/usr/bin/env bash
# requires jq

CURRENT_FOCUSED_WORKSPACE=$(i3-msg -t get_workspaces | jq -r '.[] | select (.focused==true) | .name')
i3-msg "workspace $CURRENT_FOCUSED_WORKSPACE; move workspace to output right" 

Para ele, coloquei a combinação ALT+SHIFT+D, dentro do arquivo ~/.config/i3/config:

bindsym $mod+Shift+d exec --no-startup-id ~/.local/scripts/move-workspace-to-next-screen.sh

Fazer swap dos workspaces ativos entre ambos os monitores Link para o cabeçalho

Dessa vez, criei o script ~/.local/scripts/swap-workspaces.sh com o seguinte código:

#!/usr/bin/env bash
# requires jq

DISPLAY_CONFIG=($(i3-msg -t get_outputs | jq -r '.[]|"\(.name):\(.current_workspace)"'))

for ROW in "${DISPLAY_CONFIG[@]}"
do
    IFS=':'
    read -ra CONFIG <<< "${ROW}"
    if [ "${CONFIG[0]}" != "null" ] && [ "${CONFIG[1]}" != "null" ]; then
        i3-msg -- workspace --no-auto-back-and-forth "${CONFIG[1]}"
        i3-msg -- move workspace to output right
    fi
done

Nesse script, coloquei a combinação ALT+SHIFT+S, dentro do arquivo ~/.config/i3/config:

bindsym $mod+Shift+s exec --no-startup-id ~/.local/scripts/swap-workspaces.sh

Aparência Link para o cabeçalho

Depois de algum tempo busquei alternativas mais customizáveis para o i3bar que vem por padrão com o i3. Foi então que fiquei sabendo da polybar. Configurei uma polybar para cada monitor, com diferentes módulos em cada um. Esse detalhe me ajudou bastante no dia a dia.

Hyprland Link para o cabeçalho

Após quase 2 anos inteiros usando o i3, decidi aposentar ele um pouco e dar uma chance ao Hyprland, um TWM muito bonito e fluido. Diferentemente do i3, que roda sobre X11, o Hyprland roda sobre Wayland. Esse fato atrapalha um pouco, uma vez que aplicativos como DBeaver e Flameshot, que uso constantemente no dia a dia, não possuem bom suporte ao Wayland na data em que escrevo esse post. O DBeaver é particularmente fácil de contornar executando ele com o comando GDK_BACKEND=x11 dbeaver-ce. Já para o Flameshot, tive que mudar para uma alternativa com grim e swappy: grim -g "$(slurp)" - | swappy -f -. É um bom substituto para o Flameshot, mas não tão bom quanto. Apesar disso, os scripts que mostrei mais cedo para manipular workspaces entre monitores não são mais necessários. O Hyprland permite atingir o mesmo resultado utilizando os chamados dispatchers. Dessa forma, os scripts foram resumidos em duas linhas no arquivo hyprland.conf:

bind = $mainMod SHIFT, S, swapactiveworkspaces, HDMI-A-1 HDMI-A-2
bind = $mainMod SHIFT, D, movecurrentworkspacetomonitor, +1

Muito mais prático e fácil

Em resumo, esses são os principais pontos que tenho a compartilhar da minha experiência. Muita coisa passei e não lembro mais, mas espero usar esse blog para registrar com mais frequência as adversidades que forem surgindo ao longo do caminho, para que nada se perca. Espero que fiquem bem, e até uma próxima.