Como posso personalizar um plano de fundo do console em tela cheia (TTY)?

17

Eu costumava usar os consoles de tela cheia (aqueles abertos com Ctrl+ Alt+ F1... F6) ativamente e tive a ideia de que gostaria de tentar decorá-lo com um tipo de "papel de parede" (é claro que é bastante escuro e monótono) para não diminuir a legibilidade), talvez isso pareça agradável (ou não, mas preciso tentar). Seria ainda melhor se eu pudesse definir imagens diferentes como plano de fundo do console diferente (uma para Ctrl+ Alt+ F1, outra para Ctrl+ Alt+ F2etc).

O fato de os consoles terem uma resolução muito maior que o modo de texto puro fornece sugere que o modo gráfico completo é usado para eles e tudo é possível. Mas como?

Ivan
fonte
2
Impossível. Consoles virtuais são apenas texto.
23815 Sergiy Kolodyazhnyy
5
@Serg Estou usando modos somente texto desde o momento em que o Linux nem existia - acredite, posso distinguir o modo texto real da sua emulação gráfica. Muitas pessoas mal conseguem imaginar isso hoje em dia, mas eu até assisti filmes nos consoles sem nenhum servidor X instalado durante os 2,4 dias do Linux. Isso me faz duvidar que isso seja realmente impossível.
Ivan
1
OK, bem, deixe-me me corrigir: eu acredito em ver imagens e filmes no console, por causa de algo conhecido como framebufferdispositivo, mas com essa tela é ocupada a saída de algum programa, como fbi. O TTY, por si só, ainda é um dispositivo somente de texto #
Sergiy Kolodyazhnyy
2
Colocarei uma recompensa em sua pergunta assim que ela for elegível. Eu me interessei realmente
Sergiy Kolodyazhnyy
1
Confira: code.google.com/p/fbterm
Sergiy Kolodyazhnyy 24/11/2015

Respostas:

12

Tenho certeza de que o driver do console Linux não possui essa capacidade, no entanto, existe um aplicativo chamado fbtermque pode fazer isso. Para que as imagens de fundo funcionem, você também precisará de um utilitário que possa exibir uma imagem no buffer de moldura, como fbi:

sudo apt-get install fbterm fbi

fbtermNa verdade, ele não lê ou exibe as imagens de plano de fundo, ele espera que outro programa configure a imagem de plano de fundo na tela antes de iniciar. Existem instruções na fbtermpágina de manual sobre como fazer isso usando fbv, um utilitário absolutamente antiquado e não suportado que eu nem consegui compilar em um sistema Ubuntu moderno. fbié um visualizador de imagens muito mais limpo e agradável para o buffer de quadros, mas infelizmente não possui a funcionalidade "definir e sair" da mais simples fbve, portanto, interfere fbtermse você tentar usá-la diretamente. No entanto, consegui encontrar uma alternativa que funcione:

Primeiro, você precisará usar fbie catexibir a imagem desejada e depois despejá-la em um arquivo de imagem "framebuffer raw format". Como root, em um console do buffer de estrutura, execute:

( sleep 1; cat /dev/fb0 > nifty-background.fbimg ) & fbi -t 2 -1 --noverbose -a nifty-background.png

(Isso exibirá a imagem por alguns segundos e sairá, após salvar o resultado no arquivo nifty-background.fbimg. Substitua nifty-background.fbimge nifty-background.pngpor quaisquer nomes de arquivos que você desejar, é claro.)

A primeira parte do comando aguarda 1 segundo antes de colocar o conteúdo do buffer de quadros em um arquivo. Ao mesmo tempo, a segunda parte (após o &) inicia fbipara exibir a imagem no buffer de molduras, de modo que quando o comando cat começa a executar (1 segundo depois), há uma imagem para despejo. A razão pela qual eles estão nessa ordem é porque descobri que fbihavia problemas se não estava sendo executado em primeiro plano, o que significa que deve ser o último comando da lista.

A partir de então, sempre que desejar executar fbterm, você poderá iniciá-lo dessa maneira (você pode criar um pequeno script de wrapper):

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
Foogod
fonte
7

Eu posso distinguir o modo de texto real de sua emulação gráfica.

… Que é uma das maneiras pelas quais o observador pode distinguir um BSOD real no Windows das ações do protetor de tela da piada BSOD que fez as rondas há uma década ou mais. A exibição de caracteres gráficos de bloco usando o hardware do adaptador de vídeo no modo gráfico era sutilmente diferente dos caracteres gerados pelo hardware do adaptador de vídeo no modo de texto.

Sim, o adaptador de vídeo está no modo gráfico. Tem sido assim há algum tempo, agora. Sempre foi assim em sistemas sem hardware de adaptador de vídeo para PC. Nos primeiros anos do Linux, em PCs compatíveis, o console teria o hardware do adaptador de vídeo no modo de texto. Mas esse uso foi corroído para praticamente nada. Atualmente, o suporte a Unicode para a maioria dos usuários requer um conjunto de glifos maior do que o hardware em modo de texto. O firmware da máquina (é claro) usa o modo gráfico para telas de apresentação (com imagens bonitas e logotipos da empresa), assim como o carregador do Linux e a inicialização do sistema.

Existe um programa emulador de terminal embutido no kernel do Linux. Ele está em camadas no buffer de quadros e no subsistema de eventos de entrada, que ele usa interfaces internas do kernel para acessar. Ele se apresenta aos sistemas no modo de aplicativo como uma série de dispositivos de terminal virtual do kernel , /dev/tty1e assim por diante.

