настройте ToggleShowDesktop в Openbox, чтобы действовать только на указанном уровне

У меня есть keybinding для ToggleShowDesktop . Когда я нажимаю « Меню» , все окна сводятся к минимуму, и я вижу свои обои для рабочего стола (как и ожидалось):

 <keybind key="Menu"> <action name="ToggleShowDesktop"/> </keybind> 

Теперь проблема в том, что я не хочу видеть обои. Я использую terminator качестве обоев, т. Е. Когда я запускаю terminator , он помещается на слой ниже:

 <application name="terminator"> <focus>yes</focus> <layer>below</layer> <desktop>1</desktop> <position> <y>0</y> <x>0</x> </position> <skip_taskbar>yes</skip_taskbar> <maximized>true</maximized> </application> 

Можно ли настроить ToggleShowDesktop так, чтобы он оставил слой «ниже» незатронутым? т.е. я хочу, чтобы только обычные окна были сведены к минимуму, но не terminator . Другими словами, я хочу, чтобы терминатор вел себя как нормальные обои, не будет затронут ToggleShowDesktop .

Я использую Debian Wheezy с LXDE .

ОБНОВЛЕНИЕ (используя метод, предложенный @Suchipi):

Я оставил несколько деталей из моего первоначального вопроса, и теперь эти данные, похоже, актуальны в конце концов:

Моя установка имеет 2 монитора и 4 виртуальных рабочих стола. Поэтому у меня есть «8 обоев» для заполнения terminator . Из того, что я прочитал ранее, я предположил, что эти 8 окон должны быть различимы, поэтому я создал 8 symliks для terminator , .ie:

 /usr/bin/terminator-wallpaper-1a -> terminator /usr/bin/terminator-wallpaper-1b -> terminator /usr/bin/terminator-wallpaper-2a -> terminator ... 

Фактически создано 8 разных приложений (с разными именами).

Аналогично, в .config/openbox/lxde-rc.xml у меня нет 1, но 8 определений:

 <application name="terminator-wallpaper-1a"> <desktop>1</desktop> <position> <monitor>1</monitor> </position> ... </application> <application name="terminator-wallpaper-1b"> <desktop>1</desktop> <position> <monitor>2</monitor> </position> ... </application> <application name="terminator-wallpaper-2a"> <desktop>2</desktop> <position> <monitor>1</monitor> </position> ... </application> 

И, наконец, в /.config/autostart меня есть файлы 8 *.desktop , которые должны запускаться автоматически после входа в систему:

 /.config/autostar/terminator-wallpaper-1a.desktop /.config/autostar/terminator-wallpaper-1b.desktop /.config/autostar/terminator-wallpaper-2a.desktop 

Это кажется мне спокойным и сложным, но я не видел лучшего способа сделать это.

Теперь, когда я следую инструкциям от @Suchipi, происходит следующее:

1) часть с devilspie работает нормально. Оказывается, мне нужно только одно определение, которое охватывает все мои 8 окон (подставляя matches для is ):

 $ cat .devilspie/terminator.ds (if (matches (application_name) "terminator-wallpaper") (begin (wintype "desktop") ) ) 

И я вижу с obxprop что он работает так, как ожидалось.

 $ obxprop | egrep '(_OB_APP|_NET_WM_WINDOW_TYPE)' _OB_APP_TYPE(UTF8_STRING) = "normal" _OB_APP_TITLE(UTF8_STRING) = "None" _OB_APP_CLASS(UTF8_STRING) = "Terminator-wallpaper-1" _OB_APP_NAME(UTF8_STRING) = "terminator-wallpaper-1" _OB_APP_ROLE(UTF8_STRING) = _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP 

2) теперь часть с xdotool более xdotool : прежде всего, использование 100% для разрешения не работает, т.е. окно исчезает (я не вижу его). При использовании static:

 xdotool search --class "Terminator-wallpaper-1a" windowunmap --sync windowmap windowsize %1 1920 1056 

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

 xdotool search --class "Terminator-wallpaper-2a" windowunmap --sync windowmap windowsize %1 1920 1056 

UPDATE2:

На самом деле, он работает и для других настольных компьютеров, но только если я запустил команду xdotool на конкретном рабочем столе, на что я хочу повлиять. т.е. я должен переключиться на рабочий стол 2 и запустить xdotool search --class "Terminator-wallpaper-2a" а затем он работает.

Кроме того, мне было интересно, будет ли windowsize %1 играть здесь какую-либо роль.

Openbox предоставит вам функциональность, для которой свойство _OB_APP_TYPE установлено на «рабочий стол» (вы можете использовать obxprop для проверки свойств окна). Поэтому нам нужно установить _OB_APP_TYPE для вашего окна терминатора на «рабочий стол», чтобы это произошло.

