Unity Launcher'daki özel sağ tıklama eylemi imleci 20 saniye meşgul tutar


14

Birlik fırlatıcı (Ubuntu 14.04) bir simgeyi sağ tıklayarak aracılığıyla "penceresini minimize" seçeneği için, ben ayrıntılı talimatları takip Burada bir değiştirme hakkında .desktopdosyası ve bir özel yapılmış Firefoxiçinde başlatıcısı ~/.local/share/applications/klasörüne. .Desktop dosyasının ilgili kısmı:

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;

"Minimize" masaüstü eylemi minimize.sh, aşağıdaki içeriğe sahip basit bir kabuk komut dosyasını çağırır :

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

Komut dosyası xdotool, tüm depoları bulmak firefox, üzerlerinde yinelemek ve en aza indirmek için resmi depolardan kurulabilen kullanır .

Komut dosyası çalışır ve başlatıcı sağ menü seçeneği "Windows'u En Aza İndir" de çalışır, ancak pencereler simge durumuna küçültüldüğünde, fare işaretçisi "meşgul" moduna geçer ve yaklaşık 20 saniye boyunca bu şekilde kalır (fare eylemleri hala duyarlı).

Herkes neden Unity bir sağ menü seçeneğinden bir kabuk komut dosyası başlatmak bu davranışa yol açabilir biliyor mu?

EDIT : Görünüşe göre Jacob Vlijm'in cevabında açıklandığı gibi bekleme süresi kaçınılmaz. Fare duyarlı kaldığından, askerin tekerleğinde işaretçinin dönüşümünden kaçınmak, askubuntu'da açıklandığı gibi, kısmi estetik bir çözümdür .

EDIT2 : aşağıdaki Jacob tarafından açıklandığı gibi, sisteme sahte bir pencere vermek daha iyi bir çözümdür.


Merhaba Cosmin, bence başka, oldukça temiz bir çözüm ekledim.
Jacob Vlijm

Teşekkürler Jacob. Bu tür bir çözümü düşünüyordum ama bunun nasıl yapılabileceğini bilmiyordum. Bir çözümün olması harika.
Cosmin Saveanu

Yanıtlar:


18

Mükemmel soru.

Neden

Normalde, GUI uygulamalarını Unity Launcher'dan başlatırken, başlatıcı bir pencerenin görünmesini bekler. Beklerken "çıkrık" gösterir. Ancak sonsuza kadar beklemeyecektir; yaklaşık 20 saniye sonra, başlatıcı pencerenin görünmeyeceğini varsayar ve beklemeyi bırakır.

1. Bir uygulamanın başlatıcısının ana komutu

Bir .desktopdosyada, ilk Exec=satırla (ana komut) ilgili olarak, başlatıcıya bir satırda beklemesini veya beklememesini söyleyebilirsiniz :

StartupNotify=true

bekletmek için, ya da

StartupNotify=false

bunu yapmak için değil bekleyin.

2. Başlatıcıdaki hızlı liste öğeleri

Ancak bir başlatıcıdaki olası hızlı liste (sağ tıklama) öğeleri için varsayılan değer şudur StartupNotify=true. Ne yazık ki, bu değer sabittir ve hiçbir şeyle değiştirilemez.

Bu , Unity Launcher'da bir başlatıcı simgesini sağ tıklatarak herhangi bir komutu başlatırsanız , başlatıcı bir pencere bekler ve çıkrık gösteren bir pencere bekler.

Sonuç olarak, açıklanabilse de, şu anda soruna bir çözüm yok gibi görünüyor, diğeri komut dosyanız için özel bir başlatıcı oluşturuyor ve satırı StartupNotify=falsedosyaya ekliyor .

Kanıt

Davranışı kendiniz test edebilirsiniz. İki fırlatıcı oluşturun:

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

ve:

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

Bunları farklı kaydedin test1.desktopve test2.desktopher iki başlatıcıyı da Unity başlatıcısına sürükleyin. Onları tıklayın ve davranıştaki farkı görün.


Düzenle; eğer gerçekten sizi rahatsız ediyorsa, Unity'ye sahte bir pencere besleyin

Hızlı listelerde çok sayıda komut dosyanız varsa ve / veya gerçekten sizi rahatsız ediyorsa, başka bir kozmetik çözüm var; Biz yapabilirsiniz sahte , görünmez (tamamen saydam) Senaryonuzun dahil edilecek, bir pencere göstermek için. betiğiniz daha sonra (ör.)

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

burada komut fake_window(sahte-) penceremizi çağırır ve Unity'nin çıkrıyı bitirmesini sağlar.

Nasıl kurulur

  1. Henüz yoksa dizini oluşturun ~/bin
  2. Aşağıdaki komut dosyasını boş bir dosyaya kopyalayın, fake_window(uzantı yok) olarak kaydedin ~/bin ve yürütülebilir yapın

    #!/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. Komut dosyanızın en sonuna şu komutu ekleyin:

    fake_window
  4. Oturumu kapatıp tekrar açın (veya çalıştırınsource ~/.profile)

İşte bu, tekerlek artık sadece komut dosyası çalıştığı sürece dönecektir.

açıklama

Komut yapar minimalist pencere oluşturmak. Ancak pencere tamamen şeffaftır ve 0x0 piksel boyutundadır ve bu nedenle görünmezdir. Var olduğunda kendini anında yok edecektir.

Senaryonuzun sonundaki pencereyi çağırdığınızda, Unity'nin pencere açma isteğini yerine getirerek tekerleğin dönmesini durduracaksınız.


Soruyla ilgili ayrıntılı açıklama ve düzenlemeler için teşekkür ederiz. Potansiyel çözümler hakkında fikir verir.
Cosmin Saveanu

Harika bir fikir - sahte bir pencere vermek. I like it
Sergiy Kolodyazhnyy

@Tüm hile ve aldatma, ama işe yarıyor :)
Jacob Vlijm

4

Sadece biraz daha basit ve bir Ubuntu 16.04 sisteminde python uyarılarını tetiklemeyen alternatif bir fake_window uygulaması eklemek istedim.

#!/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()

Güzel! şimdiye kadar bu eklemeyi hiç farketmedim :)
Jacob Vlijm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.