Est-il possible d'accéder au framebuffer afin de mettre un pixel sur l'écran depuis la ligne de commande?

16

Je ne sais pas si c'est le seul moyen possible, mais j'ai lu que pour mettre un seul pixel sur l'écran à un endroit de votre choix, il fallait écrire quelque chose dans un endroit appelé framebuffer. Je suis donc devenu curieux, s'il est possible d'entrer dans cet endroit et d'y écrire quelque chose afin d'afficher un seul pixel quelque part sur l'écran.

Abdul Al Hazred
la source
Vous n'avez pas spécifié quel système d'exploitation. Linux?
Gilles 'SO- arrête d'être méchant'
Oui, Linux (nom de code de la menthe rebecca)
Abdul Al Hazred
stackoverflow.com/questions/4996777/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

17

oui, en dehors de X-server, en tty, essayez la commande:

cat /dev/urandom >/dev/fb0

si des pixels colorés remplissent l'écran, votre configuration est correcte et vous pouvez essayer de jouer avec ce petit script:

#!/usr/bin/env bash

fbdev=/dev/fb0 ;   width=1280 ; bpp=4
color="\x00\x00\xFF\x00" #red colored

function pixel()
{  xx=$1 ; yy=$2
   printf "$color" | dd bs=$bpp seek=$(($yy * $width + $xx)) \
                        of=$fbdev &>/dev/null
}
x=0 ; y=0 ; clear
for i in {1..500}; do
   pixel $((x++)) $((y++))
done

où la fonction 'pixel' devrait être une réponse ... écrire un pixel à l'écran en changeant les valeurs d'octets (bleu-vert-rouge-alpha) sur le décalage xy du périphérique / dev / fbX qui est le tampon de trame pour la carte vidéo.

ou essayez un dessin de pixel de ligne (jaune sur x: y = 200: 100, si la largeur est 1024):

printf "\x00\xFF\xFF\x00" | dd bs=4 seek=$((100 * 1024 + 200)) >/dev/fb0

MISE À JOUR: ce code fonctionne même à l'intérieur de X-server, si nous configurons simplement X pour utiliser le tampon de trame . en spécifiant fb0 dans /usr/share/X11/xorg.conf.d/99-fbdev.conf

Asain Kujovic
la source
Il y a quelques choses dangereuses qui se passent ici: le premier exemple semble écrire des octets aléatoires sur une disquette, pour une raison quelconque. Les commandes de suivi utilisent ddce qui a souvent été appelé "Disk Destroy" pour des raisons spécifiques ... ne vous approchez pas de ces commandes sauf si vous savez ce que vous faites ...
robert
4
@robert Je pense que Omar voulait dire /dev/fbXet /dev/fdc'était juste une faute de frappe. Et oui, ddc'est dangereux mais ça l'est aussi rm. Cela ne signifie pas qu'il ne devrait pas être utilisé. Cela signifie simplement qu'il doit être utilisé avec soin.
terdon
ah a /dev/fb0plus de sens! Tout le monde sait ce que cela rmsignifie, mais ddest un peu plus obscur, pense toujours qu'il devrait porter un avertissement de santé.
robert
2
"oui, en dehors de X-server, dans tty, essayez la commande:" Je ne comprends pas si je l'ai bien fait, alors j'ai juste essayé d'ouvrir le terminal et d'écrire "cat / dev / urandom> / dev / fd0" mais j'ai seulement un message d'erreur: "cat: erreur d'écriture: pas d'espace disponible sur l'appareil". Je ne sais vraiment pas comment sortir du xserver.
Abdul Al Hazred
1
... je l'ai appelé tty, mais c'est une console virtuelle, non-gui, terminal sur tout l'écran, que vous atteignez avec ctrl-alt-f1,2,3 ... ou "sudo chvt 1" ... ' il ne semble pas y avoir d'espace, juste que vous êtes toujours en X-session.
Asain Kujovic
0

Je viens de poster ce matin, toujours en train de chercher pourquoi cela ne fonctionne que sur Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Ouvrez / dev / fb0, mmapez-le pour obtenir un pointeur, et c'est beaucoup plus rapide. N'utilise pas du tout X mais il ignorera volontiers X, c'est juste quelque chose à l'écran.

Oh, à partir d'une ligne de commande, en quelque sorte, vous pouvez écrire dans / dev / fb0. Mais tout ce que vous écrivez à l'offset 0 sera dans le coin supérieur gauche afin qu'il défile immédiatement hors de l'écran. Vous pouvez faire une boucle for dans Bash et écrire quelques milliers de fois. Ou utilisez / dev / urandom. Détruire ce qui se trouve dans le tampon d'écran, surtout pendant que vous êtes en X, n'est pas grave. Dès que vous faites glisser une fenêtre sur la zone, X provoque un événement d'exposition et le repeint. Vous n'avez pas besoin de tuer le pouvoir pour récupérer.

Alan Corey
la source