web-dev-qa-db-ja.com

デフォルト以外のステータスメニュー(インジケータ)で使用されるアイコンファイルを見つけるにはどうすればよいですか?

いくつかのデフォルト以外の ステータスメニュー (アプリケーションインジケーターまたはインジケーターアプレットとも呼ばれる)で使用されるアイコンの場所を見つけたいのですが。

enter image description here

これらのアイコン画像ファイルはどこにありますか?

私のスクリーンショットには、ownCloudとRadiotrayがありますが、これらの特定のアイコンに固有ではない一般的な回答をお願いします。ファイル名やファイルタイプがわからないため、検索が困難です。

9
Tom Brossman

デフォルト以外のインジケータアイコンのデフォルトの場所は?

これらのアイコンが保存されるデフォルトの場所はありません。すべてのアプリケーション(-developer)は、適切と思われる場所に保存できます。

ただし、幸いなことに、インジケータは通常、ファイルや画像の無限のリストをインストールしません。コマンドの出力を調べることで(コードを調べる以外に)検索を制限できます。

dpkg-query -L <packagename>

私の例では

dpkg-query -L placesfiles

enter image description here

これにより、特に次の画像が出力されます。

/opt/placesfiles/images/dir_icon.png
/opt/placesfiles/images/placesfiles64.png
/usr/share/pixmaps/placesfiles.png

...これにより、検索がかなり制限されます。

Man dpkg-queryから:

   -l, --list [package-name-pattern...]
          List packages matching given pattern. If no package-name-pattern
          is  given,  list all packages in /var/lib/dpkg/status, excluding
          the ones marked as not-installed (i.e.  those  which  have  been
          previously purged). Normal Shell wildcard characters are allowed
          in package-name-pattern. Please note you will probably  have  to
          quote  package-name-pattern to prevent the Shell from performing
          filename expansion. For example this will list all package names
          starting with “libc6”:

Radiotrayの場合、次の.pngファイル(dpkg-query -L radiotray | grep pngを実行)が見つかりました。

/usr/share/radiotray/images/radiotray_connecting.png
/usr/share/radiotray/images/radiotray_on.png
/usr/share/radiotray/images/radiotray_off.png
/usr/share/radiotray/images/radiotray.png
/usr/share/pixmaps/radiotray.png

本当にを見つける必要がある場合、コードを検索します

...文字列 "icon"の一致について、インストールされたファイルを(内部で)調べることができます。インジケータの多くは、スクリプト言語の1つ(pythonなど)で記述されているため、非常によく検索できます。

再びradiotrayの例を使用します

dpkg-query -L radiotray | xargs grep icon

出力にはa.o.があります。

/usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py 
                 self.icon.set_from_file(APP_ICON_CONNECT)

ファイルSysTrayGui.pyを見ると、次のことがわかります。

from lib.common import APPNAME, APPVERSION, APP_ICON_ON, APP_ICON_OFF, APP_ICON_CONNECT, APP_INDICATOR_ICON_ON, APP_INDICATOR_ICON_OFF

これから、言及されたアイコンは、(サブ)ディレクトリcommon内のモジュールlibで定義されていると結論付けることができます。 ( here pythonがモジュールを見つける方法、セクションサブディレクトリを参照)

このモジュールでは、次のセクションを読むことができます。

# Media path
if os.path.exists(os.path.abspath('../data/images/')):
    IMAGE_PATH = os.path.abspath('../data/images/')
else:
    IMAGE_PATH = '%s/%s/images' % (datadir, APPDIRNAME)

# Images
APP_ICON = os.path.join(IMAGE_PATH, 'radiotray.png')
APP_ICON_ON = os.path.join(IMAGE_PATH, 'radiotray_on.png')
APP_ICON_OFF = os.path.join(IMAGE_PATH, 'radiotray_off.png')
APP_ICON_CONNECT = os.path.join(IMAGE_PATH, 'radiotray_connecting.gif')
APP_INDICATOR_ICON_ON = "radiotray_on"
APP_INDICATOR_ICON_OFF = "radiotray_off"
APP_INDICATOR_ICON_CONNECT = "radiotray_connecting"

...そしてここにいます...

例外的な状況

実用的なすべてのインジケーターで、上記の方法を使用して対応するアイコンを見つけることができました。

ただし、イメージをコードと一緒に単一の実行可能ファイルにコンパイルすることは可能です。そのような場合、別の画像が見つからないことや、コードを編集して再コンパイルせずにそれらを置き換えることはできないことを説明する必要はありません。

Owncloudのケースはそのようなケースのようです。上記の方法を使用すると、アイコンセットが/usr/share/icons/hicolor/<size>/apps内にインストールされていることがわかりました。これらのアイコンはどれもインジケータでは使用されませんon ubunt

OPはこの質問を行う前(および後)にかなりの作業を行いました。それらの1つは実行することでした:

gdbus call --session --dest com.canonical.indicator.application --object-path /com/canonical/indicator/application/service --method com.canonical.indicator.application.service.GetApplications

...これにより、非常に役立つ情報が得られます。出力には次のセクションが含まれていました。

('146028888067', 2, 'org.kde.StatusNotifierItem-22055-1', '/StatusNotifierItem/menu', '/tmp/iconcache-50ePXx', '', '', '', 'owncloud', 'ownCloud')

ディレクトリ/tmp/iconcache-50ePXxを調べると、インジケーターで使用されていた正確なアイコンが見つかりました。

enter image description hereenter image description hereenter image description here

...これらのアイコンがその場で生成されることを証明しているようです。 owncloudを閉じると、ディレクトリとそのアイコンが消えます。

これらのアイコンを置き換えることにより、インジケーターのアイコンを変更できることが判明しました。

enter image description here

これらがまさに私たちが探していたアイコンであることを証明しています。

ただし、owncloudが起動されるたびに作成されたディレクトリの名前が変更されるため、私が手動で行ったことを自動化するには、スクリプト/ラッパーが必要です。もちろん、最も便利なオプションは、owncloud-clientのコードが変更されることです。

ディスカッションも参照してください here

つづく...

9
Jacob Vlijm

アイコンとその潜在的な場所

インジケーターがアイコンを使用できる方法は2つあります。

  • カスタムアイコン。これは通常/usr/share/pixmaps/に入りますが、作成者の中にはインジケータアイコンを他のディレクトリに送信することもできます。たとえば、このページに答えがあり、SpaceViewインジケーターの作成者でもあるJacob Vlijmは、そのインジケーターのアイコンを/opt/spaceview/iconに配置することを選択しました。これらのタイプのアイコンでは、少し複雑ですが、dpkg -L <package name>またはcat /var/lib/dpkg/info/PACKAGE.listを使用して、.pngまたは.svg拡張子のアイコンファイルを検索します。これらは最も典型的です
  • 標準のテーマ固有のアイコン。これらは通常、/usr/share/iconsフォルダーにあります。たとえば、Udisksインディケーターなどのインディケーターでは、/usr/share/icons/gnomeにあるものに頻繁に依存しています。これらは標準であり、Ubuntuのインストールに付属しているためです。 dpkgのクエリでアイコンが見つからない場合、パッケージが標準のアイコンを使用している可能性があります。

ソースに行く

インジケーターがPythonまたはRubyで記述されている場合、手掛かりのソースコードを調べるのは比較的簡単です。これらはスクリプトであり、grepを使用してソースコードを検索するのに十分です。 CやValaなどのコンパイル済み言語にはソースコードが付属していないため、apt-get source package-name経由で、またはパッケージを入手した場所から入手する必要があります。 (冒険好きのユーザーはhexdumpを使用するか、実行可能ファイルを逆コンパイルできますが、アイコンについての好奇心だけのためにあまりにも多くの作業があります)。

NOTE:アイコンが/usr/share/icons//usr/share/pixmapsなどの標準ディレクトリのいずれかにある場合、ソフトウェアの作成者は単に名前でアイコンを呼び出すことを選択できます、拡張子なし。たとえば、私のudisks-indicatorでは、次の行を使用して標準アイコンの1つを呼び出します。

self.app.set_icon("drive-harddisk-symbolic")

.svgまたは.png拡張機能がないことに注意してください。したがって、この場合、アイコンの名前があり、locatefindなどのLinux標準コマンドを使用してアイコンを見つけることができます。

標準のLinuxツールを使用した検索

アイコンを検索するコマンドが本当に必要な場合は、次の単純な組み合わせを使用してください。

dpkg -L <Package name here> | xargs file  | grep -i image

以下に例を示します。インディケーターdiskmanがカスタムアイコンを使用するという事実を知っています。それで、このコマンドは私たちに何を伝えますか?

$ dpkg -L indicator-diskman | xargs file  | grep -i image                                                                
/usr/share/indicator-diskman/images:                    directory
/usr/share/indicator-diskman/images/drive-harddisk.svg: SVG Scalable Vector Graphics image
/usr/share/indicator-diskman/images/media-optical.png:  PNG image data, 64 x 64, 8-bit/color RGBA, non-interlaced
/usr/share/indicator-diskman/images/disks.png:          PNG image data, 64 x 64, 8-bit gray+alpha, non-interlaced
/usr/share/indicator-diskman/images/locked.png:         PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
/usr/share/indicator-diskman/images/lock.svg:           SVG Scalable Vector Graphics image
/usr/share/indicator-diskman/images/unlocked.png:       PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
/usr/share/indicator-diskman/images/media-eject.svg:    SVG Scalable Vector Graphics image
/usr/share/indicator-diskman/images/disk.png:           PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced
/usr/share/pixmaps/indicator-diskman.png:               PNG image data, 64 x 64, 8-bit gray+alpha, non-interlaced

/usr/share/pixmaps/indicator-diskman.png最後の画像に注意してください。これは、インジケーターがパネルに実際に表示するものです。

そして、インジケーターが標準アイコンを使用している場合はどうなりますか?もちろん、出力はありません。

$ dpkg -L udisks-indicator | xargs file  | grep -i image                                                                 

$

結論

設定された標準はありませんが、アイコンが配置される典型的な場所のセットがあり、dpkgを使用して、特定の各パッケージに付属するファイルに関する情報を照会できます。最後に、それはおそらく最も技術的な提案ではないかもしれませんが、開発者にメールを送信するか、IRCまたはチャットで停止し、「ねえ、あなたのインジケーターはどのアイコンを使用しますか?」開発者は通常、ソフトウェアを使用している人から聞いて喜んで、簡単な質問に答えることを気にしません。

4