คำถามที่ยอดเยี่ยม
สาเหตุ
โดยปกติเมื่อเริ่มต้นแอปพลิเคชัน GUI จาก Unity Launcher ตัวเรียกใช้งานจะรอให้หน้าต่างปรากฏขึ้น ในขณะที่รอก็จะแสดง "ล้อหมุน" มันจะไม่รอตลอดไป หลังจากผ่านไปประมาณ 20 วินาทีตัวเรียกใช้จะถือว่าหน้าต่างไม่ปรากฏและจะรอ
1. คำสั่งหลักของตัวเรียกใช้งานแอปพลิเคชัน
ใน.desktop
ไฟล์ที่เกี่ยวข้องกับExec=
บรรทัดแรก(คำสั่งหลัก) คุณสามารถบอกให้ตัวเรียกใช้รอหรือไม่อยู่ในบรรทัด:
StartupNotify=true
เพื่อให้รอหรือ
StartupNotify=false
เพื่อให้ไม่รอ
2. รายการด่วนของตัวเรียกใช้
สำหรับรายการด่วนเป็นไปได้ (คลิกขวา) รายการปล่อย StartupNotify=true
แต่ค่าเริ่มต้นคือ น่าเสียดายที่ค่านี้ได้รับการแก้ไขและไม่สามารถเปลี่ยนแปลงได้โดยอะไร
นั่นหมายความว่าหากคุณเริ่มคำสั่งใด ๆจากการคลิกขวาที่ไอคอนตัวเรียกใช้งานใน Unity Launcher ตัวเรียกใช้งานจะคาดหวังหน้าต่างและรอให้มันแสดงล้อหมุน
บรรทัดล่างคือแม้ว่าจะสามารถอธิบายได้ดูเหมือนจะไม่มีวิธีแก้ไขปัญหาในขณะนี้ แต่ก็มีตัวสร้างตัวเรียกใช้งานเฉพาะสำหรับสคริปต์ของคุณและเพิ่มบรรทัดStartupNotify=false
ลงในไฟล์
การพิสูจน์
คุณสามารถทดสอบพฤติกรรมด้วยตัวเอง สร้างปืนกลสองตัว:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
และ:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
บันทึกพวกเขาเป็นtest1.desktop
และtest2.desktop
ลากทั้งปืนกลไปปล่อยความสามัคคี คลิกที่พวกเขาและดูความแตกต่างในพฤติกรรม
แก้ไข; ถ้ามันรบกวนจิตใจคุณจริง ๆฟีด Unity จะเป็นหน้าต่างปลอม
หากคุณมีสคริปต์จำนวนมากในรายการด่วนและ / หรือทำให้คุณรำคาญจริงๆมีโซลูชั่นเครื่องสำอางอื่น เราสามารถปลอมมองไม่เห็น (โปร่งใส) เพื่อแสดงหน้าต่างที่จะรวมอยู่ในสคริปต์ของคุณ สคริปต์ของคุณจะเป็น (เช่น)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
ตำแหน่งที่คำสั่งfake_window
จะเรียกหน้าต่าง (ปลอม -) ของเราทำให้ Unity จบการหมุนวงล้อ
วิธีการตั้งค่า
- สร้างถ้ามันยังไม่มีไดเรกทอรี
~/bin
คัดลอกสคริปต์ด้านล่างลงในไฟล์ว่างเปล่าบันทึกเป็นfake_window
(ไม่มีส่วนขยาย) ~/bin
และทำให้สามารถเรียกใช้งานได้
#!/usr/bin/env python3
from gi.repository import Gtk
from threading import Thread
import time
import subprocess
"""
This is a self-destroying window, to "feed" Unity a fake-window, preventing
the launcher to show a spinning wheel, waiting for a window to appear.
Include the command to run this script at the end of the (your) script.
"""
class FakeWin(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="1526closeme")
Thread(target = self.close).start()
def close(self):
t = 0
while t < 150:
time.sleep(0.2)
try:
pid = subprocess.check_output(["pgrep", "-f", "fake_window"])\
.decode("utf-8").strip()
subprocess.Popen(["kill", pid])
break
except subprocess.CalledProcessError:
pass
t += 1
def fakewindow():
window = FakeWin()
# make our window transparent
window.set_opacity(0)
window.set_default_size(0,0)
window.show_all()
Gtk.main()
fakewindow()
เพิ่มคำสั่งสคริปต์ที่ส่วนท้ายสุดของสคริปต์ของคุณ:
fake_window
ออกจากระบบและกลับเข้ามาใหม่ (หรือเรียกใช้source ~/.profile
)
นั่นแหล่ะวงล้อจะหมุนเพียงตราบเท่าที่สคริปต์ทำงาน
คำอธิบาย
สคริปต์ไม่สร้างหน้าต่าง minimalistic หน้าต่างนั้นโปร่งใสอย่างสมบูรณ์และมีขนาด 0x0 พิกเซลและมองไม่เห็น มันจะทำลายตัวเองทันทีที่มีอยู่
เมื่อเรียกหน้าต่างที่ด้านท้ายของสคริปต์คุณจะสนองความต้องการของ Unity สำหรับหน้าต่างหยุดล้อหมุน