Comment puis-je personnaliser un arrière-plan de console plein écran (ATS)?

17

J'utilisais activement les consoles plein écran (celles ouvertes avec Ctrl+ Alt+ F1... F6) et j'ai eu l'idée que j'aimerais essayer de la décorer avec un "papier peint" en quelque sorte (plutôt sombre et monotone bien sûr afin que cela ne diminue pas la lisibilité), peut-être que cela pourrait sembler agréable (ou non, mais je dois essayer). Ce serait encore mieux si je pouvais définir différentes images comme arrière-plan de console différente (une pour Ctrl+ Alt+ F1, une autre pour Ctrl+ Alt+, F2etc.).

Le fait que les consoles aient une résolution beaucoup plus élevée que le mode texte pur fournit suggère que le mode graphique à part entière est utilisé pour elles et que tout est possible. Mais comment?

Ivan
la source
2
Impossible. Les consoles virtuelles sont uniquement en texte.
Sergiy Kolodyazhnyy
5
@Serg J'utilise des modes texte uniquement depuis que Linux n'existait même pas - croyez-moi, je peux distinguer le mode texte réel de son émulation graphique. Beaucoup de gens peuvent difficilement imaginer cela de nos jours, mais j'ai même regardé des films sur les consoles sans aucun serveur X installé pendant les jours Linux 2.4. Cela me fait douter que cela soit impossible.
Ivan
1
OK, laissez-moi me corriger: je crois en la visualisation d'images et de films dans la console, à cause de quelque chose connu sous le nom de framebufferpériphérique, mais avec cet écran est occupé par la sortie d'un programme, comme fbi. ATS en soi est toujours un appareil texte uniquement
Sergiy Kolodyazhnyy
2
Je mettrai une prime sur votre question une fois qu'elle sera éligible. Je me suis intéressé en fait
Sergiy Kolodyazhnyy
1
Vérifiez ceci: code.google.com/p/fbterm
Sergiy Kolodyazhnyy

Réponses:

12

Je suis à peu près sûr que le pilote de console Linux n'a pas cette capacité intégrée, mais il existe une application appelée fbtermqui peut le faire. Afin de faire fonctionner les images d'arrière-plan, vous aurez également besoin d'un utilitaire qui peut afficher une image sur le framebuffer tel que fbi:

sudo apt-get install fbterm fbi

fbtermne lit pas ou n'affiche pas les images d'arrière-plan lui-même, il attend qu'un autre programme configure l'image d'arrière-plan sur l'écran avant de commencer. Il y a des instructions dans la fbtermpage de manuel sur la façon de le faire en utilisant fbv, un utilitaire absolument obsolète et non pris en charge que je n'ai même pas pu compiler sur un système Ubuntu moderne. fbiest une visionneuse d'images beaucoup plus propre et plus agréable pour le framebuffer, mais n'a malheureusement pas la fonctionnalité "set it and exit" du plus simple fbv, et interfère donc avec fbtermsi vous essayez de l'utiliser directement. Cependant, j'ai pu trouver une alternative qui fonctionne:

Tout d'abord, vous devrez utiliser fbiet catafficher l'image souhaitée, puis la vider dans un fichier image "format brut de framebuffer". En tant que root, dans une console framebuffer, exécutez:

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

