การดำเนินการคลิกขวาที่กำหนดเองใน Unity Launcher ทำให้เคอร์เซอร์ไม่ว่างเป็นเวลา 20 วินาที


14

จะมีตัวเลือก "ลดหน้าต่าง" ผ่านการคลิกขวาบนไอคอนในความสามัคคีปล่อย (Ubuntu 14.04) ที่ผมทำตามคำแนะนำโดยละเอียดที่นี่เกี่ยวกับการเปลี่ยนแปลง.desktopของไฟล์และทำเองFirefoxปล่อยใน~/.local/share/applications/โฟลเดอร์ ส่วนที่เกี่ยวข้องของไฟล์ .desktop คือ:

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หน้าต่างทั้งหมดทำซ้ำผ่านหน้าต่างเหล่านั้นและย่อให้เล็กสุด

สคริปต์ทำงานและตัวเลือกเมนูด้านขวาของตัวเลือก "ย่อขนาดเล็กสุดของ Windows" ทำงานได้เช่นกัน แต่ทันทีที่หน้าต่างย่อเล็กสุดตัวชี้เมาส์จะเข้าสู่โหมด "ไม่ว่าง" และยังคงอยู่ในลักษณะนี้เป็นเวลาประมาณ 20 วินาที ตอบสนอง)

ไม่มีใครรู้ว่าทำไมการเริ่มเชลล์สคริปต์จากตัวเลือกเมนูที่ถูกต้องใน Unity อาจนำไปสู่พฤติกรรมนี้ได้

แก้ไข : เห็นได้ชัดว่าช่วงเวลารอคอยหลีกเลี่ยงไม่ได้ดังที่อธิบายไว้ในคำตอบของ Jacob Vlijm ตั้งแต่เมาส์ยังคงตอบสนองต่อการหลีกเลี่ยงการเปลี่ยนแปลงของตัวชี้ในวงล้อหมุนเป็นวิธีแก้ปัญหาที่เกี่ยวกับความงามบางส่วนตามที่อธิบายไว้ในaskubuntu

EDIT2 : การให้ระบบหน้าต่างปลอมเป็นวิธีแก้ปัญหาที่ดีกว่าดังที่อธิบายไว้โดย Jacob ด้านล่าง


สวัสดี Cosmin ฉันเพิ่มอีกวิธีการแก้ปัญหาที่สะอาดสวยฉันคิดว่า
Jacob Vlijm

ขอบคุณยาโคบ ฉันกำลังคิดเกี่ยวกับวิธีแก้ปัญหาแบบนั้น แต่ไม่รู้ว่าจะทำได้อย่างไร มันยอดเยี่ยมมากที่ทางออกมีอยู่
Cosmin Saveanu

คำตอบ:


18

คำถามที่ยอดเยี่ยม

สาเหตุ

โดยปกติเมื่อเริ่มต้นแอปพลิเคชัน GUI จาก Unity Launcher ตัวเรียกใช้งานจะรอให้หน้าต่างปรากฏขึ้น ในขณะที่รอก็จะแสดง "ล้อหมุน" มันจะไม่รอตลอดไป หลังจากผ่านไปประมาณ 20 วินาทีตัวเรียกใช้จะถือว่าหน้าต่างไม่ปรากฏและจะรอ

1. คำสั่งหลักของตัวเรียกใช้งานแอปพลิเคชัน

ใน.desktopไฟล์ที่เกี่ยวข้องกับExec=บรรทัดแรก(คำสั่งหลัก) คุณสามารถบอกให้ตัวเรียกใช้รอหรือไม่อยู่ในบรรทัด:

StartupNotify=true

เพื่อให้รอหรือ

StartupNotify=false

เพื่อให้ไม่รอ

2. รายการด่วนของตัวเรียกใช้

สำหรับรายการด่วนเป็นไปได้ (คลิกขวา) รายการปล่อย StartupNotify=trueแต่ค่าเริ่มต้นคือ น่าเสียดายที่ค่านี้ได้รับการแก้ไขและไม่สามารถเปลี่ยนแปลงได้โดยอะไร

นั่นหมายความว่าหากคุณเริ่มคำสั่งใด ๆจากการคลิกขวาที่ไอคอนตัวเรียกใช้งานใน Unity Launcher ตัวเรียกใช้งานจะคาดหวังหน้าต่างและรอให้มันแสดงล้อหมุน

บรรทัดล่างคือแม้ว่าจะสามารถอธิบายได้ดูเหมือนจะไม่มีวิธีแก้ไขปัญหาในขณะนี้ แต่ก็มีตัวสร้างตัวเรียกใช้งานเฉพาะสำหรับสคริปต์ของคุณและเพิ่มบรรทัด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ลากทั้งปืนกลไปปล่อยความสามัคคี คลิกที่พวกเขาและดูความแตกต่างในพฤติกรรม


แก้ไข; ถ้ามันรบกวนจิตใจคุณจริง ๆฟีด Unity จะเป็นหน้าต่างปลอม

หากคุณมีสคริปต์จำนวนมากในรายการด่วนและ / หรือทำให้คุณรำคาญจริงๆมีโซลูชั่นเครื่องสำอางอื่น เราสามารถปลอมมองไม่เห็น (โปร่งใส) เพื่อแสดงหน้าต่างที่จะรวมอยู่ในสคริปต์ของคุณ สคริปต์ของคุณจะเป็น (เช่น)

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

ตำแหน่งที่คำสั่งfake_windowจะเรียกหน้าต่าง (ปลอม -) ของเราทำให้ Unity จบการหมุนวงล้อ

วิธีการตั้งค่า

  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 พิกเซลและมองไม่เห็น มันจะทำลายตัวเองทันทีที่มีอยู่

เมื่อเรียกหน้าต่างที่ด้านท้ายของสคริปต์คุณจะสนองความต้องการของ Unity สำหรับหน้าต่างหยุดล้อหมุน


ขอบคุณสำหรับคำอธิบายโดยละเอียดและการแก้ไขคำถาม ให้แนวคิดเกี่ยวกับวิธีแก้ไขปัญหาที่อาจเกิดขึ้น
Cosmin Saveanu

ความคิดที่ดี - ให้หน้าต่างปลอม ฉันชอบมัน
Sergiy Kolodyazhnyy

@S กลอุบายและการหลอกลวง แต่มันใช้งานได้ดี :)
35435 Jacob Vlijm

4

เพียงแค่ต้องการเพิ่มการติดตั้ง fake_window ทางเลือกที่ง่ายขึ้นเล็กน้อยและไม่เรียกใช้คำเตือนแบบหลามในระบบ 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()

ดี! ไม่เคยสังเกตเห็นนอกจากนี้จนถึงขณะนี้ :)
จาค็อบ Vlijm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.