web-dev-qa-db-ja.com

非アクティブなときにウィンドウを不透明に保つにはどうすればよいですか?

Xfceを設定して、マウスフォーカスがないときにすべてのウィンドウを半透明にします。非アクティブのときに特定のウィンドウを不透明のままに設定するにはどうすればよいですか? Xfceには、特定のウィンドウの設定を変更するオプションがありません(私が知る限り)。

以前にこれに対する解決策を見つけましたが、もう見つかりません。コマンドラインプログラムを使用して、必要なウィンドウに特定のウィンドウマネージャーのヒントを設定しました。これにより、ウィンドウが透明になるのを防ぎました。しかし、使用したプログラムやウィンドウマネージャーのヒントの名前を思い出せません。ヒント名の一部はLOCKEDだったと思います。

これは、GIMPウィンドウがマウスフォーカスを失ったときに透明にならないようにする場合などに役立ちます。

私が持っています transset-dfただし、非アクティブのときにウィンドウに同じ透明度を維持させる方法はありません。

4
yellowantphil

Devilspie2 を使用して、選択したアプリケーションのウィンドウタイプを「ユーティリティ」に設定します。このウィンドウタイプは、Xfce環境の「非アクティブなウィンドウの不透明度」の影響を受けません。

予備設定

リポジトリ( Debian および bunt リポジトリで利用可能)からDevilspie2をインストールし、$HOME/.config/devilspie2に次の内容の新しい構成ファイルを作成します。

debug_print("Window Name: " .. get_window_name());
debug_print("Application name: " .. get_application_name());

if (get_application_name()=="xfce4-dict") then
   set_window_type "_NET_WM_WINDOW_TYPE_UTILITY";
end

ファイルをopaque.luaとして保存します。ファイル名は何でもかまいませんが、Devilspie2で機能するには、ファイル拡張子が.luaである必要があります。

予備テスト

Devilspie2をデバッグモードで実行すると、次のように表示されます。

$  devilspie2 -d
Running devilspie2 in debug mode.

Using scripts from folder: /home/USERNAME/.config/devilspie2
------------
List of LUA files handling "window_open" events in folder:
/home/USERNAME/.config/devilspie2/opaque.lua
List of LUA files handling "window_close" events in folder:
------------
Window Name: Desktop
Application name: xfdesktop
Window Name: xfce4-panel
Application name: xfce4-panel
Window Name: Application Finder
Application name: xfrun4
Window Name: Dictionary
Application name: xfce4-dict

次のスクリーンショットは、Devilspie2を実行する前後のDictionaryの非アクティブなウィンドウを示しています。辞書(下)の不透明度は変化しますが、両方のウィンドウが非アクティブである間、Xfceターミナルの不透明度は低くなります(左)。

Dictionary less opaque without Devilspie2

Dictionary full opaque with Devilspie2

ディクショナリの非アクティブなウィンドウは、設定ファイルに関してDevilspie2によってウィンドウタイプが「ユーティリティ」に変更されたため、完全に不透明なままでした。

セットアップの変更

作成された構成ファイルには、「ウィンドウ名:...アプリケーション名:...」のデバッグメッセージを表示するために、debug_printで始まる最初の2行が含まれています。これらの行により、Devilspie2は、現在実行中のアプリケーションとその後実行中のアプリケーションの両方のそれぞれの名前を表示できます。

デバッグメッセージに基づいて、ユーザーは次の手順に従う必要があります。

  1. 選択したアプリケーションを特定します。非アクティブの場合は完全に不透明にする必要があります。 Application name:を含む行を探し、値をコピーします。

  2. テキストエディタを使用して/home/USERNAME/.config/devilspie2/opaque.luaで同じ構成ファイルを開き、xfce4-dictを選択したアプリケーションに置き換えます。

  3. ファイルを保存します。

  4. 終了して、Devilspie2を再度実行します。

USERNAMEは現在のユーザー名を参照していることに注意してください。

変更された構成が有効になります。選択したアプリケーションがすでに実行されている場合は、ウィンドウを前後に切り替えて、ウィンドウが再び非アクティブになったときに効果的な変更を確認します。

