Wmctrl linux что это

Wmctrl linux что это

wmctrl is controlled entirely by its command line arguments. The command line arguments are used to specify the action to be performed (with options that modify behavior) and any arguments that might be needed to perform the actions.

The following sections define the supported actions and options. Arguments to the actions and options are written in the form in the descriptions below. The detailed syntax for writing arguments are in a single section dedicated to that purpose.

ACTIONS

-a Switch to the desktop containing the window , raise the window, and give it focus.

-b ( add | remove | toggle), prop1 [, prop2 ] Add, remove, or toggle up to two window properties simultaneously. The window that is being modified must be identified with a -r action. The property change is achived by using the EWMH _NET_WM_STATE request. The supported property names (for prop1 and prop2 ) are modal , sticky , maximized_vert , maximized_horz , shaded , skip_taskbar , skip_pager , hidden , fullscreen , above and below . Two properties are supported to allow operations like maximizing a window to full screen mode. Note that this action is made up of exactly two shell command line arguments.

-c Close the window gracefully.

-d List all desktops managed by the window manager. One line is output for each desktop, with the line broken up into space separated columns. The first column contains an integer desktop number. The second column contains a ‘*’ character for the current desktop, otherwise it contains a ‘-‘ character. The next two columns contain the fixed string DG: and then the desktop geometry as ‘ x ‘ ( e.g. ‘1280×1024’). The following two columns contain the fixed string VP: and then the viewport position in the format ‘ , ‘ ( e.g. ‘0,0’). The next three columns after this contains the fixed string WA: and then two columns with the workarea geometry as ‘ X , Y and W x H ‘ ( e.g. ‘0,0 1280×998’). The rest of the line contains the name of the desktop (possibly containing multiple spaces).

-e Resize and move a window that has been specified with a -r action according to the argument.

-g w , h Change the geometry (common size) of all desktops so they are w pixels wide and h pixels high. w and h must be positive integers. A window manager may ignore this request.

-h Print help text about program usage.

-I name Set the icon name (short title) of the window specified by a -r action to name .

-k ( on | off ) Turn on or off the window manager’s «show the desktop» mode (if the window manager implements this feature).

-l List the windows being managed by the window manager. One line is output for each window, with the line broken up into space separated columns. The first column always contains the window identity as a hexadecimal integer, and the second column always contains the desktop number (a -1 is used to identify a sticky window). If the -p option is specified the next column will contain the PID for the window as a decimal integer. If the -G option is specified then four integer columns will follow: x-offset, y-offset, width and height. The next column always contains the client machine name. The remainder of the line contains the window title (possibly with multiple spaces in the title).

-m Display information about the window manager and the environment.

-n N Change the number of desktops to N (a non-negative integer).

-N name Set the name (long title) of the window specified by a -r action to name .

-o x , y Change the viewport for the current desktop. The values x and y are numeric offsets that specify the position of the top left corner of the viewport. A window manager may ignore this request.

-r Specify a target window for an action.

-R Move the window to the current desktop, raise the window, and give it focus.

-s Switch to the desktop .

-t Move a window that has been specified with the -r action to the desktop .

-T name Set the both the name (long title) and icon name (short title) of the window specified by a -r action to name . This action is like using the -N and -I actions at the same time (which would otherwise be impossible since wmctrl can execute only one action at a time).

OPTIONS

-F Window name arguments ( ) are to be treated as exact window titles that are case sensitive. Without this options window titles are considered to be case insensitive substrings of the full window title.

-G Include geometry information in the output of the -l action.

-i Interpret window arguments ( ) as a numeric value rather than a string name for the window. If the numeric value starts with the prefix ‘0x’ it is assumed to be a hexadecimal number.

-p Include PIDs in the window list printed by the -l action. Prints a PID of ‘0’ if the application owning the window does not support it.

Читайте также:  Какие геймпады подходят для windows 10

-u Override auto-detection and force UTF-8 mode.

