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
を使用しています。
私は元の質問からいくつかの詳細を省略しました、そして今これらの詳細は結局のところ関連しているようです:
私のセットアップには、2台のモニターと4台の仮想デスクトップがあります。だから私はterminator
で埋める「8つの壁紙」を持っています。以前に読んだことから、これらの8つのウィンドウは区別可能である必要があると想定したため、terminator
、つまり次の8つの記号を作成しました。
/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%
を使用しても機能しません。つまり、ウィンドウが消えます(表示されません)。静的を使用する場合:
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
が何らかの役割を果たすかどうか疑問に思いました。
そのため、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バージョンでは存在しませんでした。
この問題を解決するにはどうすればよいですか?
Openboxは、_OB_APP_TYPE
プロパティが "desktop"に設定されているウィンドウに探している機能を提供します(obxprop
を使用してウィンドウのプロパティを確認できます)。したがって、これが発生するように、ターミネータウィンドウの_OB_APP_TYPE
を「デスクトップ」に設定する必要があります。
オープンボックスのソースコードを読むと、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
を解像度に置き換えます。また、静的解決の代わりに100% 100%
を使用するDebianのaptリポジトリサポートにあるものよりも新しいバージョンのxdotool
に注意してください。 xdotool
の新しいバージョンの.deb
パッケージは、 xdotoolのgooglecodeページ にあります。
ターミネータウィンドウはすぐに装飾されなくなり、obxprop
を使用すると、両方の値が正しく設定されていることがわかります。 ToggleShowDesktop
をバインドしたキーを数回押すと、ターミネータウィンドウは常にアクティブなままになります。
これを永続的にするには、ログイン時にこれらのコマンドを実行する必要があります。 LXSessionのLXDE Wikiページ は、これを行うためのいくつかの異なる方法(グローバル、ユーザーごと、プロファイルごとなど)を示しています。ユーザー専用でLXDEプロファイル(デフォルト)でこれらの設定が必要な場合は、~/.config/lxsession/LXDE/autostart
を編集して、実行したコマンドを追加します。xdotoolコマンドはターミネーターの後に実行する必要があることに注意してください。ウィンドウがレンダリングされたので、(sleep 1s & xdotool ...)
のようなことをします。必要に応じて、これらのコマンドをopenboxのキーバインドとして設定することもできます。
私はあなたの問題を解決するように見える次のスクリプトを思いついた。
#!/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
トリックを使用しているためです。
質問が正しく表示された場合、質問は次のようになります。ToggleShowDesktop
をクリックするたびに、terminator
を除くすべての開いているアプリケーションを最小化する必要があります。
その場合は、2つのコマンドを内部的に呼び出すラッパースクリプトを作成することでこれを実現できます。
#!/bin/sh
xdotool key "super+d"
wmctrl -a "terminator"
実際のToggleShowDesktopバイナリ/スクリプトを上記のラッパースクリプトに置き換えます
汚いハックのように見えるかもしれませんが、機能します。