Unityランチャー(Ubuntu 14.04)のアイコンを右クリックして「ウィンドウを最小化する」オプションを使用するには、詳細な指示 here に従って.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の正しいメニューオプションからシェルスクリプトを起動すると、この動作につながる理由を誰もが知っていますか?
EDIT:どうやら、Jacob Vlijmの答えで説明されているように、待機期間は避けられないようです。 askubunt で説明されているように、マウスは応答性を維持するため、回転するホイールのポインターの変形を回避することは、部分的に審美的な回避策です。
EDIT2:以下のジェイコブが説明するように、システムに偽のウィンドウを与えることはより良い解決策です。
素晴らしい質問です。
通常、UnityランチャーからGUIアプリケーションを起動すると、ランチャーはウィンドウが表示されるのを待ちます。待っている間、「回転する車輪」が表示されます。ただし、永遠に待つことはありません。約20秒後、ランチャーはウィンドウが表示されないと想定し、待機をあきらめます。
1。アプリケーションのランチャーのメインコマンド
.desktop
ファイルでは、最初のExec=
行(メインコマンド)について、次の行でtellランチャーを待つかどうかを指定できます。
StartupNotify=true
待つか、
StartupNotify=false
not待機させる。
2。ランチャーのクイックリストアイテム
ただし、ランチャーの可能なクイックリスト(右クリック)アイテムの場合、デフォルト値はStartupNotify=true
です。残念ながら、この値は固定されており、何も変更することはできません。
つまり、Unityランチャーのランチャーアイコンを右クリックしてanyコマンドを開始すると、ランチャーはウィンドウを待ち、それを待って回転するホイールを表示します。
一番下の行は、説明することはできますが、現時点では問題の解決策がないようです。それ以外は、スクリプト専用のランチャーを作成し、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ランチャーにドラッグします。それらをクリックして、動作の違いを確認します。
クイックリストにmanyスクリプトがある場合、および/または実際に気になる場合は、別の化粧品の解決策があります。 fake、ウィンドウを表示するために非表示(完全に透明)にして、スクリプトに含めることができます。スクリプトは次のようになります(例)
#/bin/bash
name=$1
for i in $(xdotool search --class "$name"); do
xdotool windowminimize $i
done
fake_window
コマンドfake_window
は(偽の)ウィンドウを呼び出し、Unityが回転ホイールを終了させるようにします。
~/bin
ディレクトリを作成します以下のスクリプトを空のファイルにコピーし、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()
スクリプトの最後に次のコマンドを追加します。
fake_window
ログアウトして再度ログインする(またはsource ~/.profile
を実行)
これで、ホイールはスクリプトが実行されている間のみ回転します。
スクリプトdoesは最小限のウィンドウを作成します。ただし、ウィンドウは完全に透明であり、サイズは0x0ピクセルであるため、表示されません。存在するとすぐに破壊されます。
スクリプトの最後にウィンドウを呼び出すと、Unityのウィンドウに対する希望が満たされ、ホイールが回転しなくなります。
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()