客户端在启动时没有 name/class

Client doesn't have a name/class at startup

我正在尝试在特定标签上启动应用程序 (Spotify)。规则未应用,现在我通过在 "manage" 信号的通知中打印 class 来检查客户端 class。这会导致空通知。

client.connect_signal("manage", function (c, startup)
    naughty.notify({title=c.class})
end)

当我重新启动 awesome 时,它​​确实打印了客户端 class,那么为什么在客户端最初启动时它不工作?

使用 xprop,它还会打印 class: WM_CLASS(STRING) = "spotify", "Spotify"

听起来像是 Spotify 中的一个错误(我 认为 我以前听说过这个)。我猜想 Spotify 不遵循 ICCCM 并且只在它使其 window 可见之后才设置它的 WM_CLASS 属性 而不是之前。

我担心你除了向 Spotify 开发者投诉以修复他们的东西外,对此无能为力。

您可以通过在 manage 信号中启动一个计时器来解决此问题,该计时器检查 window 是否在短时间后变成 spotify。或者,你可以做一些类似 client.connect_signal("property::class", function(c) if c.class == "Spotify" then print("This is now a spotify window") end end) 的事情来响应 window 的 class 的变化(当然你想做一些对 Spotify 的 windows 比打印它们)。 (根据 ICCCM,window 在可见时不允许更改其 class,但谁在乎标准...)

claws-mail 客户端也有类似的问题。通过 xprop 检查它,它显示

WM_CLASS(STRING) = "claws-mail", "Claws-mail"

但是太棒了,只是没有应用规则。诀窍是通过提供一组可供选择的字符,在规则部分为这两个 class 名称赋予 awesome-wm:

rule = {class = "[Cc]laws%-mail"}

我希望这也适用于您的 spotify 应用程序。

要进一步阅读 lua 中的模式,我建议这样做: https://www.lua.org/pil/20.2.html