Ich hatte mit den folgenden wenigen Experimenten Erfolg.
Finden Sie zuerst heraus, ob X TrueColor RGB verwendet, das auf 32 Bit aufgefüllt ist (oder nehmen Sie einfach an, dass dies der Fall ist). Finden Sie dann heraus, ob Sie Schreibrechte auf fb0 haben (und dass es existiert). Wenn diese zutreffen (und ich gehe davon aus, dass viele moderne Toolkits/Desktops/PCs diese als Standard verwenden), sollten Sie in der Lage sein, Folgendes zu tun (und wenn diese Standardwerte nicht gelten, können Sie wahrscheinlich immer noch etwas Erfolg damit haben die folgenden Tests, obwohl die Details variieren können):
Test 1:Öffnen Sie ein virtuelles Terminal (in X) und geben Sie Folgendes ein:$ echo "ddd ... ddd">/dev/fb0wobei ... eigentlich ein paar Bildschirme von d sind. Das Ergebnis sind eine oder mehrere (teilweise) graue Linien am oberen Rand Ihres Bildschirms, je nachdem, wie lang Ihr Echo-String ist und welche Pixelauflösung Sie aktiviert haben. Sie können auch beliebige Buchstaben auswählen (die ASCII-Werte sind alle kleiner als 0x80, sodass die erzeugte Farbe dunkelgrau ist.. und variieren Sie die Buchstaben, wenn Sie etwas anderes als Grau wünschen). Offensichtlich kann dies auf eine Shell-Schleife verallgemeinert werden, oder Sie können eine große Datei caten, um den Effekt deutlicher zu sehen:zB:$ cat /lib/libc.so.6>/dev/fb0, um das wahre Gesicht einiger fsf zu sehen Unterstützer;-P
Machen Sie sich keine Sorgen, wenn ein großer Teil Ihres Bildschirms überschrieben wird. X hat immer noch die Kontrolle über den Mauszeiger und hat immer noch eine Vorstellung davon, wo Fenster abgebildet werden. Alles, was Sie tun müssen, ist, ein beliebiges Fenster zu greifen und es ein wenig herumzuziehen, um das Rauschen zu löschen.
Test 2:cat /dev/fb0> xxx, dann ändern Sie das Aussehen Ihres Desktops (z. B. neue Fenster öffnen und andere schließen). Machen Sie schließlich das Gegenteil:cat xxx> /dev/fb0, um Ihren alten Desktop wiederherzustellen!
Ha, naja, nicht ganz. Das Bild Ihres alten Desktops ist eine Illusion, und Sie werden schnell darauf verzichten, wenn Sie ein beliebiges Fenster im Vollbildmodus öffnen.
Test 3:Schreiben Sie eine kleine App, die sich einen vorherigen Dump von /dev/fb0 schnappt und die Farben der Pixel ändert, z. B. um die rote Komponente zu entfernen oder das Blau zu verstärken oder Rot und Grün umzukehren usw. Dann schreiben Sie diese zurück Pixel in eine neue Datei, die Sie sich später über den einfachen Shell-Ansatz von Test 2 ansehen können. Beachten Sie auch, dass Sie es wahrscheinlich mit B-G-R-A-4-Byte-Mengen pro Pixel zu tun haben. Das bedeutet, dass Sie jedes vierte Byte ignorieren und auch das erste in jedem Satz als blaue Komponente behandeln möchten. "ARGB" ist Big-Endian, wenn Sie also diese Bytes durch den zunehmenden Index eines C-Arrays besuchen, würde Blau zuerst kommen, dann Grün, dann Rot ... dh B-G-R-A (nicht A-R-G-B).
Test 4:Schreiben Sie eine App in einer beliebigen Sprache, die sich mit Videogeschwindigkeit wiederholt und ein nicht quadratisches Bild (denken Sie an Xeyes) an einen Teil des Bildschirms sendet, um eine Animation ohne Fensterränder zu erstellen. Lassen Sie sich für Extrapunkte die Animation über den gesamten Bildschirm bewegen. Sie müssen sicherstellen, dass Sie einen großen Raum überspringen, nachdem Sie eine kleine Pixelreihe gezeichnet haben (um die Bildschirmbreite auszugleichen, die wahrscheinlich viel breiter ist als das animierte Bild).
Test 5:Spielen Sie einem Freund einen Streich, erweitern Sie zB Test 4 so, dass ein Bild einer animierten Person auf ihrem Desktop erscheint (vielleicht filmen Sie sich selbst, um die Pixeldaten zu erhalten) und gehen dann zu einem ihrer wichtigen Desktops Ordner, hebt den Ordner auf und zerfetzt ihn, fängt dann an, hysterisch zu lachen, und dann kommt ein Feuerball heraus und verschlingt ihren gesamten Desktop. Obwohl dies alles eine Illusion sein wird, werden sie vielleicht ein bisschen ausflippen ... aber nutzen Sie das als Lernerfahrung, um Linux und Open Source vorzuführen und zu zeigen, wie es für einen Anfänger viel beängstigender aussieht, als es tatsächlich ist. [die "Viren" sind im Allgemeinen harmlose Illusionen unter Linux]
Ich denke darüber nach, ein Framebuffer-basiertes Programm zu schreiben, nur weil ich scrollen können muss (SDR-Wasserfall). Siehe https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=232493&p=1425567#p1425567 Den Scrolltest halte ich für gelungen. In diesen 2 Strukturen, die wir von ioctl für Informationen abrufen, gibt es auch Dinge über die Farbtiefe. Sie scheinen Ihr Programm auf dem gleichen Beispiel aufgebaut zu haben wie ich. So erhalten Sie Pixelfarbe vom Framebuffer unter Linux (Raspberry Pi)
Mine funktioniert gut auf meinem Raspberry Pi, entweder mit X oder nicht. Es hat keine Auswirkungen auf den Bildschirm meines Laptops. Das hat eine /dev/fb0, das Programm läuft und die Zahlen sehen richtig aus, aber es macht optisch nichts. Vielleicht ist es doppelt gepuffert oder so.
Unter X richtet es eigentlich keinen Schaden an. Wenn Sie einige Fenster herumziehen, damit die Dinge neu gezeichnet werden, kommt alles zurück. Dann habe ich beschlossen, das, was auf dem Bildschirm ist, zu sichern und es wieder zurückzusetzen, wenn ich fertig bin, das funktioniert auch. Ein Fenster, das ich verschoben und wieder eingesetzt habe, funktioniert genauso, als hätte ich es nie berührt. X merkt nicht, dass ich mit dem Bildschirmpuffer herumgespielt habe, es weiß, was es dort abgelegt hat, und registriert Mausklicks entsprechend. Wenn ich ein Fenster bewegte und es nicht zurückstellte, funktionierten die Klicks immer noch dort, wo es war.
Ich würde sagen, seien Sie vorsichtig, bevor Sie versuchen, in /dev/fb0 zu schreiben, wie oben vorgeschlagen. Ich habe es unter Xin Ubuntu 10.04 ausprobiert und a) nichts ist visuell passiert, b) es hat alle Shell-Fenster zerstört, sogar andere ttys, was zu Kernel-Fehlern und fehlender Funktionalität geführt hat.
Wenn Sie X11 ausführen, MÜSSEN Sie die X11-APIs durchlaufen, um auf den Bildschirm zu zeichnen. Das Umgehen des X-Servers ist sehr kaputt (und funktioniert, wie Sie gesehen haben, oft nicht). Es kann auch zu Abstürzen oder einfach nur zu einer allgemeinen Anzeigebeschädigung kommen.
Wenn Sie überall laufen wollen (sowohl Konsole als auch unter X), schauen Sie sich SDL oder GGI an. Wenn Sie sich nur für X11 interessieren, können Sie GTK, QT oder sogar Xlib verwenden. Es gibt viele, viele Möglichkeiten...