Есть ли способ сохранить текущий макет рабочего стола?

29

Что я хочу, чтобы иметь возможность сохранять текущие позиции моих приложений, поэтому, когда я собираюсь открыть те же самые и запустить что-то, они будут переставлять, как они были.

Например, если я собираюсь открыть возвышенное и три оконечных окна, я бы хотел как-то сохранить это.

введите описание изображения здесь

Мне все равно, если это приложение или инструмент командной строки, если я могу легко сохранить позиции своих приложений.

Я большой поклонник Moom , но, к сожалению, он работает только на MacOS, и я действительно скучаю по нему, когда на Ubuntu. Он поддерживает больше функций, и если вы знаете что-то близкое к этой главной проблеме, это тоже хорошо.

Lipis
источник
@VitaliusKuchalskis Подойдет ли расположение окон или это должны быть точно соответствующие открытые файлы? А какой у вас оконный менеджер? (Единство?)
Джейкоб Влейм
Я не знаю, о каком окне вы говорите? Я думаю, что есть или будет инструмент для сохранения и загрузки позиции и размера окон на рабочее пространство. До сих пор я нашел [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Но для создания этой функции потребуется написать сценарии или изменить настройки. Так что мне интересно, если кто-то уже сделал это, и был достаточно любезен, чтобы поделиться этим.
Qualphey
@VitaliusKuchalskis, не могли бы вы взглянуть на это: askubuntu.com/questions/631392/… Это предполагает, что окна остаются открытыми, но я предполагаю, что вы захотите выключить компьютер и восстановить положение окон после восстановления размер и положение (макет). Важный вопрос заключается в том, обращаетесь ли вы просто к окнам приложения или к файлам, которые были открыты внутри окон.
Джейкоб Влейм
Только окна приложений, конечно.
Qualphey
На вашем скриншоте вы, похоже, любите / используете мозаичные образования для своих окон. Вы должны обязательно попробовать tiling WM, например i3.
nixpower

Ответы:

26

Заметка

Сценарий был исправлен / исправлен 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

Затем:

  1. Скопируйте скрипт в пустой файл, сохраните его как recall_windowsв ~/bin. Создайте каталог при необходимости. Если каталог еще не существует, запустите либо, source ~/.profileлибо выйдите из системы / войдите в систему после создания каталога. Теперь будет в$PATH
  2. Сделайте скрипт исполняемым (!).
  3. Теперь откройте несколько окон, gedit, firefoxили любой другой , и тест-запустить скрипт в терминале с помощью не выполнив команду (без префикса пути требуется):

    recall_windows -read
    
  4. закрыть окна. Теперь запустите в терминале:

    recall_windows -run
    

Ваша настройка окна должна быть восстановлена

Если все работает нормально, добавьте две команды для сочетаний клавиш: Выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские сочетания клавиш». Нажмите «+» и добавьте команды:

recall_windows -read

а также

recall_windows -run

до двух разных сочетаний клавиш

Якоб Влейм
источник
2
Хах! Просто прочитав первый абзац, я понял, что это один из твоих! (голосование одобрено)
Fabby
@ Fabby и отмечаю мой праздник :)
Джейкоб Влейм
Выглядит отлично! Теперь можно легко добавить второй параметр для имени параметра, а затем сохранить / восстановить различные среды: clientA, clientB, home, ... круто!
Бачи
разные версии были бы классными, было бы здорово, если бы можно было закрыть программу. Подумав, если на экране что-нибудь появится, когда придет жена, я могу легко сделать так, будто я работаю!
Джейми Хатбер
Не могли бы вы взглянуть на эту проблему, связанную с рабочим пространством ? Благодарность!!
Сумасшедший о Natty
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

Hugo der Hungrige
источник
1
Работает отлично! Это должно быть лучшим ответом.
user3751385
2

нет такой программы. Вы можете установить compiz cub:

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

и следуйте этим инструкциям

compiz - самый продвинутый настольный инструмент для единства / гнома


источник
1

Я не знаю простого способа достижения этого.

Однако мне это редко нужно по очень простой причине: приостановить. Приостановка и спячка ваши друзья. Вы не только сохраняете положения окон, но также сохраняете все состояние своей системы. Я редко полностью выключаю компьютер, за исключением перезагрузки новой версии ядра.

январь
источник
Ну, я не переключаю это или что-то еще ... но я открываю, вы знаете, новые терминалы, другой проект, браузеры закрываются или что-то в этом роде, и т.д ... скриншот был просто примером ...
Lipis
Ну да. У меня есть рабочие столы, к которым я не прикасался уже несколько недель, и которые содержат несколько окон терминала, окна браузера, R графических окон отображения, которые связаны с конкретным проектом.
январь
Suspend - это решение, которое я использую для своего ноутбука, однако для настольного ПК это немного сложнее, так как необходимо обеспечить бесперебойную работу.
кантоны