永続的なセットアップ:このソリューションをすべてのセッションで有効にするには、Devilspie2をバックグラウンドで実行する必要があります。これを永続的にするには、[セッションと起動]の[アプリケーションの自動起動]タブにdevilspie2を追加します。

どのウィンドウタイプ

当初、試行錯誤しながらDevilspie2で遊んでいたときにこの解決策を見つけました。後でGIMP2.8を実行してみたところ、非アクティブになるとメインウィンドウの不透明度が低くなりましたが、他の2つのフローティングウィンドウは完全に不透明なままでした。

次に、xwininfoを実行してウィンドウの種類を確認し、フローティングウィンドウの1つをクリックして、ウィンドウマネージャーのヒントを出力しました。

$ xwininfo -wm

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x2a00686 "Layers - Brushes"

  Window manager hints:
      Client accepts input or input focus: Yes
      Initial state is Normal State
      Displayed on desktop 1
      Window type:
          Utility
      Window state:
          Skip Pager
          Skip Taskbar
      Process id: 5262 on Host XXXXX
      Frame extents: 1, 1, 22, 4

そしてビンゴ、ウィンドウタイプは確かに「ユーティリティ」でした!

重要な問題:「ユーティリティ」ウィンドウタイプには1つの異なる動作があります。つまり、アプリケーションウィンドウはタスクバーに表示されなくなります。ユーザーは引き続きナビゲートできます Alt+Tab タスクバーの代わりにキー。

この動作は、「ユーティリティ」ウィンドウタイプでは正常です。これは、GIMPのドックとも呼ばれるフローティングウィンドウでも同じように観察できます。

この動作が望ましくないとユーザーが感じた場合、ウィンドウタイプを変更することは、欠点のある解決策になる可能性があります。一方、非アクティブのときに選択ウィンドウを不透明に保つことができる一方で、動作は些細な問題です。

Devilspie2 v0.31を使用して、Xubuntu 14.04(Xfce 4.10)での動作をテストしました。

3
clearkimura

Clearkimuraの回答を調べているときに、ウィンドウを不透明に保つために以前使用していた方法を見つけました。ターミナルでこのコマンドを入力し、目的のウィンドウをクリックします。

xprop -f _NET_WM_WINDOW_OPACITY_LOCKED 32c -set _NET_WM_WINDOW_OPACITY_LOCKED 1

これにより、ウィンドウがアクティブになったときにXfceがウィンドウの不透明度を変更しないようにするウィンドウプロパティが設定されます。

Clearkimuraが提案したことを実行することになりましたが、これは、ウィンドウが非アクティブのときにウィンドウを自動的に不透明に保つ別の方法です。

私のリポジトリにはdevilspieのみがあり、devilspie2はありません。このdevilspie設定ファイルを作成し、~/.devilspie/rules.dsという名前を付けました(コメントはセミコロンで始まります):

(begin
    ;(debug)
    (if
        ; For mplayer/smplayer and all Gimp windows:
        (or
            (contains (application_name) "MPlayer")
            (contains (window_class) "Gimp")
        )
        ; comment out one of the lines below:
        (print (window_xid) "\n") ; print the window IDs
        ; (wintype "utility") ; set the window type to utility
    )
)

次に、このスクリプトを作成し、devilspie_xpropという名前を付けて、ホームディレクトリに配置しました。

#!/bin/bash
devilspie $@ | while read id text; do
    if [[ $id -gt 0 && $text == "" ]]; then
        xprop -id $id -f _NET_WM_WINDOW_OPACITY_LOCKED 32c -set _NET_WM_WINDOW_OPACITY_LOCKED 1
    else
        echo "$id $text"
    fi
done

devilspieは、GimpまたはMPlayer/SMPlayerウィンドウのウィンドウIDを出力します。次に、スクリプトはウィンドウIDごとにxpropを実行し、_NET_WM_WINDOW_OPACITY_LOCKEDプロパティを設定します。

最後に、Xfceを起動する前に、これを.xinitrcに追加しました。

$HOME/devilspie_xprop &

最終的に、clearkimuraのソリューションの方が好きだと判断しましたが、どちらでも機能します。

1
yellowantphil