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