Tindakan klik kanan khusus di Unity Launcher membuat kursor sibuk selama 20 detik

14

Untuk memiliki opsi "meminimalkan jendela" melalui klik kanan pada ikon di peluncur Unity (Ubuntu 14.04), saya mengikuti instruksi terperinci di sini tentang mengubah .desktopfile dan membuat Firefoxpeluncur khusus dalam ~/.local/share/applications/folder. Bagian yang relevan dari file .desktop adalah:

Actions=NewWindow;NewPrivateWindow;Minimize

[Desktop Action NewWindow]
Name=Open a New Window
Exec=firefox -new-window
OnlyShowIn=Unity;

[Desktop Action NewPrivateWindow]
Name=Open a New Private Window
Exec=firefox -private-window
OnlyShowIn=Unity;

[Desktop Action Minimize]
Name=Minimize Windows
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
OnlyShowIn=Unity;

Tindakan desktop "Minimalkan" memanggil skrip shell sederhana, minimize.shyang memiliki konten berikut:

#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
    xdotool windowminimize $i
done

Script menggunakan xdotool, yang dapat diinstal dari repositori resmi, untuk menemukan semua firefoxjendela, beralih ke mereka dan meminimalkan mereka.

Skrip berfungsi dan opsi menu peluncur kanan "Minimalkan Windows" juga berfungsi, tetapi segera setelah jendela diperkecil, penunjuk tetikus masuk ke mode "sibuk" dan tetap seperti ini selama sekitar 20 detik (walaupun tindakan tetikus masih responsif).

Adakah yang tahu mengapa memulai skrip shell dari opsi menu kanan di Unity dapat menyebabkan perilaku ini?

EDIT : Rupanya masa tunggu tidak bisa dihindari, seperti yang dijelaskan dalam jawaban Jacob Vlijm. Karena mouse tetap responsif, menghindari transformasi pointer di roda pemintalan adalah solusi estetika parsial, seperti yang dijelaskan pada askubuntu .

EDIT2 : memberikan sistem jendela palsu adalah solusi yang lebih baik, seperti yang dijelaskan oleh Jacob di bawah ini.

Cosmin Saveanu
sumber
Hai Cosmin, saya menambahkan solusi lain yang cukup bersih.
Jacob Vlijm
Yakub terima kasih. Saya sedang memikirkan solusi semacam itu tetapi tidak tahu bagaimana itu bisa dilakukan. Sangat bagus bahwa ada solusi.
Cosmin Saveanu

Jawaban:

18

Pertanyaan yang sangat bagus

Penyebab

Biasanya, ketika memulai aplikasi GUI dari Unity Launcher, peluncur menunggu jendela muncul. Sambil menunggu, itu menunjukkan "roda berputar". Namun tidak akan menunggu selamanya; setelah sekitar 20 detik, peluncur menganggap jendela tidak akan muncul dan menyerah menunggu.

1. Perintah utama peluncur aplikasi

Dalam sebuah .desktopfile, mengenai Exec=baris pertama (perintah utama), Anda dapat memberi tahu peluncur untuk menunggu atau tidak, dalam satu baris:

StartupNotify=true

untuk membuatnya menunggu, atau

StartupNotify=false

untuk membuatnya tidak menunggu.

2. Item daftar cepat dari peluncur

Namun untuk item quicklist (klik kanan) peluncur, nilai defaultnya adalah StartupNotify=true . Sayangnya, nilai ini tetap dan tidak dapat diubah oleh apa pun.

Itu berarti bahwa jika Anda mulai setiap perintah dari mengklik kanan ikon peluncur di Unity Launcher, peluncur mengharapkan jendela dan menunggu, menampilkan roda berputar.

Intinya adalah bahwa, meskipun dapat dijelaskan, tampaknya tidak ada solusi untuk masalah saat ini, selain itu membuat peluncur khusus untuk skrip Anda dan menambahkan baris StartupNotify=falseke file.

Bukti

Anda dapat menguji perilaku itu sendiri. Buat dua peluncur:

[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=true

dan:

[Desktop Entry]
Name=Test
Exec=sh /home/myusername/Documents/xdotool_sh/minimize.sh firefox
Type=Application
StartupNotify=false

Simpan sebagai test1.desktopdan test2.desktop, seret kedua peluncur ke peluncur Unity. Klik mereka dan lihat perbedaan perilaku.


Edit; jika benar benar mengganggu Anda, beri Unity jendela palsu

Jika Anda memiliki banyak skrip dalam daftar cepat, dan / atau itu benar-benar mengganggu Anda, ada solusi kosmetik lain; kami dapat memalsukan , tidak terlihat (sepenuhnya transparan) untuk menampilkan jendela, untuk dimasukkan dalam skrip Anda. skrip Anda akan menjadi (misalnya)

#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
    xdotool windowminimize $i
done
fake_window

dimana perintahnya fake_window akan memanggil jendela (palsu-) kita, membuat Unity mengakhiri roda pemintalan.

Cara mengatur

  1. Buat, jika belum ada, direktori ~/bin
  2. Salin skrip di bawah ini ke dalam file kosong, simpan sebagai fake_window(tanpa ekstensi) ~/bin dan buat itu bisa dieksekusi

    #!/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()
  3. Tambahkan sampai akhir skrip Anda perintah:

    fake_window
  4. Logout dan kembali (atau jalankansource ~/.profile)

Itu saja, roda sekarang hanya akan berputar selama skrip berjalan.

Penjelasan

Script memang membuat jendela minimalis. Jendela itu sepenuhnya transparan dan memiliki ukuran 0x0 piksel sehingga tidak terlihat. Itu akan menghancurkan dirinya sendiri segera setelah itu ada.

Memanggil jendela di akhir skrip Anda, Anda akan memuaskan keinginan Unity untuk sebuah jendela, menghentikan roda untuk berputar.

Yakub Vlijm
sumber
Terima kasih atas penjelasan terperinci dan suntingan pada pertanyaan. Memberikan ide tentang solusi potensial.
Cosmin Saveanu
Ide bagus - memberikan jendela palsu. Saya menyukainya
Sergiy Kolodyazhnyy
@ Trik sulap dan tipuan, tapi berhasil :)
Jacob Vlijm
4

Hanya ingin menambahkan implementasi fake_window alternatif yang sedikit lebih sederhana dan tidak memicu peringatan python pada sistem Ubuntu 16.04.

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '3.0')

from gi.repository import Gtk
from gi.repository import GLib

"""
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.
"""

def timer_cb():
    Gtk.main_quit()
    return False

def show_cb(widget, data=None):
    GLib.timeout_add(500, timer_cb)

def fakewindow():
    window = Gtk.Window()
    # make our window transparent
    window.set_opacity(0)
    window.set_default_size(0,0)

    window.connect("show", show_cb)

    window.show_all()

    Gtk.main()

fakewindow()
Digikata
sumber
Bagus! tidak pernah memperhatikan penambahan ini sampai sekarang :)
Jacob Vlijm