มีวิธีในการจัดเก็บเค้าโครงเดสก์ทอปปัจจุบันหรือไม่?


29

สิ่งที่ฉันต้องการที่จะบันทึกตำแหน่งปัจจุบันของแอปพลิเคชันของฉันดังนั้นเมื่อฉันจะเปิดตำแหน่งเดิมและเรียกใช้บางสิ่งพวกเขาจะจัดเรียงใหม่เหมือนเดิม

ตัวอย่างเช่นถ้าฉันจะเปิดประเสริฐและหน้าต่างเทอร์มินัลสามหน้าต่างฉันต้องการที่จะบันทึกสิ่งนั้น

ป้อนคำอธิบายรูปภาพที่นี่

ฉันไม่สนใจว่าจะเป็นแอพหรือเครื่องมือบรรทัดคำสั่งตราบใดที่ฉันสามารถบันทึกตำแหน่งของแอพได้อย่างง่ายดาย

ฉันเป็นแฟนตัวยงของMoomแต่น่าเสียดายที่มันใช้งานได้กับ MacOS เท่านั้นและฉันก็คิดถึงมันจริงๆใน Ubuntu มันรองรับฟีเจอร์ที่มากขึ้นและถ้าคุณรู้ว่ามีบางสิ่งที่ใกล้เคียงกับปัญหาหลักของฉันนั่นก็ใช้ได้เช่นกัน


@VitaliusKuchalskis เลย์เอาต์ของหน้าต่างจะทำหรือควรเป็นไฟล์ที่เปิดที่ถูกต้องหรือไม่ และผู้จัดการหน้าต่างของคุณคืออะไร? (Unity?)
Jacob Vlijm

ฉันไม่รู้ว่าคุณกำลังพูดถึงเค้าโครงหน้าต่างอะไร ฉันคิดว่ามีหรือจะเป็นเครื่องมือสำหรับการบันทึกและการโหลดตำแหน่งและขนาดของ windows ต่อพื้นที่ทำงาน จนถึงตอนนี้ฉันพบ [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ) แต่มันจะต้องเขียนสคริปต์หรือเปลี่ยนการกำหนดค่าเพื่อให้คุณสมบัตินี้ ดังนั้นฉันสงสัยว่ามีใครทำไปแล้วและก็ใจดีพอที่จะแบ่งปัน
Qualphey

@VitaliusKuchalskis คุณสามารถดูที่นี่: askubuntu.com/questions/631392/…นี่ถือว่าหน้าต่างเปิดอยู่ แต่ฉันคิดว่าคุณต้องการปิดเครื่องคอมพิวเตอร์และกลับตำแหน่งหน้าต่างหลังจากการคืนค่า ขนาดและตำแหน่ง (เลย์เอาต์) คำถามที่สำคัญคือถ้าคุณเพียงอ้างถึงหน้าต่างแอปพลิเคชันหรือไฟล์ที่เปิดในหน้าต่าง
Jacob Vlijm

เฉพาะหน้าต่างแอพพลิเคชั่นแน่นอน
Qualphey

จากภาพหน้าจอของคุณคุณดูเหมือนจะชอบ / ใช้การเรียงต่อกันสำหรับหน้าต่าง คุณควรลองใช้ WM แบบเรียงต่อกันตัวอย่างเช่น i3
nixpower

คำตอบ:


26

บันทึก

สคริปต์ได้รับการแก้ไข / แก้ไขเมื่อวันที่ 16 มกราคม 2017 แก้ไขสำหรับแอปพลิเคชั่นบางตัวที่ชื่อกระบวนการแตกต่างจากคำสั่งเพื่อเรียกใช้แอปพลิเคชันคำสั่งเพื่อเรียกใช้โปรแกรมประยุกต์อาจเกิดขึ้นได้ในบางครั้งในแอปพลิเคชัน หากมีใครพบกรุณาแสดงความคิดเห็น


สคริปต์เพื่อจดจำและเรียกคืนการจัดเรียงหน้าต่างและแอปพลิเคชันที่เกี่ยวข้อง

สคริปต์ด้านล่างสามารถเรียกใช้ด้วยสองตัวเลือก สมมติว่าคุณมีการจัดเรียงหน้าต่างดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

หากต้องการอ่าน (จดจำ) การจัดเรียงหน้าต่างปัจจุบันและแอปพลิเคชันให้รันสคริปต์ด้วยตัวเลือก:

<script> -read

จากนั้นปิดหน้าต่างทั้งหมด:

ป้อนคำอธิบายรูปภาพที่นี่

จากนั้นเมื่อต้องการตั้งค่าการจัดเรียงหน้าต่างที่จำล่าสุดให้รันด้วยตัวเลือก:

<script> -run

และการจัดเรียงหน้าต่างที่จำครั้งสุดท้ายจะถูกกู้คืน:

ป้อนคำอธิบายรูปภาพที่นี่

สิ่งนี้จะทำงานหลังจากรีสตาร์ท

