gpt4 book ai didi

c++ - 如何使用 XF86VidModeSetGamma() 更改第二台显示器的 Gamma 值?

转载 作者:太空狗 更新时间:2023-10-29 21:45:14 25 4
gpt4 key购买 nike

我编写了一个小函数来更改我的显示器的 Gamma 值,但不幸的是,它恰好更改了错误显示器的 Gamma 值,而我不需要它。

我几乎尝试了所有方法,但找不到任何可行的解决方案 - 总是错误的显示器。

我如何正确地告诉它应该更改哪个显示器的 gamma?

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

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

如果有人能向我解释我如何使用 xgamma 命令更改我的第二台显示器的 Gamma ,那就太好了,因为该命令发生的情况完全相同。

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

最佳答案

屏幕的 XF86 接口(interface)确实很旧,不能反射(reflect)现代的多屏幕设置(使用 xinerama,...)。

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

关于c++ - 如何使用 XF86VidModeSetGamma() 更改第二台显示器的 Gamma 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18044701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com