Чи є спосіб зберігати поточний макет робочого столу?


29

Те, що я хочу, щоб зберегти поточні позиції моїх додатків, тож коли я збираюсь відкривати ті самі і запускати щось, вони будуть переставлятись, як і раніше.

Наприклад, якщо я збираюся відкрити піднесений і три термінальні вікна, я б хотів якось зберегти це.

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

Мені все одно, чи це додаток чи інструмент командного рядка, якщо я можу легко зберігати позиції своїх додатків.

Я великий шанувальник Moom , але, на жаль, він працює лише на MacOS, і мені дуже не вистачає цього в Ubuntu. Він підтримує більше функцій, і якщо ви знаєте щось близьке до цього, крім моєї основної проблеми, це теж добре.


@VitaliusKuchalskis Чи зробить макет вікна чи це саме відповідність відкритих файлів? А який ваш менеджер вікон? (Єдність?)
Яків Влійм

Я не знаю, про який макет вікон ви говорите? Я думаю, що є або буде інструмент для збереження та завантаження позиції та розміру вікон на робочу область. Поки що я знайшов [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Але для створення цієї функції потрібно буде написати сценарії або змінити конфігурації. Тож мені цікаво, чи хтось це вже робив, і був добрий, щоб поділитися цим.
Qualphey

@VitaliusKuchalskis ви могли поглянути на це: askubuntu.com/questions/631392/… Це передбачає, що вікна (і) залишаються відкритими, але я припускаю, що ви хочете вимкнути комп'ютер і змінити положення вікон після відновлення розмір і положення (макет). Тоді важливим питанням є те, якщо ви просто маєте на увазі вікна програм , а також файли, відкриті всередині вікон.
Яків Влійм

Тільки вікна додатків, звичайно.
Qualphey

На екрані екрана вам здається, що ви любите / використовуєте черепичні утворення для своїх вікон. Ви обов'язково повинні спробувати плитковий 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
Га! Я просто прочитав перший абзац, і я знав, що це один із ваших! (upvoted)
Fabby

@Fabby та відзначаю моє свято :)
Яків Влійм

Виглядає здорово! Тепер можна легко додати другий параметр для імені налаштування, а потім зберігати / відновлювати різні середовища, clientA, clientB, home, .. cool!
Бачі

різні версії було б круто, чудово, якби це могло закрити програму. Думаючи, чи є щось на екрані, коли дружина приходить, я міг би легко зробити так, що я працюю!
Джеймі Хатбер

Ви можете, можливо, поглянути на цю проблему, пов’язану з робочим простором ? Спасибі!!
горіх про 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


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

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

Однак мені дуже рідко це потрібно з дуже простої причини: призупинити. Призупинення і сплячка - ваші друзі. Ви не тільки зберігаєте позиції вікон, але й зберігаєте весь стан вашої системи. Я рідко вимикаю комп'ютер повністю, за винятком перезавантаження нової версії ядра.


Ну я не перемикаю це на щось, але я відкриваю, що ви знаєте нові термінали, інший проект, браузери закриваються, або щось і т.д. .. скріншот був лише прикладом ..
Ліпіс,

Ну так. У мене є настільні комп’ютери, яких я не торкався протягом тижнів, які містять кілька вікон терміналів, вікна браузера, вікна R графічного відображення, які стосуються певного проекту.
січня

Suspend - це рішення, яке я використовую для свого ноутбука, однак, для настільного ПК трохи складніше, оскільки потрібно мати безвідрив.
кантоні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.