Linux сделать окно активным

Обновлено: 06.07.2024

Операционными системами, которые основаны на Linux и Unix и работают в текстовом режиме, очень легко управлять. Учитывая то, как работает подсистема ввода-вывода Unix, программам, ожидающих на входе то, что вводится с клавиатуры, можно передавать любые данные. А то, что программы обычно выдают на экран, можно перехватить и подвергнуть дальнейшей обработке. Вся операционная система устроена именно так. А вот графические программы, использующие возможности X11, это — уже совсем другое дело. Можно ли управлять графическими программами так же, как управляют программами с текстовым интерфейсом? Точный ответ на этот вопрос зависит от того, что именно понимать под «управлением программами». Но если не вдаваться в детали, то на этот вопрос можно дать положительный ответ.

Как это обычно бывает в Linux и Unix, существует множество способов решения одной и той же задачи. И наша задача — не исключение. Если вам нужны средства для точного управления программами, то можно сказать, что добиться этого можно с помощью утилит, задействующих специальный механизм, называемый D-Bus. Этот механизм позволяет программам так оформлять данные и методы, что ими могут пользоваться другие программы. В идеальном мире программы, которыми нужно управлять, применяют D-Bus, но в реальности всё далеко не так просто. Поэтому сегодня мы поговорим о том, как управлять самыми разными графическими программами в Linux.


Существует несколько утилит, которые позволяют каким-то способом управлять X-окнами. Например, есть инструмент xdo, о котором вы, наверняка слышите не особенно часто. Более популярным средством из этой сферы является утилита xdotool, о которой я расскажу. Кроме того, похожим функционалом обладает wmctrl. Есть ещё программа autokey, которая родственна популярной Windows-программе AutoHotKey.

Утилита xdotool

Пожалуй, утилита xdotool является самой популярной программой, используемой в тех случаях, когда надо управлять приложениями с графическим интерфейсом. Это — нечто вроде «швейцарского ножа» для системы X. Но эта утилита использует достаточно сложные конструкции командной строки. Это, вероятно, является следствием того, что она очень много всего умеет. Я чаще всего прибегал к её помощи в ситуациях, когда мне надо было организовать перемещение окон и изменение их размеров. Но она умеет, например, имитировать ввод данных с клавиатуры и воспроизводить действия, которые обычно выполняют с помощью мыши. Она позволяет привязывать выполнение неких действий к событиям, имеющим отношение к перемещениям мыши и к событиям, связанным с окнами программ.

Хотя xdotool можно запускать, указывая файл, содержащий необходимые команды, чаще всего можно видеть передачу аргументов этой утилите из командной строки. При её использовании сначала находят нужное окно, а потом выполняют с ним какие-то действия. Найти окно можно, зная его имя. Можно поступить и иначе. Например — выбрать то окно, по которому щелкнет пользователь.

Рассмотрим следующий пример:


Если ввести это в командной строке, то можно щёлкнуть по окну, а потом увидеть, как в нём появится заданный текст. Причём, выглядит это так, будто текст введён пользователем. Наш инструмент, кроме того, может имитировать действия, выполняемые с помощью мыши. Он способен выполнять множество операций с окнами. Среди них, например, изменение активного окна и переключение между рабочими столами.

Кстати, надо отметить, что для того чтобы пользоваться некоторыми из возможностей xdotool, нужно чтобы было установлено расширение X-сервера XTest. Я обычно обнаруживаю это расширение уже установленным. Но если вы столкнулись с тем, что у вас что-то не работает — проверьте X-сервер и узнайте о том, загружено ли это расширение.

Утилита wmctrl

Программа wmctrl обладает возможностями, похожими на возможности xdotool, но она, в основном, взаимодействует с оконным менеджером. Единственная проблема тут заключается в том, что она использует стандартный интерфейс к оконному менеджеру. Не все оконные менеджеры поддерживают полный набор возможностей wmctrl. Это, кстати, одна из тех особенностей Linux, которая является причиной того, что распространение программ для этой ОС может превратиться в настоящее приключение. Нет двух одинаковых систем, а некоторые системы даже и близко друг на друга не похожи.

Утилита wmctrl особенно хороша для решения таких задач, как переключение рабочих столов и максимизация окон. Но она способна и на многое из того, что умеет xdotool.