-v Provide verbose output. This is really useful when debugging wmctrl itself.

-w [ [, ]. ] Use workarounds specified in the argument.

-x Include WM_CLASS in the window list or interpret as the WM_CLASS name.

ARGUMENTS

A Desktop is always specified by an integer which represents the desktop numbers. Desktop numbers start at 0.

A move and resize argument has the format ‘ g , x , y, w , h ‘. All five components are integers. The first value, g , is the gravity of the window, with 0 being the most common value (the default value for the window). Please see the EWMH specification for other values. The four remaining values are a standard geometry specification: x , y is the position of the top left corner of the window, and w , h is the width and height of the window, with the exception that the value of -1 in any position is interpreted to mean that the current geometry value should not be modified.

This argument specifies a window that is the target of an action. By default the argument is treated as if were a string, and windows are examined until one is found with a title the contains the specified string as a substring. The substring matching is done in a case insensitive manner. The -F option may be used to force exact, case sensitive title matching. The option -i may be used to interpret the window target as a numeric window identity instead of a string. The window name string :SELECT: is treated specially. If this window name is used then wmctrl waits for the user to select the target window by clicking on it. The window name string :ACTIVE: may be used to instruct wmctrl to use the currently active window for the action.

There is only one work around currently implemeted. It is specified by using the string DESKTOP_TITLES_INVALID_UTF8 and it causes the printing of non-ASCII desktop tiles correctly when using Window Maker.

EXAMPLES

Getting a list of windows managed by the window manager wmctrl -l

Getting a list of windows with PID and geometry information. wmctrl -p -G -l

Going to the window with a name containing ’emacs’ in it wmctrl -a emacs

Shade a window with a title that contains the word ‘mozilla’ wmctrl -r mozilla -b add,shaded

Close a very specifically titled window sticky wmctrl -F -c ‘Debian bug tracking system — Mozilla’

Toggle the ‘stickiness’ of a window with a specific window identity wmctrl -i -r 0x0120002 -b add,sticky

Change the title of window to a specified string but choose the window by clicking on it wmctrl -r :SELECT: -T «Selected Window»

SEE ALSO

Some examples of EWMH/NetWM compatible window managers include recent versions of Enlightenment, Icewm, Kwin, Sawfish and Xfce.

AUTHOR

This manual page was written by Shyamal Prasad for the Debian project (but may be used by others).

Источник

Альтернативное управление окнами в Linux

Я из тех, кто ставит на Caps Lock переключение раскладки потому, что лень нажимать 2 клавиши, когда можно нажимать одну. Я бы даже хотел 2 ненужные клавиши: одну бы я использовал для включения английской раскладки, а вторую для русской. Но вторая ненужная клавиша — это вызов контекстного меню, которая настолько ненужная, что выпиливается многими производителями ноутбуков. Так что приходится довольствоваться тем, что есть.

А ещё я не хочу при переключении окон искать их иконки на панели задач, ловить взглядом названия при листании через Alt+Tab, листать рабочие столы и т. д. Я хочу нажать комбинацию клавиш (в идеале вообще одну, но свободных ненужных клавиш уже нет) и сразу попасть в нужное мне окно. Например так:

  • Alt+F: Firefox
  • Alt+D: Firefox (Private Browsing)
  • Alt+T: Terminal
  • Alt+M: Калькулятор
  • Alt+E: IntelliJ Idea
  • и т. д.

Причём, по нажатию, например, на Alt+M я хочу видеть калькулятор вне зависимости от того, запущена ли в данный момент эта программа. Если запущена, то её окну надо передать фокус, а если нет — запустить нужную программу и передать фокус когда она загрузится.

На случаи, которые не покрываются предыдущим сценарием, я хочу иметь универсальные комбинации клавиш, на которые можно легко назначить любые из открытых окон. Например, у меня назначены 10 комбинаций от Alt+1 до Alt+0, которые не привязанные ни к каким программам. Я могу просто нажать Alt+1 и окно, которое сейчас в фокусе, будет получать фокус при нажатии Alt+1.

