如何使用XF86VidModeSetGamma()更改第二台显示器的gamma?

时间:2013-08-04 15:45:58

标签: c++ c linux sdl

我写了一个小函数来改变我的显示器的伽玛值,但不幸的是它改变了错误显示器的伽玛,我不需要它。

我几乎尝试了一切,但我找不到任何有效的解决方案 - 它总是错误的显示器。

如何正确地告诉它应该更改哪个监视器?

另一个奇怪的事情是,ScreenCount()总是返回1.

这个函数应该是破解SDL_SetGamma()的一种解决方法,它在Linux上不起作用,或者至少不适用于ATi卡。我在运行时加载libXxf86vm.so,因此它是一个可选功能,不需要链接到应用程序。

如果有人能解释我,我怎么能用xgamma命令改变我的第二台监视器的伽玛值,这也很棒,因为该命令正好相同。

#include <X11/Xlib.h>

typedef struct {
    float red;          /* Red Gamma value */
    float green;        /* Green Gamma value */
    float blue;         /* Blue Gamma value */
} XF86VidModeGamma;

typedef Bool (*XF86VidModeSetGamma)(Display*, int, XF86VidModeGamma*);

int changegamma(float red, float green, float blue)
{
    void *lib;
    XF86VidModeSetGamma f;
    int screen;
    Display *display;
    XF86VidModeGamma gamma;

    lib = dlopen("libXxf86vm.so", RTLD_LAZY);
    if(!lib) goto error;

    f = (XF86VidModeSetGamma)dlsym(lib, "XF86VidModeSetGamma");
    if(!lib) goto error; 

    gamma.red = red;
    gamma.green = green;
    gamma.blue = blue;

    display = XOpenDisplay(NULL);

    if(!display) goto error; 
    screen = DefaultScreen(display);

    if(!f(display, screen, &gamma)) goto error; 
    XCloseDisplay(display);
    dlclose(lib);

    return 0;
error:;
    if(lib) dlclose(lib);
    return SDL_SetGamma(red, green, blue);
}

1 个答案:

答案 0 :(得分:2)

屏幕的XF86界面非常陈旧,并不能反映现代多屏幕设置(使用xinerama,......)。

在任何情况下,您都应该使用xrandr来设置这些天的每个显示设置。 最简单的方法可能就是检查xrandr实用程序本身的源代码,该代码可用于设置cmdline中的每屏幕伽玛。