【问题标题】:Opacity in a reparenting WMReparenting WM 中的不透明度
【发布时间】:2021-11-28 18:45:48
【问题描述】:

我正在为 X11 编写一个 reparenting 窗口管理器(并且已经在这里问了很多关于它的问题)。现在,我遇到的问题与其说是要修复的错误,不如说是关于如何实现某些东西的问题。

应用程序可以请求透明性,如果像 xcompmgr 或 picom 这样的合成器正在运行,它们会提供它。但是,当我重新设置窗口时,这似乎不起作用;在这种情况下,客户端窗口的背景只是在后面显示黑色背景(可能是框架窗口?但它的背景不是黑色)。我确实通过设置 _NET_FRAME_EXTENTS 来表明我有一个框架。

我尝试过的:

  • 看起来 awesomewm 的 opacity 代码监听了带有 _NET_WM_OPACITY 的属性通知。尽管在根窗口上选择了 SubstructureRedirect|SubstructureNotify|PropertyChange,但当我更改窗口的不透明度时,我没有收到任何 PropertyNotify 事件。

【问题讨论】:

  • 我想我可能已经想通了。在实际的客户端窗口上设置 PropertyNotify,我会收到事件。现在我可以尝试弄清楚如何将网络 wm 不透明度转发到框架窗口,就像 awesome 一样。惊人的! (双关语;))
  • 嗯。我收到了事件,但这真的很有趣,因为它们似乎不在 EWMH 中;我在寻找 _NET_WM_WINDOW_OPACITY
  • Got atom 322, expected one of EWMH: [241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 304, 268, 269, 270, 271, 272, 273]; 304 是净 wm 窗口不透明度。看起来它实际上并不是 EWMH 规范的一部分,但我确实使用 xcb_intern_atom 获得了原子。我现在应该尝试什么?
  • 我想我可以只获取窗口的转换并将其应用于框架,可能会工作,但感觉不干净。我不明白如果它在 awesomewm 中工作,为什么这不起作用。
  • 其实没那么快;这发生在任何按钮按下。所以我不知道:(

标签: x11 xlib xcb


【解决方案1】:

您需要使用深度 = 32 的重新父级来创建框架窗口(即:使用透明度)。由于您已经在查看 AwesomeWM:它会在启动时为此找到正确的视觉效果,然后以这种方式创建 所有 的窗口。这只是必要的,因为 Lua 代码可能需要透明度。 AFAIR,其他 WM 会查看程序的窗口位深度并基于此创建框架窗口。

【讨论】:

  • 谢谢。但是,如果我执行self.conn.create_window(32, ...,则窗口永远不会出现,但使用 COPY_DEPTH_FROM_PARENT 会出现。
  • 如果我使用 geom.depth 它适用于某些窗口,如 Chromium,但不适用于其他窗口;并且一旦该窗口未映射,则它不会让其他窗口被映射。 ??
  • 啊,看起来铬的深度是 24。深度为 24 的窗口可以工作,但深度不是 32。将深度硬编码为 24,我没有得到任何透明度。跨度>
  • 从 attr.colormap 设置颜色图也不起作用
  • 好的,所以我不得不使用属性提供的颜色图 视觉效果。现在透明度起作用了!但我遇到的问题是,现在它使标题栏在深度为 32 的窗口上也变得透明。我该如何解决那个?我只是将背景设置为某些东西和深度= 32。如果我画一个矩形,它会起作用吗?
猜你喜欢
  • 1970-01-01
  • 2016-10-12
  • 2014-01-05
  • 2020-07-12
  • 1970-01-01
  • 2017-01-11
  • 2021-11-01
  • 2013-06-05
相关资源
最近更新 更多