(@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。つまり、次のようになります。

/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/autostart8 つのファイルがあります。*.desktop

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

これは私にとっては非常に複雑すぎて洗練されていないように思えますが、これよりよい方法は思いつきませんでした。

さて、@Suchipi の指示に従うと、次のようになります。

1) の部分はdevilspie正常に動作します。結局、8 つのウィンドウすべてをカバーする 1 つの定義だけが必要です (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%解像度に を使用すると機能しません。つまり、ウィンドウが消えます (見えません)。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

実際、他のデスクトップでも機能しますが、xdotool影響を与える特定のデスクトップでコマンドを実行した場合のみです。つまり、デスクトップに切り替えて2実行してxdotool search --class "Terminator-wallpaper-2a"から機能します。

windowsize %1また、ここで が何らかの役割を果たすかどうかも疑問でした。

2019年12月7日更新:

そこで、現在 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

壁紙として 2 つのターミナルが表示されます。しかし、問題は、実際に使用できるのはこれらのターミナルのうち 1 つだけであることです。もう 1 つは「フォーカスされていない」ため、マウスでクリックしてもフォーカスできません。つまり、ターミナルは表示されますが、入力できません。

この問題は以前のOpenboxバージョンでは発生しませんでした

この問題を解決するにはどうすればいいでしょうか?

答え1

_OB_APP_TYPEOpenbox は、プロパティが「デスクトップ」に設定されているウィンドウに必要な機能を提供します( を使用してウィンドウのプロパティを確認できます)。そのため、この機能が実現されるように、ターミネーター ウィンドウの を「デスクトップ」にobxprop設定する必要があります。_OB_APP_TYPE

openbox のソース コードを読んでいくと、が から継承されているclient.cことがわかりました。そこで、 を変更できるアプリケーションを探しました。私が見つけたアプリケーションは です。_OB_APP_TYPE_NET_WM_WINDOW_TYPE_NET_WM_WINDOW_TYPEdevilspie

まず、インストールします。

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ターミネータに対してを使用するかどうかがわかります。を使用してウィンドウのマップを解除し、再マップしてみましょう (X11 用語では、これは描画を停止し、ウィンドウの描画を開始することを意味します)。これにより、openbox が値を認識できるようになります。_NET_WM_WINDOW_TYPE_OB_APP_TYPExdotool

xdotoolをインストールします:

sudo apt-get install xdotool

次に、次のスクリプトを実行してウィンドウを見つけterminator、マップ解除し、マップ解除されるまで待ってから再マップします。マップ解除して再マップしたときに最大化が失われたため、ウィンドウのサイズも変更します。

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

をあなたの解像度に置き換えてください1024 768。また、xdotoolDebianのaptリポジトリにあるものよりも新しいバージョンのは100% 100%、静的解像度の代わりに を使用することをサポートしています。.deb新しいバージョンのパッケージは、xdotoolxdotool の Google コード ページ。

ターミネーター ウィンドウはすぐに装飾が解除され、 を使用するとobxprop、両方の値が適切に設定されていることがわかります。バインドしたキーをToggleShowDesktop数回押すと、ターミネーター ウィンドウは常にアクティブになります。

これを永続的にするには、ログイン時にこれらのコマンドを実行する必要があります。LXSession の LXDE Wiki ページは、これを行うためのいくつかの異なる方法を示しています (グローバル、ユーザーごと、プロファイルごとなど)。これらの設定をユーザーのみに、LXDE プロファイル (デフォルト) で実行したいと仮定すると、実行~/.config/lxsession/LXDE/autostartしたコマンドを編集して追加する必要があります。xdotool コマンドは、ターミネータのウィンドウがレンダリングされた後に実行する必要があることに注意してください。そのため、次のようにします(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-wallpaperxdotoolsを に変更し_NET_WM_WINDOW_TYPEます。_NET_WM_WINDOW_TYPE_DESKTOPxprop

Openbox はウィンドウの作成後にこのタイプが変更されたかどうかをチェックしないため、Openbox にこれを実行させる必要があります。これは、を設定し_MOTIF_WM_HINTSて削除することで実現します。

同じことはdevilspie

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

ウィンドウを に設定すると、(undecorate)この _MOTIF_WM_HINTSトリックも使用されるためです。

答え3

質問を正しく理解していれば、質問は次のようになります: をクリックするたびにToggleShowDesktop、 を除くすべての開いているアプリケーションを最小化したいということですterminator

もしそうなら、内部的に2つのコマンドを呼び出すラッパースクリプトを書くことでこれを実現できます。

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

実際のToggleShowDesktopバイナリ/スクリプトを上記のラッパースクリプトに置き換えます。

汚いハックのように見えるかもしれませんが、機能します。

関連情報