Использование большого монитора

Я недавно поменял свою конструкцию из трёх мониторов на очень большой 4K-монитор. Это 43-дюймовый монстр обладает разрешением в 3840x2160 пикселей. Всё это очень хорошо, но мне не хватало возможности поместить окно одной программы на один монитор, а окно другой (или третьей) программы — на другой монитор.

Решением этой проблемы было использование механизма, позволяющего сдвинуть окно в определённую позицию на экране. Нечто подобное можно сделать, используя стандартные возможности менеджера окон, но я использую KDE, а там нужной мне возможности по расстановке окон больше нет. А именно, окна привязываются к определённым позициям при перетаскивании их в нужное место, но делается это не особенно быстро. Кроме того, не все места привязки окон находятся там, где мне хотелось бы их видеть.

Работа на большом мониторе

Я сразу подумал о том, чтобы использовать для решения этой задачи xdotool и привязать соответствующие действия к клавиатурным сокращениям, используя возможности KDE. Например, сочетание клавиш CTRL+ALT+1 могло бы закреплять текущее окно в правом верхнем углу экрана, а сочетание CTRL+ALT+0 могло бы максимизировать окно. Сочетание CTRL+ALT+6 позволяло бы окну занять всю правую половину экрана, а сочетание CTRL+ALT+8 должно было размещать окно в верхней половине экрана.

Вот как выглядела моя первая попытка создания команды, соответствующей клавиатурному сокращению CTRL+ALT+1 :


Тут реализована следующая идея: находим текущее окно, перемещаем его в позицию 0,0, а потом меняем его размер так, чтобы оно заняло бы четверть экрана. Числа, жёстко заданные в коде, это, конечно, не очень хорошо. Но если речь идёт о работе на одном компьютере, то это вполне допустимо. Размер окна, если вам так удобнее, можно установить и по-другому. Например — в виде 50% 50% . Причём, этот параметр можно настроить с использованием подобного значения, а вот в других макросах, где окно перед изменением его размера перемещается в позицию, отличающуюся от 0,0, всё равно придётся использовать жёстко заданные значения.

Первая проблема, с которой я столкнулся, заключалась в том, что в некоторых случаях окна не перемещались. Правда, для решения этой проблемы можно попытаться поменять местами команды изменения размера и перемещения окна.

Но проблемы на этом не кончались. Если максимизировать окно, то значения, касающиеся размеров и позиции окна, ни на что не влияют. Вот как эту проблему можно решить с привлечением wmctrl:


Тут, с помощью wmctrl, отключается максимизация активного окна, а после этого в дело вступает xdotool. Правда, если хочется использовать исключительно wmctrl, то можно применить такую команду:


В опции -e задаются параметры перемещения окна. Причём, обратите внимание на то, что первый 0 — это не опечатка. Значение этого параметра позволяет задавать свойство окна «gravity», которое обычно устанавливается в 0. Следующие четыре числа — это позиция и размер окна. Но тут можно заметить то, что если xdotool перемещает в заданную позицию верхний левый угол окна, wmctrl перемещает верхний левый угол внутреннего содержимого окна (сюда не входят элементы оформления окна). Это приводит к различным результатам.


Два окна на экране

Конечно, можно написать простой bash-скрипт, предназначенный для решения всех этих задач. Можно предусмотреть в нём механизмы, позволяющие программе адаптироваться к изменению размеров экрана без вмешательства пользователя в код программы. В скрипте можно даже сделать так, чтобы, например, окна не перекрывались бы, можно и воспользоваться другими специальными эффектами.

Вот пример подобного скрипта:


Клавиатурные макросы, в результате, можно использовать для вызова этого скрипта с тегом вроде ne (Northeast, северо-восток) или center (центр), устанавливая таким образом позицию окна. Изменения легче вносить в один скрипт, а не редактировать несколько клавиатурных макросов.

Итоги

В сериале «Звёздный путь» (в настоящем, с Уильямом Шетнером) есть момент, когда Кирк говорит кому-то о том, что нужно изучить то, как всё работает на космическом корабле. ОС семейства Linux очень похожи на этот корабль. Нельзя многого достичь, лишь догадываясь о том, как сделать то, что нужно, и продираясь через огромное количество инструментов, которые, возможно, способны решить задачу. Иногда достичь желаемого можно с помощью комбинации из нескольких инструментов. Нелегко испытывать самые разные конфигурации в поисках желаемого. Но обычно, если попытаться, всё можно сделать так, как нужно.

