%3A.png)
Ich habe eine Tastenkombination für ToggleShowDesktop
. Wenn ich drücke Menu, werden alle Fenster minimiert und ich sehe (wie erwartet) mein Desktop-Hintergrundbild:
<keybind key="Menu">
<action name="ToggleShowDesktop"/>
</keybind>
Jetzt besteht das Problem darin, dass ich mein Hintergrundbild nicht sehen möchte. Ich verwende terminator
als Hintergrundbild, d. h. wenn ich starte terminator
, wird es auf der Ebene darunter platziert:
<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>
Ist es möglich, die Konfiguration so vorzunehmen ToggleShowDesktop
, dass die Ebene „darunter“ unberührt bleibt? Ich möchte also, dass nur die normalen Fenster minimiert werden, aber nicht terminator
. Mit anderen Worten, ich möchte, dass sich Terminator wie ein normales Hintergrundbild verhält – also unberührt von ToggleShowDesktop
.
Ich verwende Debian Wheezy
mit LXDE
.
(mit der von @Suchipi vorgeschlagenen Methode):
Ich habe einige Details meiner ursprünglichen Frage ausgelassen, und nun scheinen diese Details doch relevant zu sein:
Mein Setup hat 2 Monitore und 4 virtuelle Desktops. Ich habe also „8 Hintergrundbilder“, die ich füllen muss terminator
. Aus dem, was ich zuvor gelesen habe, bin ich davon ausgegangen, dass diese 8 Fenster unterscheidbar sein müssen, also habe ich 8 Symliks erstellt terminator
, z. B.:
/usr/bin/terminator-wallpaper-1a -> terminator
/usr/bin/terminator-wallpaper-1b -> terminator
/usr/bin/terminator-wallpaper-2a -> terminator
...
Tatsächlich wurden 8 verschiedene Anwendungen (mit unterschiedlichen Namen) erstellt.
Ebenso .config/openbox/lxde-rc.xml
habe ich in nicht 1, sondern 8 Definitionen:
<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>
Und zuletzt /.config/autostart
habe ich 8 *.desktop
Dateien, die nach der Anmeldung automatisch gestartet werden sollen:
/.config/autostar/terminator-wallpaper-1a.desktop
/.config/autostar/terminator-wallpaper-1b.desktop
/.config/autostar/terminator-wallpaper-2a.desktop
Das erscheint mir ziemlich kompliziert und unelegant, aber ich sehe keine bessere Möglichkeit, es zu machen.
Wenn ich jetzt den Anweisungen von @Suchipi folge, passiert Folgendes:
1) Der Teil mit devilspie
funktioniert einwandfrei. Es stellt sich heraus, dass ich nur eine Definition brauche, die alle meine 8 Fenster abdeckt (als Ersatz matches
für is
):
$ cat .devilspie/terminator.ds
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
)
)
Und ich sehe, obxprop
dass es wie erwartet funktioniert.
$ 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) jetzt ist der Teil mit xdotool
etwas kniffliger: Erstens 100%
funktioniert die Verwendung von für die Auflösung nicht, d. h. das Fenster verschwindet (ich sehe es nicht). Bei Verwendung von static:
xdotool search --class "Terminator-wallpaper-1a" windowunmap --sync windowmap windowsize %1 1920 1056
dies funktioniert für Desktop 1, Monitor 1. Aber wenn ich es für andere Desktops ausführe, hat es keine Wirkung, z. B.:
xdotool search --class "Terminator-wallpaper-2a" windowunmap --sync windowmap windowsize %1 1920 1056
Eigentlich funktioniert es auch bei anderen Desktops, allerdings nur, wenn ich den xdotool
Befehl auf dem konkreten Desktop ausführe, auf den ich Einfluss nehmen möchte. D. h. ich muss zum Desktop wechseln 2
und ausführen xdotool search --class "Terminator-wallpaper-2a"
, und dann funktioniert es.
Außerdem habe ich mich gefragt, ob das windowsize %1
hier eine Rolle spielt.
UPDATE 07.12.2019:
also, ich versuche jetzt, dasselbe System auf Debian Buster (Openbox 3.6) einzurichten und habe ein neues Problem. Ich vermute, dass sich in der neuen Version von Openbox einige Eigenschaften geändert haben.
Alles scheint wie vorher, d.h.:
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
Ich bekomme zwei Terminals als Hintergrundbild. Das Problem ist jedoch, dass nur eines dieser Terminals tatsächlich nutzbar ist. Das andere ist „unfokussiert“ und selbst wenn ich mit der Maus darauf klicke, kann ich es nicht in den Fokus bringen. Das heißt, ich kann das Terminal sehen, aber nichts darin eingeben.
Dieses Problem gab es vorher nicht, in älteren Openbox-Versionen
Wie kann ich dieses Problem beheben?
Antwort1
Openbox bietet die von Ihnen gesuchte Funktionalität für Fenster, deren _OB_APP_TYPE
Eigenschaft auf „Desktop“ eingestellt ist (Sie können obxprop
die Eigenschaften eines Fensters überprüfen). Wir müssen also _OB_APP_TYPE
für Ihr Terminatorfenster „Desktop“ einstellen, damit dies geschieht.
Beim Durchlesen des Openbox-Quellcodes client.c
konnte ich sehen, dass _OB_APP_TYPE
von geerbt wurde _NET_WM_WINDOW_TYPE
. Also suchte ich nach einer Anwendung, die ändern könnte _NET_WM_WINDOW_TYPE
. Die Anwendung, die ich gefunden habe, heißt devilspie
.
Installieren Sie es zunächst:
sudo apt-get install devilspie
Als nächstes erstellen wir den Ordner für devilspie
Konfigurationsdateien:
mkdir ~/.devilspie
Nun fügen wir eine Konfigurationsdatei hinzu, die anweist, devilspie
nach Anwendungen mit dem Namen zu suchen terminator
und deren Fenstertyp auf einzustellen desktop
. Tragen Sie Folgendes in ein ~/.devilspie/terminator.ds
:
(if
(is (application_name) "terminator")
(begin
(wintype "desktop")
)
)
Wenn Sie jetzt ausführen devilspie
(oder devilspie -a
vorhandene Fenster beeinflussen möchten, anstatt nur neu erstellte), werden Sie feststellen, ob Sie obxprop
einen Terminator verwenden, der _NET_WM_WINDOW_TYPE
sich geändert hat, aber _OB_APP_TYPE
noch nicht geändert wurde. Lassen Sie uns verwenden, xdotool
um die Zuordnung des Fensters aufzuheben und neu zuzuordnen (in der X11-Terminologie bedeutet dies, dass wir mit dem Zeichnen aufhören und mit dem Zeichnen des Fensters beginnen), wodurch Openbox gezwungen werden sollte, den Wert zu bemerken.
Installieren Sie xdotool:
sudo apt-get install xdotool
Dann führen wir das folgende Skript aus, um das terminator
Fenster zu finden, es aufzuheben, zuzuordnen, zu warten, bis es aufgehoben wurde, und es dann neu zuzuordnen. Wir ändern auch die Größe des Fensters, da es beim Aufheben und Neuzuordnen seine Maximierung verloren hat:
xdotool search --class "terminator" windowunmap --sync windowmap windowsize %1 1024 768
Ersetzen Sie 1024 768
durch Ihre Auflösung. Beachten Sie auch, dass neuere Versionen von xdotool
als die im Apt-Repo von Debian gefundenen die Verwendung 100% 100%
anstelle einer statischen Auflösung unterstützen. Sie finden .deb
Pakete für neuere Versionen von xdotool
unterGooglecode-Seite von xdotool.
Das Terminator-Fenster wird sofort entdekoriert, und wenn Sie jetzt verwenden obxprop
, werden Sie sehen, dass beide Werte richtig eingestellt wurden. Wenn Sie jetzt die Taste, die Sie zugewiesen haben, ToggleShowDesktop
ein paar Mal drücken, bleibt das Terminator-Fenster immer aktiv.
Um dies dauerhaft zu machen, sollten Sie diese Befehle beim Anmelden ausführen. DieLXDE Wiki-Seite für LXSessionzeigt mehrere verschiedene Möglichkeiten, dies zu tun (global, pro Benutzer, pro Profil usw.). Angenommen, Sie möchten diese Einstellungen nur für Ihren Benutzer und unter dem LXDE-Profil (Standard), möchten Sie ~/.config/lxsession/LXDE/autostart
die von uns ausgeführten Befehle bearbeiten und hinzufügen. Beachten Sie dabei, dass der Befehl xdotool ausgeführt werden muss, nachdem das Terminator-Fenster gerendert wurde. Geben Sie also etwas wie ein (sleep 1s & xdotool ...)
. Sie können diese Befehle auch als Tastenkombinationen in Openbox einrichten, wenn Sie möchten.
Antwort2
Mir ist das folgende Skript eingefallen, das Ihre Probleme anscheinend löst.
#!/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
Sie können es so verwenden.
desktop_terminal terminator-wallpaper
Es sucht nach allen Fenstern die die Klasse terminator-wallpaper
mit haben xdotools
und wechselt dort _NET_WM_WINDOW_TYPE
zu _NET_WM_WINDOW_TYPE_DESKTOP
mit xprop
.
Da Openbox nicht überprüft, ob dieser Typ geändert wurde, nachdem ein Fenster erstellt wurde, müssen wir Openbox dazu überreden, dies zu tun. Dies geschieht, indem wir sie setzen _MOTIF_WM_HINTS
und entfernen.
Das Gleiche erreichen Sie, devilspie
wenn Sie hinzufügen
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
(undecorate)
)
)
da das Einstellen des Fensters (undecorate)
auch den Trick verwendet _MOTIF_WM_HINTS
.
Antwort3
Wenn ich die Frage richtig verstehe, lautet Ihre Frage folgendermaßen: Wenn Sie auf klicken, ToggleShowDesktop
möchten Sie, dass alle geöffneten Anwendungen außer minimiert werden terminator
.
Wenn dies der Fall ist, können Sie dies erreichen, indem Sie ein Wrapper-Skript schreiben, das intern zwei Befehle aufruft
#!/bin/sh
xdotool key "super+d"
wmctrl -a "terminator"
Ersetzen Sie die aktuelle ToggleShowDesktop-Binärdatei/das aktuelle ToggleShowDesktop-Skript durch das oben genannte Wrapper-Skript
Es mag wie ein schmutziger Trick aussehen, aber es funktioniert