Search code examples
linuxcolorsxorgscreen-brightness

Setting color brightness on Linux/Xorg


Is there any command (or API) to set X.Org/Linux color brightness?

In other words, I need something as handy as the xgamma command but for changing RGB brightness real-time.

Is this possibile?


Solution

  • Use the XF86VidMode* family of functions.

    #include <X11/Xlib.h>
    #include <X11/extensions/xf86vmode.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main() {
        Display *display;
        int screen;
        int major, minor;
        int i;
        XF86VidModeGamma orig;
    
        display = XOpenDisplay(NULL);
        if (!display) return -1;
        screen = DefaultScreen(display);
        if (!XF86VidModeQueryVersion(display, &major, &minor)
                || major < 2 || major == 2 && minor < 0
                || !XF86VidModeGetGamma(display, screen, &orig)) {
            XCloseDisplay(display);
            return -1;
        }
    
        for (i = 0; i <= 32; i++) {
            XF86VidModeGamma gamma;
            gamma.red = exp2f(2 - fabs(i - 16) / 4);
            gamma.green = gamma.red;
            gamma.blue = gamma.red;
            if (!XF86VidModeSetGamma(display, screen, &gamma)) break;
            printf("gamma: %f %f %f", gamma.red, gamma.green, gamma.blue);
            if (!XF86VidModeGetGamma(display, screen, &gamma)) break;
            printf(" -> %f %f %f\n", gamma.red, gamma.green, gamma.blue);
            sleep(1);
        }
        XF86VidModeSetGamma(display, screen, &orig);
        XF86VidModeGetGamma(display, screen, &orig);
    
        XCloseDisplay(display);
        return 0;
    }
    

    This brings the gamma from 0.25 to 4.0 and back, and then restores the original gamma.

    Or you could just repeatedly call system("xgamma -gamma %f"), with pretty much the same results.