web-dev-qa-db-ja.com

いくつかの除外を除いて、すべてのワークスペースですべてのウィンドウを開始します

私は知っています Always on visible workspace しかし、いくつかの例外を除いて、allウィンドウを開くときにこれをデフォルトとして使用する必要があります。

私が探しているワークフローは、それが機能する方法のほとんど逆です。いくつかの(手動の)例外を除いて、すべてのワークスペースのすべてを表示します。

出来ますか?スクリプトが必要な場合は、おそらく気にしません。

Ubuntu 17.04でcinnamonを使用していますが、この機能は単一およびほとんどのデスクトップ環境にあります。

2
janw

興味深いケース。

考慮すべきこと

概念は複雑ではありません。すべてのウィンドウをスティッキーに設定するだけですただし

  • 一部のアプリケーションを除外したいので、それらのアプリケーションをリストし、ウィンドウクラスのウィンドウをチェックして、スティッキーを設定する(すべてのワークスペースに表示する)かどうかを決定する必要があります。
  • ウィンドウリストには、wmctrl -lからの出力として、DOCKやDESKTOPなどのいくつかのウィンドウタイプも表示されますが、これらのプロパティは一般に編集しないでください。
  • 不必要な燃料消費を防ぐため、new windows stickyのみを設定する必要があります。

サンプルスクリプト(Python)

以下のスクリプトでは:

  • 次を使用して、2秒サイクルのループが実行され、ウィンドウリストと前のリストが比較されます。

    wmctrl -l
    

    その後、各行からウィンドウIDを抽出します

  • その後、スクリプトが実行されます

    xprop -id <window_id>
    

    _NET_WM_WINDOW_TYPEおよびWM_CLASSに関する情報を見つけることができます

  • 新しいウィンドウがこれらのテストに「合格」した場合、i.o.w。ウィンドウは除外されたアプリケーションのいずれにも属さず、除外されたタイプのいずれでもないため、スティッキーに設定されます。

スクリプトは新しく作成されたウィンドウでのみ動作するため、システムに目立った負担をかけることはありません。

スクリプト

#!/usr/bin/env python3
import subprocess
import time

# excluded applications
apps = ["gedit", "chromium", "monkey"]


# ignored window types
ignore = [
    "= _NET_WM_WINDOW_TYPE_DOCK",
    "= _NET_WM_WINDOW_TYPE_DESKTOP",
]


# just a helper
def get(cmd):

    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except (subprocess.CalledProcessError, TypeError):
        pass


# initiate windowlist
wins1 = []


while True:
    # cycle time
    time.sleep(2)
    # initiate new list
    new_wins = []
    # get the most recent window list
    windata = get(["wmctrl", "-l"])
    if windata:
        # extract window -ids
        wins2 = [w.split()[0] for w in windata.splitlines()]
        new = [w for w in wins2 if w not in wins1]
        # check for excluded classes and window types
        for w in new:
            testdata = get(["xprop", "-id", w])
            if all([
                not any([ig in testdata for ig in ignore]),
                not any([app in testdata for app in apps]),
                ]):
                # set the passed windows to sticky
                subprocess.Popen(
                    ["wmctrl", "-i", "-r", w, "-b", "add,sticky"]
                    )
        # refresh the window list for next cycle
        wins1 = wins2

設定方法

  1. wmctrlがインストールされていることを確認します。

    Sudo apt install wmctrl
    
  2. スクリプトを空のファイルにコピーし、set_sticky.pyとして保存します
  3. スクリプトのheadセクションで、除外するWM_CLASS -sesを設定します(猿を削除したい場合があります。テスト目的でした:))
  4. 次のコマンドでテスト実行します:

    python3 /path/to/set_sticky.py
    
  5. すべてが正常に機能する場合は、スタートアップアプリケーションに追加できますが、まだ準備が整っていないデスクトップでスクリプトが破損しないように、小さなブレークを追加してください。

    /bin/bash -c "sleep 10 && python3 /path/to/set_sticky.py"
    

楽しんで :)

注意

Ubuntu Budgie(mutter)で25分間問題なくテストしました。どのウィンドウマネージャーでも正常に動作するはずですが、問題が発生した場合は言及してください。

2
Jacob Vlijm