Вопрос или проблема
Я пытаюсь запустить скрипт, который будет проверять скорость интернета на компьютере с Linux и графическим интерфейсом, сворачивать окно терминала вниз, а когда запрос завершится, окно будет подниматься с ответом.
На данный момент я могу свернуть окно, но не поднять.
#!/bin/bash
xdotool getactivewindow windowminimize
#xdotool set_window --name speedy
#xdotool set_window --icon-name speedy
speedtest-cli --simple
if [ $? -eq 0 ]
then
#xdotool windowactivate speedy
xdotool windowfocus #speedy
xdotool key "F11"
fi
exec $SHELL
xdotool
нужно знать идентификатор окна для всех его действий.
Вы правильно использовали getactivewindow
для получения окна для команды windowminimize
, но вам также нужно сделать это для установки его имени. Так что поставьте
xdotool getactivewindow set_window --name speedy
перед строкой сворачивания.
Затем вы можете использовать search
для поиска его для последующей активации.
xdotool search --name speedy windowactivate
Смотрите разделы руководства Window stack и Command chaining для объяснения, как это все работает.
Весь скрипт:
#!/bin/bash
# переименуйте окно, чтобы найти его снова позже
xdotool getactivewindow set_window --name speedy
xdotool search --name speedy windowminimize
speedtest-cli --simple
if [ $? -eq 0 ]
then
xdotool search --name speedy windowactivate
xdotool key "F11"
fi
Я не знаю, как это делать, используя xdotool, но вот как вы можете поднять окно с помощью wmctrl и переключиться в полноэкранный режим с помощью одной команды:
#!/bin/sh
TITLE_OF_WINDOW_TO_BE_RAISED="Tor-Browser"
wmctrl -a $TITLE_OF_WINDOW_TO_BE_RAISED -b add,fullscreen
Она также переключается на рабочий стол, содержащий окно и фокусирует его.
-a
поднимает окно, -b add,fullscreen
“добавляет” свойство полноэкранности.
Чтобы не переименовывать окно, сохраните его идентификатор в bash переменной, которую можно будет передавать xdotool
для всех дальнейших действий:
#!/bin/bash
WID=$(xdotool getactivewindow)
xdotool windowminimize $WID
speedtest-cli --simple
if [ $? -eq 0 ]
then
xdotool windowactivate $WID
xdotool key "F11" $WID
fi
Сценарий использования wmctrl на Linux Mint 21.2 Cinnamon (файловый менеджер Nemo)…
#!/bin/bash
clear
VAR_TITLE="МОЁ НАЗВАНИЕ ОКНА"
echo -en "\033]0;${VAR_TITLE}\a" # Заголовок окна
echo "${VAR_TITLE}"
fun_myzenfunction (){
VAR_MYZEN=$(zenity --question blablabla etcetera)
здесь выполняется
}
(sleep 1 && wmctrl -F -a "${VAR_TITLE}" -b add,below,shaded) &
fun_myzenfunction
read
Цель скрипта:
Свернуть окно скрипта на панель задач/панель сразу после загрузки окна zenity с помощью функции ‘fun_myzenfunction’.
Дилемма:
При запуске скрипта щелчком по нему из Nemo он работает как ожидается, но,
при запуске с ярлыка на рабочем столе некоторые добавки wmctrl не срабатывают, как листья деревьев.
Иными словами: ссылка на рабочем столе отказывается сворачиваться с ‘below’. Только ‘shaded’ там работает и сворачивает оболочку скрипта. Вам придется сворачивать вручную после этого.
Насколько мне известно, вы можете добавить два параметра после wmctrl ‘add’. Здесь добавлен ‘shaded’, чтобы как минимум свернуть оболочку скрипта. Когда скрипт запускается из файлового менеджера Nemo ‘below’ достаточно, чтобы эффективно сворачивать сразу.
Интересно, как решить это девиантное (Mint?) поведение рабочего стола…
Примечание: Развернутое на рабочем столе окно терминала сворачивается, когда я щелкаю любую другую программу. Итак, ярлык на рабочем столе запускает скрипт, скрипт запускает окно zenity и сворачивает окно терминала, окно терминала остается неподвижным на рабочем столе. Откройте, например, Firefox или файловый менеджер, что угодно, возвращайтесь на рабочий стол и терминал тем временем сворачивается…
Ответ или решение
Рассмотрим сценарий автоматизации действий с оконным интерфейсом на Linux с использованием инструментов, таких как xdotool
и wmctrl
. Согласно вашему запросу, вы стремитесь минимизировать окно терминала во время выполнения скрипта для проверки скорости интернета и восстанавливать его после завершения операции. Однако возникают проблемы с правильным восстановлением окна после его минимизации.
Теория
Начнем с основных функций и возможностей xdotool
и wmctrl
:
-
xdotool
: Это утилита, которая позволяет автоматизировать взаимодействие с X11, включая управление окнами. Она предоставляет командуgetactivewindow
для получения идентификатора текущего активного окна,windowminimize
для минимизации окна иwindowactivate
для его активации. Уникальность данного инструмента заключается в его способности взаимодействовать напрямую через симуляцию пользовательских действий, таких как перемещение курсора мыши и ввод клавиш. -
wmctrl
: Это утилита для управления окнами в X Window System. С ее помощью можно изменять свойства окна, активировать его и даже переключаться на требуемый рабочий стол. В частности,wmctrl -a
активирует окно, аwmctrl -b add,fullscreen
переключает его в полноэкранный режим.
Тем не менее, обе эти утилиты требуют точного указания идентификатора окна или уникального способа его идентификации (например, имя окна). Это подразумевает, что необходимо сохранять или определять точную информацию об окне для корректного управления.
Пример
Разберем пример скрипта, который решает вашу задачу:
#!/bin/bash
# Сохраняем идентификатор текущего активного окна
WID=$(xdotool getactivewindow)
# Минимизируем активное окно
xdotool windowminimize $WID
# Выполняем команду для проверки скорости интернета
speedtest-cli --simple
# Проверяем код возврата выполненной команды
if [ $? -eq 0 ]; then
# Активируем ранее минимизированное окно
xdotool windowactivate $WID
xdotool key "F11" # Переключаем окно в полноэкранный режим (если необходимо)
fi
Применение
В этом скрипте используется xdotool
для получения идентификатора текущего окна и его минимизации. После завершения проверки интернет-соединения с помощью speedtest-cli
, скрипт проверяет успешность выполнения команды. Если код возврата равен нулю (успешное выполнение), он восстанавливает окно терминала из сворачивания.
Преимущество такого подхода заключается в его простоте и минимум зависимости от внешних параметров, таких как имя окна. Однако при различных сценариях может потребоваться более сложное управление окнами, особенно если они запускаются в разных сеансах или на нескольких виртуальных рабочих столах.
Углубление в детали
Также важно учитывать среду рабочего стола: такие инструменты, как xdotool
и wmctrl
, зависят от X11 и могут работать иначе в Wayland-сессиях (который по умолчанию используется в множестве современных дистрибутивов). Проблемы, описанные вами, могут возникать из-за особенностей работы оконного менеджера в конкретном дистрибутиве или специфических конфигураций.
Способы обхода:
-
Использование переменных окружения: Сохранение состояния окна до выполнения скрипта и восстановление этого состояния после его выполнения.
-
Использование различных утилит: Например,
wmctrl
может предложить более стабильные результаты при смене фокуса и переключении между окнами на некоторых окружениях. -
Проведение тестов в разных окружениях: Так как отличия в поведении оконного менеджера могут варьироваться, протестируйте скрипт в разных условиях.
Окончательное улучшение
Учитывая современные изменения в экосистеме Linux, важно поддерживать актуальность инструментов и их совместимость с различными оболочками. Для более глубокого понимания работы xdotool
и wmctrl
, рекомендуется ознакомиться с их руководствами man xdotool
и man wmctrl
, а также сообществами и форумами, которые могут предложить специфические для окружения советы и улучшения.