Страница 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 telegramPID выдаёт. Если с большой буквы написать - то пустое значение.

Скрыть кнопку свернуть для одного приложения

Добавлено: 11 авг 2022, 21:26
demonlibra
Кажется разобрался. Задал принудительно интерпритатор bash добавив в начало сценария строку

Код: Выделить всё

#!/bin/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