web-dev-qa-db-ja.com

新しく開いたアプリケーションのビューポートに自動的にジャンプするにはどうすればよいですか?

最近、Compizの魔法を発見しました。これは、さまざまなワークスペースで複数のアプリケーションを開くように設定したものです。私の質問は、ワークスペーススイッチャーを開いたときにアプリのワークスペースに自動的にジャンプするようにするにはどうすればよいですか?

この例としては、ワークスペース2-1でファイルマネージャーを開いて、ムービーファイルをクリックすると、ワークスペース1-2でVLCが開きます。ワークスペースナビゲーターをワークスペース1-2のVLCに自動的に切り替えるにはどうすればよいですか?

2
Kalamalka Kid

以下のスクリプトは、現在のビューポートをany新しいウィンドウが表示されるビューポートに変更します。

スクリプトは、システムにany(システムモニターを使用して)顕著な/測定可能な負担を追加しません。

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

def get_wlist():
    # get the output of wmctrl -lG, try because wmctrl is a bit buggy :)
    try:
        return subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def get_wids(currlist):
    # get the window ids
    return [l.split()[0] for l in currlist.splitlines()]

def get_abspos():
    posdate = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
    return [int(n) for n in posdate[5].split(",")]

while True:
    # wait until the desktop is ready to run wmctrl
    wdata1 = get_wlist()
    if wdata1:
        break
    time.sleep(1)

# and then...
wlist1 = get_wids(wdata1)

while True:
    time.sleep(2)
    wdata2 = get_wlist()
    if wdata2:
        wlist2 = get_wids(wdata2)
        new = [w for w in wlist2 if not w in wlist1]
        for item in new:
            line = wdata2.splitlines()[wlist2.index(item)].split()
            pos = [int(line[n]) for n in [2, 3]]
            absposcount = get_abspos()
            abspos = [str(pos[0]+absposcount[0]), str(pos[1]+absposcount[1])]
            # print(abspos)
            subprocess.Popen(["wmctrl", "-o", ",".join(abspos)])
        wlist1 = wlist2; wdata1 = wdata2

使い方

  1. スクリプトにはwmctrlが必要です:

    Sudo apt-get install wmctrl
    
  2. スクリプトを空のファイルにコピーし、move_toviewport.pyとして保存します

  3. 次のコマンドで実行します。

    python3 /path/to/move_toviewport.py
    
  4. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加。上記のコマンドを追加します。

使い方

  • スクリプトは、wmctrl -lGを使用して、新しく表示される可能性のあるウィンドウを監視します。
  • 新しいウィンドウがある場合、スクリプトはスパニングワークスペース上のその(絶対)位置を読み取り、その後wmctrl -o x,yを使用して対応するビューポートに移動します。
2
Jacob Vlijm