(Dies betrifft nur X11, nicht Wayland oder andere Display-Management-Systeme. Einige dieser Techniken können mit anderen Tools angewendet werden, z. B. den Eingabehilfen von GNOME Shell .)
Ich kann mir zwei Möglichkeiten vorstellen, um eine gelbe Anzeige zu erhalten: Einfügen eines Compositing-Plugins, das alle Farben korrigiert, und Erstellen eines Farbprofils, das alle Farben auf ein gelbes Äquivalent korrigiert. Beide sind wahrscheinlich mit mehr Aufwand verbunden als sie wert sind (abgesehen von der Lernseite der Dinge).
Sie können eine gute Annäherung für Primärfarbanzeigen erhalten, indem Sie das Gamma pro Kanal manipulieren, wie in der Antwort von sigvei erläutert . xcalib
kann auch Zugriff darauf gewähren und ermöglicht die direkte Steuerung von Helligkeit und Kontrast sowie die Angabe des Gammawertes:
xcalib -blue 1.0 0 1.0 -red 1.0 0 1.0 -alter
führt zu einer grünen Anzeige. Helligkeit und Kontrast werden auf die Gammarampen angewendet, sodass xrandr
Sie dieselben Ergebnisse erzielen können.
Es ist möglich, die Gammarampen noch feiner zu steuern, aber das erlaubt Ihnen sowieso nicht, alles auf Bernsteinfarben abzubilden. Sie können Kanäle auf bestimmte Bereiche „klemmen“, sodass beispielsweise bei einem hellen Rot etwas Grün eingeführt wird und somit bernsteinfarbener erscheint, dann jedoch dunkle Rottöne grün erscheinen ...
Der folgende Code zeigt, wie Sie vorgehen müssen (ohne Fehlerbehandlung):
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/extensions/xf86vmode.h>
#include <stdlib.h>
int main(int argc, char **argv) {
Display * dpy = NULL;
int screen = -1;
u_int16_t * r_ramp = NULL, * g_ramp = NULL, * b_ramp = NULL;
unsigned int ramp_size = 256;
int r_tgt = 255, g_tgt = 191, b_tgt = 0;
int i;
dpy = XOpenDisplay(NULL);
screen = DefaultScreen(dpy);
/* Set up ramps */
XF86VidModeGetGammaRampSize(dpy, screen, &ramp_size);
r_ramp = (unsigned short *) calloc(ramp_size, sizeof(u_int16_t));
g_ramp = (unsigned short *) calloc(ramp_size, sizeof(u_int16_t));
b_ramp = (unsigned short *) calloc(ramp_size, sizeof(u_int16_t));
for (i = 0; i < ramp_size; i++) {
r_ramp[i] = r_tgt * 256 * i / ramp_size;
g_ramp[i] = g_tgt * 256 * i / ramp_size;
b_ramp[i] = b_tgt * 256 * i / ramp_size;
}
XF86VidModeSetGammaRamp(dpy, screen, ramp_size, r_ramp, g_ramp, b_ramp);
XCloseDisplay(dpy);
}
(Sie müssen -lX11 -lXxf86vm
verlinken.)