ध्यान दें
स्क्रिप्ट को 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
फिर:
- स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें, इसे इस रूप
recall_windows
में सहेजें ~/bin
। यदि आवश्यक हो तो निर्देशिका बनाएं। यदि निर्देशिका अभी तक मौजूद नहीं थी, तो source ~/.profile
निर्देशिका बनाने के बाद या तो चलाएँ या लॉग आउट करें। यह अब अंदर होगा$PATH
- स्क्रिप्ट को निष्पादन योग्य (!) बनाएं।
अब कुछ विंडो खोलें gedit
, firefox
या जो भी हो, और कमांड को चलाकर टर्मिनल में स्क्रिप्ट का परीक्षण करें (आवश्यक कोई उपसर्ग नहीं):
recall_windows -read
खिड़की बंद करें। अब एक टर्मिनल में दौड़ें:
recall_windows -run
अब आपका विंडो सेटअप बहाल होना चाहिए
यदि सभी ठीक काम करते हैं, तो शॉर्टकट कुंजियों में दो कमांड जोड़ें: चुनें: सिस्टम सेटिंग्स> "कीबोर्ड"> "शॉर्टकट"> "कस्टम शॉर्टकट"। "+" पर क्लिक करें और कमांड जोड़ें:
recall_windows -read
तथा
recall_windows -run
दो अलग शॉर्टकट कुंजी के लिए