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の正しいメニューオプションからシェルスクリプトを起動すると、この動作につながる理由を誰もが知っていますか?

編集:どうやら、ジェイコブヴリジムの回答で説明されているように、待機期間は避けられないようです。askubuntuで説明されているように、マウスは応答性を維持するため、回転するホイールのポインターの変形を避けることは、部分的な審美的回避策です

EDIT2:以下のジェイコブが説明するように、システムに偽のウィンドウを与えることはより良い解決策です。


こんにちは、コスミン、別のかなりきれいなソリューションを追加したと思います。
ジェイコブVlijm

ジェイコブありがとうございます。私はその種の解決策について考えていましたが、それがどのように行われるかを知りませんでした。ソリューションが存在することは素晴らしいことです。
コスミンSaveanu

回答:


18

素晴らしい質問です。

原因

通常、UnityランチャーからGUIアプリケーションを起動するとき、ランチャーはウィンドウが表示されるのを待ちます。待っている間、「回転する車輪」が表示されます。ただし、永遠に待つことはありません。約20秒後、ランチャーはウィンドウが表示されないと想定し、待機をあきらめます。

1.アプリケーションのランチャーのメインコマンド

では.desktopまずに関するファイル、Exec=行(メインコマンド)、次のことができます伝えるラインではなく、待ったりするランチャーを:

StartupNotify=true

待つか、

StartupNotify=false

それは作るためではない待ちます。

2.ランチャーのクイックリストアイテム

ただし、ランチャーのクイックリスト(右クリック)項目の場合、デフォルト値はStartupNotify=trueです。残念ながら、この値は固定されており、何も変更することはできません。

あなたが開始した場合、その手段があることどのユニティランチャーでランチャーアイコンを右クリックしてからコマンドを、ランチャーは糸車を示し、それのためにウィンドウを待つ期待しています。

一番下の行は、説明することはできますが、現時点では問題の解決策がないようです。それ以外は、スクリプト専用のランチャーを作成しStartupNotify=falseて、ファイルに行を追加します。

の証拠

動作を自分でテストできます。2つのランチャーを作成します。

[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

これで、ホイールはスクリプトが実行されている間のみ回転します。

説明

このスクリプト、最小限のウィンドウを作成します。ただし、ウィンドウは完全に透明であり、サイズは0x0ピクセルであるため、表示されません。存在するとすぐに破壊されます。

スクリプトの最後にウィンドウを呼び出すと、Unityのウィンドウに対する希望が満たされ、ホイールが回転しなくなります。


質問の詳細な説明と編集をありがとう。潜在的な回避策についてのアイデアを提供します。
コスミンSaveanu 16年

素晴らしいアイデア-偽のウィンドウを与える。私はそれが好き
セルギーKolodyazhnyy

@Serg策略と詐欺が、それは動作します:)
ジェイコブVlijm

4

Ubuntu 16.04システムでPython警告をトリガーしない、もう少しシンプルなfake_window実装を追加したかっただけです。

#!/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.