(Cela affichera l'image pendant quelques secondes, puis quittera, après avoir enregistré le résultat dans le fichier nifty-background.fbimg. Remplacez nifty-background.fbimget nifty-background.pngavec les noms de fichiers que vous souhaitez, bien sûr.)

La première partie de la commande attend 1 seconde avant d'attribuer le contenu du framebuffer à un fichier. En même temps, la deuxième partie (après le &) se lance fbipour afficher l'image sur le framebuffer, de sorte que lorsque la commande cat se met à s'exécuter (1 seconde plus tard), il y a une image à vider. La raison pour laquelle ils sont dans cet ordre est parce que j'ai trouvé qu'il y fbiavait des problèmes s'il ne s'exécutait pas au premier plan, ce qui signifie que ce doit être la dernière commande de la liste.

A partir de là, chaque fois que vous voulez l'exécuter fbterm, vous pouvez le démarrer comme ça (vous voudrez peut-être créer un petit script wrapper):

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

Je peux distinguer le mode texte réel de son émulation graphique.

… Qui est l'un des moyens par lesquels l'observateur pourrait distinguer un vrai BSOD sur Windows des actions de l'économiseur d'écran BSOD qui a fait le tour il y a une dizaine d'années. L'affichage des caractères graphiques de bloc à l'aide du matériel de la carte graphique en mode graphique était subtilement différent des caractères générés par le matériel de la carte graphique en mode texte.

Oui, la carte graphique est en mode graphique. Il en est ainsi depuis un certain temps maintenant. Il en a toujours été ainsi sur les systèmes sans matériel de carte graphique pour PC. Dans les premières années de Linux, sur PC compatible, la console disposait du matériel de la carte graphique en mode texte. Mais cette utilisation s'est discrètement érodée en presque rien. La prise en charge Unicode pour la plupart des utilisateurs nécessite aujourd'hui un ensemble de glyphes plus important que le matériel en mode texte. Le firmware de la machine (bien sûr) utilise le mode graphique pour les écrans de démarrage (avec de jolies images et logos d'entreprise), tout comme le chargeur Linux et l'initialisation du système.

Il existe un programme d'émulation de terminal intégré au noyau Linux. Il est superposé au framebuffer et au sous-système d'événement d'entrée, auquel il utilise les interfaces internes du noyau pour accéder. Il se présente aux systèmes en mode application comme une série de terminaux virtuels du noyau , /dev/tty1etc.

Ce programme est assez limité par rapport aux émulateurs de terminaux qui fonctionnent avec le noyau Linux, en tant que programmes d'applications ordinaires. Il n'émule qu'un sous-ensemble limité des fonctionnalités d'un terminal réel et il lui manque les fonctionnalités supplémentaires de ces derniers émulateurs de terminal.

Ce sont ceux que vous devez rechercher pour cela. Vous connaissez peut-être les émulateurs de terminaux qui utilisent X pour leurs entrées / sorties, tels que xterm, lxterminal, gnome-console, konsole, eterm, wterm et le reste. Moins connus sont ceux qui utilisent le (s) dispositif (s) framebuffer et les dispositifs d'événement d'entrée pour leur entrée / sortie. fournir des terminaux virtuels dans l'espace utilisateur :

Certains de ces derniers peuvent faire ce que vous voulez.

fbterm peut être configuré pour utiliser tout ce qui se trouve dans le framebuffer au démarrage comme image d'arrière-plan, par exemple. Donc, tout ce que l'on doit faire est d'utiliser l'un des nombreux autres utilitaires pour afficher des images directement sur un périphérique Linux framebuffer pour configurer une image d'arrière-plan avant d'exécuter fbterm. Il existe plusieurs outils de ce type, notamment:

fbvis et fbi effacent l'écran à la sortie et nécessitent les circonvolutions qui sont expliquées plus en détail dans la réponse de Foogod. dfbg, cependant, ne nettoie pas après lui-même, ce qui le rend plus adapté à cette tâche particulière.

Lectures complémentaires

JdeBP
la source
La question demandait comment créer une image d'arrière-plan pour la console. Votre réponse ne répertorie que les solutions potentielles. Par conséquent, j'accorde une prime à l'autre réponse, cependant, je vous remercie pour la richesse des informations que vous avez fournies. Vous avez mon vote positif.
Sergiy Kolodyazhnyy
4

Bien que la réponse de Foogod n'ait pas fonctionné pour moi, elle m'a conduit dans la bonne direction, en fournissant la moitié de la solution (à savoir la lecture des données du tampon de trame, tout en fbiaffichant une image sur l'écran TTY). J'ai donc accordé sa réponse à sa réponse.

Ci-dessous est un script qui facilite le lancement fbtermavec un chemin partiel vers l'image en tant qu'argument de ligne de commande unique

Usage

Le script doit être enregistré dans un répertoire répertorié dans votre $PATHvariable. De préférence, il doit être dans votre $HOME/bindossier personnel . Reportez-vous à Comment ajouter un répertoire au CHEMIN? sur l' explication comment ajouter vos données personnelles binà $PATH, mais la création d' un répertoire appelé bindans votre répertoire personnel est suffisant pour l' ajouter à PATHle re-connexion.

Le script doit également avoir une autorisation exécutable; vous pouvez le régler avec chmod +x /path/to/script.sh.

Enfin, il doit être exécuté avec sudo, pour permettre un accès root pour la lecture et l'écriture /dev/fb0.

Source de script

Également disponible sur mon référentiel 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 

information additionnelle

Il s'avère que l'utilisateur n'a pas nécessairement besoin d'utiliser sudo; /dev/fb0appartient au videogroupe, donc les utilisateurs peuvent simplement s’ajouter à ce groupe en utilisant

sudo usermod -a -G video $USER

Ainsi, les vérifications de racine dans le script ci-dessus deviennent obsolètes, en particulier [ "$(whoami)" != "root" ] ||partie.

Sergiy Kolodyazhnyy
la source