我有一个脚本,我从 Unity Launcher 启动它。当我单击图标时,我的脚本成功启动。
虽然脚本只需要一瞬间就可以运行,但启动器图标会闪烁大约 7-8 秒,在此期间启动器处于占用状态并且不会响应额外的点击。
我可以自定义我的 bash 脚本,使得闪烁的图标不会在七秒内阻止脚本吗?
我使用 Ubuntu 15.10。
答案1
不是骗子
非常有关的这个,但略有不同,因为闪烁、无响应的图标是另一个问题,不是通过添加解决:
StartupNotify=false
到启动器;图标仍会闪烁约七秒钟。虽然两个问题中的问题是相同的,但症状和可能的解决方案都略有不同。
原因
从 Unity Launcher 启动 GUI 应用程序(通过单击图标)后,启动器会等待窗口出现。等待期间,光标会闪烁。启动器需要一段时间才能得出结论:其“日期”(窗口)不会出现。尽管然而,等待时启动器不会接受新的点击来再次执行脚本。
上述链接问题中的解决方案是添加
StartupNotify=false
做解决鼠标光标旋转的问题,但不是使图标再次响应。
那么什么起作用呢?
但是,链接答案中的另一个解决方案(从 Unity 启动器启动非 GUI 脚本时打开一个虚假的、不可见的窗口)也将解决闪烁图标的问题。
来自链接的答案:
- 如果目录尚不存在,则创建该目录
~/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
)
现在,如果您从 Unity Launcher 运行脚本,图标将不会闪烁七秒。