Linux: forced WEBKIT_DISABLE_DMABUF_RENDERER=1 makes the main window transparent on WebKitGTK 2.54 (only repainted regions show)
维护者通常 1 天内回复
评估
调研方向
The forced variable is set unconditionally in apps/desktop/src-tauri/src/main.rs, lines 48-51, under a #[cfg(target_os = "linux")] block. Read that block, then check the linked PR #2628 before starting, since it is already open against this issue. Done means the variable is skipped when the user has already set it, and the window renders on WebKitGTK 2.54 without the shim.
由索引模型根据 Issue 内容生成。
描述
Description
On Linux with WebKitGTK 2.54, Cap's main window is almost entirely invisible. The window exists (KWin reports it mapped, 330×395, not hidden/minimized), but only the regions that get repainted show up: a hovered button, a toggle being animated, etc. Everything else stays transparent, so you see the desktop through the window.
The cause is the unconditional override added for #1948:
#[cfg(target_os = "linux")]
unsafe {
std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1");
}
With WebKitGTK 2.54, disabling the DMABUF renderer on a transparent window makes WebKit repaint only the damaged areas, and the rest of the surface is never painted. Other Tauri projects hit the same regression on 2.54 (e.g. rogeriojunior31/vultures-ai#126, xnmp/tauri-explorer#1057).
Because the variable is overwritten with set_var, users can't opt out: running WEBKIT_DISABLE_DMABUF_RENDERER=0 Cap still yields WEBKIT_DISABLE_DMABUF_RENDERER=1 in the environment of Cap's WebKitWebProcess (checked via /proc/<pid>/environ).
Reproduction
- Debian 13, KDE Plasma 6.3 Wayland, WebKitGTK 2.54.0.
- Install Cap 0.6.0 (
.deb) and launch it. - The main window is transparent except for elements being hovered or animated.
What I tried
All of these still show the bug, because the forced variable stays in effect:
GDK_BACKEND=x11(XWayland)WEBKIT_DISABLE_COMPOSITING_MODE=1WEBKIT_SKIA_ENABLE_CPU_RENDERING=1- forcing Mesa EGL instead of NVIDIA (
__EGL_VENDOR_LIBRARY_FILENAMES=.../50_mesa.json) WEBKIT_FORCE_COMPOSITING_MODE=1
Workaround that fixes it: an LD_PRELOAD shim that turns setenv("WEBKIT_DISABLE_DMABUF_RENDERER", …) into a no-op. With the variable unset, the window renders fully and correctly on this machine.
#define _GNU_SOURCE
#include <dlfcn.h>
#include <string.h>
int setenv(const char *name, const char *value, int overwrite) {
static int (*real)(const char *, const char *, int);
if (!real) real = dlsym(RTLD_NEXT, "setenv");
if (name && strcmp(name, "WEBKIT_DISABLE_DMABUF_RENDERER") == 0) return 0;
return real(name, value, overwrite);
}
Suggested fix
At minimum, respect a value the user already set, so people can opt out without a shim:
#[cfg(target_os = "linux")]
if std::env::var_os("WEBKIT_DISABLE_DMABUF_RENDERER").is_none() {
unsafe { std::env::set_var("WEBKIT_DISABLE_DMABUF_RENDERER", "1"); }
}
Better still, don't apply the workaround by default on WebKitGTK ≥ 2.54 (or limit it to the configurations from #1948), since it now breaks rendering instead of fixing it.
Environment
- Cap 0.6.0 (
.deb) - Debian GNU/Linux 13 (trixie), kernel 6.12
- KDE Plasma / KWin 6.3.6, Wayland session
- libwebkit2gtk-4.1 2.54.0
- Hybrid GPU: Intel Raptor Lake UHD (i915) + NVIDIA RTX 4060 Laptop (driver 555.58.02)
Related: #1948, #1553
- 主要语言
- Rust
- 星标
- 23.2k
- 派生
- 2k
- 平均合并
- 1 天 5 小时
- 30 天内合并 PR
- 130
环境准备
- 提供 Dockerfile 或 Docker Compose 文件
- 没有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
CapSoftware/Cap 的其他 Issue
-
Web player intercepts ⌘⇧M and blocks Chrome profile-menu shortcut可能已有人在做 @AatmanAJ 于 1 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 80/100
CapSoftware/Cap#2596 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
CapSoftware/Cap#2384 · 1 条评论 ·
维护者通常 1 天内回复
-
Dashboard pagination causes full page reloads on self-hosted Cap可能已有人在做 @Dewin 于 29 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 88/100
CapSoftware/Cap#2305 · 2 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
CapSoftware/Cap#1714 · 3 条评论 ·
维护者通常 1 天内回复
-
macOS: main-thread panic in tauri-runtime-wry 2.8.1 freezes Cap mid Instant recording; the crashed recording then can't be recovered or reuploaded可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 4/5 3-5 天 新手友好度 18/100
CapSoftware/Cap#2606 · 3 条评论 ·
维护者通常 1 天内回复
相似的 Issue
-
priority: medium
难度 2/5 1-3 小时 新手友好度 68/100
storytold/photocraft#6759 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 65/100
-
area:logging documentation good first issue
难度 2/5 1-3 小时 新手友好度 72/100
hugowis/open-fpv-sim#48 ·
-
难度 2/5 1-3 小时 新手友好度 68/100
IngvarConsulting/unica#1537 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 70/100