Бескнопочные окна
Oct. 31st, 2024 05:54 pmВ Debian 12 блютусный менеджер повадился открывать отдельные окна с сообщением "такое-то устройство connected", такое-то устройство "disconnected".
Причем в этих окнах нет кнопки "Ок", закрывать надо кликая на крестик в уголку окна. И возникает это окно почему-то в центре того дисплея, на котором случайно оказался курсор.
А у блютусной мыши есть привычка уходить в спячку и дисконнектиться, а потом коннектиться обратно когда за нее рукой схватишься.
Поэтому у меня стали эти мелкие окна копиться. И наконец мне это надоело. Пришлось немножко погуглить, потом поставить пакет wmctrl и написать вот такое:
wmctrl -l -x|awk '$3 ~ "blueman-applet" {print $1;}'|xargs -n1 wmctrl -ic
Окна мы выбираем по классу blueman-applet, потому что заголовок у них - имя bluetooth-устройства, то есть у разных мышей и наушников - разный. Но никаких других окон с таким классом blueman-applet не создает. Если открыть окно настроек, у него будет класс blueman-manager. Так что окна эти можно прибивать не глядя. Что и делает последняя команда в pipeline.
Сначала я хотел решить эту проблему только базовыми средствами X. Выбрать нужные окна я вполне могу по xprop. Но чтобы послать окну сообщение WM_CLOSE, надо уже что-то не входящее в пакет x11-utils. В нем есть только xkill, который пришибает не окно, а процесс его создавший (что мне совершенно не надо). А если ставить что-то что умеет закрывать окна из командной строки, то почему бы не wmctrl, который и поиск окон существенно упростит?
Почему бы не воспользоваться командой
wmctrl -xc blueman-applet.Blueman-applet
А потому что она закрывает не все окна с данным классом, а только одно, первое попавшееся. Можно конечно ее в цикл обернуть:
while wmctrl -xc blueman-applet.Blueman-applet; do :; done
Благо wmctrl возвращает ненулевой код завершения если не нашел окна которому нужно сказать close.