сворачивание и разворачивание окна из shell-скрипта

Вопрос или проблема

Я пытаюсь запустить скрипт, который будет проверять скорость интернета на компьютере с 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:

  1. xdotool: Это утилита, которая позволяет автоматизировать взаимодействие с X11, включая управление окнами. Она предоставляет команду getactivewindow для получения идентификатора текущего активного окна, windowminimize для минимизации окна и windowactivate для его активации. Уникальность данного инструмента заключается в его способности взаимодействовать напрямую через симуляцию пользовательских действий, таких как перемещение курсора мыши и ввод клавиш.

  2. 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-сессиях (который по умолчанию используется в множестве современных дистрибутивов). Проблемы, описанные вами, могут возникать из-за особенностей работы оконного менеджера в конкретном дистрибутиве или специфических конфигураций.

Способы обхода:

  1. Использование переменных окружения: Сохранение состояния окна до выполнения скрипта и восстановление этого состояния после его выполнения.

  2. Использование различных утилит: Например, wmctrl может предложить более стабильные результаты при смене фокуса и переключении между окнами на некоторых окружениях.

  3. Проведение тестов в разных окружениях: Так как отличия в поведении оконного менеджера могут варьироваться, протестируйте скрипт в разных условиях.

Окончательное улучшение

Учитывая современные изменения в экосистеме Linux, важно поддерживать актуальность инструментов и их совместимость с различными оболочками. Для более глубокого понимания работы xdotool и wmctrl, рекомендуется ознакомиться с их руководствами man xdotool и man wmctrl, а также сообществами и форумами, которые могут предложить специфические для окружения советы и улучшения.

Оцените материал
Добавить комментарий

Капча загружается...