Isolando a aplicação do ambiente

Quando você executa um programa no ambiente Unices-Like como Linux, BSD,… seu programa esta sempre usando um decorador e gerenciador de janelas. Diferentemente do Windows, o comportamento e a aparência de um programa num Unices-like como o Linux pode mudar para seguir o padrão do ambiente gráfico (aka. Desktop Enviroment), por exemplo, o GNOME tem GNOME Human Interface Guidelines que orienta como os programadores deveriam criar seus programas seguindo certos estilos, cores e comportamentos. Alguns deles o programador é o responsável por aplicá-los em seu programa enquanto outros aspectos são forçados pelo ambiente gráfico ao seu programa.

When something is going wrong and we need to find out if the behavior comes from the graphical environment and not from our program then we need to run our program outside the current graphical environment. The way to do this requires us to change the current graphical environment to another one and then run the program again. However, a lot of time is wasted doing it this way so let's learn how to do it in a simpler and faster way.

Vamos instalar Xephyr, ele é um servidor de exibição X11 para sistemas Unix-like, como o Linux. Ele é uma evolução do Xnest e oferece funcionalidades semelhantes, permitindo a execução de um ambiente gráfico dentro de uma janela de outro ambiente gráfico. Este programa é uma ferramenta útil para desenvolvedores, testadores e entusiastas de Linux que desejam explorar e experimentar diferentes ambientes gráficos de forma isolada e controlada. Para evitar ficar falando o extenso nome “Servidor X11 Xephyr”, vou simplificar e chamá-lo apenas de Xephyr, com “X” maiusculo porque referencia ao protocolo X11. Para instalá-lo num ambiente debian-like:

sudo apt install -y xserver-xephyr 

Você talvez precise de um decorador de janelas, vamos sugerir dois que são bem leves e quase não afetam a aparência de um programa, mas você pode escolher instalar apenas um deles, então execute:

sudo apt install -y metacity mutter

Depois de instalados, terá de iniciar uma janela de execução do Xephyr.

Xephyr :10 -screen 1024x768 &

Preste bastante atenção ao que significa cada um desses parametros:

  • :10
    • Número do display gráfico, você pode usar qualquer número inteiro, mas terá de se lembrar dele nos passos posteriores quando for exportar uma aplicação para o Xephyr
  • -screen 1024×768
    • Tamanho da janela com o Xephyr, dentro dele estará sua aplicação. Escolha um tamanho que caiba em sua tela e possa ser possivel depurar, em geral 1024×768 ou 1366×768 é suficiente. Não ultrapasse a largura e/ou altura total que seu monitor suporta porque ficará desconfortável manusear.
  • &
    • O “&” comercial no final da linha solicita que o programa vá para background. Assim o terminal não fica preso aguardando o termino do comando para que possa iniciar outro.

No exemplo anterior, pedimos ao Xephyr que se mantivesse no display “10”, você se lembra né? Pois bem, agora nós vamos injetar o primeiro programa dentro do Xephyr, será o decorador de janelas, sem um decorador de janelas você ficará impedido de arrastar, minimizar e maximizar os programas que alí forem executados. Fique a vontade para escolher um deles, mas apenas um:

Opção “A” com o mutter:

mutter --display=:10&

Opção “B” com o metacity:

metacity --display=:10&

Não execute nem “A” e nem “B” e não terá decorador de janela, então não poderá arrastar nenhuma janela de aplicativo exportado para dentro do Xephyr, isso pode parecer ruim, mas em algumas circunstância é interessante que seja assim para observar a aparência de seu aplicativo sem a presença de nenhum decorador. Sem nenhum decorador, seus programas usarão as coordenadas (0,0).

Convenientemente, também podemos executar numa única linha:

Xephyr :10 -screen 1024x768 & metacity --display=:10 &

Quer fazer um teste-drive dentro do Xephyr? Então execute no terminal :

export DISPLAY=:10
firefox&

Também convenientemente, podemos digitar numa única linha:

firefox  --DISPLAY=:10 &

No exemplo acima, o firefox ao invés de aparecer em seu desktop, aparecerá dentro do Xephyr, isto é, isolado do mundo exterior:

Quando você estiver debugando um programa no Lazarus usando este método, você estará isolando o seu programa do mundo exterior e saberá que não há outros programas afetando à execução.

Vamos ao Lazarus, vá nas opções de RUN Parameters do seu projeto e…

… então marque a opção Use Display:

Onde você vê “:0”, troque por “:10” que é o numero do display que o Xephyr está rodando no momento. Quando rodar seu programa, ele aparecerá dentro da janela do Xephyr.

Curiosidade: Uma curiosidade interessante é que ao invés de :10 deveria ser localhost:10, mas o nome ou endereço de loopback pode ser suprimido, e porque isso é importante? Porque o servidor gráfico apelidado de X11 é feito para permitir a execução de um programa em qualquer outro host que também tenha um servidor X11 instalado, em outras palavras, é normal executar um programa num local, mas sua janela de exibição ir onde for indicado mostrar, seja na própria maquina ou outro host na rede que também tiver um servidor X11. Pare e pense, se ambientes Windows possuissem um servidor X11, seus usuários rodariam seus aplicativos num servidor Unices-Like como o Linux, mas estes usuários teriam a impressão de rodá-los diretamente de seu desktop Windows.

Conclusion

Com experiência em ambientes Unices-like, você notará que qualquer aplicação pode ser exportada para um servidor rodando o protocolo X11, pode ser sua própria máquina ou até outro local remoto. Até existem servidores X11 para Windows, no entanto, todos são comerciais. Existe a promessa que a Microsoft coloque no appliance Linux contido no Windows 10/11 a possibilidade de rodar gráficos, possivelmente ela incluirá um servidor X11 e daí provavelmente conseguiremos exportar aplicações no Windows como o fazemos nos Unices-like como Linux, BSD, MacOS e outros.

Com este artigo esperamos que consiga testar melhor suas aplicações.