Под катом описание ещё пары фич и ответ на то, как можно это сделать. Но сразу предупрежу, что подобная кастомизация «под себя» может вызвать сильную зависимость и даже ломку при необходимости использовать Windows, Mac OS или даже чужой компьютер с Linux.

На самом деле, если подумать, то мы не так много программ используем повседневно. Браузер, терминал, IDE, какой-то мессенджер, файловый менеджер, калькулятор и, пожалуй, это практически всё. Нужно не так много комбинаций клавиш, чтобы покрыть 95% повседневных задач.

Для программ, у которых открыто несколько окон, одно из них можно назначить главным. Например, открыто несколько окон IntelliJ Idea, назначенных на Alt+E. В обычных условиях при нажатии на Alt+E будет открываться какое-то окно данной программы, скорее всего то, которое было открыто первым. Однако, если нажать на Alt+E когда одно из окон данной программы уже в фокусе, то именно это окно будет назначено главным и именно ему будет передаваться фокус при последующих нажатиях комбинации.

Читайте также:  Установит убунту рядом с windows

Главное окно можно переназначить. Для этого комбинацию нужно сначала сбросить, а потом назначить на неё главным другое окно. Для сброса комбинации нужно нажать саму комбинацию, а потом специальную комбинацию сброса, у меня она назначена на Alt+Backspace. Это вызовет скрипт, который отменит назначение главного окна для предыдущей комбинации. А далее можно назначить новое главное окно как это было описано в предыдущем абзаце. Сброс привязанного окна к универсальным комбинациям происходит аналогично.

Вступление получилось длинным, но хотелось сначала рассказать что будем делать, а потом объяснить как делать.

Для тех, кому надоело читать

Если коротко, то ссылка на скрипты в конце статьи.

Но все равно сразу установить и пользоваться не получится. Придётся сначала разобраться как скрипт находит нужное окно. Без этого не получится указать скрипту куда именно нужно передать фокус. И нужно понять что делать, если вдруг подходящего окна не нашлось.

А ещё я не буду заострять внимание на том, как настраивать выполнение скриптов по нажатию комбинаций клавиш. Например, в KDE это в System Settings → Shortcuts → Custom Shortcuts. В других оконных менеджерах такое тоже должно быть.

Знакомство с wmctrl

Wmctrl — консольная утилита для взаимодействия с X Window Manager. Это ключевая программа для скрипта. Давайте бегло глянем на то, как ей можно пользоваться.

Для начала выведем список открытых окон:

Опция -l выводит список всех открытых окон, а добавляет к выводу название класса (skype.Skype, Navigator.Firefox и т.д). Нам тут понадобится id окна (колонка 1), имя класса (колонка 3) и название окна (последняя колонка).

Можно попробовать активировать какое-то окно с помощью опции -a:

Если все пошло по плану, то на экране должно появиться окно Skype. Если вместо опции -x использовать опцию -i, то вместо имени класса можно будет указать id окна. С id проблема в том, что id окна меняется при каждом запуске приложения и мы не можем знать его заранее. С другой стороны, этот атрибут однозначно указывает на окно, что может быть важно, когда приложение открывает больше одного окна. Об этом чуть дальше.

На этом этапе нам надо запомнить, что мы будем искать нужное окно с помощью regex по выводу wmctrl -lx. Но это не значит, что нам обязательно использовать что-то сложное. Обычно достаточно имени класса или названия окна.

В принципе, основная идея уже должна быть ясна. В настройках глобальных hotkeys/shortcuts для вашего оконного менеджера настраиваем нужную комбинацию на выполнение скрипта.

Как пользоваться скриптами

Для начала надо установить консольные утилиты wmctrl и xdotool:

Дальше надо скачать скрипты и добавить их в $PATH. Я обычно кладу их в

