Devil's Pie
Первая моя более-менее полезная статья. В ней отражено мое тогдашнее увлечение настройкой линукса под себя. Сидел часами, пытаясь решить как банальные проблемы, которых в те времена было много, так и очень специфичные. Например, эта статья родилась из-за того, что Counter-Strike, запущенная через wine, в полноэкранном режиме работала не так, как мне нравилось: долго переключаться было на аську, и куб рабочих столов лагал. А в оконном режиме мешали заголовки окна. Другие примеры — тоже исправление того, что мне не нравилось.
Эту статью я изначально писал на хабр, но там она не вышла из песочницы и инвайт я не получил. Но я решил написать одному из администраторов русскоязычного сообщества Ubuntu, Malamut. И в итоге получилсь wiki-страница на help.ubuntu.ru, а я получил от Malamut инвайт на хабр.
Я потом еще написал две wiki-страницы: “Возвращаем кнопку переключения адресной строки Nautilus” и “как убрать индикатор раскладки клавиатуры”. Первая еще даже жива, а вторая сгинула. Но их ценность уже сомнительна, а эта — дорога как память.
…
Devil’s Pie — утилита, дополняющая возможности Metacity — стандартного менеджера окон среды GNOME. Как говорит ее разработчик, Ross Burton, на создание Devil’s Pie его вдохновила опция “Matched Windows” старого менеджера, SawFish, и недостаток функционала в Metacity.
Данная утилита позволяет применять к приложениям набор правил по некоторым шаблонам. Например, с ее помощью можно запустить любое приложение в свернутом состоянии, указать его местоположение на экране и номер рабочего стола, не показывать приложение в списке задач и т.п.
Правила #
Devil’s Pie работает с набором правил вида
(if a b c)
Здесь а — проверяемое условие, b — выполняемое действие, если условие выполнено, с — если условие не выполнено.
Правила надо хранить в текстовом файле с расширением .ds. Devil’s Pie по умолчанию загружает все такие файлы из папки ~/.devilspie. Создатель рекомендует хранить по одному правилу в файле, однако можно использовать объединение конструкций и хранить несколько правил в одном файле. Можно запускать Devil’s Pie, используя только определенные файлы правил, прописывая их в параметрах командной строки.
Условия #
В качестве условия может выступать одна из следующих конструкций:
(is a b)
Выполняется, когда строка а совпадает со строкой b.
(contains a b)
Выполняется, когда строка b является подстрокой a.
(matches a b)
Выполняется, когда строка а соотвествует регулярному выражению b. Пример:
(matches "ubuntu" "[bntu]{6}") — true
(matches "ubuntu" "[0-9]+") — false
Условия можно усложнять с помощью операторов and, or, not (используется префиксная нотация). Пример:
(or (and a (not b)) c d)
Выражение будет истинным, когда будут истинны либо c, либо d, либо одновременно a будет истинно и b — ложно.
Свойства окон #
В качестве проверяемых строк можно использовать следующие свойства окон:
window_name — заголовок.
window_role — роль, определенная в WM_WINDOW_ROLE.
application_name — имя приложения.
window_workspace — номер рабочего стола.
window_class — класс окна.
window_xid — XID.
window_property свойство — другие свойства.
Полный список возможных параметров можно посмотреть здесь: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html#id2511080
Действия #
Основные действия:
geometry — задает положение и размер окна.
В качестве аргумента используется строка X-GeometryString:
[<width>{xX}<height>][{+-}<xoffset>{+-}<yoffset>]
Пример:
(geometry "400x300+0-22")
fullscreen — перевод в полноэкранный режим.
maximize — развернуть на весь экран.
unmaximize — обратное действие.
minimize — свернуть.
unminimize — развернуть.
close — закрыть окно.
pin — поместить на всех рабочих столах.
set_workspace N — переместить на рабочий стол N.
skip_tasklist — не показывать окно в списке задач.
above — окно будет расположено поверх всех окон.
wintype тип — задает тип окна: "normal", "dialog", "menu", "toolbar", "splashscreen", "utility", "dock","desktop".
opacity N — задает прозрачность в процентах.
spawn_sync сommand — выполняет внешнюю команду.
Некоторые действия можно применить не ко всем типам окон, например диалоговые окна не принимают команду изменения размера. Обойти это ограничение можно с помощью команды wintype "normal"
.
Более полный набор действий можно посмотреть здесь: http://foosel.org/linux/devilspie.
Объединение действий #
Действия можно объединять с помощью конструкции
(begin a1 a2 ... an)
Также можно и объединять несколько правил в одном файле:
(begin
(if a b c)
(if d e f)
)
Примеры #
Прикрепить спикок контактов Gaim Buddylist ко всем рабочим столам с размером 340×630 пискелей и с положением x=4, y=150. #
(if
(and
(is (application_name) "gaim")
(is (window_name) "Buddy List")
)
(begin
(pin)
(geometry "340x630+4+150")
)
)
Переместить firefox на рабочий стол №2 и развернуть окно на весь экран #
(if
(is (application_name) "firefox-bin")
(begin
(set_workspace 2)
(maximize)
)
)
Закрыть окно KAlarm при запуске системы. #
Создаем в папке ~/.devilspie файл kalarm.ds:
(if
(is (window_name) "KAlarm" )
(begin
(close)
(spawn_sync "bash -c \"ps auxww| grep -E 'devilspie(.*)kalarm' | awk '{print \$2}'| xargs kill\"")
)
)
Добавляем в “Запускаемые приложения” команду
devilspie ~/.devilspie/kalarm.ds
Таким образом, как только Devil’s Pie видит окно KAlarm, он закрывает его (сворачивает в трей) и завершает свою работу.
Развернуть окно Counter-Strike, запущенного под wine, на весь экран. #
Создаем в папке ~/.devilspie файл cs.ds:
(if
(matches (window_name) "Counter-Strike")
(begin
(wintype "normal")
(fullscreen)
)
)
Добавляем в “Запускаемые приложения” команду
devilspie ~/.devilspie/cs.ds
Окно диалоговое, и просто так развернуть его во весь экран не получится. Поэтому начала ему назначаем тип. В отличие от первого случая, Devil’s Pie будет постоянно отслеживать окно и не будет завершаться после применения правила.
Ссылки #
Одна из самых подробнейших документаций по утилите на английском языке http://foosel.org/linux/devilspie
Сайт разработчика: http://www.burtonini.com/blog/computers/devilspie