NixOS中修复Wayland下Flameshot缩放异常
Flameshot 是一款功能强大且广受欢迎的开源截图工具,它提供了丰富的编辑功能,如标注、高亮、模糊、添加文本等,让用户在截取屏幕内容后能够直接进行快速编辑。在Linux下可以说是最强的截图工具。
遗憾的是, 在Wayland下,flameshot有一些恼人的问题,当屏幕缩放比例不是 100% 时,Flameshot的截图选取界面会将屏幕再次放大,导致截图区域不能覆盖整个屏幕,屏幕区域被裁切。Github仓库中关于这个问题的open issue: https://github.com/flameshot-org/flameshot/issues/5
问题根源
Wayland下Flameshot使用QT的QGuiAppCurrentScreen来获取屏幕尺寸、放大比率等信息。但Wayland下,由于对QT应用的放大处理比较特殊 ,这个API回报的信息不正确, 导致计算结果异常。
解决方案
在 NixOS 中,我们可以通过修改配置来解决 Flameshot 在 Wayland 下的缩放异常问题。核心思路是利用 Qt 应用程序的环境变量来调整其在 Wayland 下的行为。
根据 GitHub issue 中的讨论,Flameshot 在 Wayland 下的缩放异常主要源于 Qt
应用程序在 Wayland
合成器进行缩放时,无法正确获取或处理屏幕的实际缩放信息。一个有效的解决方案是手动设置 QT_SCALE_FACTOR
环境变量,强制 Qt 应用程序进行反向缩放,以抵消 Wayland
合成器带来的额外缩放。
QT_SCALE_FACTOR
这个环境变量用于控制 Qt
应用程序的整体缩放比例。如果你的系统显示缩放比例是 QT_SCALE_FACTOR
应该设置为
综合以上,我们这样运行Flameshot:QT_SCALE_FACTOR=0.5 flameshot
即可修复问题。
然而,直接全局设置环境变量可能会影响其他应用程序的正常显示,而每次手动在运行时添加环境变量又非常不便。幸运的是,在 NixOS 中,这个问题可以优雅地解决。
Nixpkgs 提供了强大的 wrapProgram
函数,它允许我们轻松地封装任何二进制文件,并在其运行前修改其执行环境。这意味着,对于
Flameshot,我们只需通过覆写其打包配置,利用 wrapProgram
为其专门设置 QT_SCALE_FACTOR
环境变量,即可实现按需修复,而不会影响系统中的其他应用。
代码片段如下:
(pkgs.flameshot.override { enableWlrSupport = true; }).overrideAttrs (
finalAttrs: previousAttrs: {
postFixup = (previousAttrs.postFixup or "")
+ ''
wrapProgram $out/bin/flameshot --set QT_SCREEN_SCALE_FACTORS "0.5"
'';
}
)
这段代码覆写了enableWlrSupport用以支持wayland, 并在postFixup属性中增加了使用warpProgram设置运行时环境变量。这样一来,运行flameshot时实际上运行是一个warpper,它每次会帮我们设置好缩放,一劳永逸解决该问题。
评论
发表评论