Wie finde ich die Symboldateien, die von nicht standardmäßigen Statusmenüs (auch als Indikatoren bezeichnet) verwendet werden?

9

Ich möchte die Position der Symbole ermitteln, die von einigen nicht standardmäßigen Statusmenüs verwendet werden (auch als Anwendungsindikatoren oder Indikator-Applets bezeichnet).

Geben Sie hier die Bildbeschreibung ein

Wo befinden sich diese Bilddateien?

In meinem Screenshot habe ich ownCloud und Radiotray, aber ich möchte eine allgemeine Antwort, die nicht spezifisch für diese speziellen Symbole ist. Ich kenne die Dateinamen oder Dateitypen nicht, daher ist die Suche schwierig.

Tom Brossman
quelle

Antworten:

9

Standardspeicherort für nicht standardmäßige Indikatorsymbole?

Es gibt keinen Standardspeicherort für diese Symbole. Jede Anwendung (-Entwickler) kann sie dort speichern, wo dies als angemessen erachtet wird.

Die gute Nachricht ist jedoch, dass Indikatoren normalerweise keine endlosen Listen von Dateien und Bildern installieren. Wir können unsere Suche einschränken, indem wir (abgesehen vom Blick in den Code) in die Ausgabe des Befehls schauen:

dpkg-query -L <packagename>

In meinem Beispiel von

dpkg-query -L placesfiles

Geben Sie hier die Bildbeschreibung ein

Dies würde unter anderem die folgenden Bilder ausgeben:

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

... was die Suche ziemlich einschränken würde.

Vom Menschen 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”:

