У клиента нет имени / класса при запуске

Я пытаюсь запустить приложение (Spotify) по определенному тегу. Правила не применяются, и теперь я проверяю класс клиента, печатая класс в уведомлении в сигнале "управление". Это приводит к пустому уведомлению.

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

Когда я перезапускаю awesome, он печатает класс клиента, так почему же он не работает, когда клиент изначально запускается?

Используя xprop, он также печатает класс:WM_CLASS(STRING) = "spotify", "Spotify"

2 ответа

Решение

Похоже, ошибка в Spotify (и я думаю, что слышал об этом раньше). Я предполагаю, что Spotify не следует ICCCM и только устанавливает его WM_CLASS свойство после того, как оно сделало свое окно видимым, а не раньше.

Я боюсь, что вы не можете ничего с этим поделать, кроме как жаловаться разработчикам Spotify, чтобы исправить их вещи.

Вы можете обойти это, запустив таймер в manage сигнал, который проверяет, оказывается ли окно спойтируемым через короткое время. В качестве альтернативы, вы можете сделать что-то вроде client.connect_signal("property::class", function(c) if c.class == "Spotify" then print("This is now a spotify window") end end) реагировать на изменение класса окна (конечно, вы захотите сделать что-то более полезное для окон Spotify, чем распечатывать их). (Согласно ICCCM, окну не разрешается изменять свой класс, пока он виден, но кого волнуют стандарты...)

У меня была похожая проблема с почтовым клиентом claws. Осматривая его через xprop, он показывает

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

но удивительно просто не применять правила для этого. Уловка заключалась в том, чтобы дать awesome-wm обоим этим именам классов в разделе правил, предоставив набор символов на выбор:

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

Я надеюсь, что это работает и для вашего приложения spotify.

Для дальнейшего чтения о шаблонах в lua я предлагаю это: https://www.lua.org/pil/20.2.html

Другие вопросы по тегам