Эффективность администрирования систем GNU/Linux напрямую зависит от используемых утилит. Возможность выполнять максимум задач в минимальный срок - приоритетная цель этого процесса. Команда screen Linux является одним из основных инструментов системного администратора.

По умолчанию screen не является стандартной утилитой в большинстве дистрибутивов, но работает везде одинаково. Поэтому сначала рассмотрим её инсталляцию, а затем — возможности и основные команды.

Установка утилиты screen

Разница в инсталляции программы на разных дистрибутивах заключается в программах управления пакетами и их командами.

Чтобы установить screen в Ubuntu, Linux Mint, Deepin и других систем семейства Debian, используйте команду apt:

sudo apt install screen

В Manjaro, Antergos и других Arch-подобных ОС screen располагается в AUR, поэтому используйте соответствующую программу управления пакетами, например aurman:

aurman -S screen

Для инсталляции screen в системах на основе Red Hat (например Fedora и CentOS) используйте утилиту dnf:

dnf install screen

Основы работы команды screen

Принцип работы GNU/Linux в целом заключается в использовании небольших утилит, которые делают что-то одно, но хорошо. И эта программа — не исключение.

Команда screen Linux является консольной программой и имеет однозначное определение, соответствующее названию, — это оконный менеджер, разделяющий один физический терминал между несколькими процессами. Подходит для прямого либо удалённого администрирования.

Возможности программы

Screen позволяет переключаться между терминалами, в которых выполняются процессы, не прерывая их. Это особенно эффективно, когда необходимо производить сборку/установку ПО и мониторить дисковое пространство или использовать аппаратные ресурсы.

Screen может разделять текущий терминал на меньшее количество окон с возможностью запуска в них того же или других терминалов. Это ещё больше упрощает вышеописанную задачу, особенно при использовании больших мониторов.

Также к одной сессии screen может подключаться несколько пользователей. Это эффективно при обучении персонала.

Основные команды screen

Откройте терминал. Для запуска первого окна наберите:--

Все управляющие команды начинаются с комбинации клавиш Ctrl + a, затем следует буква или сочетание клавиш. Буквы разных регистров выполняют разные команды. Также сочетания можно заменять текстом. Для его ввода нажмите Ctrl + a и :, после чего вводите текст.

Например, чтобы создать новое окно, нажмите по очереди сочетание Ctrl + a и затем c. Для просмотра списка созданных окон нажмите Ctrl + a и w.

Список всех окон

Для перехода в любое из созданных окон сессии используется комбинация Ctrl + a и номер, который за ним закреплён, или Ctrl + a и ", после чего нужно выбрать стрелками необходимое. Для последовательного перехода используйте Ctrl + a и n (следующее окно) или p (предыдущее окно).

Список окон

Чтобы разделить экран по горизонтали, нажмите Ctrl + a и S. Например, для разделения окна по горизонтали напишите split.

screen Split

Будет создано новое окно снизу от текущего, и оно не становится активным. Чтобы разделить по вертикали, нажмите Ctrl + a и | (или введите split -v).

Вертикальный split

Были созданы новые пустые окна. Для переключения между ними используйте Ctrl + a и Tab (или напишите focus). Положение курсора указывает, какое окно является активным в данный момент. Для скрытия окна используйте Ctrl + a и X (или введите remove).

Чтобы запустить в новом окне терминал, нажмите Ctr + a и c (или наберите screen).

Новый терминал screen

Чтобы скрыть все окна и оставить только текущее, используйте Ctrl + a и Q (или напишите only).

Оставить одно окно

Переименовать окно можно с помощью Ctrl + a и A. Внизу появится строка с возможностью заменить старое название.

Переименовать

Чтобы скрыть все окна сессии, нажмите Ctrl + a и \. Подтвердите решение нажатием y. Для выхода из менеджера окон нажмите Ctrl + a и d.

Команда screen обладает большим набором горячих клавиш. Полный их список можно посмотреть с помощью Ctrl + a и ?.

Справка команд

