यूनिटी लॉन्चर में कस्टम राइट-क्लिक एक्शन 20 सेकंड के लिए कर्सर को व्यस्त रखता है


14

यूनिटी लांचर (उबंटू 14.04) में एक आइकन पर राइट क्लिक के माध्यम से "विंडो कम से कम करें" विकल्प के लिए, मैंने एक फ़ाइल बदलने और फ़ोल्डर में एक कस्टम लॉन्चर बनाने के बारे में विस्तृत निर्देशों का पालन ​​किया । .Desktop फ़ाइल का प्रासंगिक हिस्सा है:.desktopFirefox~/.local/share/applications/

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.shजिसमें निम्न सामग्री है:

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

स्क्रिप्ट का उपयोग करता है xdotool, जिसे आधिकारिक रिपॉजिटरी से स्थापित किया जा सकता है, सभी firefoxविंडो को खोजने के लिए , उन पर पुनरावृति और उन्हें कम से कम करें।

स्क्रिप्ट काम करती है और लॉन्चर राइट मेन्यू ऑप्शन "Minimize Windows" भी काम करता है, लेकिन जैसे ही विंडोज़ कम से कम होता है, माउस पॉइंटर "व्यस्त" मोड में हो जाता है और लगभग 20 सेकंड तक ऐसे ही रहता है (हालाँकि माउस की क्रियाएं अभी भी हैं) उत्तरदायी)।

क्या किसी को पता है कि एकता में राइट मेनू विकल्प से शेल स्क्रिप्ट शुरू करने से यह व्यवहार क्यों हो सकता है?

EDIT : जाहिरा तौर पर प्रतीक्षा अवधि अपरिहार्य है, जैसा कि जैकब व्लिजम के उत्तर में बताया गया है। चूंकि माउस उत्तरदायी रहता है, चरखा में पॉइंटर को बदलने से बचना एक आंशिक एस्थेटिक वर्कअराउंड है, जैसा कि आस्कुबंटु पर बताया गया है ।

EDIT2 : सिस्टम को नकली विंडो देना एक बेहतर उपाय है, जैसा कि नीचे दिए गए याकूब ने बताया है।


हाय कोस्मिन, मैंने एक और जोड़ा, मुझे लगता है कि बहुत साफ समाधान है।
जैकब व्लिजम

शुक्रिया जैकब। मैं उस तरह के समाधान के बारे में सोच रहा था लेकिन यह नहीं जानता था कि यह कैसे किया जा सकता है। यह महान है कि एक समाधान मौजूद है।
कॉसमैन सवेनू

जवाबों:


18

बहुत बढ़िया सवाल।

कारण

आम तौर पर, एकता लांचर से जीयूआई अनुप्रयोगों को शुरू करते समय, लांचर एक खिड़की के सामने आने का इंतजार करता है। प्रतीक्षा करते समय, यह "चरखा" दिखाता है। हालांकि यह हमेशा के लिए इंतजार नहीं करेगा; लगभग 20 सेकंड के बाद, लांचर मान लेता है कि खिड़की दिखाई नहीं देगी और इंतजार करना छोड़ देगी।

1. एप्लिकेशन के लॉन्चर का मुख्य कमांड

एक में .desktopफ़ाइल, पहले के विषय में Exec=लाइन (मुख्य कमान), तो आप कर सकते हैं बता इंतजार है या नहीं, एक लाइन में करने के लिए लांचर:

StartupNotify=true

इंतजार करना, या

StartupNotify=false

इंतजार करने के लिए नहीं

2. एक लॉन्चर का क्विकलिस्ट आइटम

लॉन्चर के संभावित क्विकलिस्ट (राइट-क्लिक) के लिए हालांकि, डिफ़ॉल्ट मूल्य है StartupNotify=true। दुर्भाग्य से, यह मान निश्चित है और इसे किसी भी चीज़ से नहीं बदला जा सकता है।

इसका मतलब है कि यदि आप यूनिटी लॉन्चर में लॉन्चर आइकन पर राइट-क्लिक करने से कोई कमांड शुरू करते हैं, तो लॉन्चर को विंडो की उम्मीद होती है और वह चरखा दिखाता है।

लब्बोलुआब यह है कि, हालांकि, यह समझाया जा सकता है, इस समय इस मुद्दे का कोई समाधान नहीं प्रतीत होता है, अन्य तो अपनी स्क्रिप्ट के लिए एक समर्पित लांचर बनाने और StartupNotify=falseफ़ाइल में लाइन जोड़ने के लिए।

सबूत

आप स्वयं व्यवहार का परीक्षण कर सकते हैं। दो लॉन्चर बनाएं:

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

तथा:

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

उन्हें बचाने के रूप में test1.desktopऔर test2.desktop, एकता लांचर के लिए पर दोनों लांचर खींचें। उन्हें क्लिक करें और व्यवहार में अंतर देखें।


संपादित करें; अगर यह वास्तव में आपको परेशान करता है, तो एकता को एक नकली खिड़की खिलाएं

यदि आपके पास quicklists में कई स्क्रिप्ट हैं, और / या यह वास्तव में आपको परेशान करता है, तो एक और कॉस्मेटिक समाधान है; हम आपकी स्क्रिप्ट में शामिल करने के लिए एक खिड़की दिखाने के लिए नकली , अदृश्य (पूरी तरह से पारदर्शी) हो सकते हैं। आपकी स्क्रिप्ट तब होगी (उदाहरण के लिए)

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

जहां कमांड fake_windowहमारी (नकली-) विंडो को कहेगी, एकता को चरखा खत्म करेगी।

स्थापित कैसे करें

  1. बनाएँ, अगर यह अभी तक मौजूद नहीं है, तो निर्देशिका ~/bin
  2. एक खाली फ़ाइल में नीचे दी गई स्क्रिप्ट को कॉपी करें, इसे 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()
  3. अपनी स्क्रिप्ट के बहुत अंत में जोड़ें कमांड:

    fake_window
  4. लॉग आउट और वापस (या रनsource ~/.profile)

यही है, पहिया अब केवल तभी तक स्पिन करेगा जब तक स्क्रिप्ट चलती है।

व्याख्या

स्क्रिप्ट करता है एक minimalistic बना सकते हैं। हालांकि खिड़की पूरी तरह से पारदर्शी है और इसका आकार 0x0 पिक्सेल है और इस प्रकार यह अदृश्य है। एक बार मौजूद होने के बाद यह तुरंत नष्ट हो जाएगा।

अपनी स्क्रिप्ट के अंत में विंडो को कॉल करके, आप स्पिन के लिए पहिया को रोकते हुए, विंडो के लिए एकता की इच्छा को पूरा करेंगे।


प्रश्न पर विस्तृत विवरण और संपादन के लिए धन्यवाद। संभावित वर्कअराउंड के बारे में विचार देता है।
कॉसमैन सावीनू

महान विचार - एक नकली खिड़की दे रही है। मुझे यह पसंद है
सेर्गेई कोलोडियाज़नी

@ शेर की चाल और छल, लेकिन यह काम करता है :)
याकूब Vlijm

4

बस एक वैकल्पिक नकली_विंडो कार्यान्वयन जोड़ना चाहते थे जो थोड़ा सरल है और एक 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()

अच्छा! अब तक इस जोड़ पर कभी ध्यान नहीं दिया गया :)
जैकब व्लिजम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.