Có cách nào để lưu trữ bố trí máy tính để bàn hiện tại?


29

Những gì tôi muốn có thể lưu các vị trí hiện tại của ứng dụng của mình, vì vậy khi tôi sẽ mở những ứng dụng tương tự và chạy thứ gì đó chúng sẽ sắp xếp lại như cũ.

Ví dụ: nếu tôi sẽ mở một cửa sổ cao siêu và ba cửa sổ đầu cuối, tôi muốn có thể lưu nó bằng cách nào đó.

nhập mô tả hình ảnh ở đây

Tôi không quan tâm nếu đó là một ứng dụng hoặc công cụ dòng lệnh, miễn là tôi có thể dễ dàng lưu các vị trí của ứng dụng của mình.

Tôi là một fan hâm mộ lớn của Moom , nhưng thật không may, nó chỉ hoạt động trên MacOS và tôi thực sự nhớ nó khi ở trên Ubuntu. Nó hỗ trợ nhiều tính năng hơn và nếu bạn biết thứ gì đó gần với vấn đề chính của tôi thì điều đó cũng tốt.


@VitaliusKuchalskis Bố cục cửa sổ sẽ làm gì, hay nó phải chính xác là các tập tin đã mở? Và quản lý cửa sổ của bạn là gì? (Đoàn kết?)
Jacob Vlijm

Tôi không biết bạn đang nói về bố cục cửa sổ nào? Tôi nghĩ rằng có hoặc sẽ có một công cụ để lưu và tải vị trí và kích thước của các cửa sổ trên mỗi không gian làm việc. Cho đến nay tôi đã tìm thấy [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ). Nhưng nó sẽ yêu cầu viết các tập lệnh hoặc thay đổi cấu hình để tạo ra tính năng này. Vì vậy, tôi tự hỏi nếu có ai đã thực hiện điều này, và đã tốt bụng chia sẻ nó.
Qualphey

@VitaliusKuchalskis bạn có thể có một cái nhìn tại một này: askubuntu.com/questions/631392/... này giả định cửa sổ (s) lại mở, nhưng tôi giả sử bạn muốn tắt máy tính và resore các vị trí cửa sổ sau một khôi phục kích thước và vị trí (bố trí). Một câu hỏi quan trọng sau đó là nếu bạn chỉ đề cập đến các cửa sổ ứng dụng , hoặc cả các tệp được mở bên trong các cửa sổ.
Jacob Vlijm

Tất nhiên chỉ có các cửa sổ ứng dụng.
Qualphey

Từ ảnh chụp màn hình của bạn, bạn có vẻ thích / sử dụng các hình thức ốp lát cho các cửa sổ của bạn. Bạn chắc chắn nên thử WM, ví dụ i3.
nixpower

Câu trả lời:


26

chú thích

Tập lệnh đã được vá / sửa vào ngày 16 tháng 1 năm 2017, sửa một vài ứng dụng trong đó tên quy trình khác với lệnh để chạy ứng dụng . Có thể, điều này đôi khi xảy ra trên các ứng dụng. Nếu ai đó tìm thấy một, xin vui lòng để lại nhận xét.


Script để ghi nhớ và khôi phục sắp xếp cửa sổ và các ứng dụng tương ứng của chúng.

Kịch bản dưới đây có thể được chạy với hai tùy chọn. Giả sử bạn có cách sắp xếp cửa sổ như dưới đây:

nhập mô tả hình ảnh ở đây

Để đọc (ghi nhớ) cách sắp xếp cửa sổ hiện tại và các ứng dụng của chúng, hãy chạy tập lệnh với tùy chọn:

<script> -read

Sau đó đóng tất cả các cửa sổ:

nhập mô tả hình ảnh ở đây

Sau đó, để thiết lập sắp xếp cửa sổ ghi nhớ cuối cùng, hãy chạy nó với tùy chọn:

<script> -run

và sắp xếp cửa sổ ghi nhớ cuối cùng sẽ được khôi phục:

nhập mô tả hình ảnh ở đây

Điều này cũng sẽ làm việc sau khi khởi động lại.

Đặt hai lệnh dưới hai phím tắt khác nhau, bạn có thể "ghi lại" cách sắp xếp cửa sổ, tắt máy tính và gọi lại cách sắp xếp cửa sổ tương tự sau khi (ví dụ) khởi động lại.

Kịch bản làm gì, và cái gì không

Chạy với tùy chọn -read

  • Kịch bản sử dụng wmctrlđể liệt kê tất cả các cửa sổ, trên tất cả các không gian làm việc, vị trí của chúng, kích thước của chúng, các ứng dụng mà chúng thuộc về
  • Tập lệnh sau đó "chuyển đổi" các vị trí cửa sổ từ vị trí tương đối (sang không gian làm việc hiện tại, như ở đầu ra của wmctrl) thành các vị trí tuyệt đối , trên các không gian làm việc kéo dài của bạn. Do đó, không có vấn đề gì nếu các cửa sổ bạn muốn nhớ chỉ nằm trên một không gian làm việc hoặc trải rộng trên các không gian làm việc khác nhau.
  • Tập lệnh sau đó "ghi nhớ" cách sắp xếp cửa sổ hiện tại, ghi nó vào một tệp vô hình trong thư mục chính của bạn.

Chạy với tùy chọn -run

  • kịch bản đọc sắp xếp cửa sổ ghi nhớ cuối cùng; nó khởi động các ứng dụng tương ứng, di chuyển các cửa sổ đến các vị trí đã nhớ, cũng với sự trợ giúp củawmctrl

Tập lệnh không nhớ các tệp có thể được mở trong cửa sổ, cũng như (ví dụ) các trang web được mở trong cửa sổ trình duyệt.

Các vấn đề

