แก้ไข - คำตอบใหม่ -
คำตอบด้านล่างนี้ / ยังคงใช้ได้ทั้งหมดและตัวเลือกที่แนะนำ ข้อมูลเชิงลึกอย่างต่อเนื่องทำให้ฉันเพิ่มตัวเลือกนี้เพื่อใช้ตัวบ่งชี้ด้านล่างซึ่งอาจเป็นทางออกที่หรูหราที่สุด
ดังนั้นจึงควรแทนที่ตัวเลือก 5 (โดยใช้ไฟล์ .desktop)
เพียงเลือกแอปพลิเคชันจากรายการและหน้าต่างทั้งหมดของแอปพลิเคชั่นที่เกี่ยวข้อง (ปรากฏบนวิวพอร์ตปัจจุบัน) จะเพิ่ม:
วิธีใช้
จาก ppa:
sudo add-apt-repository ppa:vlijm/upfront
sudo apt-get update
sudo apt-get install upfront
... หรือด้วยตนเอง:
#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread
import os
import subprocess
import getpass
currpath = os.path.dirname(os.path.realpath(__file__))
class Indicator():
def __init__(self):
self.app = 'raise_apps'
iconpath = os.path.join(currpath, "raise.png")
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
# the thread:
self.update = Thread(target=self.check_recent)
# daemonize the thread to make the indicator stopable
self.update.setDaemon(True)
self.update.start()
def create_menu(self):
# creates the (initial) menu
self.menu = Gtk.Menu()
# separator
initial = Gtk.MenuItem("Fetching list...")
menu_sep = Gtk.SeparatorMenuItem()
self.menu.append(initial)
self.menu.append(menu_sep)
# item_quit.show()
self.menu.show_all()
return self.menu
def raise_wins(self, *args):
index = self.menu.get_children().index(self.menu.get_active())
selection = self.menu_items2[index][1]
for w in selection:
execute(["wmctrl", "-ia", w])
def set_new(self):
# update the list, appearing in the menu
for i in self.menu.get_children():
self.menu.remove(i)
for app in self.menu_items2:
sub = Gtk.MenuItem(app[0])
self.menu.append(sub)
sub.connect('activate', self.raise_wins)
# separator
menu_sep = Gtk.SeparatorMenuItem()
self.menu.append(menu_sep)
# quit
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.stop)
self.menu.append(item_quit)
self.menu.show_all()
def get_apps(self):
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split() for l in get(["wmctrl", "-lpG"]).splitlines()]
# windows on current viewport
relevant = [w for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# pids
pids = [l.split() for l in get(["ps", "-u", getpass.getuser()]).splitlines()]
matches = [[p[-1], [w[0] for w in relevant if w[2] == p[0]]] for p in pids]
return [m for m in matches if m[1]]
def check_recent(self):
self.menu_items1 = []
while True:
time.sleep(4)
self.menu_items2 = self.get_apps()
for app in self.menu_items2:
app[0] = "gnome-terminal" if "gnome-terminal" in app[0] else app[0]
if self.menu_items2 != self.menu_items1:
GObject.idle_add(
self.set_new,
priority=GObject.PRIORITY_DEFAULT
)
self.menu_items1 = self.menu_items2
def stop(self, source):
Gtk.main_quit()
def get(command):
return subprocess.check_output(command).decode("utf-8")
def execute(command):
subprocess.Popen(command)
Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
ตัวบ่งชี้ที่ต้องการ wmctrl
sudo apt-get wmctrl
คัดลอกตัวบ่งชี้ลงในไฟล์เปล่าแล้วบันทึกเป็น raise_apps.py
คัดลอกภาพด้านล่างบันทึกเป็นชื่อที่แน่นอน raise.png
ในไดเรกทอรีเดียวกับตัวบ่งชี้
จากนั้นให้รันโดยใช้คำสั่ง:
python3 /path/to/raise_apps.py
เพิ่มถ้าคุณต้องการเริ่มต้นแอปพลิเคชัน:
/bin/bash -c "sleep 10 && python3 /path/to/raise_apps.py"
คำตอบเดิม:
เกี่ยวกับคำถาม
ด้วยเครื่องมือที่เหมาะสมมันไม่ซับซ้อนมากนักที่จะ "เพิ่ม" หน้าต่างทั้งหมดของแอปพลิเคชัน มันซับซ้อนกว่านี้เล็กน้อยเพื่อให้แน่ใจว่าจะเพิ่มเฉพาะหน้าต่างของวิวพอร์ตปัจจุบันเท่านั้น อย่างไรก็ตามความท้าทายที่แท้จริงคือการหาวิธีที่สะดวกในการทำให้ผู้ใช้สามารถดำเนินการได้
ด้านล่างห้าตัวเลือกที่จะดูแลที่แสดงให้เห็นว่ามันสามารถทำได้ ตัวเลือกทั้งหมดพร้อมใช้งาน ตัวเลือกสุดท้ายคือประเภทของการทดลอง มันทำงานได้ดี แต่มีข้อเสียเล็ก ๆ น้อย ๆ เครื่องสำอางตามที่อธิบายไว้ในคำอธิบายของตัวเลือก ฉันเพิ่ม แต่อย่างไรก็ตามมันเป็นแนวคิด
การแพร่กระจายหน้าต่างโดยอัตโนมัติในลักษณะที่ไม่ทับซ้อนกันตามที่แนะนำในความคิดเห็นดูเหมือนจะไม่ใช่ความคิดที่เป็นประโยชน์สำหรับฉัน หากคุณทำงานในการตั้งค่าหน้าต่าง (แอปพลิเคชันที่ฉลาด) จัดกลุ่มสคริปต์อาจจัดเรียงหน้าต่างใหม่โดยไม่ต้องการ
วิธีใช้
สำหรับตัวเลือกทั้งหมดคุณต้อง:
ติดตั้งwmctrl
หากยังไม่ได้อยู่ในระบบของคุณ:
sudo apt-get install wmctrl
สร้างถ้ายังไม่มีไดเรกทอรี:
~/bin
(คำอธิบาย: ไดเรกทอรี~/bin
อยู่ใน $ PATH เพื่อให้คุณสามารถเรียกใช้ไฟล์ปฏิบัติการได้โดยใช้ชื่อของพวกเขา)
คัดลอกสคริปต์ที่ตรงกับตัวเลือกวางลงในไฟล์เปล่าบันทึกเป็นraise_app
(ไม่มีส่วนขยาย) ~/bin
และทำให้สามารถเรียกใช้งานได้
ในตัวเลือกที่แยกต่างหากจะอธิบายขั้นตอนเพิ่มเติมที่เป็นไปได้
ตัวเลือกที่ 1: เลือกแอปพลิเคชันโดยป้อนอักขระหนึ่งตัวขึ้นไป
- กดคีย์ผสม
zenity
หน้าต่างจะปรากฏขึ้น
- ป้อนชื่อแอปพลิเคชันอย่างน้อยหนึ่งตัวในกล่องป้อน
- กดปุ่มตกลง
สิ่งนี้จะทำให้หน้าต่างทั้งหมดของแอปพลิเคชันที่ตรงกัน (บนวิวพอร์ตปัจจุบัน ) ปรากฏขึ้นด้านหน้า
ยกgnome-terminal
หน้าต่างทั้งหมดในวิวพอร์ตปัจจุบัน:
วิธีใช้:
บท:
#!/usr/bin/env python3
import subprocess
import getpass
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# ask user for first characters
try:
arg = get('zenity --entry --text "first characters" --title "application"').strip()
except subprocess.CalledProcessError:
pass
# raise matching windows
try:
[execute("wmctrl -ia "+item[1]) for item in windows if item[0].startswith(arg)]
except (subprocess.CalledProcessError, NameError):
pass
ตัวเลือกที่ 2: วนรอบแอปพลิเคชันและยกระดับหน้าต่างด้วยคีย์ผสม:
สมมติว่าผมมีสคริปต์ด้านล่างภายใต้คีย์ผสม+Alt 1ฉันเปิดหน้าต่างหลายบาน:
- Firefox
- คำพังเพยขั้ว
- หอยโข่ง
สถานะปัจจุบัน:
ฉันกดหนึ่งครั้งAlt+ 1ทุกnautilus
หน้าต่างยกขึ้น:
ฉันกดอีกครั้งAlt+ หน้าต่าง1ทุกfirefox
บานยกขึ้น:
ฉันกดอีกครั้งAlt+ หน้าต่าง1ทั้งหมดgnome-terminal
จะถูกยกขึ้นอีกรอบจะเริ่มต้นใหม่:
วิธีใช้
จากนั้นวนรอบแอปพลิเคชันของคุณด้วยหน้าต่างแอปพลิเคชันที่จัดกลุ่มด้วยชุดคีย์ของคุณ
บท:
#!/usr/bin/env python3
import subprocess
import getpass
include_single = True # set to False if you only want to cycle through apps with multiple windows
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
def get_frontmost():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# create application list to cycle through
if include_single == False:
pre = [it[0] for it in windows]
apps = sorted(list(set([it for it in pre if pre.count(it) > 1])))
else:
apps = sorted(list(set([it[0] for it in windows])))
if len(apps) == 0:
pass
else:
# get the frontmost window as a last itm in the cycle
front = get_frontmost()
front_pid = [l.split()[2] for l in get("wmctrl -lp").splitlines() if front in l][0]
last_infront = get("ps -u "+getpass.getuser()+" | grep "+front_pid).split()[-1]
# determine next apllication to raise
if not last_infront in apps or last_infront == apps[-1]:
arg = apps[0]
print(arg)
else:
arg = apps[apps.index(last_infront)+1]
# raise matching windows
try:
[execute("wmctrl -ia "+item[1]) for item in windows if item[0] == arg]
except (subprocess.CalledProcessError, NameError):
pass
ตัวเลือกที่ 3: กดปุ่มการรวมกัน + คลิกที่ไอคอนตัวเรียกใช้- หรือ -หน้าต่างแอปพลิเคชันเพื่อยกหน้าต่างทั้งหมดในวิวพอร์ตปัจจุบัน
นี่อาจเป็นตัวเลือกที่ใกล้เคียงที่สุดกับที่อธิบายไว้ในคำถาม / ความคิดเห็น
สมมติว่าฉันมีเดสก์ท็อปยุ่งกับnautilus
windows สามฝังอยู่ภายใต้ windows อื่น
วิธียกหน้าต่าง nautilus ทั้งหมด (ทางลัดตัวอย่าง: Alt+ 1):
- กดAlt+ 1ปล่อย (!)
ภายใน 3 วินาทีอย่างใดอย่างหนึ่ง:
คลิกที่ไอคอนของแอปพลิเคชั่นในตัวเรียกใช้งาน
หรือ:
คลิกที่หนึ่งในหน้าต่างของแอปพลิเคชัน
ผล:
วิธีใช้:
แล้ว:
บท
#!/usr/bin/env python3
import subprocess
import getpass
import time
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
def get_frontmost():
cmd = "xprop -root"
frontmost = [l for l in get(cmd).splitlines() if\
"ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
return frontmost[:2]+"0"+frontmost[2:]
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# get window data for various purposes
w_data = get("wmctrl -lpG").splitlines()
non_windows = sum([[l.split()[0] for l in w_data if it in l]\
for it in ("unity-launcher", "unity-panel", "unity-dash", "Hud")], [])
# get id of current window
curr_window = get_frontmost()
# user gets 3 seconds to pick an application window (or launcher icon)
t = 0
while t < 4:
w_id1 = get_frontmost()
time.sleep(1)
w_id2 = get_frontmost()
if w_id1 == w_id2 or w_id2 in non_windows+[curr_window]:
t = t+1
else:
new_frontmost = w_id2
break
# raise
try:
pid = [l.split()[2] for l in w_data if new_frontmost in l]
wl_data = [l.split() for l in w_data]
raise_windows = [l[0] for l in wl_data if pid[0] == l[2] and\
0 < int(l[3]) < res[0] and 0 < int(l[4]) < res[1]]
[execute("wmctrl -ia "+item) for item in raise_windows]
except NameError:
pass
ตัวเลือก 4: การผสมคีย์เรียกรายการตัวเลือกโดยแสดงจำนวนหน้าต่างต่อแอปพลิเคชันในวิวพอร์ตปัจจุบัน
อันนี้เปิดออกเพื่อความสะดวกมากขึ้นแล้วฉันคิดว่า:
การกดคีย์ผสม (อีกครั้งตัวอย่าง -) Alt+ จะ1เรียกzenity
หน้าต่างแสดงรายการแอปพลิเคชันทั้งหมดและจำนวนหน้าต่างในวิวพอร์ตปัจจุบัน:
เพียงแค่กดปุ่ม▴หรือ▾ลูกศรจะพาคุณไปยังตัวเลือกที่เหมาะสม กดEnterและหน้าต่างทั้งหมดของแอปพลิเคชันที่เลือกจะถูกยกขึ้น
วิธีใช้:
บท
#!/usr/bin/env python3
import subprocess
import getpass
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
# preparing zenity optionlist
apps = [item[0] for item in windows]
# prevent multiple zenity windows
if apps.count("zenity") > 1:
pass
elif apps.count("zenity") > 0:
execute('zenity --info --text "Another Zenity window is open already"')
# preventing empty windowlist
elif len(apps) > 0:
applist = [[app, str(apps.count(app))] for app in set(apps)]
applist.sort(key=lambda x: x[1])
# calling zenity window
try:
arg = get('zenity --list --text "Choose an application" '+\
'--title "Current windows" '+\
'--column "application" '+\
'--column "windows" '+\
'--height 250 '+\
'--width 250 '+\
(" ").join(sum(applist, [])))
except subprocess.CalledProcessError:
pass
# raise matching windows
try:
[execute("wmctrl -ia "+item[1]) \
for item in windows if arg.startswith(item[0])]
except (subprocess.CalledProcessError, NameError):
pass
else:
execute('zenity --info --text "No windows to list"')
ตัวเลือกที่ 5: ยก windows ของแอปพลิเคชันที่กำลังเรียกใช้จากไอคอนตัวเรียกใช้
ตัวเลือกนี้มีไอคอนตัวเรียกใช้พร้อมกับแอปพลิเคชันที่ทำงานอยู่ในรายการด่วน เลือกหนึ่งหน้าต่างจากนั้นแอปพลิเคชันทั้งหมดจะได้รับการยกขึ้น
ตัวเรียกใช้งานจะได้รับการอัปเดตโดยอัตโนมัติเมื่อรายการแอปพลิเคชันที่รันอยู่ (บนวิวพอร์ตปัจจุบัน) เปลี่ยนแปลง รายการด่วนแสดงรายการต่าง ๆ ในวิวพอร์ตอื่น ๆ ที่เปิดหน้าต่างของแอปพลิเคชั่นอื่น (จะใช้เวลา 1-2 วินาทีในการปรับ)
เป็นที่กล่าวถึงแม้จะทำงานอย่างเต็มที่ตัวเลือกนี้เป็นความหมายเป็นแนวคิด มันมีข้อเสียเล็ก ๆ น้อย ๆ เครื่องสำอางตามที่มันเป็น ที่สำคัญที่สุด:
- เคอร์เซอร์ "วงล้อ" หมุนอย่างต่อเนื่องไม่กี่วินาทีหลังจากการกระทำ แม้ว่ามันจะไม่ส่งผลกระทบต่อฟังก์ชั่น แต่เป็นข้อเสียของเครื่องสำอาง
- รายการแอปพลิเคชันในไอคอนตัวเรียกใช้งานจะใช้เวลาอัปเดต 1-2 วินาทีหลังจากรายการแอปพลิเคชันที่รันอยู่เปลี่ยนแปลง
นอกจากนี้การตั้งค่ามีความซับซ้อนเล็กน้อย (แม้ว่าจะอธิบายรายละเอียดด้านล่าง)
วิธีใช้
ด้านล่างคุณจะพบกับ:
สองสคริปต์ / ไอคอน / .desktop
ไฟล์
- เตรียมการตั้งค่าเช่นเดียวกับใน "วิธีใช้" ให้บันทึกสคริปต์ (main-) ตัวแรกเช่นเดียวกับ
raise_app
ใน~/bin
บันทึกไอคอนด้านล่าง (คลิกขวา, บันทึกเป็น) เป็น raise.png
คัดลอก.desktop
ไฟล์ลงในไฟล์ว่างแก้ไขบรรทัด
Icon=/path/to/raise.png
ไปยังเส้นทางที่แท้จริงไปที่ไอคอน (เส้นทางที่มีช่องว่างระหว่างเครื่องหมายคำพูด)
บันทึกเป็นraise.desktop
ใน~/.local/share/applications
ลาก.desktop
ไฟล์ไปที่ตัวเรียกใช้งานเพื่อเพิ่ม
- คัดลอกสคริปต์ที่สองวางลงในไฟล์ที่ว่างเปล่าบันทึกเป็น
update_apps
ใน~/bin
ให้มันปฏิบัติการ
เพิ่มคำสั่งต่อไปนี้ไปยังแอปพลิเคชันเริ่มต้นของคุณ (Dash> แอปพลิเคชันเริ่มต้น> เพิ่ม):
update_apps
- ออกจากระบบและกลับเข้ามาใหม่เพื่อให้ใช้งานได้
สคริปต์แรก
#!/usr/bin/env python3
import subprocess
import getpass
import sys
arg = sys.argv[1]
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
try:
[execute("wmctrl -ia "+item[1]) for item in windows if item[0].startswith(arg)]
except (subprocess.CalledProcessError, NameError):
pass
สคริปต์ที่สอง
#!/usr/bin/env python3
import subprocess
import getpass
import time
import os
dtfile = os.environ["HOME"]+"/.local/share/applications/raise.desktop"
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def execute(command):
subprocess.Popen(["/bin/bash", "-c", command])
# calculate screen resolution
res_output = get("xrandr").split(); idf = res_output.index("current")
res = (int(res_output[idf+1]), int(res_output[idf+3].replace(",", "")))
# creating window list on current viewport / id's / application names
def applist():
try:
w_data = [l.split()[0:7] for l in get("wmctrl -lpG").splitlines()]
windows = [[get("ps -u "+getpass.getuser()+" | grep "+w[2]).split()[-1], w[0]]
for w in w_data if 0 < int(w[3]) < res[0] and 0 < int(w[4]) < res[1]]
except subprocess.CalledProcessError:
return []
else:
return set([app[0] for app in windows])
def update_dtfile(applications, text):
actionline = "Actions="+(";").join(applications)+";\n"
with open(dtfile) as src:
lines = src.readlines()
lines = lines[:[i for i in range(len(lines)) \
if lines[i].startswith("Actions=")][0]]+[actionline]
for item in text:
for it in item:
lines.append(it)
with open(dtfile, "wt") as out:
for line in lines:
out.write(line)
while True:
apps1 = applist()
time.sleep(1)
apps2 = applist()
if apps1 != apps2:
text = [["[Desktop Action "+it+"]\n", "Name="+it+"\n",
"Exec=raise_app "+it+"\n", "OnlyShowIn=Unity;\n\n",
]for it in apps2]
update_dtfile(apps2, text)
ไฟล์ .desktop
[Desktop Entry]
Name=Raise application windows
Comment=Raise groups of windows
Icon=/path/to/raise.png
Terminal=false
Type=Application
Version=1.0
Actions=
คำอธิบายสั้น ๆ
โซลูชันทั้งหมดข้างต้นใช้wmctrl
เพื่อสร้างรายการหน้าต่างโดยใช้wmctrl -lpG
คำสั่ง คำสั่งนี้สร้างบรรทัดที่มีลักษณะดังนี้:
0x044000b3 0 3429 65 24 1615 1026 jacob-System-Product-Name unity - How to show all windows of an application? - Ask Ubuntu - Mozilla Firefox
บรรทัดเหล่านี้รวมถึง:
- คอลัมน์ที่ 1: รหัสของหน้าต่าง (ที่เราสามารถใช้ยกมัน)
- คอลัมน์ที่ 3: pid ที่เป็นเจ้าของหน้าต่าง
- คอลัมน์ที่ 4 / 5th: เรขาคณิตของหน้าต่าง xy (ที่เราใช้เพื่อดูว่าหน้าต่างอยู่ในวิวพอร์ตปัจจุบันหรือไม่
xrandr
)
pid ถูกค้นหาในเอาต์พุตของps -u <username>
เพื่อรับการระบุ "ชื่อผู้ใช้" (ชื่อ) ของแอปพลิเคชัน
ดังนั้นเราสามารถจัดสรร windows ให้กับแอปพลิเคชัน ต่อจากนั้นเราสามารถเพิ่มหน้าต่างของโปรแกรมที่กำหนดในวงที่มีคำสั่งfor
wmctrl -ia
ในตัวเลือก 3
สคริปต์เริ่มการวนรอบ "รอ" ที่ 3 วินาทีโดยใช้xprop -root
คำสั่งซ้ำ ๆ เพื่อดูว่ามีการเปลี่ยนแปลงใด ๆ ในหน้าต่างที่อยู่ข้างหน้าหรือไม่ สิ่งนี้จะเกิดขึ้นหากผู้ใช้คลิกที่ไอคอนตัวเรียกใช้เพื่อยกระดับหน้าต่างแอปพลิเคชันหรือคลิกที่หน้าต่างโดยตรง ถ้าเป็นเช่นนั้น while-loop จะแบ่งและค้นหาแอพพลิเคชั่นส่วนหน้า "ใหม่" และจากนั้นจะเพิ่มหน้าต่างอื่น ๆ ทั้งหมดของแอปพลิเคชันนั้น