web-dev-qa-db-ja.com

指定されたレイヤーでのみ動作するようにOpenboxでToggleShowDesktopを構成します

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 WheezyLXDEを使用しています。

(@Suchipiによって提案された方法を使用):

私は元の質問からいくつかの詳細を省略しました、そして今これらの詳細は結局のところ関連しているようです:

私のセットアップには、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つだけ必要です(matchesisに置き換えます)。

$ 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が何らかの役割を果たすかどうか疑問に思いました。

更新2019-12-07:

そのため、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バージョンでは存在しませんでした。

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

7
Martin Vegter

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

次に、devilspieterminatorという名前のアプリケーションを検索し、それらのウィンドウタイプを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のキーバインドとして設定することもできます。

7
Suchipi

私はあなたの問題を解決するように見える次のスクリプトを思いついた。

#!/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トリックを使用しているためです。

2
Raphael Ahrens

質問が正しく表示された場合、質問は次のようになります。ToggleShowDesktopをクリックするたびに、terminatorを除くすべての開いているアプリケーションを最小化する必要があります。

その場合は、2つのコマンドを内部的に呼び出すラッパースクリプトを作成することでこれを実現できます。

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

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

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

0
SHW