現在のデスクトップレイアウトを保存する方法はありますか?


29

アプリケーションの現在の位置を保存できるようにしたいので、同じものを開いて何かを実行しようとすると、元の状態に戻ります。

たとえば、崇高な3つのターミナルウィンドウを開く場合、何らかの方法で保存できるようにしたいと思います。

ここに画像の説明を入力してください

アプリの位置を簡単に保存できる限り、それがアプリなのかコマンドラインツールなのかは気にしません。

私はMoomの大ファンですが、残念ながらMacOSでしか機能せず、Ubuntuでは本当に見逃しています。それはより多くの機能をサポートし、あなたが私の主な問題に加えてそれに近い何かを知っているなら、それも問題ありません。


@VitaliusKuchalskis ウィンドウレイアウトは機能しますか、それとも対応する開かれたファイルでなければなりませんか?そして、あなたのウィンドウマネージャーは何ですか?(団結?)
ジェイコブVlijm

どんなウィンドウレイアウトについて話しているのかわかりませんか?ワークスペースごとにウィンドウの位置とサイズを保存およびロードするためのツールがあるか、またはそうなると思います。これまでのところ、[wmctrl](en.wikipedia.org/wiki/Wmctrl)を見つけました。ただし、この機能を使用するには、スクリプトを作成するか、構成を変更する必要があります。だから私は、誰かがこれをすでに作成していて、それを共有するのに十分親切だったかどうか疑問に思っています。
カルフィー

@VitaliusKuchalskisはこれを見ることができます:askubuntu.com/questions/631392 / ...これはウィンドウが開いたままであることを前提としていますが、復元後にコンピューターをシャットダウンし、ウィンドウの位置を再度確保したいと思いますサイズと位置(レイアウト)。重要な質問は、アプリケーションウィンドウだけを参照しているのか、ウィンドウ内で開かれたファイルを参照しているのかです。
ジェイコブVlijm

もちろん、アプリケーションウィンドウのみです。
カルフィー

スクリーンショットから、ウィンドウのタイルフォーメーションが好き/使用されているように見えます。i3など、タイリングWMをぜひ試してください。
nixpower

回答:


26

注意

スクリプトは2017年1月16日にパッチ/修正され、プロセス名アプリケーションを実行するコマンドと異なるいくつかのアプリケーションを修正しました。おそらく、これはアプリケーションで時々発生します。誰かが見つけたらコメントを残してください。


ウィンドウの配置と対応するアプリケーションを記憶および復元するスクリプト。

以下のスクリプトは、2つのオプションで実行できます。次のようなウィンドウ配置があるとしましょう:

ここに画像の説明を入力してください

現在のウィンドウ配置とそのアプリケーションを読み取る(覚えておく)には、オプションを指定してスクリプトを実行します。

<script> -read

次に、すべてのウィンドウを閉じます。

ここに画像の説明を入力してください

次に、最後に記憶されたウィンドウの配置を設定するには、次のオプションを使用して実行します。

<script> -run

最後に記憶されたウィンドウの配置が復元されます。

ここに画像の説明を入力してください

これは再起動後も機能します。

2つの異なるショートカットキーの下に2つのコマンドを置くと、ウィンドウの配置を "記録"し、コンピューターをシャットダウンして、(たとえば)再起動後に同じウィンドウの配置を呼び出すことができます。

スクリプトが行うことと行わないこと

オプションで実行 -read

  • このスクリプトはwmctrl、すべてのワークスペースにわたるすべてのウィンドウ、その位置、サイズ、属するアプリケーションをリストするために使用します
  • スクリプトは、ウィンドウの位置を、スパニングワークスペース上の相対位置(の出力のように現在のワークスペースwmctrl)から絶対位置に「変換」します。したがって、覚えておきたいウィンドウが1つのワークスペースのみにあるか、別のワークスペースに広がっているかは問題ではありません。
  • スクリプトは、現在のウィンドウ配置を「記憶」し、ホームディレクトリ内の非表示のファイルに書き込みます。

オプションで実行 -run

  • スクリプトは、最後に記憶されたウィンドウ配置を読み取ります。対応するアプリケーションを起動し、ウィンドウを記憶された位置に移動します。wmctrl

スクリプトは、ウィンドウで開かれる可能性のあるファイルや、ブラウザウィンドウで開かれたWebサイトを記憶しませ

課題

との組み合わせにはwmctrlUnityいくつかのバグ、いくつかの例があります。

  • ウィンドウ座標は、で読み取るとwmctrl異なり、わずかにするためのコマンドを形成する位置に述べたように、窓をここに。したがって、リコールされたウィンドウの位置は、元の位置とわずかに異なる場合があります。
  • wmctrlウィンドウのエッジが非常に近いのいずれかである場合、コマンドビットが予測不可能な動作Unity Launcherまたはパネル。
  • 「記憶」ウィンドウは、wmctrl配置コマンドが適切に機能するために、ワークスペースの境界内に完全に収まっている必要があります。

一部のアプリケーションは、デフォルトで新しいタブの同じウィンドウで新しいウィンドウを開きます(などgedit)。を修正しましたがgedit、さらに例外が見つかった場合はお知らせください。

スクリプト

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

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 get_res():
    # get resolution and the workspace correction (vector)
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    return [res, curr_vpdata]

app = lambda pid: subprocess.check_output(["ps", "-p",  pid, "-o", "comm="]).decode("utf-8").strip()

