Published on

Tiling window managers e problemas com reparenting em Java

Authors

Introdução

Em junho de 2021 fui agraciado com uma bolsa do banco Santander para realizar um bootcamp para full stack com Java e Angular. Embora eu já utilizasse a IDE Eclipse para desenvolvimento em Java, decidi torcar para a IntelliJ IDEA, assim como os instrutores. Ao executar o programa, entretanto, tive uma surpresa desagradável, mesmo que eu colocasse a janela em modo flutuante, seu conteúdo era apenas uma tela cinza, como pode ser visto abaixo:

Bug

Causa

Embora gerenciadores de janela em mosaico, mais conhecidos como tiling window managers sejam muito pouco utilizados se comparados com gerenciadores flutuantes, a IntelliJ IDEA foi o único programa no meu computador a apresentar este tipo de bug e mesmo também sendo um ambiente para desenvolvimento Java, a Eclipse se comportava normalmente na minha máquina.

Surpreendentemente a causa do problema é a própria linguagem Java. Diferentemente da IntelliJ o source code da Eclipse não é completamente escrito em Java, contendo também código C. Acontece que o Abstract Window Toolkit do Java mantém uma lista de gerenciadores de janelas que suportam reparenting, algo completamente inusitado. Meu gerenciador de janela sendo o DWM, não faz parte da lista, assim como não fazem a maior parte dos tiling window managers populares, como BSPWM, Awesome e I3. Isso explica a diferença de comportamento entra as duas IDEs, assim como porque forçar modo flutuante não resolve o problema. Entendendo a causa, entretanto, a solução é simples!


Solução

Para fazer com que o AWT do Java tenha o comportamento esperado, temos de fazer uso da ferramenta wmname, desenvolvida pelo grupo scukless. Sua função é definir a propriedade do nome do gerenciador de janelas. Logo, basta chamar wmname passando como parâmetro um gerenciador de janelas suportado, minha sugestão sendo LG3D, um tiling window manager escrito em Java. Uma vez feito isso, basta reiniciar a IntelliJ e o problema estará resolvido. Contudo, para evitar a chamada manual do wmname no terminal toda vez que se deseje utilizar um software problemático escrito em java, sugiro a criação de um Shellscript de autostart, como:

#!/bin/bash
function run {
 if ! pgrep $1 ;
  then
    $@&
  fi
}
run "wmname LG3D"

Encontram-se abaixo imagens da minha implementação dessa solução e do comportamento arrumado da IntelliJ IDEA:

Bug
Bug

Referências

  1. https://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html
  2. https://intellij-support.jetbrains.com/hc/en-us/community/posts/206187409-Tiling-window-managers-intelliJ
  3. https://www.reddit.com/r/bspwm/comments/267srd/problem_with_intellij_bspwm/