Страница 1 из 1
Telegram свернись, Telegram вернись
Добавлено: 10 авг 2022, 21:32
demonlibra
Linuxmint 21 Cinnamon
В настройках "Параметры системы" -> "Окна" -> "Раскладка кнопок" можно включить режим Gnome, что скроет кнопки "Скрыть" и "Развернуть".
Можно ли каким-то образом запустить отдельное приложение с такой настройкой?
Скрыть кнопку свернуть для одного приложения
Добавлено: 10 авг 2022, 21:44
rogoznik
Вряд ли. Элементы управления окном предоставляет оконный менеджер.
В случае Cinnamon - это muffin, форк mutter из гном.
Обычно эти элементы настраиваются на этапе разработки приложения. И в дальнейшем их доступность - это реакция на внешние условия
Скрыть кнопку свернуть для одного приложения
Добавлено: 10 авг 2022, 22:49
demonlibra
Печально.
Да я всё с Telegram`ом борюсь ))
Скрыть кнопку свернуть для одного приложения
Добавлено: 10 авг 2022, 23:08
Ара Магеддон
Люблю линукс! Всё можно сделать, хоть через задницу, но можно)))
xprop -name 'Telegram' -format _MOTIF_WM_HINTS 32i -set _MOTIF_WM_HINTS 1
Только оно вообще все кнопки сносит. И закрыть не получится, и свернуть. Но проблемы трёх кликов это никак не решает, увы... Да, двойка на конце сносит декорации нафиг, нолик - возвращает как было.
UPD: сколько там всего интересного, в этой команде. Может, и нужная настройка найдётся, если поэкспериментировать...
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 02:02
Ара Магеддон
В общем, команда xprop -name 'Telegram' _NET_WM_STATE
выдает состояние окна телеги. Например, _NET_WM_STATE_HIDDEN если оно свёрнуто или _NET_WM_STATE_DEMANDS_ATTENTION если оно требует внимания (мигает на панели задач вместо того, чтобы нормально нарисоваться на экране). А дальше два путя: нужен какой-то демон, который будет отслеживать состояние окна и активировать его, если оно требует внимания. Или наоборот, закрывать, если оно свернуто. И то, и другое легко делается через wmctrl
. Сама телега никуда из трея не денется: даже набранное, но не отправленное сообщение не пропадет.
Только вот как это лучше сделать? Скрипт, который раз в секунду будет чекать выхлоп команды, или есть более правильные варианты? Тут я как-то совсем не советчик...
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 10:51
demonlibra
Обратил внимание, что имя окна меняется произвольным образом.
Telegram
Telegram (1)
...
Пока написал такой сценарий:
Код: Выделить всё
title=`wmctrl -l | egrep -o Telegram.*` # Имя окна Telegram
if [ -n "$title" ] # Если окно найдено
then
echo "title = "$title
status=`xprop -name "$title" _NET_WM_STATE` # Текущее состояние окна
echo "status = "$status
marker1="_NET_WM_STATE(ATOM) = _NET_WM_STATE_HIDDEN, _NET_WM_STATE_DEMANDS_ATTENTION" # Маркер свёрнутого мигающего окна
if [ "$status" == "$marker1" ] # Статус соответствует маркеру
then
wmctrl -a "$title" # Активация окна
fi
else
echo "Окно Telegram не найдено"
fi
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 10:55
rogoznik
demonlibra, а смысл делать вывод, если ты этот скрипт по хоткею вызываешь или он в фоне выполняется по таймеру?
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 11:06
demonlibra
Думаю над этим.
Не хочется делать так.
Код: Выделить всё
./Telegram &
for ((;;))
do
echo "Бесконечный цикл"
...
sleep 1
done
Может быть есть какой-то более умный способ инициировать запуск сценария, чем такой? Хотя бы при любом нажатии в области трея.
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 11:33
Ара Магеддон
Да, вот тоже завис вчера на бесконечном цикле. Точнее, на нежелании к нему прибегать.
"_NET_WM_STATE(ATOM) = _NET_WM_STATE_HIDDEN, _NET_WM_STATE_DEMANDS_ATTENTION"
- вот тут, если окно не свёрнуто, может быть просто один статус "demands attention". При этом окно мигает и не прорисовывается.
Думаю, мож в багтрекер написать? Или mint/muffin, или в телегу, или в оба.
Если в минтовский - то пусть вернут отключаемую опцию "Запретить похищать фокус". Так и надо, чтобы похищали. Вообще не жалко))
Если в телегу - то добавить проверку на DE, и если это Циннамон, то пнуть лишний раз окно наверх. Думаю, это можно и кодом сделать, без wmctrl и лишних зависимостей.
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 16:54
Ара Магеддон
demonlibra, спасибо, всё фунциклирует!
Код: Выделить всё
#!/bin/bash
while true
do
title=`wmctrl -l | egrep -o Telegram.*`
if [ -n "$title" ]; then
status=`xprop -name "$title" _NET_WM_STATE`
if [[ $status == *"DEMANDS_ATTENTION"* ]]; then
wmctrl -R "$title"
fi
fi
sleep 1
done
С
sleep 0.3
жрет до 0,1% CPU, с секундной задержкой почти незаметен.
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 17:12
demonlibra
Я за день вылови пару моментов, когда этот сценарий не работает.
Надо задавать условия:
Код: Выделить всё
marker1="_NET_WM_STATE(ATOM) = _NET_WM_STATE_HIDDEN, _NET_WM_STATE_DEMANDS_ATTENTION"
marker2="_NET_WM_STATE(ATOM) = _NET_WM_STATE_DEMANDS_ATTENTION"
if [ "$status" == "$marker1" ] || [ "$status" == "$marker2" ] # Статус соответствует маркеру
then
wmctrl -a "$title" # Активация окна
fi
но при этом окно Telegram вываливается на передний план при получении уведомлений.
В общем костыль заставляет хромать другой ногой ))
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 17:35
Ара Магеддон
demonlibra писал(а): ↑11 авг 2022, 17:12
но при этом окно Telegram вываливается на передний план при получении уведомлений.
А если убрать галку "Настройки > Уведомления и звуки > Подсветка окна"? У меня вроде работает.
Варик скрипта с однократным получением ID окошка вместо поиска раз в секунду (я заметил, что он даже после перезапуска телеги не меняется, только после выхода из сессии).
Код: Выделить всё
#!/bin/bash
while true
do
if [ -z $window_id ]; then
window_id=`wmctrl -l | grep -i telegram | awk '{print $1}'`
fi
status=`xprop -id "$window_id" _NET_WM_STATE`
if [[ $status == *"DEMANDS_ATTENTION"* ]]; then
wmctrl -i -R "$window_id"
fi
sleep 1
done
Так, пожалуй, и оставлю)))
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 18:14
demonlibra
До меня долго доходило, что название меняется так как содержит количество непрочитанных сообщений.
Небольшое условие к "бесконечному" циклу, чтобы сценарий завершился, если телегу закрыли
Код: Выделить всё
./Telegram &
sleep 5
while [[ -n `pgrep Telegram` ]]
...
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 20:46
demonlibra
Ара Магеддон писал(а): ↑11 авг 2022, 17:35
Так, пожалуй, и оставлю)))
Почему-то если запустить сценарий в терминале, то всё прекрасно работает.
Но стоит это сделать в фоне, то эффект нулевой.
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 21:21
Ара Магеддон
demonlibra писал(а): ↑11 авг 2022, 20:46
Почему-то если запустить сценарий в терминале, то всё прекрасно работает.
Но стоит это сделать в фоне, то эффект нулевой.
Странно... у меня и в фоне работает. Запускал просто из nemo. А процесс висит в системном мониторе, не пропадает? Там ещё sleep у него должен быть, если с зависимостями смотреть. Как вариант - можно echo в лог вывести, посмотреть, что там в переменных.
Телега, если что, из flatpak-а. Скрипт просто в домашней папке валяется.
demonlibra писал(а): ↑11 авг 2022, 18:14
while [[ -n `pgrep Telegram` ]]
У меня только
pgrep telegram
PID выдаёт. Если с большой буквы написать - то пустое значение.
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 21:26
demonlibra
Кажется разобрался. Задал принудительно интерпритатор bash добавив в начало сценария строку
Для запуска создал пункт в меню
/home/demonlibra/.local/share/applications/Telegram_fix.desktop
Код: Выделить всё
[Desktop Entry]
Name=Telegram fix
Comment=Desktop version of Telegram messaging app
Exec=/home/demonlibra/.scripts/telegram.sh
Icon=telegram
Terminal=false
StartupWMClass=TelegramDesktop
Type=Application
Categories=Chat;Network;InstantMessaging;Qt;
MimeType=x-scheme-handler/tg;
Keywords=tg;chat;im;messaging;messenger;sms;tdesktop;
SingleMainWindow=true
X-GNOME-UsesNotifications=true
Скрыть кнопку свернуть для одного приложения
Добавлено: 11 авг 2022, 22:08
Ара Магеддон
demonlibra писал(а): ↑11 авг 2022, 21:26
Задал принудительно интерпритатор bash добавив в начало сценария строку
Код: Выделить всё
#!/bin/bash
Движок сайта её коварно маскирует бледно-серым цветом почему-то )))
Telegram свернись, Telegram вернись
Добавлено: 11 авг 2022, 22:38
WWolf
Ара Магеддон, потому что # это коммент... А #! признак для интерпретатора скрипта, но от этого для синтаксиса он не перестаёт быть комментарием
Telegram свернись, Telegram вернись
Добавлено: 11 авг 2022, 22:48
slant
Ара Магеддон писал(а): ↑11 авг 2022, 21:21
while [[ -n `pgrep Telegram` ]]
Вот извращенцы. Вам надо для цикла убедится, что программа запущена? Дык это можно сделать гораздо проще:
while pidof telegram-desktop
И все. Вместо telegram-desktop - подставить имя исполняемого файла программы.
Как работает:
1. while проверяет вывод errorlevel следующей за ним программы. Если 0 - выполняет цикл (так же работает if, кстати)
2. pidof - выдает pid(ы) запущенной(ых) программ(ы) на консоль, и возвращает 0 в качестве errorlevel если нашел хоть одну работающую копию. И 1 если не нашел.
P.S. test, [ и [[ - это программы. Которые тоже выдают 0 в errorlevel если описанное в их параметрах условие выполнено.
Telegram свернись, Telegram вернись
Добавлено: 14 авг 2022, 18:28
demonlibra
Ара Магеддон писал(а): ↑11 авг 2022, 11:33
Думаю, мож в багтрекер написать? Или mint/muffin
Написал, как смог.
https://github.com/linuxmint/muffin/issues/634