То, что я хочу, чтобы иметь возможность сохранять текущие позиции моих приложений, поэтому, когда я собираюсь открыть те же самые и запустить что-то, они будут переставлять, как они были.
Например, если я собираюсь открыть возвышенное и три оконечных окна, я бы хотел как-нибудь сохранить это.
Мне все равно, если это приложение или инструмент командной строки, если я могу легко сохранить позиции своих приложений.
Я большой поклонник Moom , но, к сожалению, он работает только на MacOS, и я действительно скучаю по нему, когда на Ubuntu. Он поддерживает больше функций, и если вы знаете что-то близкое к этому, помимо моей основной проблемы, это тоже хорошо.
Я не знаю простого способа достижения этого.
Однако, мне редко нужно это по очень простой причине: приостановить. Приостановить и гибернацию ваши друзья. Вы не только сохраняете положения окон, но также сохраняете все состояние своей системы. Я редко выключаю компьютер полностью, за исключением перезагрузки новой версии ядра.
Я написал небольшой инструмент для библиотеки / командной строки, который позволяет сохранять и восстанавливать сеансы и поддерживает различные настройки мониторов, а также виртуальные рабочие столы.
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-окно-сессия-менеджер
Сценарий исправлялся/фиксировался 16 января 2017, фиксируя для нескольких приложений, из которых имя процесса отличается от команды для запуска приложения. Возможно, это иногда происходит на приложениях. Если кто-то находит один, оставьте комментарий.
Скрипт ниже может быть запущен с двумя опциями. Скажем, у Вас есть расположение окна как указано ниже:
Для чтения (помнят) текущее расположение окна и их приложения, запускают скрипт с опцией:
<script> -read
Затем закройте все окна:
Затем для установки последнего помнившего расположения окна выполните его с опцией:
<script> -run
и последнее помнившее расположение окна будет восстановлено:
Это будет также работать после перезапуска.
Подвергая две команды двум различным сочетаниям клавиш, можно "записать" расположение окна, завершить работу компьютера и вспомнить то же расположение окна после (например). перезапуск.
Выполненный с опцией -read
wmctrl
для списка всех окон, через все рабочие области, их положения, их размеры, приложения, они принадлежатwmctrl
) к абсолютным позициям, на Ваших рабочих областях охвата. Поэтому не имеет значения, если окна, которые Вы хотите помнить, находятся только на одной рабочей области или распространяются по различным рабочим областям.Выполненный с опцией -run
wmctrl
Сценарий не помнит файлы, которые возможно могли бы быть открыты в окнах, ни (например). веб-сайты, которые были открыты в окне браузера.
Комбинация wmctrl
и Unity
имеет некоторые ошибки, несколько примеров:
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
Затем:
recall_windows
в ~/bin
. Создайте каталог при необходимости. Если каталог еще не существовал, работайте также source ~/.profile
или журнал/в после создания каталога. Это теперь будет в $PATH
Теперь откройте несколько окон, gedit
, firefox
или что бы то ни было, и тестовый прогон сценарий в терминале путем выполнения команды (никакой необходимый префикс пути):
recall_windows -read
закройте окна. Теперь выполненный в терминале:
recall_windows -run
Ваша установка окна должна теперь быть восстановлена
Если все хорошо работает, добавьте две команды к сочетаниям клавиш: Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команды:
recall_windows -read
и
recall_windows -run
к двум различным сочетаниям клавиш
нет такой программы. Вы можете установить compiz cub:
sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins
и следовать этим инструкциям
compiz - самый продвинутый настольный инструмент для unity / гном