O que exatamente torna um aplicativo gráfico executável no ambiente de terminal? Em relação ao X11, o que você precisa fazer para tornar o aplicativo executável a partir do tty?
Como é que programas como omxplayer
, minecraft
ou gedit
não podem ser executados a partir de tty, mas, por exemplo, "anões bêbados raivosos" (um jogo de python) ou emulador retroarch podem?
É claro que esses são apenas exemplos, não quero que você explique por que eles especificamente funcionam ou não. Mas suspeito que haja algum denominador comum. Se puder, entre em detalhes, mas apenas links para a literatura/artigos corretos também são bem-vindos. Obrigado.
--EDITAR--
Ok, houve algum mal-entendido. Para esclarecer: vamos supor que o Xorg esteja rodando no tty7 e estamos tentando executar programas gráficos em um terminal diferente (digamos, tty1) que não tenha uma instância do Xorg rodando.
Na verdade, o que você (ou mais corretamente, os aplicativos GUI que você executa) precisa geralmente de duas coisas.
X11
servidor viaxhost
DISPLAY
variável de ambiente.O exemplo de trabalho prático é uma das minhas respostas antigas em que o pai-OP solicitou mostrar a mensagem do terminal (supondo
ssh
) para as crianças conectadas via GUI.Com alguns ambientes de desktop que usam DBUS, você também pode precisar fornecer variável de ambiente para sessão DBUS. Esse tipo de sugestão é frequentemente visto em perguntas sobre a execução de aplicativos/mensagens GUI para usuários de
/etc/rc.local
.Se um terminal é capaz de exibir um aplicativo gráfico ou não, depende de dois fatores, a capacidade do terminal e o design do aplicativo gráfico.
Nos tempos antigos, onde os terminais eram dispositivos reais conectados a computadores por meio de linhas seriais, a maioria dos terminais, especialmente os que realmente imprimiam texto em papel, também conhecidos como teletipos, eram capazes apenas de exibir texto.
Já existiam alguns "aplicativos" gráficos capazes de imprimir coisas parecidas com aquela:
Depois vieram os terminais baseados em CRT, como o DEC VT100, que implementou um padrão que a maioria dos emuladores de terminais atuais seguem. Esses terminais eram essencialmente de texto, embora houvesse suporte para alguns caracteres gráficos, mas eles eram incapazes de exibir gráficos (alta resolução). Uma exibição de 80 colunas e 25 linhas também pode ser considerada como um dispositivo de baixa resolução de 2.000 pixels (80x25), mas a velocidade das linhas seriais impedia que essa abordagem fosse muito útil.
Costumava haver também terminais capazes de exibir gráficos nativamente, por exemplo aquele :
Atualmente, a maioria dos aplicativos gráficos executados em Unix e Linux são baseados no protocolo X11 no nível inferior. Este protocolo requer um servidor compatível com X11 para rodar no computador que controla a tela. Este servidor está assumindo o controle do console subjacente ou de um dos terminais virtuais em todas as implementações, portanto, até certo ponto, todos os aplicativos gráficos estão sendo executados a partir de um ambiente de terminal, geralmente tty7, mas é claro que este terminal perde seus recursos originais assim que como X11 assume o controle.
O console usado pela maioria dos sistemas operacionais Unix/Unix fornece algum suporte para aplicativos gráficos. No Linux, esse suporte está disponível por meio do linux framebuffer (fbdev - /dev/fb0). Ele é usado, por exemplo, para exibir o pinguim do Linux, Tux, no momento da inicialização.
Costumava haver alguns aplicativos que usavam diretamente esse dispositivo como o doom, mas agora, a maioria dos aplicativos gráficos usa o X11, que também depende do fbdev. Alguns aplicativos muito versáteis como vlc e mplayer são capazes de usar diretamente o frame buffer do Linux.
Existem também bibliotecas que implementam uma camada gráfica apresentando um dispositivo gráfico às aplicações, mas que na verdade são exibidas em consoles de texto, não muito diferente do que se fazia nos anos 60 nos teletipos e nos anos 80 no PC conectado ao BBS. Uma bem conhecida é a libcaca com a qual você pode até assistir a um filme em um terminal com o mplayer...
Por fim, alguns emuladores de terminal também oferecem suporte a gráficos. Um notável é o venerável xterm que fornece uma janela do emulador Tektronix 4014 capaz de exibir gráficos vetoriais com o gnuplot e outros aplicativos/bibliotecas:
Os aplicativos gráficos não são executados em um terminal. Eles rodam em um servidor X. Este servidor X não precisa estar conectado a um tty, embora normalmente esteja.
Portanto, não é o aplicativo conectado a um tty, mas apenas o servidor X. Você pode iniciar um servidor X apenas em um tty, não em um aplicativo.
IIRC, você pode fazer um servidor X executar um único aplicativo. Mas não posso dar detalhes sobre isso.