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


Untuk memiliki opsi "minimize window" melalui klik kanan pada ikon di peluncur Unity (Ubuntu 14.04), saya mengikuti petunjuk terperinci sini tentang mengubah a .desktop file dan membuat suatu kebiasaan Firefox peluncur di ~/.local/share/applications/ map. 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 "Minimize" memanggil skrip shell sederhana, minimize.sh yang memiliki konten berikut:

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

Skrip ini menggunakan xdotool, yang dapat diinstal dari repositori resmi, untuk menemukan semua firefox windows, iterate atas mereka dan minimalkan mereka.

Skrip ini berfungsi dan opsi menu peluncur kanan "Minimize Windows" juga berfungsi, tetapi begitu jendela diminimalkan, penunjuk mouse masuk dalam mode "sibuk" dan tetap seperti ini selama sekitar 20 detik (meskipun aksi mouse masih responsif).

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

EDIT: Rupanya periode menunggu tidak dapat dihindari, seperti yang dijelaskan dalam jawaban Jacob Vlijm. Karena mouse tetap responsif, menghindari transformasi pointer di roda pemintalan adalah solusi estetik parsial, seperti yang dijelaskan di askubuntu.

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


14
2018-03-10 07:00


asal


Hai Cosmin, saya menambahkan solusi lain yang lumayan bersih, saya kira. - Jacob Vlijm
Terima kasih, Jacob. Saya sedang memikirkan solusi semacam itu tetapi tidak tahu bagaimana hal itu bisa dilakukan. Sangat bagus bahwa ada solusi. - Cosmin Saveanu


Jawaban:


Pertanyaan yang 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 berhenti menunggu.

1. Perintah utama peluncur aplikasi

Di sebuah .desktop file, tentang yang pertama Exec= baris (perintah utama), Anda bisa menceritakan peluncur untuk menunggu atau tidak, dalam satu baris:

StartupNotify=true

untuk membuatnya menunggu, atau

StartupNotify=false

untuk membuatnya tidak Tunggu.

2. Item daftar cepat dari peluncur

Untuk kemungkinan item quicklist (klik kanan) dari sebuah launcher, nilai defaultnya adalah StartupNotify=true. Sayangnya, nilai ini tetap dan tidak dapat diubah oleh apa pun.

Itu artinya jika Anda mulai apa saja perintah dari mengklik kanan ikon peluncur di Unity Launcher, peluncur mengharapkan jendela dan menunggu untuk itu, menunjukkan roda berputar.

Intinya adalah bahwa, meskipun dapat dijelaskan, tampaknya tidak ada solusi untuk masalah saat ini, yang lain kemudian membuat peluncur khusus untuk naskah Anda dan menambahkan baris StartupNotify=false ke 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 mereka sebagai test1.desktop dan test2.desktop, seret kedua peluncur ke peluncur Unity. Klik mereka dan lihat perbedaan dalam perilaku.


Sunting; jika sangat mengganggumu, beri Persatuan sebuah jendela palsu

Jika Anda memiliki banyak skrip dalam daftar cepat, dan / atau benar-benar mengganggu Anda, ada solusi kosmetik lainnya; kita dapat palsu, tidak terlihat (sepenuhnya transparan) untuk menampilkan jendela, untuk dimasukkan dalam skrip Anda. skrip Anda akan menjadi (mis.)

#/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-) kami, membuat Unity mengakhiri roda pemintalan.

Bagaimana cara mengaturnya

  1. Buat, jika belum ada, direktori ~/bin
  2. Salin skrip di bawah ini ke dalam file kosong, simpan sebagai fake_window (tidak ada ekstensi) di ~/bin  dan membuatnya 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 ke bagian akhir skrip Anda perintahnya:

    fake_window
    
  4. Keluar dan masuk kembali (atau jalankan source ~/.profile)

Itu saja, kemudi sekarang hanya berputar selama naskah berjalan.

Penjelasan

Naskah tidak buat jendela minimalis. Namun jendela sepenuhnya transparan dan memiliki ukuran 0x0 piksel dan dengan demikian 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.


18
2018-03-10 08:14



Terima kasih atas penjelasan dan pengeditan terperinci atas pertanyaan itu. Memberikan ide tentang solusi yang potensial. - Cosmin Saveanu
@Cocofifi, selamat datang! - Jacob Vlijm
Ide bagus - memberi jendela palsu. saya suka itu - Sergiy Kolodyazhnyy
@Serg tipu muslihat dan penipuan, tapi itu berhasil :) - Jacob Vlijm


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()

4
2017-09-28 20:55



Bagus! tidak pernah memperhatikan penambahan ini sampai sekarang :) - Jacob Vlijm