При создании новой сессии screen можно задать ей имя. Таким образом можно создать несколько сессий. Чтобы сделать это, используйте параметр -S, после которого укажите название.

screen -S name-of-screen

Посмотреть список запущенных сессий можно командой

Список сессий

Строка, идентифицирующая сессию, состоит из нескольких полей: id, название и статус.

Значение id отображается в списке всех запущенных процессов. Это означает, что его можно завершить с помощью команды kill. Завершить работу текущего окна можно с помощью комбинации Ctrl+a и k; подтвердите решение нажатием y.

Статус может иметь два состояния: Attached (задействован) и Detached (незадействован). Второе состояние у сессий, в которых ещё не происходили никакие процессы.

Чтобы перейти в нужную сессию, следует указать параметру -r её id или название.

Это всё основные команды screen Linux.

Как пользоваться screen Linux

Теперь давайте рассмотрим, как пользоваться screen Linux более подробно.

Пример 1. Необходимо отслеживать изменения файла в реальном времени. Для этого в одном окне будем вносить изменения в новый файл, а в другом ­— отображать файл командой tail с опцией -f:

Отображение изменений в реальном времени

Пример 2. Необходимо отслеживать размер каталога в реальном времени. В одном окне записываем данные, в другом — отображаем, как изменяется размер домашнего каталога командой watch с задержкой в две секунды.

Watch

Выводы

Команда screen является эффективным инструментом для системного администрирования, особенно при работе с системой без среды рабочего стола. Имея один терминал, вы можете создавать несколько окон для обработки параллельных процессов без конфликтов между ними.

Продолжаем рассматривать настройки Linux Mint и давайте посмотрим что можно изменить в интерфейсе окон. Для этого выбираем модуль настроек «Окна» в Центре управления.

Здесь в первую очередь мы можем настроить вид переключения между окнами при нажатии сочетания клавиш Alt+Tab.

Настройка окон в Linux

По умолчанию появляется лента со значками программ, запущенных в отдельных окнах:

Лента запущенных программ

Но мы можем изменить вид отображения, например, на «Timeline 3D» и вместо ленты появится красивая анимация запущенных окон:

Анимация окон Timeline 3D

Посмотрите варианты и выберите наиболее понравившийся. Для того, чтобы переключить настройку достаточно ее выбрать из выпадающего списка. Никаких дополнительных кнопок нажимать не нужно, поэтому опробовать все варианты можно достаточно быстро и без лишних движений.

Настройка строки заголовка окна в Linux Mint

В первую очередь можем настроить кнопки, которые находятся в правой части строки заголовка. Мы их можем частично перенести в левую часть, поменять их очередность или добавить новые кнопки.

Например, выбрав «Меню» мы добавим кнопку, вызывающую выпадающее меню с некоторыми опциями.

Меню окон в Linux Mint

Мы можем закрепить окно на переднем плане и тогда оно всегда будет находится поверх других, даже когда не будет активным. Здесь есть еще несколько опций, относящихся к рабочему месту и о том, что это такое я расскажу чуть позже.

Далее идут настройки действий при определенных манипуляциях мышью. Думаю, вы помните, как в одном из прошлых видео я рассказывал, что двойной щелчок левой кнопкой мыши по строке заголовка приводит к разворачиванию окна на весь экран. Так вот сейчас вы это действие можете изменить по своему желанию, а также настроить и другие действия. Я также здесь все оставляю по умолчанию, так как мне эти значения привычны и удобны.

Далее идет настройка списка окон. Здесь все можно оставить как есть и речь здесь идет о рабочих местах или областях, о которых я обещал рассказать и сделаю это через минуту.

Фокус окна в Linux Mint

Поэкспериментируйте и вы увидите как изменяется подсветка окна, указывающая на его активность, но само окно при этом на передний план не помещается. Если установить сейчас галочку в пункте «Автоматически переключаться на окно, получившее фокус», то при наведении указателя мыши на неактивное окно, оно будет перемещаться на передний план. Не думаю, что это удобно и что в этом подразделе настроек нужно что-то изменять, в общем-то как и в последнем подразделе, отвечающем за перемещение или изменение размера окон. Здесь указывается клавиша, при нажатии которой можно перемещать окно или изменять его размеры.

