Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 966
Gian Paolo Ghilardi Avatar asked Dec 26 '09 14:12

Gian Paolo Ghilardi


People also ask

How do I adjust screen brightness in Linux?

To change the brightness of your screen, click the system menu on the right side of the top bar and adjust the screen brightness slider to the value you want to use. The change should take effect immediately. Many laptop keyboards have special keys to adjust the brightness.

How do I adjust brightness in KDE?

Launch it with Alt+Space and type screen brightness 60 to set the brightness level to 60.


1 Answers

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.

like image 154
ephemient Avatar answered Oct 03 '22 16:10

ephemient