【问题标题】:How do I change gamma of my second monitor with XF86VidModeSetGamma()?如何使用 XF86VidModeSetGamma() 更改第二台显示器的伽玛?
【发布时间】:2013-08-05 00:17:48
【问题描述】:

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

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

我如何正确告诉它应该改变哪个显示器的伽玛?

另一个奇怪的是,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);
}

【问题讨论】:

  • 您还应该考虑到 X 可能很快会被所有主要发行版删除,这取决于您想要做什么以及您的目标是什么,但如果我是你,我不会期望为长期或为广大受众编写代码。

标签: c++ c linux sdl


【解决方案1】:

XF86 的屏幕界面非常老旧,无法反映现代的多屏幕设置(使用 xinerama,...)。

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

【讨论】:

  • 可能是最好的解决方案。
猜你喜欢
  • 2013-02-15
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
相关资源
最近更新 更多