/bin не было, то его надо создать и перезагрузиться (или перелогиниться), иначе

/bin не попадёт в $PATH. Если всё сделано правильно, то скрипты должны быть доступны из консоли и должно работать автодополнение по Tab.

Основной скрипт showwin принимает 2 параметра: первый это regex, по которому мы будем искать нужное окно, а второй параметр это команда, которую нужно выполнить, если нужного окна не нашлось.

Можно попробовать выполнить скрипт, например:

Если Firefox установлен, то его окну должен быть передан фокус. Даже если Firefox не был запущен, он должен был запуститься.

Если получилось, то можно попробовать настроить выполнение команд на комбинации. В настройках глобальных hotkeys/shortcuts добавляем:

  • Alt+F: showwin «Mozilla Firefox$» firefox
  • Alt+D: showwin «Mozilla Firefox (Private Browsing)$» «firefox -private-window»
  • Alt+C: showwin «chromium-browser.Chromium-browser N*» chromium-browser
  • Alt+X: showwin «chromium-browser.Chromium-browser I*» «chromium-browser -incognito»
  • Alt+S: showwin «skype.Skype» skypeforlinux
  • Alt+E: showwin «jetbrains-idea» idea.sh

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

Разочарую любителей хрома: обычное окно он инкогнито отличить по выводу wmctrl нельзя, у них одинаковые названия классов и заголовки окна. В предложенных regex символы N* и I* необходимы только для того, чтобы эти регулярки отличались друг от друга и им можно было назначить главными разные окна.

Для сброса главного окна предыдущей комбинации (по факту для regex, которым showwin вызывался в последний раз) нужно вызвать скрипт showwinDetach. У меня этот скрипт назначен на комбинацию клавиш Alt+Backspace.

У скрипта showwin есть ещё одна функция. Когда он вызывается с одним параметром (в данном случае параметр является просто идентификатором), то он вообще не проверяет regex, а все окна считает подходящими. Само по себе это кажется бесполезным, однако таким образом мы можем назначить любое окно главным и быстро переключаться именно к этому окну.

У меня настроены такие комбинации:

  • Alt+1: showwin «CustomKey1»
  • Alt+2: showwin «CustomKey2»
  • Alt+0: showwin «CustomKey0»
  • Alt+Backspace: showwinDetach

Таким образом я могу привязать любые окна к комбинациям Alt+1. Alt+0. Просто нажав Alt+1 я привязываю текущее окно к этой комбинации. Отменить привязку могу нажав Alt+1, а затем Alt+Backspace. Или закрыть окно, так тоже работает.

Дальше я расскажу немного технических деталей. Их можно не читать, а просто попробовать настроить и посмотреть. Но я бы всё-таки рекомендовал разобраться в чужих скриптах прежде, чем запускать их у себя на компьютере :).

Как различать разные окна одного приложения

В принципе, самый первый пример «wmctrl -a skype.Skype -x» был рабочий и его можно использовать. Но давайте ещё раз глянем на пример с Firefox, в котором открыты 2 окна:

Читайте также:  Смена комбинации клавиш для переключения языка windows 10

Первое окно — обычный режим, а второе — Private Browsing. Эти окна хотелось бы считать разными приложениями и переключаться в них по разным комбинациям клавиш.

Нужно усложнить скрипт, переключающий окна. Я использовал такое решение: вывести список всех окон, сделать grep по regex, взять первую строку с помощью head, достать первую колонку (это будет id окна) с помощью cut, переключить на окно по id.

Тут должна быть шутка про регулярные выражения и две проблемы, но по факту я не использую ничего сложного. Регулярки мне нужны для того, чтобы можно было указать конец строки (символ «$») и отличать «Mozilla Firefox$» от «Mozilla Firefox (Private Browsing)$».

Команда выглядит примерно так:

