%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
。つまり、次のようになります。
/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 つのウィンドウすべてをカバーする 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_TYPE
Openbox は、プロパティが「デスクトップ」に設定されているウィンドウに必要な機能を提供します( を使用してウィンドウのプロパティを確認できます)。そのため、この機能が実現されるように、ターミネーター ウィンドウの を「デスクトップ」に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
ターミネータに対してを使用するかどうかがわかります。を使用してウィンドウのマップを解除し、再マップしてみましょう (X11 用語では、これは描画を停止し、ウィンドウの描画を開始することを意味します)。これにより、openbox が値を認識できるようになります。_NET_WM_WINDOW_TYPE
_OB_APP_TYPE
xdotool
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 の 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-wallpaper
、xdotools
を に変更し_NET_WM_WINDOW_TYPE
ます。_NET_WM_WINDOW_TYPE_DESKTOP
xprop
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バイナリ/スクリプトを上記のラッパースクリプトに置き換えます。
汚いハックのように見えるかもしれませんが、機能します。