web-dev-qa-db-ja.com

ウィンドウ位置の保存と復元

マシンがスタンバイから復帰したときに、ディスプレイポート(MST)を介して接続されたモニターが復帰しないバグが発生していますが、それが点灯した場合、ウィンドウはまだカバーする領域にあります。

この短い再起動から回復する唯一の方法は、ディスプレイを無効にしてから再度有効にすることです。コマンドラインからうまく実行できますが、ディスプレイが無効になると、すべてのウィンドウが残りの画面に再配置されます。

私のスクリプトがこのシーケンスを実行できるように、ウィンドウの位置を保持して復元する方法はありますか-

  1. ウィンドウの列挙、位置の保存
  2. 表示オフ(位置をめちゃくちゃにする)
  3. 表示する(表示を再び動作させる、いや!)
  4. ウィンドウの位置を復元する

ステップ2と3は問題なく実行できますが、ステップ1と4では失われます

私はアプリごとにポジションを強制することができることを知っていますが、異なることをして同じアプリを異なるポジションに置くことができるので、それは私が望むものではありません。また、複数の端末を開いており、現在のポジションを何らかの方法で保存して復元する必要があります。

助けていただければ幸いです!

5
Anthony Graham

ウィンドウ配置の「スナップショット」を取り、復元します

以下のスクリプトを使用して、すべての「通常」ウィンドウの現在のウィンドウ位置を取得(引数-getで実行)したり、最後のウィンドウ配置を復元(引数-restoreで実行)できます。

説明したように herewmctrl i.c.wを使用します。 Unityにはいくつかの問題があります。それはあなたの状況で満足している場合は決定することです。

使い方

スクリプトはwmctrlを使用します。

Sudo apt-get install wmctrl

次に:

  1. スクリプトを空のファイルにコピーし、window_arrange.pyとして保存します
  2. 実行者:

    python3 /path/to/window_arrange.py -get
    

    現在のウィンドウ配置を「記録」する

    python3 /path/to/window_arrange.py -restore
    

    最後の「記録された」ウィンドウ配置を復元する

スクリプト:

#!/usr/bin/env python3
import subprocess
import os
import sys

wfile = os.environ["HOME"]+"/.windowlist"
arg = sys.argv[1]

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

def check_window(w_id):
    w_type = get("xprop -id "+w_id)
    if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
        return True
    else:
        return False

def read_windows():
    w_list =  [l.split()[:6] for l in get("wmctrl -lG").splitlines()]
    relevant = [(" ").join(w) for w in w_list if check_window(w[0]) == True]
    with open(wfile, "wt") as out:
        for item in relevant:
            out.write(item+"\n")

def restore_windows():
    try:
        wlist = [l.split() for l in open(wfile).read().splitlines()]
    except FileNotFoundError:
        pass
    else:
        for w in wlist:
            try:
                cmd = "wmctrl -ir "+w[0]+" -e 0,"+(",").join(w[2:])
                subprocess.Popen(["/bin/bash", "-c", cmd])
            except:
                pass

if arg == "-restore":
    restore_windows()
Elif arg == "-get":
    read_windows()
7
Jacob Vlijm

NodeJを好む場合:セッションの保存と復元を可能にする小さなライブラリ/コマンドラインツールを作成し、さまざまなモニターセットアップと仮想デスクトップをサポートしています。ウィンドウ関連機能の実装を確認することをお勧めします。 https://github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js

ここですべてを見つけることができます: https://github.com/johannesjo/linux-window-session-manager

2

Wmctrlをインストールする場合、「wmctrl -Gl」を使用して、現在の位置とサイズを含むすべてのウィンドウのリストを取得できます。その後、ステップ4でこの情報を使用して、-eオプションを指定してwmctrlを呼び出し、サイズと位置を復元できます。例えば:

wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>
2
jholtrop