Перемещение и изменение размеров окон в Линукс Минт

Не уверен, что кто-то этим пользуется, но по факту это позволяет перетаскивать окно не только захватив его за строку заголовка, но и за любую его область. Для этого нужно нажать клавишу, указанную здесь (по умолчанию это клавиша Alt) и перемещать окно, «ухватившись» левой кнопкой мыши за любую его область, при этом правая кнопка мыши с этой же клавишей позволит изменить размеры окна.

На этом с настройками окон заканчиваю и расскажу, как и обещал, о рабочих местах или виртуальных рабочих столах.

Для всего семейства операционный систем Линукс характерно наличие так называемых виртуальных рабочих столов. Для пользователей Windows это может показаться непривычным и непонятным, но на самом деле штука очень удобная. В Linux Mint виртуальные рабочие столы называют рабочими областями (Workspaces). По умолчанию их два, хотя это количество можно увеличить.

Конечно, тоже самое можно сделать и на одном рабочем столе, просто поискать значок программы в управляющей панели или воспользоваться сочетанием Alt+Tab, но все же виртуальный рабочий стол несколько удобнее, хотя это мое субъективное мнение и вы можете составить свое, опробовав эту возможность на деле.

Переключаться между рабочими областями можно с помощью комбинации клавиш Ctrl+Alt+Стрелка вправо/влево. Также в правой части управляющей панели есть кнопка «все окна», с помощью которой можно выбрать окно программы, расположенное на любом из доступных виртуальных рабочих столов.

Все окна в Linux

По сути эта кнопка является стандартным апплетом Windows Quick List и при желании вы можете поменять ее месторасположение на управляющей панели или совсем удалить. О том как это сделать я рассказал в прошлом видео.

Также хочу обратить ваше внимание на то, что ранее нами рассмотренное сочетание клавиш Alt+Tab позволяет переключаться между приложениями в одной рабочей области. Поэтому для выбора окна, расположенного на другом рабочем столе, стоит воспользоваться либо сочетанием Ctrl+Alt+Стрелка вправо/влево, либо кнопкой «Все окна», расположенной в панели управления.

Режим экспозиции рабочих областей Linux Mint

Здесь мы можем переименовать рабочие области или создать новую, щелкнув на плюс справа. Также тут мы можем и удалять созданные области, для этого при наведении указателя мыши на область в ее верхнем правом углу появляется «крестик».

Чтобы выйти из режима экспозиции достаточно выбрать рабочую область мышью или нажать сочетание клавиш Ctrl+Alt+Стрелка вниз. Кстати это же сочетание клавиш позволяет вам увидеть все запущенные в активной рабочей области окна, что можно использовать также как и сочетание Alt+Tab.

Все окна одной рабочей области в Linux Mint

Настройки рабочих областей в Линукс Минт

Так если вы создадите более двух рабочих областей и отмените опцию «Показывать экспозицию как сетку», то при переходе в режим экспозиции все рабочие области выстроятся в линию.

Режим экспозиции рабочих областей Линукс

Ну и в заключении вернемся к меню, появляющемся по умолчанию при щелчке правой кнопкой мыши по строке заголовка любого окна. Здесь есть два пункта, о которых я ранее не рассказал.

Меню окна в Линукс Минт

Первый пункт «Всегда на видимом рабочем месте» заставит данное окно перемещаться на другие рабочие столы вместе с вами. То есть вы будете переключаться между рабочими областями и окно будет следовать за вами.

Ну а пункт «Переместить на другое рабочее место» позволит переместить окно на другой виртуальный рабочий стол, который нужно выбрать из списка.


wmctrl — маленькая консольная утилита для управления оконным менеджером из командной строки.


wmctrl обеспечивает простой доступ к большинству функций оконных менеджеров, тем функциям что доступны с помощью мыши и клавиатуры. Например можно изменять размер и перемещать окна, отображать выбранное окно на переднем плане или выбранном рабочем столе, делать окна "липкими", получать информацию об объектах и выполнять другие операции.


Например, для получения списка открытых окон используется команда:

Получить список открытых окон с отображением PID-процесса и информацией о размере окна:

Сделать активным окно в названии которого есть слово "Докум":

Свернуть окно в названии которого есть слово 'caja':

Закрыть окно по его имени:

