%3A.png)
У меня есть сочетание клавиш для 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-wallpaper
with xdotools
, и изменяет его _NET_WM_WINDOW_TYPE
на _NET_WM_WINDOW_TYPE_DESKTOP
with 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 на вышеупомянутый скрипт-оболочку
Это может показаться грязным трюком, но он работает.