アプリケーションの現在の位置を保存できるようにしたいので、同じものを開いて何かを実行しようとすると、元の状態に戻ります。
たとえば、崇高な3つのターミナルウィンドウを開く場合、何らかの方法で保存できるようにしたいと思います。
アプリの位置を簡単に保存できる限り、それがアプリなのかコマンドラインツールなのかは気にしません。
私は Moom の大ファンですが、残念ながらMacOSでしか動作せず、Ubuntuでは本当に見逃しています。それはより多くの機能をサポートし、あなたが私の主な問題に加えてそれに近い何かを知っているなら、それも問題ありません。
スクリプトは2017年1月16日にパッチ適用/修正され、プロセス名がアプリケーションを実行するコマンドと異なるいくつかのアプリケーションを修正しました。おそらく、これはアプリケーションで時々発生します。誰かが見つけたらコメントを残してください。
以下のスクリプトは、2つのオプションで実行できます。次のようなウィンドウ配置があるとしましょう:
現在のウィンドウ配置とそのアプリケーションをread(記憶)するには、オプションを指定してスクリプトを実行します:
<script> -read
次に、すべてのウィンドウを閉じます。
次に、最後に記憶されたウィンドウ配置をセットアップするために、オプションでそれを実行します:
<script> -run
最後に記憶されたウィンドウの配置が復元されます。
これは再起動後も機能します。
2つの異なるショートカットキーの下に2つのコマンドを置くと、ウィンドウの配置を「記録」し、コンピューターをシャットダウンして、(たとえば)再起動後に同じウィンドウの配置を呼び出すことができます。
オプション-read
で実行します
wmctrl
を使用して、すべてのウィンドウ、すべてのワークスペース、それらの位置、サイズ、属するアプリケーションを一覧表示します。wmctrl
の出力のように)相対的な(現在のワークスペースに)からabsolute位置にスパンワークスペースに「変換」します。したがって、覚えておきたいウィンドウが1つのワークスペースのみにあるか、別のワークスペースに広がっているかは問題ではありません。オプション-run
で実行します
wmctrl
の助けを借りて、記憶された位置にウィンドウを移動しますスクリプトは、ウィンドウで開かれる可能性のあるファイルや、ブラウザウィンドウで開かれたWebサイトをnot記憶しません。
wmctrl
とUnity
の組み合わせには、いくつかのバグといくつかの例があります。
wmctrl
によって読み取られるウィンドウ座標は、 here のように、ウィンドウのpositionコマンドとわずかに異なります。したがって、リコールされたウィンドウの位置は、元の位置とわずかに異なる場合があります。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
次に:
recall_windows
に~/bin
として保存します。必要に応じてディレクトリを作成します。ディレクトリがまだ存在していなかった場合は、source ~/.profile
を実行するか、ディレクトリの作成後にログアウト/ログインします。 $PATH
になりますgedit
、firefox
などのいくつかのウィンドウを開き、コマンドを実行してターミナルでスクリプトをテスト実行します(パスプレフィックスは不要です)。
recall_windows -read
ウィンドウを閉じます。ターミナルで実行します:
recall_windows -run
これで、ウィンドウのセットアップが復元されます
すべてが正常に機能する場合は、2つのコマンドをショートカットキーに追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します。
recall_windows -read
そして
recall_windows -run
2つの異なるショートカットキー
セッションを保存および復元できる小さなライブラリ/コマンドラインツールを作成し、仮想デスクトップだけでなくさまざまなモニターセットアップをサポートしています。
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
そのようなプログラムはありません。 compiz cubをインストールできます:
Sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins
this how-to に従ってください
compizは、Unity/GNOME向けの最も先進的なデスクトップツールです。
私はこれを達成する簡単な方法を知りません。
ただし、サスペンドという非常に単純な理由により、ほとんど必要ありません。 サスペンドおよびハイバネーションは友達です。ウィンドウの位置を保存するだけでなく、システム全体の状態も保存します。新しいカーネルバージョンをリロードする場合を除き、コンピューターの電源を完全にオフにすることはほとんどありません。