Изменить заголовок окна для окна выбранного курсором мыши:

Развернуть окно со словом GIMP в заголовке на полный экран:

Команда для перемещения указанного окна, с изменением его размера:

  • G - Притяжение окна к краям экрана (0 - как настроено в системе)
  • X - Координаты окна по оси X (от левого края окна) [-1 -не менять]
  • Y - Координаты окна по оси Y (от верхнего края окна) [-1 -не менять]
  • W - Высота окна в пикселах [-1 -не менять]
  • H - Ширина окна в пикселах [-1 -не менять]

Команда переместит окно файлового менеджера с открытым каталогом "Загрузки" в левый верхний угол, а размер окна станет 700x700 пикселей.


Обеспечиваемый wmctrl доступ к функциям управления окнами позволяет использовать утилиту для автоматизации выполнения заданных команд в ответ на события, встраивания в скрипты для интерактивного управления графическими окнами совместно с Zenity (GUI диалоги для скриптов) и пр.


wmctrl является NetWM / EWMH (Extended Window Manager Hints) совместимой, не требует наличия какого либо рабочего окружения и может использоваться с большинством оконных менеджеров (blackbox, icewm, kwin, metacity, openbox, fvwm, pekwm, enlightenment, fluxbox, sawfish, waimea, matchbox и пр. ).


Наверняка, у вас уже есть Linux Screen в вашей системе. В большинстве дистрибутивов Red Hat и CentOS вы можете найти Screen Linux в /usr/bin/ screen . Чтобы увидеть, находится ли там Screen , вы можете использовать следующую команду:

Если у вас нет Screen, то можете установить его из RPM или файла пакета для вашей системы. Например, на CentOS можно установить Screen с yum:

Поскольку вы, скорее всего, уже имеете Screen или можете использовать RPM, я не буду описывать установку Screen из ресурса. А расскажу, как использовать screen.

Запуск Screen Linux

Screen запускается с командной строки точно так же, как любая другая команда :

Теперь вы в окне в Screen. Оно функционирует точно так же, как нормальная оболочка за исключением нескольких специальных символов.

Команда управления

Создание окон

Такая комбинация, с настройками по умолчанию создаст новое окно. Ваше старое окно будет все еще активно.
Например, я могу выполнить top и затем открыть новое окно, чтобы заняться чем-то другим. Top остается рабочей! Чтобы попробовать, запустите screen, а затем выполните top. (Примечание: некоторые скрины у меня урезаны, чтобы оставить свободное место.)

top - 09 : 10 : 33 up 35 days , 17 : 26 , 1 user , load averag Tasks : 131 total , 1 running , 130 sleeping , 0 stoppe Cpu ( s ) : 0.4 % us , 0.2 % sy , 0.0 % ni , 99.4 % id , 0.0 % wa , 0 Mem : 12302040k total , 6363652k used , 5938388k free ,

Ваше главное окно все еще запущено. При необходимости, вы можете переключиться на него.

Переключение между окнами

Отсоединение от Screen

Экран позволяет отсоединяться от окна и вернуться к нему позже. Если сетевая связь прервется, то Screen автоматически отсоединит сеанс!

Все окна Screen все еще там, и вы можете повторно присоединиться к ним. Это удобно при использовании rsync для миграции сервера.

Повторное присоединение к Screen

Если Ваше соединение оборвалось или Вы отсоединились от Screen’а, Вы можете повторно подключиться, просто запуская:

Произойдёт повторное подключение к Вашему Screen. Однако, если у Вас есть несколько Screen’ов,то может получится это:

Если так, просто определите Screen, который хотите.

] $ screen - r 31844.pts - 0.office

Получение уведомлений

Screen может контролировать окно, его активность или бездействие. Данная функция необходима, если загружаете большие файлы, делаете компиляцию или ожидаете вывода.

Блокировка сеанса Screen

Screen used by root <jeffh>.
Password:

Остановка Screen

Когда вы закончили работу, я бы порекомендовал закончить сеанс вместо того, чтобы оставить его на потом. Чтобы остановить Screen, можете, как обычно, просто ввести «Exit» из своей оболочки. Это закроет Screen. Чтобы завершить сеанс вы должны закрыть все окна.

[screen is terminating]

Читайте также: