Ubuntu(Gnome)パネルでアイコンを追加および変更する最も簡単な方法は何でしょうか?シェルスクリプトのような単純なものを探していますが、それに限定されません。それがより良いまたはより単純なアプローチである場合、そのためのプログラムを作成します。
アイデアは、いくつかの状態(たとえば、マウントポイントの可用性、インターネット接続の可用性)を監視するスクリプト/プログラムを作成し、現在のステータスを反映するようにアイコンの状態を変更することです。
私はYAD(Yet Another Dialog)が最も簡単な解決策を提供することを発見しました。webupd8の簡単な説明を参照してください。ただし、Unityへの統合は現時点では少し壊れているようです。以下に回避策について説明しますが、Unityに本当に関心がある場合は、おそらく他の回答を確認する必要があります。
注:YADはさまざまな環境で機能すると思われますが、以下の手順はLubuntu 15.10(LXDEデスクトップ)とUbuntu 14.04(Unityデスクトップ)を使用してのみテストしました。
私は次の機能を備えたインストールを取得しました。
sudo apt-add-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad
(実際、Lubuntu 15.10では最初の2行は必要ありませんでしたが、それは偶然の一致だった可能性があります。)
LXDEでは、
yad --notification --listen
次に、次のように入力して変更できるトレイアイコンを表示しました icon:gtk-help
。Unityでは何も表示されなかったので、次のものが必要でした...
Unityの回避策: 次の手順は、webupd8から引用したものです。問題は、「システムトレイ」がUnityに正式に存在しなくなったことです。この変更に追いついていないYADのようなプログラムを実行するための1つの可能な解決策は、「システムトレイエミュレータ」をインストールすることです。
sudo apt-add-repository ppa:fixnix/indicator-systemtray-unity
sudo apt-get update
sudo apt-get install indicator-systemtray-unity
Unityパネルで直接アイコンを取得するには、次の設定を使用しました。
gsettings set net.launchpad.indicator.systemtray tray-is-static true
gsettings set net.launchpad.indicator.systemtray show-background-static false
ログアウトして再度ログインすると、yad --notification
期待どおりに機能しました。(さらに、「システムトレイ」には、以前は無駄に検索していた追加のアイコンがいくつか表示されていました。)パネル上のアイコンの位置は、次の方法で調整できます。
gsettings set net.launchpad.indicator.systemtray static-x 1500
(1500は任意の妥当な値に置き換えることができます)。アイコンを右揃えで表示する方法がわかりません。「システムトレイエミュレータ」を再度アンインストールしたい場合は、webupd8で次のことをお勧めします。
sudo apt-get purge indicator-systemtray-unity
これは、実際のシナリオでYADを使用する方法を説明するのに役立つ可能性のある単純なデモです。YAD自体は上記のようにすでにインストールされていると思います。コマンドラインで実行されているプログラムの出力を監視し、それに応じてトレイアイコンを更新するとします。このデモの目的のために、この「プログラム」を次のスクリプト「dummyprogram.sh」としましょう。
#! /bin/bash
i=1
while [ $i -ne 3 ]
do
let "i=((i+1)%2)"
echo $i
sleep 1
done
上記の行をファイル「dummyprogram.sh」にコピーし、「chmod + xdummyprogram.sh」で実行可能にして「./dummyprogram.sh」を呼び出すと、次の出力が得られます。
0
1
0
1
...
(毎秒1行)。さて、手元にある実際のタスクについてです。トレイ領域で上記の出力の「アイコン化された」バージョンを取得するには、次のスクリプト「demo.sh」を使用します。
#! /bin/bash
while read x
do
if [ $x -eq 0 ]
then
echo icon:gtk-home
else
echo icon:gtk-help
fi
done
この場合も、行をファイル「demo.sh」にコピーして実行可能にします。呼び出し
./dummyprogram.sh | ./demo.sh | yad --notification --listen
これで、目的の結果が得られるはずです。トレイ領域のアイコンは、2つの異なるアイコン間で毎秒前後に変化します。
ターミナルでCtrl-Cを入力すると、デモを終了できます。
簡単な方法の1つは、Pythonで作成することです。たとえば、このブログ投稿を参照してください。
Unityを気にする人にとって、単純な解決策は現在存在しないかもしれません。したがって、UnityのAppIndicator-APIを使用するカスタムPythonスクリプトを作成することは、実際に進むべき道です。これの例はすでにWeb上にたくさんありますが、他の回答で説明したYADを使用したソリューションとほぼ同じ機能を実装するスクリプト(リッスンするスクリプト)に到達するには、かなりの労力を要しました。プログラムの出力とそれに応じて「トレイアイコン」を更新します。これが私の解決策です:
#!/usr/bin/python
import os, threading, signal
from subprocess import Popen, PIPE, STDOUT
from gi.repository import Gtk
from gi.repository import AppIndicator3 as AppIndicator
class my_indicator:
ICON_0 = "gtk-home"
ICON_1 = "gtk-help"
def __init__(self, wrapper):
self.ind = AppIndicator.Indicator.new("my-app-indicator", Gtk.STOCK_INFO, AppIndicator.IndicatorCategory.SYSTEM_SERVICES)
self.ind.set_status(AppIndicator.IndicatorStatus.ACTIVE)
self.wrapper = wrapper
self.build_menu()
def build_menu(self):
item_quit = Gtk.MenuItem('Quit')
item_quit.connect('activate', self.wrapper.quit)
menu = Gtk.Menu()
self.ind.set_menu(menu)
menu.append(item_quit)
menu.show_all()
def update_icon(self,icon):
self.ind.set_icon(icon)
class dummy_wrapper:
PROGRAM = "./dummyprogram.sh"
def __init__(self):
self.indicator = my_indicator(self)
def main(self):
self.process = Popen(self.PROGRAM, stdout=PIPE, stderr=STDOUT, close_fds=True, shell=True, preexec_fn=os.setsid)
self.thread = threading.Thread(target=self.watch_pipe, args=(self.process.stdout,self.indicator))
self.thread.daemon = True
self.thread.start()
Gtk.main()
def quit(self, source):
if self.process:
os.killpg(self.process.pid, signal.SIGTERM)
if self.thread:
self.thread.join()
Gtk.main_quit()
@staticmethod
def watch_pipe(pipe, indicator):
while 1:
line = pipe.readline().strip()
# The thread waits here until a line appears in the pipe.
if not line:
# This happens exactly once, namely when the process ends.
break
else:
print line
if line=="0":
indicator.update_icon(my_indicator.ICON_0)
else:
indicator.update_icon(my_indicator.ICON_1)
dummy_wrapper().main()
コードに関する簡単なメモ:
./dummyprogram.sh
)、つまり行self.process = Popen(...
とos.killpg(...
はこの回答から取得されます。これは、シェル(サブ)プロセスを終了する唯一の信頼できる方法のようです。デモ:上記のコードをファイルに貼り付け、my-indicator.py
を使用して実行可能にしchmod +x my-indicator.py
ます。YADを提案する私の答えdummy-programm.sh
に記載されているファイルについても同じことを行います。を呼び出すと、Unityパネルにアイコンが表示されます。このアイコンは毎秒2つの異なるアイコン間で前後に変化します。(これは、Ubuntuのapp-indicator-libraryがインストールされている場合、gnomeおよびKDE-desktopsでも機能するはずです。)./my-indicator.py