Câu hỏi tuyệt vời.
Nguyên nhân
Thông thường, khi khởi động các ứng dụng GUI từ Unity Launcher, trình khởi chạy sẽ chờ một cửa sổ xuất hiện. Trong khi chờ đợi, nó cho thấy "bánh xe quay". Nó sẽ không chờ đợi mãi mãi; sau khoảng 20 giây, trình khởi chạy giả định cửa sổ sẽ không xuất hiện và chờ đợi.
1. Lệnh chính của launcher của ứng dụng
Trong một .desktop
tập tin, liên quan đến việc đầu Exec=
dòng (lệnh chính), bạn có thể nói với các phóng chờ đợi hay không, trong một dòng:
StartupNotify=true
để làm cho nó chờ đợi, hoặc
StartupNotify=false
để làm cho nó không chờ đợi.
2. Danh sách nhanh các mục của trình khởi chạy
Tuy nhiên, đối với các mục danh sách nhanh (nhấp chuột phải) có thể có của trình khởi chạy, giá trị mặc định là StartupNotify=true
. Thật không may, giá trị này là cố định và không thể thay đổi bởi bất cứ điều gì.
Điều đó có nghĩa là nếu bạn bắt đầu bất kỳ lệnh nào từ nhấp chuột phải vào biểu tượng trình khởi chạy trong Unity Launcher, trình khởi chạy đang mong đợi một cửa sổ và chờ đợi nó, hiển thị bánh xe quay.
Điểm mấu chốt là, mặc dù có thể giải thích được, nhưng dường như không có giải pháp nào cho vấn đề tại thời điểm này, sau đó tạo một trình khởi chạy chuyên dụng cho tập lệnh của bạn và thêm dòng StartupNotify=false
vào tệp.
Bằng chứng
Bạn có thể tự kiểm tra hành vi. Tạo hai launcher:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true
và:
[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false
Lưu chúng dưới dạng test1.desktop
và test2.desktop
kéo cả hai trình khởi chạy vào trình khởi chạy Unity. Nhấp vào chúng và xem sự khác biệt trong hành vi.
Biên tập; nếu nó thực sự làm phiền bạn, hãy cho Unity một cửa sổ giả
Nếu bạn có nhiều tập lệnh trong danh sách nhanh, và / hoặc nó thực sự làm phiền bạn, có một giải pháp thẩm mỹ khác; chúng tôi có thể giả mạo , vô hình (hoàn toàn minh bạch) để hiển thị một cửa sổ, được đưa vào tập lệnh của bạn. kịch bản của bạn sau đó sẽ là (ví dụ)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
trong đó lệnh fake_window
sẽ gọi cửa sổ (fake-) của chúng ta, làm cho Unity kết thúc bánh xe quay.
Làm thế nào để thiết lập
- Tạo, nếu nó chưa tồn tại, thư mục
~/bin
Sao chép tập lệnh bên dưới vào một tệp trống, lưu nó dưới dạng fake_window
(không có phần mở rộng) ~/bin
và làm cho nó có thể thực thi được
#!/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()
Thêm vào phần cuối của tập lệnh của bạn lệnh:
fake_window
Đăng xuất và đăng nhập lại (hoặc chạysource ~/.profile
)
Đó là nó, bánh xe bây giờ sẽ chỉ quay miễn là kịch bản chạy.
Giải trình
Kịch bản không tạo ra một cửa sổ tối giản. Tuy nhiên, cửa sổ hoàn toàn trong suốt và có kích thước 0x0 pixel và do đó không nhìn thấy được. Nó sẽ tự hủy ngay lập tức khi nó tồn tại.
Gọi cửa sổ ở cuối tập lệnh của bạn, bạn sẽ đáp ứng mong muốn của Unity cho một cửa sổ, dừng bánh xe quay.