É possível acessar o buffer de quadros para colocar um pixel na tela a partir da linha de comando?

15

Não tenho certeza se é a única maneira possível, mas li que, para colocar um único pixel na tela em um local de sua escolha, é preciso escrever algo em um local chamado framebuffer. Então fiquei curioso, se é possível entrar neste lugar e escrever algo nele para exibir um único pixel em algum lugar da tela.

Abdul Al Hazred
fonte
Você não especificou qual SO. Linux?
Gilles 'SO- stop be evil'
Sim, Linux (mint codename rebecca)
Abdul Al Hazred
stackoverflow.com/questions/4996777/…
Ciro Santilli deve ser executado em 28/08/16

Respostas:

16

sim, fora do X-server, em tty, tente o comando:

cat /dev/urandom >/dev/fb0

se pixels coloridos preenchem a tela, sua configuração está correta e você pode tentar jogar com este pequeno 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

onde a função 'pixel' deve ser uma resposta ... escreva um pixel na tela alterando os valores de bytes (azul-verde-vermelho-alfa) no deslocamento xy do dispositivo / dev / fbX, que é o buffer de quadros da placa de vídeo.

ou tente desenhar um pixel de liner (amarelo em x: y = 200: 100, se a largura for 1024):

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

ATUALIZAR: esse código funciona mesmo dentro do servidor X, se apenas configurarmos o X para usar o buffer de quadros . especificando fb0 dentro de /usr/share/X11/xorg.conf.d/99-fbdev.conf

Asain Kujovic
fonte
Há algumas coisas perigosas acontecendo aqui: o primeiro exemplo parece gravar bytes aleatórios em um disquete, por algum motivo. O acompanhamento comandos usam ddo que tem sido muitas vezes chamado de "Disk Destroy" por razões específicas ... não vá perto estes comandos se você não sabe o que está fazendo ...
robert
4
@robert Acho Omar quis dizer /dev/fbXe /dev/fdfoi apenas um erro de digitação. E sim, ddé perigoso, mas também é rm. Isso não significa que não deva ser usado. Significa apenas que deve ser usado com cuidado.
terdon
ah /dev/fb0faz mais sentido! Todo mundo sabe o que rmsignifica, mas ddé um pouco mais obscuro, ainda acha que deve levar um aviso de saúde.
robert
2
"sim, fora do X-server, em tty, tente o comando:" Eu não entendi se estava certo, então tentei abrir o terminal e escrever "cat / dev / urandom> / dev / fd0", mas só consegui uma mensagem de erro: "cat: erro de gravação: não há espaço no dispositivo". Eu realmente não sei como sair do xserver.
Abdul Al Hazred 27/03/2015
1
... chamei de tty, mas é console virtual, coisa não-gui, terminal em toda a tela, que você acessa com ctrl-alt-f1,2,3 ... ou "sudo chvt 1" ... ' nenhum espaço restante 'parece que vai ficar bem, apenas você ainda está na sessão X.
Asain Kujovic
0

Acabei de postar esta manhã, ainda investigando por que funciona apenas em Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Abra / dev / fb0, mmapie-o para obter um ponteiro, e é muito mais rápido. Não usa X, mas ignora felizmente o X, é apenas algo na tela.

Ah, a partir de uma linha de comando, você pode escrever para / dev / fb0. Porém, o que você escrever no deslocamento 0 estará no canto superior esquerdo, para rolar imediatamente para fora da tela. Você pode fazer um loop for no Bash e escrever algumas milhares de vezes. Ou use / dev / urandom. Destruir o que está no buffer de tela, especialmente enquanto você estiver no X, não é grande coisa. Assim que você arrasta uma janela sobre a área, X causa um evento de exposição e o repete. Você não precisa matar o poder de se recuperar.

Alan Corey
fonte