Тут уже можно догадаться про вторую особенность скрипта: если grep ничего не выдал, значит нужное приложение не открыто и его нужно запустить, выполнив команду из второго параметра. А потом периодически проверять не открылось ли нужное окно, чтобы передать ему фокус. Не буду заострять на этом внимание, кому надо, тот посмотрит исходники.

Когда окна приложения не различимы

Итак, мы научились передавать фокус окну нужного приложения. Но что, если отрыто больше одного окна у приложения? К какому из них передавать фокус? Скрипт выше передаст, скорее всего, первому открытому окну. Однако, мы бы хотели большей гибкости. Хотелось бы иметь возможность запомнить какое именно окно нам нужно и переключаться именно к этому окну.

Идея была такая: Если мы хотим запомнить для комбинации клавиш какое-то определённое окно, то нужно нажать эту комбинацию тогда, когда нужное окно в фокусе. В дальнейшем при нажатии этой комбинации фокус будет отдаваться именно этому окну. Пока окно не закроется или мы не сделаем сброс для этой комбинации скрипта showwinDetach.

Алгоритм скрипта showwin примерно такой:

  • Проверить, не запомнили ли мы раньше id окна, которому надо передать фокус.
    Если запомнили и такое окно все ещё существует, то передаём фокус ему и выходим.
  • Смотрим какое окно сейчас в фокусе, и если оно подходит под наш запрос, то запомним его id для перехода к нему в дальнейшем и выходим.
  • Переходим хоть к какому-то подходящему окну если оно существует или открываем нужное приложение.

Узнать какое окно сейчас в фокусе можно с помощью консольной утилиты xdotool, преобразовав её вывод в шестнадцатеричный формат:

Что-то запоминать в bash проще всего создавая файлы в виртуальной файловой системе, находящейся в памяти. В Ubuntu такая подключена по умолчанию в /dev/shm/. Про другие дистрибутивы ничего не могу сказать, надеюсь, что подобное тоже есть. Можно посмотреть командой:

Скрипт будет создавать пустые директории в этой папке, вот такие: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Дополнительно при каждом вызове он будет создавать symlink /dev/shm/$USER/showwin/showwin_last на /dev/shm/$USER/showwin/$SEARCH_REGEX. Это понадобится для того, чтобы при необходимости удалить id окна для определённой комбинации с помощью скрипта showwinDetach.

Что можно улучшить

Во-первых скрипты надо настраивать руками. Наверняка, из-за необходимости вникать и делать много руками, многие из вас даже не попробуют настроить систему. Если бы была возможность просто поставить пакет и настроить все проще, то, возможно, это бы обрело некоторую популярность. А там гляди и в стандартные дистрибутивы запилили бы приложение.

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

Другая проблема, как я уже писал, в том, что в некоторых случаях окна нельзя отличить одно от другого. Я пока наблюдал такое только с incognito в chrome/chromium, но, возможно, где-то ещё есть подобное. В крайнем случае, всегда есть вариант универсальных комбинаций Alt+1. Alt+0. Опять же, я использую Firefox и лично для меня эта проблема не существенна.

А вот существенная для меня проблема в том, что по работе я использую Mac OS и там ничего подобного я настроить не смог. Утилиту wmctrl поставить вроде бы смог, но она на Mac OS толком не работает. Что-то можно сделать с приложением Automator, но оно так тормозит, что пользоваться им не удобно даже когда оно работает. Настроить комбинации клавиш так, чтобы они работали во всех программах я тоже не смог. Если вдруг кто-то придумает решение — буду рад им пользоваться.

Вместо заключения

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

Я немного рассказал о том, что под капотом скрипта и как его настроить. В подробности самого скрипта не вдавался, но он всего 50 строк, разобраться не сложно.

Надеюсь, что кто-то ещё эту идею опробует и, возможно, даже оценит. Про себя могу сказать, что скрипт был написан года 3 назад и мне это ОЧЕНЬ удобно. Настолько удобно, что вызывает серьёзный дискомфорт при работе с чужими компьютерами. И с рабочим макбуком.

Источник

Оцените статью