(mit der von @Suchipi vorgeschlagenen Methode):

(mit der von @Suchipi vorgeschlagenen Methode):

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 terminatorals 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 Wheezymit 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.xmlhabe 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/autostarthabe ich 8 *.desktopDateien, 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 devilspiefunktioniert einwandfrei. Es stellt sich heraus, dass ich nur eine Definition brauche, die alle meine 8 Fenster abdeckt (als Ersatz matchesfür is):

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

Und ich sehe, obxpropdass 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 xdotooletwas 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 xdotoolBefehl auf dem konkreten Desktop ausführe, auf den ich Einfluss nehmen möchte. D. h. ich muss zum Desktop wechseln 2und ausführen xdotool search --class "Terminator-wallpaper-2a", und dann funktioniert es.

Außerdem habe ich mich gefragt, ob das windowsize %1hier 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_TYPEEigenschaft auf „Desktop“ eingestellt ist (Sie können obxpropdie Eigenschaften eines Fensters überprüfen). Wir müssen also _OB_APP_TYPEfür Ihr Terminatorfenster „Desktop“ einstellen, damit dies geschieht.

Beim Durchlesen des Openbox-Quellcodes client.ckonnte ich sehen, dass _OB_APP_TYPEvon 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 devilspieKonfigurationsdateien:

mkdir ~/.devilspie

Nun fügen wir eine Konfigurationsdatei hinzu, die anweist, devilspienach Anwendungen mit dem Namen zu suchen terminatorund 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 -avorhandene Fenster beeinflussen möchten, anstatt nur neu erstellte), werden Sie feststellen, ob Sie obxpropeinen Terminator verwenden, der _NET_WM_WINDOW_TYPEsich geändert hat, aber _OB_APP_TYPEnoch nicht geändert wurde. Lassen Sie uns verwenden, xdotoolum 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 terminatorFenster 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 768durch Ihre Auflösung. Beachten Sie auch, dass neuere Versionen von xdotoolals die im Apt-Repo von Debian gefundenen die Verwendung 100% 100%anstelle einer statischen Auflösung unterstützen. Sie finden .debPakete für neuere Versionen von xdotoolunterGooglecode-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, ToggleShowDesktopein 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/autostartdie 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-wallpapermit haben xdotoolsund wechselt dort _NET_WM_WINDOW_TYPEzu _NET_WM_WINDOW_TYPE_DESKTOPmit 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_HINTSund entfernen.

Das Gleiche erreichen Sie, devilspiewenn 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, ToggleShowDesktopmö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

verwandte Informationen