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

14

Eu costumava usar consoles de tela cheia (aqueles abertos com Ctrl + Alt + F1 ... F6 ) ativamente e chegou a uma idéia que eu gostaria de tentar decorá-lo com um "papel de parede" de um tipo (um escuro e monótono claro, para que não diminuísse a legibilidade), talvez isso possa parecer e me sinto bem (ou não, mas preciso tentar). Seria ainda melhor se eu pudesse definir imagens diferentes como plano de fundo do console diferente (um para Ctrl + Alt + F1 , outro para Ctrl + Alt + F2 etc).

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

    
por Ivan 24.11.2015 / 09:23

3 respostas

10

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

sudo apt-get install fbterm fbi

fbterm na verdade não lê nem exibe imagens de fundo, ele espera que algum outro programa configure a imagem de fundo na tela antes de iniciar. Há instruções na página fbterm man 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 framebuffer, mas infelizmente não tem a funcionalidade "definir e sair" do mais simples fbv e, portanto, interfere com fbterm se você tentar usá-lo diretamente. No entanto, consegui encontrar uma alternativa que funcionasse:

Primeiro, você precisará usar fbi e cat para exibir a imagem desejada e, em seguida, despejá-la em um arquivo de imagem "framebuffer raw format". Como root, em um console framebuffer, 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 depois sairá, depois de salvar o resultado no arquivo nifty-background.fbimg . Substitua nifty-background.fbimg e nifty-background.png pelos nomes de arquivos desejados, é claro.)

A primeira parte do comando aguarda por 1 segundo antes de colocar o conteúdo do framebuffer em um arquivo. Ao mesmo tempo, a segunda parte (após o & amp;) lança fbi para exibir a imagem no framebuffer, para que quando o comando cat comece a executar (1 segundo depois), haja uma imagem ali para ser despejada. A razão pela qual eles estão nessa ordem é porque achei que fbi tinha problemas se não estivesse sendo executado em primeiro plano, o que significa que ele precisa ser o último comando da lista.

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

export FBTERM_BACKGROUND_IMAGE=1
cat nifty-background.fbimg > /dev/fb0; fbterm
    
por Foogod 29.11.2015 / 02:07
4
  

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

... que é uma das maneiras em que o observador poderia distinguir um BSOD real no Windows das ações do protetor de tela BSOD piada que fez as rodadas de uma década ou mais atrás. A exibição de caracteres gráficos de bloco usando o hardware do adaptador de vídeo no modo gráfico foi 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. Era sempre desta forma em sistemas sem hardware de adaptador de monitor de PC. Nos primeiros anos do Linux, em computadores compatíveis, o console teria o hardware do adaptador de vídeo no modo de texto. Mas este uso silenciosamente se desgastou para praticamente nada. O suporte a Unicode para a maioria dos usuários hoje em dia requer um conjunto de glifos maior do que o hardware em modo texto. O firmware da máquina (é claro) usa o modo gráfico para telas iniciais (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. É colocado sobre o framebuffer e o subsistema de eventos de entrada, que usa interfaces de kernel internas para acessar. Ele se apresenta para sistemas de modo aplicativo como uma série de dispositivos kernel virtual terminal , /dev/tty1 e assim por diante.

Este programa é bastante limitado em comparação com os emuladores de terminal que executam fora do kernel Linux, como programas de aplicativos comuns. Ele apenas emula um subconjunto limitado da funcionalidade de um terminal real e não possui os recursos adicionais dos últimos emuladores de terminal.

São aqueles que você precisa procurar para isso. Você pode estar familiarizado com os emuladores de terminal que usam o X para sua entrada / saída, como xterm, lxterminal, gnome-console, konsole, eterm, wterm e o resto. Menos conhecidos são os que usam o (s) dispositivo (s) framebuffer e os dispositivos de evento de entrada para sua entrada / saída. fornecendo terminais virtuais espaço do usuário :

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

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

fbvis e fbi limpam a tela na saída e requerem as circunvoluções que são explicadas com mais detalhes na resposta de Foogod. O dfbg, no entanto, não limpa depois de si, tornando-o mais adequado para esta tarefa em particular.

Leitura adicional

por JdeBP 04.12.2015 / 14:08
3

Embora a resposta de Foogod não tenha funcionado para mim, ela me levou à direção certa, fornecendo metade da solução (ou seja, lendo dados de framebuffer, enquanto fbi está mostrando uma imagem na tela TTY). Por isso, eu recompensei a sua resposta pela generosidade.

Abaixo está um script que facilita o lançamento de fbterm com o caminho parcial da imagem como um único argumento de linha de comando

Uso

O script deve ser salvo em um diretório listado em sua variável $PATH . De preferência, ele deve estar na sua pasta pessoal $HOME/bin . Consulte Como adicionar um diretório ao PATH? explicando como adicionar seu bin a $PATH , mas criar um diretório chamado bin no seu diretório pessoal é suficiente para adicioná-lo ao PATH ao fazer o login novamente.

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 em /dev/fb0 .

Origem do script

Também disponível em meu repositório do 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: https://askubuntu.com/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ções adicionais

Acontece que o usuário não precisa necessariamente usar sudo ; /dev/fb0 pertence a video group, para que os usuários possam se se adicionar a esse grupo usando

sudo usermod -a -G video $USER

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

    
por Sergiy Kolodyazhnyy 05.12.2015 / 09:37