3

モニターのガンマ値を変更する小さな関数を作成しましたが、残念ながら、必要のない間違ったモニターのガンマを正確に変更してしまいます。

ほとんどすべてを試しましたが、有効な解決策が見つかりません。常に間違ったモニターです。

ガンマを変更する必要があるモニターを正しく伝えるにはどうすればよいですか?

もう 1 つの奇妙な点は、ScreenCount() が常に 1 を返すことです。

この関数は、壊れた SDL_SetGamma() の回避策になるはずです。これは、Linux では動作しないか、少なくとも ATi カードでは動作しません。実行時にロードlibXxf86vm.soするため、これはオプションの機能であり、アプリにリンクする必要はありません。

xgammaまた、そのコマンドでもまったく同じことが起こっているため、コマンドを使用して2番目のモニターのガンマを変更する方法を誰かが説明してくれれば、それも素晴らしいことです。

#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);
}
4

1 に答える 1