Wayland 是否有与 xrandr 相当的用于改变亮度和色温的功能?

Wayland 是否有与 xrandr 相当的用于改变亮度和色温的功能?

xrandr可用于通过命令行更改显示亮度。例如,

xrandr --output VGA-1 --brightness 0.4

Wayland 不支持xrandr。Wayland 有没有类似的工具可以用来控制亮度和色温?

注意:这不是重复的这个问题因为那是关于改变分辨率,我想在不支持的台式电脑上控制亮度sys/class/backlight,这样前端就像亮度控制器或者红移可以与 Wayland 配合使用。

答案1

伽玛步与使用 xrandr 不同——它更像是 redshift 的替代品。你只需手动设置亮度,但该功能会一直运行,因此一旦退出,显示器就会重置为默认亮度。例如,您可以将显示器亮度设置为 50%:

gammastep -l 0:0 -o -b 0.5:0.5

-l 0:0将纬度/经度设置为 0,并告诉-o它只执行一次操作(因此您不需要正确的纬度/经度),并-b指定夜晚:白天亮度,这里两者相同,因为我们只是告诉它执行一次设置。您可能决定要利用白天/夜晚的连续调整,在这种情况下,请关闭-o并为其提供适当的纬度/经度。

亮度控制更接近于您所要求的,但是当我运行它时,我无法设置外部显示器的亮度 - 只有内置笔记本电脑屏幕:

brightnessctl -l # list displays
brightnessctl -l -c backlight # list displays of class 'backlight'
sudo brightnessctl -d intel_backlight s 25% # set display to 25%

与 brightctl 类似,但无法检测(因此无法控制)我的外部显示器。

所有这三个软件包均可在 22.04 jammy 中使用。

答案2

ddcutil,它对我的​​ wayland 有用

只需更改以下示例中的亮度和显示 ID 的值:

sudo ddcutil setvcp 10 50 --display 1

答案3

由于这是 wayland(它只是一种协议),这将取决于您的合成器(例如 KDE 的 Kwin、GNOME 的 Mutter),但截至目前(2023 年 2 月),似乎没有任何等效的东西。

我深入研究了代码来了解 xrandr 实际上是如何做到这一点的,相关代码就在这里:https://gitlab.freedesktop.org/xorg/app/xrandr/-/blob/6f714830da6c8d74f024be6b0bb32c1ea39c1217/xrandr.c#L1469-1494

以下是相关片段:

    if (output->gamma.red == 0.0)
        output->gamma.red = 1.0;
    if (output->gamma.green == 0.0)
        output->gamma.green = 1.0;
    if (output->gamma.blue == 0.0)
        output->gamma.blue = 1.0;

    gammaRed = 1.0 / output->gamma.red;
    gammaGreen = 1.0 / output->gamma.green;
    gammaBlue = 1.0 / output->gamma.blue;

    for (i = 0; i < size; i++) {
        if (gammaRed == 1.0 && output->brightness == 1.0)
        crtc_gamma->red[i] = (double)i / (double)(size - 1) * 65535.0;
        else
        crtc_gamma->red[i] = dmin(pow((double)i/(double)(size - 1),
                          gammaRed) * output->brightness,
                      1.0) * 65535.0;

        if (gammaGreen == 1.0 && output->brightness == 1.0)
        crtc_gamma->green[i] = (double)i / (double)(size - 1) * 65535.0;
        else
        crtc_gamma->green[i] = dmin(pow((double)i/(double)(size - 1),
                        gammaGreen) * output->brightness,
                        1.0) * 65535.0;

        if (gammaBlue == 1.0 && output->brightness == 1.0)
        crtc_gamma->blue[i] = (double)i / (double)(size - 1) * 65535.0;
        else
        crtc_gamma->blue[i] = dmin(pow((double)i/(double)(size - 1),
                           gammaBlue) * output->brightness,
                       1.0) * 65535.0;
    }

    XRRSetCrtcGamma(dpy, crtc->crtc.xid, crtc_gamma);

xrandr 降低亮度的做法实际上是将伽马函数改变为更慢地上升到最大值,通过将伽马曲线应用于 RGB 通道,并使用XRRSetCrtcGamma——XRANDR Set CRTC Gamma 的缩写来应用它,其中 XRANDR 是 X.org 调整大小和旋转,CRTC 是 CRT(阴极射线管)控制器,尽管名称很旧,但它只是视频控制器的一般术语。

由于此行为特定于 xrandr,因此合成器本身(例如 Kwin 或 Sway)必须实现它,但在此之前,我相信 wayland 需要实现该协议。

因此需要

  1. 需要达成一致并合并的 Wayland 协议(这里有一个我能看到的 PR:https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/14
  2. 您的合成器(kwin、mutter、sway、weston 等)来实现此协议
  3. 您的合成器可通过 API 公开伽玛变化设置
  4. 有人编写一个工具,比如 xrandr,使用这个新 API,利用伽马曲线调整亮度。理论上,这也可以由你的合成器完成,它可以公开 CLI 或图形界面来调整亮度。

xrandr本身已被类似合成器专用工具kscreen-doctor和桌面环境的 GUI 系统设置所取代,因此将由桌面环境提供工具来执行xrandr --brightness过去所做的事情。

编辑:进一步研究 kwin 代码,看来如果您的合成器支持某种夜色(又名红移),那么理论上应该可以支持这一点。

Kwin 实际上在代码中支持亮度,但它似乎没有被任何内置插件公开,但似乎可以编写一个改变亮度的插件。

答案4

这个问题困扰了很久之后,我发现最好的解决方案就是这个项目gnome-randr-rust

它仅具有调整亮度功能,但您需要使用实验分支并在本地安装才能使其正常工作。

有关实验分支的更多信息,请参阅这个问题

相关内容