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

25

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

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

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

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

    
задан Lipis 27.09.2012 в 12:02
источник

4 ответа

23

Примечание

Сценарий был исправлен / исправлен 16 января 2017 года, исправление для нескольких приложений, имя которых отличается от для запуска приложения . Возможно, это случается иногда в приложениях. Если кто-то найдет его, оставьте комментарий.

Скрипт для запоминания и восстановления расположения окна и соответствующих им приложений.

Сценарий ниже может быть запущен с двумя параметрами. Предположим, у вас есть расположение окон, как показано ниже:

Чтобыпрочитать(запомнить)текущеерасположениеокнаиихприложения,запуститесценарийспомощьюопции:

<script>-read

Затемзакройтевсеокна:

Затем, чтобы настроить последнее запомненное расположение окна, запустите его с помощью опции:

<script> -run

и будет восстановлено последнее запоминающееся расположение окна:

Этотакжебудетработатьпослеперезагрузки.

Поместитедвекомандыподдвумяразнымиклавишамибыстрогодоступа,высможете"записать"расположениевашегоокна,выключитькомпьютеривызватьтужесхемуокнапосле(например,)перезагрузки.

Чтоделаетскрипт,ичтоонделаетnot

Запуститесопцией-read

  • Скриптиспользуетwmctrlдляотображениявсехокон,всехрабочихпространств,ихпозиций,ихразмеров,приложений,ккоторымонипринадлежат
  • Затемсценарий"преобразует"позицииокнаизотносительной(втекущуюрабочуюобласть,какинавыходеwmctrl)впозицииabsolute,навашихрабочихпространствахspanning.Поэтомуневажно,будутлиокна,которыевыхотитезапомнить,тольконаодномрабочемпространствеилинаразныхрабочихпространствах.
  • Затемскрипт"запоминает"текущеерасположениеокна,записываяеговневидимыйфайлввашемдомашнемкаталоге.

Запуститесопцией-run

  • сценарийчитаетпоследнеезапоминающеесярасположениеокна;онзапускаетсоответствующиеприложения,перемещаетокнавзапоминающиесяпозиции,такжеспомощьюwmctrl

Скриптnotзапоминаетфайлы,которыемогутбытьоткрытывWindows,атакже(например)веб-сайты,открытыевокнебраузера.

Вопросы

ВкомбинацииwmctrlиUnityестьнекоторыеошибки,несколькопримеров:

  • координатыокна,таккакчтениеwmctrlнемногоотличаетсяоткоманды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

Тогда:

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

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

    recall_windows -run
    

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

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

recall_windows -read

и

recall_windows -run

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

    
ответ дан Jacob Vlijm 07.07.2015 в 19:25
2

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

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

и следуйте этим практическим

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

    
ответ дан user91632 27.09.2012 в 12:52
1

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

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

    
ответ дан January 27.09.2012 в 12:23
0

Я написал небольшой инструмент библиотеки / командной строки, который позволяет сохранять и восстанавливать сеансы и поддерживает различные настройки мониторов, а также виртуальные рабочие столы.

Установка

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

Проверьте это: Ссылка

    
ответ дан hugo der hungrige 25.04.2017 в 17:34