Im Fall von Radiotray habe ich die folgenden .pngDateien gefunden (läuft 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

Wenn wir es wirklich herausfinden müssen, suchen Sie den Code

... können wir (innerhalb) installierte Dateien nach Übereinstimmungen mit der Zeichenfolge "icon" durchsuchen. Viele der Indikatoren sind in einer der Skriptsprachen (wie python) geschrieben, was bedeutet, dass sie sehr gut durchsuchbar sind.

Ein Beispiel

Wieder am radiotrayBeispiel

dpkg-query -L radiotray | xargs grep icon

In der Ausgabe finden wir ua:

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

Wenn SysTrayGui.pywir in die Datei schauen, können wir sehen:

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

Daraus können wir schließen, dass die genannten Symbole im Modul commonim (Unter-) Verzeichnis definiert sind lib. (Sehen Sie hier, wie Python Module findet, Abschnitt Unterverzeichnisse )

In diesem Modul können wir den Abschnitt lesen:

# 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"

...und hier sind wir...

Ausnahmesituationen

Mit praktisch allen meinen Indikatoren gelang es mir, die entsprechenden Symbole mithilfe der oben beschriebenen Methode (n) zu finden.

Es stellt sich jedoch heraus, dass es möglich ist, Bilder zusammen mit dem Code zu einer einzigen ausführbaren Datei zu kompilieren. Sie müssen nicht erklären, dass Sie in solchen Fällen weder ein separates Bild finden noch ersetzen können, ohne den Code zu bearbeiten und neu zu kompilieren.

Der Fall der eigenen Wolke scheint ein solcher Fall zu sein. Unter Verwendung der oben genannten Methode (n) wurde gezeigt, dass eine Reihe von Symbolen im Inneren installiert wurde /usr/share/icons/hicolor/<size>/apps. Keines dieser Symbole wird jedoch in der Anzeige auf Ubuntu verwendet .

OP hat einige Arbeit geleistet, bevor (und nachdem) er diese Frage gestellt hat. Einer von ihnen war zu rennen:

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

... was uns einige nützliche Informationen gibt. Die Ausgabe enthielt einen Abschnitt:

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

Beim Durchsuchen des Verzeichnisses /tmp/iconcache-50ePXxfand ich die genauen Symbole, die vom Indikator verwendet wurden:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

... was zu beweisen scheint, dass diese Symbole im laufenden Betrieb generiert werden; Durch das Schließen von owncloud verschwinden das Verzeichnis und seine Symbole.

Es stellte sich heraus, dass es möglich war, das Symbol des Indikators durch Ersetzen dieser Symbole zu ändern:

Geben Sie hier die Bildbeschreibung ein

was beweist, dass dies tatsächlich die Symbole sind, nach denen wir gesucht haben.

Um das, was ich manuell gemacht habe, zu automatisieren, wäre jedoch ein Skript / Wrapper erforderlich, da der Name des erstellten Verzeichnisses bei jedem Start von owncloud geändert wird. Die bequemste Option wäre natürlich, dass der Code des owncloud-Clients geändert wird.

Siehe auch unsere Diskussion hier .

Fortsetzung folgt...

Jacob Vlijm
quelle
Tut nicht dpkg -Ldas Gleiche?
Kaz Wolfe
@KazWolfe offenbar, hier ist es allerdings nicht erwähnt: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm
Vielen Dank, dies ist hilfreich, um die Radiotray-Symbole zu finden. Ich bin hinter dem monochromen ownCloud-Symbol in meinem Screenshot her ( Beispiel aus dem ownCloud-Quellcode auf GitHub hier ) - und es gehört nicht zu den Ergebnissen, die mit zurückgegeben werden dpkg-query -L. Die Suche mit dem find / -name state-ok -type fAussehen scheint ins Stocken geraten zu sein, aber ich werde es über Nacht laufen lassen.
Tom Brossman
@ TomBrossman Ich bin sicher, wir können es herausfinden. Ich werde ownCloud installieren, um zu sehen.
Jacob Vlijm
1
@ TomBrossman Der Server ist möglicherweise vorübergehend ausgefallen. Ich erhalte 404 - an einigen Stellen wurde kein Fehler gefunden. In der heruntergeladenen .deb-Datei installiert owncloud jedoch einige Symbole /usr/share/icons/hicolor/<size>/apps . Leider wird die .deb-Datei nicht installiert: Errors were encountered while processing:Ich werde es später erneut
versuchen
4

Symbole und ihre potenziellen Standorte

Es gibt zwei Möglichkeiten, wie Indikatoren Symbole verwenden können:

  • Benutzerdefiniertes Symbol. Dies geschieht normalerweise /usr/share/pixmaps/, obwohl es möglich ist, dass einige Autoren Indikatorsymbole an andere Verzeichnisse senden. Jacob Vlijm, dessen Antwort auf dieser Seite steht und der auch Autor des SpaceView-Indikators ist, hat beispielsweise Symbole für diesen Indikator platziert /opt/spaceview/icon. Mit dieser Art von Symbolen ist es etwas schwierig, aber nicht komplex - verwenden Sie dpkg -L <package name>oder cat /var/lib/dpkg/info/PACKAGE.listund suchen Sie nach einer Symboldatei mit .pngoder .svgErweiterung. Diese sind am typischsten
  • Standard, themenspezifisches Symbol. Diese befinden sich normalerweise im /usr/share/iconsOrdner. Zum Beispiel verlasse ich mich bei meinen Indikatoren wie Udisks Indicator häufig auf die Inhalte /usr/share/icons/gnome, da diese Standard sind und mit jeder Ubuntu-Installation geliefert werden . Wenn Sie beim Abfragen kein Symbol dpkgfinden, verwendet das Paket wahrscheinlich ein Standardsymbol.

Zur Quelle gehen

Wenn ein Indikator in Python oder Ruby geschrieben ist, kann das grepDurchsuchen des Quellcodes nach Hinweisen relativ einfach sein, da es sich um Skripte handelt und es ausreicht, den Quellcode zu durchsuchen. Kompilierte Sprachen wie C und Vala werden nicht mit Quellcode geliefert, sodass Sie ihn entweder über apt-get source package-nameoder von jedem Ort erhalten müssen, an dem Sie das Paket erhalten haben. (Abenteuerlustige Benutzer könnten hexdumpdie ausführbare Datei verwenden oder dekompilieren, aber meiner Meinung nach ist es zu viel Arbeit, nur um neugierig auf ein Symbol zu werden.)

HINWEIS : Wenn sich ein Symbol in einem der Standardverzeichnisse befindet, z. B. /usr/share/icons/oder /usr/share/pixmaps, kann der Autor der Software das Symbol einfach beim Namen ohne Erweiterungen aufrufen. In meiner udisks-indicatorZeile verwende ich beispielsweise diese Zeile, um eines der Standardsymbole aufzurufen:

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

Beachten Sie das Fehlen .svgoder die .pngErweiterung. In diesem Fall haben wir also einen Namen für das Symbol und können ihn mithilfe von Linux-Standardbefehlen wie locateoder finden find.

Suche mit Standard-Linux-Tools

Wenn Sie wirklich einen Befehl zum Suchen von Symbolen haben möchten, verwenden Sie einfach diese einfache Kombination:

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

Hier ist ein Beispiel. Ich weiß, dass der Indikator diskman ein benutzerdefiniertes Symbol verwendet. Was sagt uns dieser Befehl?

$ 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

Beachten Sie das /usr/share/pixmaps/indicator-diskman.pngletzte Bild, das der Indikator tatsächlich auf dem Bedienfeld anzeigt.

Und was ist, wenn der Indikator ein Standardsymbol verwendet? Nun, offensichtlich wird es keine Ausgabe geben:

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

$

Fazit

Es gibt zwar keinen festgelegten Standard, aber eine Reihe typischer Orte, an denen Symbole angezeigt werden, und wir können dpkgInformationen darüber abfragen, welche Dateien mit den einzelnen Paketen geliefert werden. Schließlich ist es vielleicht nicht der technischste Vorschlag, aber Sie sollten Entwicklern eine E-Mail senden oder in ihrem IRC oder Chat vorbeischauen und sie einfach fragen: "Hey, welches Symbol verwendet Ihr Indikator?". Entwickler sind normalerweise froh, von Leuten zu hören, die ihre Software verwenden, und haben nichts dagegen, eine kurze Frage zu beantworten.

Sergiy Kolodyazhnyy
quelle
Vielen Dank, diese Antwort war auch sehr hilfreich, aber meine ownCloud-Desktop-Synchronisierung macht etwas Seltsames mit den Symbolen und ich hoffe, das auch herauszufinden.
Tom Brossman
@ TomBrossman mit etwas Seltsamem, was genau meinst du?
Sergiy Kolodyazhnyy
Die Desktop Sync-Anwendung von ownCloud installiert eine Reihe von Symbolen, die nicht verwendet werden. Ich hatte gehofft, sie anpassen und ersetzen zu können, aber da es sie im laufenden Betrieb erzeugt, ist /tmpes nicht praktisch. Das Anpassen für die meisten Anwendungen ist jedoch mit Ihrer Antwort einfach, da sie die installierten Symbolsätze verwenden.
Tom Brossman