def read_windows():
    res = get_res()
    w_list =  [l.split() for l in get("wmctrl -lpG").splitlines()]
    relevant = [[w[2],[int(n) for n in w[3:7]]] for w in w_list if check_window(w[0]) == True]
    for i, r in enumerate(relevant):      
        relevant[i] = app(r[0])+" "+str((" ").join([str(n) for n in r[1]]))
    with open(wfile, "wt") as out:
        for l in relevant:
            out.write(l+"\n")

def open_appwindow(app, x, y, w, h):
    ws1 = get("wmctrl -lp"); t = 0
    # fix command for certain apps that open in new tab by default
    if app == "gedit":
        option = " --new-window"
    else:
        option = ""
    # fix command if process name and command to run are different
    if "gnome-terminal" in app:
        app = "gnome-terminal"
    elif "chrome" in app:
        app = "/usr/bin/google-chrome-stable"


    subprocess.Popen(["/bin/bash", "-c", app+option])
    # fix exception for Chrome (command = google-chrome-stable, but processname = chrome)
    app = "chrome" if "chrome" in app else app
    while t < 30:      
        ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
        procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
                  if app in p and w[2] in p] for w in ws2]
        if len(procs) > 0:
            time.sleep(0.5)
            w_id = procs[0][0][1]
            cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
            cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
            cmd3 = "wmctrl -ir "+procs[0][0][1]+" -e 0,"+x+","+y+","+w+","+h
            for cmd in [cmd1, cmd2, cmd3]:   
                subprocess.call(["/bin/bash", "-c", cmd])
            break
        time.sleep(0.5)
        t = t+1

def run_remembered():
    res = get_res()[1]
    try:
        lines = [l.split() for l in open(wfile).read().splitlines()]
        for l in lines:          
            l[1] = str(int(l[1]) - res[0]); l[2] = str(int(l[2]) - res[1] - 24)
            open_appwindow(l[0], l[1], l[2], l[3], l[4])   
    except FileNotFoundError:
        pass

if arg == "-run":
    run_remembered()
elif arg == "-read":
    read_windows()

設定方法

開始する前に、wmctrlがインストールされていることを確認してください。

sudo apt-get install wmctrl

次に:

  1. スクリプトを空のファイルにコピーし、のように保存recall_windows~/binます。必要に応じてディレクトリを作成します。ディレクトリがまだ存在していなかった場合は、ディレクトリsource ~/.profileを作成した後に実行するか、ログアウト/ログインします。今になります$PATH
  2. スクリプトを実行可能にします(!)。
  3. さて、いくつかのウィンドウを開いてgeditfirefox(何のパス接頭辞は必要ありません)コマンドを実行することにより、端末にまたは何、およびテストを実行するスクリプト:

    recall_windows -read
    
  4. ウィンドウを閉じます。ターミナルで実行します:

    recall_windows -run
    

これで、ウィンドウのセットアップが復元されます

すべてが正常に機能する場合は、2つのコマンドをショートカットキーに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。「+」をクリックして、コマンドを追加します。

recall_windows -read

そして

recall_windows -run

2つの異なるショートカットキー


2
ハァッ!最初の段落を読むだけで、それがあなたのものの1つであることがわかりました。(投票)
ファビー

@ファビーと私の休日を祝う:)
ジェイコブヴリム

素晴らしく見える!これで、設定名の2番目のパラメーターを簡単に追加し、さまざまな環境(clientA、clientB、home、.. cool!)を保存/復元できます。
バチ

異なるバージョンはクールです。プログラムを閉じることができれば素晴らしいです。妻が入ってきたときに画面上に何かがあるかどうかを考えると、私が働いているように簡単に見せることができます!
ジェイミーハッバー


4

セッションを保存および復元できる小さなライブラリ/コマンドラインツールを作成し、仮想デスクトップだけでなくさまざまなモニター設定をサポートしています。

設置

npm install -g linux-window-session-manager

使用法

現在のセッションを〜/ .lwsm / sessionData / DEFAULT.jsonに保存します

lwsm save

現在のセッションを〜/ .lwsm / sessionData / my-session.jsonに保存します

lwsm save my-session   

〜/ .lwsm / sessionData / DEFAULT.jsonからセッションを復元します

lwsm restore

〜/ .lwsm / sessionData / my-session.jsonからセッションを復元します

lwsm restore my-session   

セッションを開始する前に、実行中のすべてのアプリを正常に閉じます

lwsm restore --closeAllOpenWindows

チェックしてくださいhttps : //github.com/johannesjo/linux-window-session-manager


1
よく働く!これが一番の答えです。
user3751385

2

そのようなプログラムはありません。compiz cubをインストールできます:

sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins

このハウツーに従ってください

compizは、Unity / GNOME向けの最も高度なデスクトップツールです


1

私はこれを達成する簡単な方法を知りません。

ただし、サスペンドという非常に簡単な理由で、これが必要になることはほとんどありません。サスペンドハイバネーションはあなたの友達です。ウィンドウの位置を保存するだけでなく、システム全体の状態も保存します。新しいカーネルバージョンをリロードする場合を除いて、コンピューターを完全にオフにすることはほとんどありません。


まあ、私はそれのか何かを切り替えていないよ..しかし、私はあなたが新しい端末を知って開いています、別のプロジェクト、ブラウザがなど。、閉じられたか何かになっているスクリーンショットは一例..だった
Lipis

はい、そうです。私は何週間も触れていないデスクトップを持っています。これには、特定のプロジェクトに関連するいくつかのターミナルウィンドウ、ブラウザウィンドウ、Rグラフィックディスプレイウィンドウが含まれています。

サスペンドはノートブックに使用するソリューションですが、デスクトップPCにはノーブレークが必要なので少し複雑です。
カントーニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.