คุณสามารถ "บันทึก" การจัดเรียงหน้าต่างของคุณปิดเครื่องคอมพิวเตอร์และเรียกใช้การจัดเรียงหน้าต่างเดียวกันหลังจาก (เช่น) รีสตาร์ท

สิ่งที่สคริปต์ทำและสิ่งที่ไม่

เรียกใช้ด้วยตัวเลือก -read

  • สคริปต์ใช้ wmctrlเพื่อแสดงรายการหน้าต่างทั้งหมดทั่วทั้งเวิร์กสเปซตำแหน่งตำแหน่งขนาดแอปพลิเคชันที่เป็นของมัน
  • จากนั้นสคริปต์จะ "แปลง" ตำแหน่งหน้าต่างจากสัมพัทธ์ (เป็นเวิร์กสเปซปัจจุบันเช่นเดียวกับผลลัพธ์wmctrl) เป็นตำแหน่งสัมบูรณ์บนพื้นที่ทำงานของคุณ ดังนั้นจึงไม่สำคัญว่า windows ที่คุณต้องการจดจำนั้นอยู่ในพื้นที่ทำงานเดียวหรือกระจายไปทั่วพื้นที่ทำงานที่แตกต่างกัน
  • จากนั้นสคริปต์จะ "จดจำ" การจัดเรียงหน้าต่างปัจจุบันโดยเขียนเป็นไฟล์ที่มองไม่เห็นในโฮมไดเร็กตอรี่ของคุณ

เรียกใช้ด้วยตัวเลือก -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. ปิดหน้าต่าง ตอนนี้ทำงานใน terminal:

    recall_windows -run
    

การตั้งค่าหน้าต่างของคุณควรได้รับการคืนค่าแล้ว

หากใช้งานได้ดีให้เพิ่มสองคำสั่งในปุ่มทางลัด: เลือก: การตั้งค่าระบบ> "แป้นพิมพ์"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:

recall_windows -read

และ

recall_windows -run

ถึงสองปุ่มทางลัดที่แตกต่างกัน


2
ฮะ! เพิ่งอ่านย่อหน้าแรกและฉันรู้ว่ามันเป็นหนึ่งในของคุณ! (upvoted)
Fabby

@Fabby และร่วมฉลองวันหยุดของฉัน :)
จาค็อบ Vlijm

ดูดี! ตอนนี้หนึ่งสามารถเพิ่มพารามิเตอร์ที่สองสำหรับชื่อการตั้งค่าแล้วจัดเก็บ / กู้คืนสภาพแวดล้อมที่แตกต่างกัน clientA, clientB, home, .. cool!
Bachi

เวอร์ชันที่แตกต่างกันจะยอดเยี่ยมถ้ายอดเยี่ยมก็สามารถปิดโปรแกรมได้ กำลังคิดว่ามีอะไรบนหน้าจอเมื่อภรรยาเข้ามาฉันสามารถทำให้มันดูเหมือนว่าฉันกำลังทำงานอยู่!
Jamie Hutber

คุณอาจลองดูที่ปัญหาเกี่ยวกับพื้นที่ทำงานนี้หรือไม่ ขอบคุณ !!
บ๊องเกี่ยวกับ 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 เป็นเครื่องมือเดสก์ท็อปที่ทันสมัยที่สุดสำหรับ unity / gnome


1

ฉันไม่รู้วิธีง่ายๆในการบรรลุเป้าหมายนี้

อย่างไรก็ตามฉันไม่ค่อยต้องการสิ่งนั้นด้วยเหตุผลง่ายๆ: ระงับ ระงับและจำศีลเป็นเพื่อนของคุณ คุณไม่เพียงบันทึกตำแหน่งหน้าต่างเท่านั้น แต่ยังบันทึกสถานะทั้งหมดของระบบอีกด้วย ฉันไม่ค่อยปิดคอมพิวเตอร์อย่างสมบูรณ์ยกเว้นการโหลดเคอร์เนลเวอร์ชันใหม่


ดีฉันไม่ได้เปลี่ยนหรืออะไรก็ตาม .. แต่ฉันกำลังเปิดให้คุณรู้ว่าเทอร์มินัลใหม่โครงการอื่นเบราว์เซอร์กำลังจะปิดตัวลงหรือบางสิ่งบางอย่าง ฯลฯ ภาพหน้าจอเป็นเพียงตัวอย่างเท่านั้น ..
Lipis

ก็ใช่ ฉันมีเดสก์ท็อปที่ฉันไม่ได้สัมผัสมานานหลายสัปดาห์แล้วซึ่งประกอบด้วยหน้าต่างเทอร์มินัลหลายหน้าต่างเบราว์เซอร์หน้าต่างแสดงกราฟิก R ที่เกี่ยวข้องกับโครงการเฉพาะ
มกราคม

การระงับเป็นวิธีการแก้ปัญหาที่ฉันใช้กับโน้ตบุ๊กของฉัน แต่สำหรับพีซีตั้งโต๊ะนั้นค่อนข้างซับซ้อนกว่าเนื่องจากจำเป็นต้องมีคุณสมบัติที่ดี
cantoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.