क्या वर्तमान डेस्कटॉप लेआउट को संग्रहीत करने का कोई तरीका है?


29

मैं अपने अनुप्रयोगों की वर्तमान स्थितियों को बचाने में सक्षम होना चाहता हूं, इसलिए जब मैं वही खोलने जा रहा हूं और कुछ चलाऊंगा तो वे फिर से व्यवस्थित हो जाएंगे जैसे वे थे।

उदाहरण के लिए, अगर मैं एक उदात्त और तीन टर्मिनल विंडो खोलने जा रहा हूं, तो मैं चाहूंगा कि मैं किसी तरह से बचा सकूं।

यहां छवि विवरण दर्ज करें

मुझे परवाह नहीं है अगर यह एक ऐप या कमांड लाइन टूल है, जब तक कि मैं आसानी से अपने ऐप्स की स्थिति को बचा सकता हूं।

मैं Moom का बहुत बड़ा प्रशंसक हूं , लेकिन दुर्भाग्य से यह केवल MacOS पर काम करता है और मैं इसे उबंटू के समय याद करता हूं। यह अधिक सुविधाओं का समर्थन करता है और यदि आपको मेरी मुख्य समस्या के शीर्ष पर इसके करीब कुछ पता है तो यह भी ठीक है।


@VitaliusKuchalskis क्या विंडो लेआउट करेगी , या क्या यह वास्तव में खोली गई फ़ाइलों को खोलना चाहिए? और आपका विंडो मैनेजर क्या है? (एकता?)
जेकब वलीजम

मैं नहीं जानता कि आप किस विंडो लेआउट के बारे में बात कर रहे हैं? मुझे लगता है कि कार्यक्षेत्र के अनुसार खिड़कियों की स्थिति और आकार को बचाने और लोड करने के लिए एक उपकरण होगा या होगा। अब तक मैंने [wmctrl] ( en.wikipedia.org/wiki/Wmctrl ) पाया । लेकिन इस सुविधा को बनाने के लिए स्क्रिप्ट लिखने या कॉन्फ़िगरेशन बदलने की आवश्यकता होगी। इसलिए, मैं सोच रहा था कि अगर किसी ने पहले से ही इसे बनाया है, और इसे साझा करने के लिए पर्याप्त था।
क्फ्फ्फी जूल

@VitaliusKuchalskis क्या आप इस पर एक नज़र डाल सकते हैं: askubuntu.com/questions/631392/… यह मानता है कि विंडो खुली रहे, लेकिन मुझे लगता है कि आप कंप्यूटर को बंद करना चाहते हैं और पुनर्स्थापना के बाद विंडो की स्थिति फिर से शुरू कर सकते हैं। आकार और स्थिति (लेआउट)। एक महत्वपूर्ण प्रश्न यह है कि क्या आप केवल अनुप्रयोग विंडो का उल्लेख कर रहे हैं , या उन फाइलों का भी जो विंडोज़ के अंदर खोली गई थीं।
जैकब वलिज्म

केवल आवेदन की खिड़कियां।
क्फ्फ्फी जूल

अपने स्क्रीनशॉट से, आप अपनी खिड़कियों के लिए टाइलिंग संरचनाओं को पसंद / उपयोग करते हैं। आपको निश्चित रूप से एक कठिन 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)
फेबी जुएल

@ फैबी और मेरी छुट्टी मना रहे हैं :)
जैकब व्लिजम

अच्छा लग रहा है! अब कोई एक सेटिंग नाम के लिए आसानी से दूसरा परम जोड़ सकता है और फिर अलग-अलग वातावरण, क्लाइंटए, क्लाइंटबी, होम, कूल को स्टोर / रिस्टोर कर सकता है!
बच्ची

यदि यह कार्यक्रम बंद कर सकता है, तो विभिन्न संस्करण शांत होंगे। यह सोचकर कि क्या स्क्रीन पर कुछ भी है जब पत्नी आती है तो मैं आसानी से देख सकता हूं कि मैं काम कर रहा हूं!
जेमी हट्बर


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

ऐसा कोई कार्यक्रम नहीं है। आप कम्पाइब क्यूब स्थापित कर सकते हैं:

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

और अनुसरण करो कैसे करें

compiz एकता / सूक्ति के लिए सबसे उन्नत डेस्कटॉप उपकरण है


1

मैं इसे प्राप्त करने का एक सरल तरीका नहीं जानता।

हालांकि, मुझे शायद ही कभी एक बहुत ही सरल कारण की आवश्यकता होती है: सस्पेंड। सस्पेंड और हाइबरनेशन आपके मित्र हैं। न केवल आप खिड़की की स्थिति को बचाते हैं, बल्कि आप अपने सिस्टम की संपूर्ण स्थिति को भी बचाते हैं। मैं शायद ही कभी कंप्यूटर को पूरी तरह से बंद करता हूं, सिवाय एक नए कर्नेल संस्करण को फिर से लोड करने के।


वैसे मैं इसे या किसी भी चीज़ पर स्विच नहीं कर रहा हूँ .. लेकिन मैं आपको नए टर्मिनल्स, एक और प्रोजेक्ट, ब्राउज़र बंद होने या कुछ और आदि जानने के लिए खोल रहा हूँ .. स्क्रीनशॉट सिर्फ एक उदाहरण था ..
लिपिस

सही है। मेरे पास ऐसे डेस्कटॉप हैं जिन्हें मैंने अब हफ्तों तक नहीं छुआ है जिनमें कई टर्मिनल विंडो, ब्राउज़र विंडो, आर ग्राफिक डिस्प्ले विंडो शामिल हैं जो सभी एक विशेष परियोजना से संबंधित हैं।
जनवरी

सस्पेंड वह समाधान है जो मैं अपनी नोटबुक के लिए उपयोग करता हूं, हालांकि, डेस्कटॉप पीसी के लिए यह थोड़ा अधिक जटिल है, क्योंकि इसमें एक nobreak होना आवश्यक है।
छत्तीसगढ़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.