Прочитав исходный код openbox, в client.c я увидел, что _OB_APP_TYPE унаследован от _NET_WM_WINDOW_TYPE . Поэтому я искал приложение, которое могло бы изменить _NET_WM_WINDOW_TYPE . Приложение, которое я нашел, называется devilspie .

Сначала установите:

 sudo apt-get install devilspie 

Затем мы создадим папку для конфигурационных файлов devilspie :

 mkdir ~/.devilspie 

Теперь мы добавим конфигурационный файл, который сообщает devilspie искать приложения с именем terminator и задавать тип окна их на desktop . Поместите следующее в ~/.devilspie/terminator.ds :

 (if (is (application_name) "terminator") (begin (wintype "desktop") ) ) 

Теперь, если вы запустите devilspie (или devilspie -a чтобы повлиять на существующие окна вместо недавно созданных), вы заметите, что вы используете obxprop на терминаторе, который изменил _NET_WM_WINDOW_TYPE , но _OB_APP_TYPE еще нет. Давайте используем xdotool чтобы xdotool и xdotool окно (в терминологии X11 это означает, что мы прекратим рисование и начнем рисовать окно), что должно заставить openbox заметить значение.

Установите xdotool:

 sudo apt-get install xdotool 

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

 xdotool search --class "terminator" windowunmap --sync windowmap windowsize %1 1024 768 

Замените 1024 768 своим разрешением. Также обратите внимание, что более новые версии xdotool чем те, которые найдены в поддержке apt repo от Debian, используют 100% 100% вместо статического разрешения. Вы можете найти пакеты .deb для новых версий xdotool на странице googlecode xdotool.

Окно терминатора сразу же станет непривязанным, и если вы теперь используете obxprop , вы увидите, что оба значения установлены правильно. Если вы сейчас нажмете клавишу, с которой вы связали ToggleShowDesktop несколько раз, окно терминатора всегда будет оставаться активным.

Чтобы сделать это постоянным, вы захотите запустить эти команды при входе в систему. Страница LXDE Wiki для LXSession показывает несколько разных способов сделать это (глобальный, для каждого пользователя, для каждого профиля и т. Д.). Предполагая, что вы хотите использовать эти настройки только для своего пользователя и в профиле LXDE (по умолчанию), вам необходимо отредактировать ~/.config/lxsession/LXDE/autostart и добавить команды, которые мы выполнили, имея в виду, что команда xdotool нуждается в для запуска после того, как окно терминатора было отображено, так что сделайте что-то вроде (sleep 1s & xdotool ...) . Вы также можете установить эти команды в качестве клавишных в openbox, если хотите.

Я придумал следующий сценарий, который выглядит так, как будто он решает ваши проблемы.

 #!/bin/sh make_wid_desktop_app() { # set the type of the window to xprop -id $1 -f _NET_WM_WINDOW_TYPE 32a -set _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_DESKTOP xprop -id $1 -f _MOTIF_WM_HINTS 32c -set _MOTIF_WM_HINTS 0 xprop -id $1 -remove _MOTIF_WM_HINTS } get_wids() { xdotool search --class $1 } for id in $(get_wids $1); do make_wid_desktop_app $id; done 

Вы можете использовать его так.

 desktop_terminal terminator-wallpaper 

Он ищет все окна, у которых есть класс terminator-wallpaper с xdotools и измените там _NET_WM_WINDOW_TYPE на _NET_WM_WINDOW_TYPE_DESKTOP с помощью xprop .

Поскольку Openbox не проверяет, был ли этот тип изменен после создания окна, нам нужно обмануть Openbox для этого. Это делается путем установки _MOTIF_WM_HINTS и их удаления.

То же самое можно достичь с помощью devilspie когда вы добавляете

 (if (matches (application_name) "terminator-wallpaper") (begin (wintype "desktop") (undecorate) ) ) 

так как установка окна (undecorate) также использует трюк _MOTIF_WM_HINTS .

Если я правильно ToggleShowDesktop вопрос, тогда ваш вопрос будет таким: всякий раз, когда вы нажимаете ToggleShowDesktop вы хотите, чтобы все открытое приложение было минимизировано, кроме terminator .

Если это так, вы можете достичь этого, написав сценарий оболочки, который будет внутренне вызывать две команды

 #!/bin/sh xdotool key "super+d" wmctrl -a "terminator" 

Замените фактический бинарный файл / скрипт ToggleShowDesktop на вышеупомянутый сценарий оболочки

Это может показаться грязным взломом, но оно работает.