Sự kết hợp wmctrlUnitycó một số lỗi, một vài ví dụ:

  • tọa độ cửa sổ, như được đọc bởi wmctrlkhác nhau một chút tạo thành lệnh để định vị các cửa sổ, như được đề cập ở đây . Do đó, các vị trí cửa sổ bị thu hồi có thể hơi khác với vị trí ban đầu.
  • Các wmctrllệnh hoạt động hơi khó đoán nếu cạnh của cửa sổ rất gần Unity Launcherhoặc bảng điều khiển.
  • Các cửa sổ "được nhớ" cần phải nằm hoàn toàn bên trong đường viền không gian làm việc để wmctrllệnh vị trí hoạt động tốt.

Một số ứng dụng mở các cửa sổ mới theo mặc định trong cùng một cửa sổ trong một tab mới (như gedit). Tôi đã sửa nó gedit, nhưng vui lòng đề cập đến nó nếu bạn tìm thấy nhiều ngoại lệ hơn.

Kịch bản

#!/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()

Làm thế nào để thiết lập

Trước khi bạn bắt đầu, hãy chắc chắn rằng đã wmctrlđược cài đặt:

sudo apt-get install wmctrl

Sau đó:

  1. Sao chép tập lệnh vào một tập tin trống, lưu nó như recall_windowstrong ~/bin. Tạo thư mục nếu cần thiết. Nếu thư mục chưa tồn tại, hãy chạy source ~/.profilehoặc đăng xuất / đăng nhập sau khi bạn tạo thư mục. Bây giờ nó sẽ ở trong$PATH
  2. Làm cho tập lệnh thực thi (!).
  3. Bây giờ mở một vài cửa sổ, gedit, firefoxhoặc bất cứ điều gì, và chạy thử kịch bản trong một thiết bị đầu cuối bằng cách chạy lệnh (không có con đường tiền tố cần thiết):

    recall_windows -read
    
  4. đóng những cái cửa sổ. Bây giờ chạy trong một thiết bị đầu cuối:

    recall_windows -run
    

Thiết lập cửa sổ của bạn bây giờ sẽ được khôi phục

Nếu tất cả đều hoạt động tốt, hãy thêm hai lệnh vào các phím tắt: Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm các lệnh:

recall_windows -read

recall_windows -run

đến hai phím tắt khác nhau


2
Hừ! Chỉ cần đọc đoạn đầu tiên và tôi biết đó là một trong những đoạn của bạn! (nâng cấp)
Fabby 7/07/2015

@Fabby và kỷ niệm ngày lễ của tôi :)
Jacob Vlijm 7/07/2015

Trông rất tuyệt! Bây giờ người ta có thể dễ dàng thêm một thông số thứ hai cho tên cài đặt và sau đó lưu trữ / khôi phục các môi trường khác nhau, clientA, clientB, home, .. cool!
Bachi

các phiên bản khác nhau sẽ rất tuyệt, thật tuyệt nếu nó có thể đóng chương trình. Suy nghĩ nếu có bất cứ điều gì trên màn hình khi vợ bước vào tôi có thể dễ dàng làm cho nó giống như tôi đang làm việc!
Jamie Hutber


4

Tôi đã viết một công cụ thư viện / dòng lệnh nhỏ cho phép lưu và khôi phục phiên và có hỗ trợ cho các thiết lập màn hình khác nhau cũng như máy tính để bàn ảo.

Cài đặt

npm install -g linux-window-session-manager

Sử dụng

Lưu phiên hiện tại vào ~ / .lwsm / sessionData / DEFAULT.json

lwsm save

Lưu phiên hiện tại vào ~ / .lwsm / sessionData / my-session.json

lwsm save my-session   

Khôi phục phiên từ ~ / .lwsm / sessionData / DEFAULT.json

lwsm restore

Khôi phục phiên từ ~ / .lwsm / sessionData / my-session.json

lwsm restore my-session   

Hoàn toàn đóng tất cả các ứng dụng đang chạy trước khi bắt đầu phiên

lwsm restore --closeAllOpenWindows

Hãy xem thử: https://github.com/johannesjo/linux-window-session-manager


1
Hoạt động tuyệt vời! Đây phải là câu trả lời hàng đầu.
dùng3751385

2

không có chương trình như vậy Bạn có thể cài đặt compiz cub:

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

và làm theo cách này

compiz là công cụ máy tính để bàn tiên tiến nhất cho unity / gnome


1

Tôi không biết một cách đơn giản để đạt được điều này.

Tuy nhiên, tôi hiếm khi cần điều đó vì một lý do rất đơn giản: đình chỉ. Đình chỉngủ đông là bạn của bạn. Bạn không chỉ lưu các vị trí cửa sổ mà còn lưu toàn bộ trạng thái của hệ thống. Tôi hiếm khi tắt máy tính hoàn toàn, ngoại trừ để tải lại một phiên bản kernel mới.


Chà, tôi không chuyển đổi nó hay bất cứ thứ gì .. nhưng tôi đang mở cho bạn biết các thiết bị đầu cuối mới, một dự án khác, các trình duyệt đang bị đóng cửa hoặc một cái gì đó, vv .. ảnh chụp màn hình chỉ là một ví dụ ..
Lipis

Vâng, vâng. Tôi có máy tính để bàn mà tôi đã không chạm vào trong nhiều tuần nay có chứa một số cửa sổ đầu cuối, cửa sổ trình duyệt, cửa sổ hiển thị đồ họa R tất cả đều liên quan đến một dự án cụ thể.
Ngày

Đình chỉ là giải pháp tôi sử dụng cho máy tính xách tay của mình, tuy nhiên, đối với Máy tính để bàn phức tạp hơn một chút, vì cần phải có một sự quý phái.
cantoni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.