У клиента нет имени / класса при запуске
Я пытаюсь запустить приложение (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