モニターのガンマ値を変更する小さな関数を作成しましたが、残念ながら、必要のない間違ったモニターのガンマを正確に変更してしまいます。
ほとんどすべてを試しましたが、有効な解決策が見つかりません。常に間違ったモニターです。
ガンマを変更する必要があるモニターを正しく伝えるにはどうすればよいですか?
もう 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);
}