Este programa é bastante limitado comparado aos emuladores de terminal que são executados com o kernel Linux, como programas aplicativos comuns. Ele apenas emula um subconjunto limitado da funcionalidade de um terminal real e não possui os recursos adicionais desses últimos emuladores de terminal.

É para aqueles que você precisa procurar por isso. Você pode estar familiarizado com os emuladores de terminal que usam X para suas entradas / saídas, como xterm, lxterminal, gnome-console, konsole, eterm, wterm e o restante. Menos conhecidos são aqueles que usam o dispositivo buffer de estrutura e os dispositivos de evento de entrada para sua entrada / saída. fornecendo terminais virtuais no espaço do usuário :

Alguns destes últimos podem fazer o que você deseja.

O fbterm pode ser configurado para usar o que estiver no buffer de estrutura na inicialização como uma imagem de plano de fundo, por exemplo. Então, tudo o que você precisa fazer é usar um dos vários outros utilitários para exibir imagens diretamente em um desenvolvedor de framebuffer Linux para configurar uma imagem de fundo antes de executar o fbterm. Existem várias ferramentas, incluindo:

fbvis e fbi limpam a tela na saída e exigem as convoluções explicadas em mais detalhes na resposta de Foogod. O dfbg, no entanto, não se limpa, tornando-o mais adequado para esta tarefa específica.

Leitura adicional

JdeBP
fonte
A pergunta foi feita sobre como criar uma imagem de fundo para o console. Sua resposta lista apenas possíveis soluções. Por isso, concedo recompensa à outra resposta, no entanto, agradeço a riqueza de informações que você forneceu. Você tem o meu voto.
Sergiy Kolodyazhnyy
4

Embora a resposta de Foogod não tenha funcionado para mim, ela me levou na direção certa, fornecendo metade da solução (ou seja, lendo dados do buffer de quadros, enquanto fbimostra uma imagem na tela TTY). Portanto, eu concedi a sua resposta a recompensa.

Abaixo é um script que facilita o lançamento fbtermcom caminho parcial para a imagem como um único argumento de linha de comando

Uso

O script deve ser salvo em um diretório listado em sua $PATHvariável. De preferência, ele deve estar na sua $HOME/binpasta pessoal . Consulte Como adicionar um diretório ao PATH? na explicação como adicionar o seu pessoal binpara $PATH, mas a criação de um diretório chamado binem seu diretório home é suficiente para adicioná-lo PATHna re-login.

O script também deve ter permissão executável; você pode configurá-lo com chmod +x /path/to/script.sh.

Finalmente, ele deve ser executado com sudo, para permitir acesso root para leitura e gravação /dev/fb0.

Origem do Script

Também disponível no meu repositório Github.

#!/bin/bash
# Author : Serg Kolo
# Date: Dec 5, 2015
# Description: Script to render image and set it as background
# in conjunction with fbterm
# Depends: fbterm,fbi, awk
# Written for: /ubuntu//q/701874/295286

function printUsage
{
  echo "<<< Script to set background image in TTY console"
  echo "<<< Written by Serg Kolo, Dec 5 , 2015"
  echo "<<< Usage: scriptName.sh /path/to/image"
  echo "<<< Must be ran with root privileges, in TTY only"
  echo "exiting"

}

# check if we're root, if there's at least one ARG, and it is a TTY

if [ "$(whoami)" != "root"   ] || [ "$#" -eq 0  ] ||  [ "$( tty | awk '{gsub(/[[:digit:]]/,""); gsub(/\/dev\//,"");print}' )" != "tty"  ] ;then

   printUsage
   exit 1
fi



# read the full path of the image

IMAGE="$( readlink -f "$@" )"

# Launch fbi with whatever image was supplied as command line arg
# then take out whatever is the data in framebuffer;
# Store that data to /tmp folder

( sleep 1; cat /dev/fb0 > /tmp/BACKGROUND.fbimg ; sleep 1; pkill fbi ) & fbi -t 2 -1 --noverbose -a  "$IMAGE"

# This portion is really optional; you can comment it out 
# if you choose so

echo "LAUNCH FBTERM ?(y/n)"
read ANSWER

if [ "$ANSWER" != "y"  ] ; then
   echo exiting
   exit 1
fi

# The man page states that fbterm takes screenshot of 
# what is currently in framebuffer and sets it as background
# if FBTERM_BACKGROUND_IMAGE is set to 1
# Therefore the trick is to send the framebuffer data captured
# in the last step (which will display the image on screen)
# and then launch fbterm. Note, that I send output from the command
# send to background in order to avoid the extra text displayed on 
# screen. That way we have clear image in framebuffer, without 
# the shell text, when we launch fbterm

export FBTERM_BACKGROUND_IMAGE=1 
clear
( cat /tmp/BACKGROUND.fbimg  > /dev/fb0 &) > /dev/null; sleep 0.25; fbterm 

informação adicional

Acontece que o usuário não precisa necessariamente usar sudo; /dev/fb0pertence ao videogrupo, para que os usuários possam se adicionar a esse grupo usando

sudo usermod -a -G video $USER

Assim, as verificações de raiz no script acima se tornam obsoletas, especificamente [ "$(whoami)" != "root" ] ||parte.

Sergiy Kolodyazhnyy
fonte