Hành động nhấp chuột phải tùy chỉnh trong Unity Launcher giúp con trỏ bận trong 20 giây


14

Để có tùy chọn "thu nhỏ cửa sổ" thông qua nhấp chuột phải vào biểu tượng trong trình khởi chạy Unity (Ubuntu 14.04), tôi đã làm theo các hướng dẫn chi tiết ở đây về việc thay đổi .desktoptệp và tạo Firefoxtrình khởi chạy tùy chỉnh trong ~/.local/share/applications/thư mục. Phần có liên quan của tệp .desktop là:

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;

Hành động trên máy tính để bàn "Thu nhỏ" gọi một tập lệnh shell đơn giản, minimize.shcó nội dung như sau:

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

Kịch bản sử dụng xdotool, có thể được cài đặt từ kho chính thức, để tìm tất cả các firefoxcửa sổ, lặp lại chúng và thu nhỏ chúng.

Kịch bản hoạt động và tùy chọn menu bên phải của trình khởi chạy "Thu nhỏ Windows" cũng hoạt động, nhưng ngay khi các cửa sổ được thu nhỏ, con trỏ chuột sẽ ở chế độ "bận" và giữ nguyên như thế trong khoảng 20 giây (mặc dù các hành động của chuột vẫn còn phản ứng nhanh nhẹn).

Có ai biết tại sao bắt đầu một tập lệnh shell từ một tùy chọn menu bên phải trong Unity có thể dẫn đến hành vi này không?

EDIT : Rõ ràng thời gian chờ đợi là không thể tránh khỏi, như được giải thích trong câu trả lời của Jacob Vlijm. Vì chuột vẫn phản ứng nhanh, nên việc tránh sự biến đổi của con trỏ trong bánh xe quay là một cách giải quyết thẩm mỹ một phần, như đã giải thích trên Askubfox .

EDIT2 : cung cấp cho hệ thống một cửa sổ giả là một giải pháp tốt hơn, như Jacob giải thích bên dưới.


Xin chào Cosmin, tôi đã thêm một giải pháp khá sạch sẽ tôi nghĩ.
Jacob Vlijm 11/03/2016

Cảm ơn Jacob. Tôi đã suy nghĩ về loại giải pháp đó nhưng không biết làm thế nào nó có thể được thực hiện. Thật tuyệt khi một giải pháp tồn tại.
Cosmin Saveanu 11/03/2016

Câu trả lời:


18

Câu hỏi tuyệt vời.

Nguyên nhân

Thông thường, khi khởi động các ứng dụng GUI từ Unity Launcher, trình khởi chạy sẽ chờ một cửa sổ xuất hiện. Trong khi chờ đợi, nó cho thấy "bánh xe quay". Nó sẽ không chờ đợi mãi mãi; sau khoảng 20 giây, trình khởi chạy giả định cửa sổ sẽ không xuất hiện và chờ đợi.

1. Lệnh chính của launcher của ứng dụng

Trong một .desktoptập tin, liên quan đến việc đầu Exec=dòng (lệnh chính), bạn có thể nói với các phóng chờ đợi hay không, trong một dòng:

StartupNotify=true

để làm cho nó chờ đợi, hoặc

StartupNotify=false

để làm cho nó không chờ đợi.

2. Danh sách nhanh các mục của trình khởi chạy

Tuy nhiên, đối với các mục danh sách nhanh (nhấp chuột phải) có thể có của trình khởi chạy, giá trị mặc định là StartupNotify=true. Thật không may, giá trị này là cố định và không thể thay đổi bởi bất cứ điều gì.

Điều đó có nghĩa là nếu bạn bắt đầu bất kỳ lệnh nào từ nhấp chuột phải vào biểu tượng trình khởi chạy trong Unity Launcher, trình khởi chạy đang mong đợi một cửa sổ và chờ đợi nó, hiển thị bánh xe quay.

Điểm mấu chốt là, mặc dù có thể giải thích được, nhưng dường như không có giải pháp nào cho vấn đề tại thời điểm này, sau đó tạo một trình khởi chạy chuyên dụng cho tập lệnh của bạn và thêm dòng StartupNotify=falsevào tệp.

Bằng chứng

Bạn có thể tự kiểm tra hành vi. Tạo hai launcher:

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

và:

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

Lưu chúng dưới dạng test1.desktoptest2.desktopkéo cả hai trình khởi chạy vào trình khởi chạy Unity. Nhấp vào chúng và xem sự khác biệt trong hành vi.


Biên tập; nếu nó thực sự làm phiền bạn, hãy cho Unity một cửa sổ giả

Nếu bạn có nhiều tập lệnh trong danh sách nhanh, và / hoặc nó thực sự làm phiền bạn, có một giải pháp thẩm mỹ khác; chúng tôi có thể giả mạo , vô hình (hoàn toàn minh bạch) để hiển thị một cửa sổ, được đưa vào tập lệnh của bạn. kịch bản của bạn sau đó sẽ là (ví dụ)

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

trong đó lệnh fake_windowsẽ gọi cửa sổ (fake-) của chúng ta, làm cho Unity kết thúc bánh xe quay.

Làm thế nào để thiết lập

  1. Tạo, nếu nó chưa tồn tại, thư mục ~/bin
  2. Sao chép tập lệnh bên dưới vào một tệp trống, lưu nó dưới dạng fake_window(không có phần mở rộng) ~/bin và làm cho nó có thể thực thi được

    #!/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. Thêm vào phần cuối của tập lệnh của bạn lệnh:

    fake_window
  4. Đăng xuất và đăng nhập lại (hoặc chạysource ~/.profile)

Đó là nó, bánh xe bây giờ sẽ chỉ quay miễn là kịch bản chạy.

Giải trình

Kịch bản không tạo ra một cửa sổ tối giản. Tuy nhiên, cửa sổ hoàn toàn trong suốt và có kích thước 0x0 pixel và do đó không nhìn thấy được. Nó sẽ tự hủy ngay lập tức khi nó tồn tại.

Gọi cửa sổ ở cuối tập lệnh của bạn, bạn sẽ đáp ứng mong muốn của Unity cho một cửa sổ, dừng bánh xe quay.


Cảm ơn bạn đã giải thích chi tiết và chỉnh sửa câu hỏi. Đưa ra ý tưởng về cách giải quyết tiềm năng.
Cosmin Saveanu 10/03/2016

Ý tưởng tuyệt vời - đưa ra một cửa sổ giả. Tôi thích nó
Sergiy Kolodyazhnyy

@Serg lừa và lừa dối, nhưng nó hoạt động :)
Jacob Vlijm

4

Chỉ muốn thêm một triển khai fake_window thay thế đơn giản hơn một chút và không kích hoạt cảnh báo python trên hệ thống 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()

Đẹp! không bao giờ nhận thấy sự bổ sung này cho đến bây giờ :)
Jacob Vlijm 8/11/2016
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.