![Wayland 是否有与 xrandr 相当的用于改变亮度和色温的功能?](https://linux22.com/image/1069514/Wayland%20%E6%98%AF%E5%90%A6%E6%9C%89%E4%B8%8E%20xrandr%20%E7%9B%B8%E5%BD%93%E7%9A%84%E7%94%A8%E4%BA%8E%E6%94%B9%E5%8F%98%E4%BA%AE%E5%BA%A6%E5%92%8C%E8%89%B2%E6%B8%A9%E7%9A%84%E5%8A%9F%E8%83%BD%EF%BC%9F.png)
答案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 需要实现该协议。
因此需要
- 需要达成一致并合并的 Wayland 协议(这里有一个我能看到的 PR:https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/14)
- 您的合成器(kwin、mutter、sway、weston 等)来实现此协议
- 您的合成器可通过 API 公开伽玛变化设置
- 有人编写一个工具,比如 xrandr,使用这个新 API,利用伽马曲线调整亮度。理论上,这也可以由你的合成器完成,它可以公开 CLI 或图形界面来调整亮度。
xrandr
本身已被类似合成器专用工具kscreen-doctor
和桌面环境的 GUI 系统设置所取代,因此将由桌面环境提供工具来执行xrandr --brightness
过去所做的事情。
编辑:进一步研究 kwin 代码,看来如果您的合成器支持某种夜色(又名红移),那么理论上应该可以支持这一点。
Kwin 实际上在代码中支持亮度,但它似乎没有被任何内置插件公开,但似乎可以编写一个改变亮度的插件。
答案4
这个问题困扰了很久之后,我发现最好的解决方案就是这个项目gnome-randr-rust。
它仅具有调整亮度功能,但您需要使用实验分支并在本地安装才能使其正常工作。
有关实验分支的更多信息,请参阅这个问题。