(используя метод, предложенный @Suchipi):

(используя метод, предложенный @Suchipi):

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

<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 симликов для 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более хитрой: во-первых, использование 100%для разрешения не работает, т.е. окно исчезает (я его не вижу). При использовании статики:

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

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

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

ОБНОВЛЕНИЕ 2019-12-07:

Итак, я сейчас пытаюсь настроить ту же систему на Debian Buster (Openbox 3.6) и у меня возникла новая проблема. Я подозреваю, что в новой версии openbox изменилось какое-то свойство.

Вроде бы все как прежде, т.е.:

terminator-wallpaper-1a --profile wallpaper -b &
terminator-wallpaper-1b --profile wallpaper -b &
xdotool search --class 'Terminator-wallpaper-1a' windowunmap --sync windowmap windowsize %1 1920 1180 
xdotool search --class 'Terminator-wallpaper-1b' windowunmap --sync windowmap windowsize %1 1920 1180

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

Ранее в более старой версии Openbox этой проблемы не было.

Как я могу решить эту проблему?

решение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для отмены отображения и повторного отображения окна (в терминологии X11 это означает, что мы остановим рисование и начнем рисовать окно), что должно заставить openbox заметить значение.

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

sudo apt-get install xdotool

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

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

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

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

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

решение2

Я придумал следующий скрипт, который, похоже, решает ваши проблемы.

#!/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-wallpaperwith xdotools, и изменяет его _NET_WM_WINDOW_TYPEна _NET_WM_WINDOW_TYPE_DESKTOPwith xprop.

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

Того же результата можно добиться, devilspieесли добавить

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

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

решение3

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

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

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

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

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

Связанный контент