it-swarm.com.de

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

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

enter image description here

Wo befinden sich diese Bilddateien für Symbole?

In meinem Screenshot habe ich ownCloud und Radiotray, aber ich hätte gerne eine allgemeine Antwort, die nicht speziell für diese bestimmten Symbole ist. Ich kenne die Dateinamen oder Dateitypen nicht, daher ist das Suchen schwierig.

9
Tom Brossman

Standardspeicherort für nicht standardmäßige Anzeigesymbole?

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

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

dpkg-query -L <packagename>

In meinem Beispiel von

dpkg-query -L placesfiles

enter image description here

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 eingeschränkt machen 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 .png -Dateien gefunden (mit 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 wirklich herausfinden müssen, suchen wir den Code

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

Ein Beispiel

Verwenden Sie erneut das Beispiel radiotray

dpkg-query -L radiotray | xargs grep icon

in der Ausgabe finden wir a.o .:

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

Wenn wir in die Datei SysTrayGui.py 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 common im (Unter-) Verzeichnis lib definiert sind. (Siehe 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 habe ich es geschafft, die entsprechenden Symbole mithilfe der obigen Methode (n) zu finden.

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

Der Fall von owncloud scheint ein solcher Fall zu sein. Bei Verwendung der obigen Methode (n) wurde eine Reihe von Symbolen in /usr/share/icons/hicolor/<size>/apps installiert. 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 laufen:

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-50ePXx habe ich die genauen Symbole gefunden, die vom Indikator verwendet wurden:

enter image description hereenter image description hereenter image description here

... was zu beweisen scheint, dass diese Symbole im laufenden Betrieb generiert werden; Wenn Sie owncloud schließen, verschwinden das Verzeichnis und seine Symbole.

Es stellte sich heraus, dass das Symbol des Indikators durch Ersetzen der folgenden Symbole geändert werden konnte:

enter image description here

das beweist, dass dies tatsächlich die Ikonen sind, nach denen wir gesucht haben.

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

Siehe auch unsere Diskussion hier .

Fortsetzung folgt...

9
Jacob Vlijm

Symbole und ihre potenziellen Standorte

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

  • Benutzerdefiniertes Symbol. Dies geht normalerweise in /usr/share/pixmaps/ über, obwohl es möglich ist, dass einige Autoren Anzeigesymbole an andere Verzeichnisse senden. Jacob Vlijm, dessen Antwort sich auf dieser Seite befindet und der auch Autor des SpaceView-Indikators ist, hat beispielsweise ausgewählt, Symbole für diesen Indikator in /opt/spaceview/icon zu platzieren. Bei dieser Art von Symbolen ist es etwas schwierig, aber nicht komplex - verwenden Sie dpkg -L <package name> oder cat /var/lib/dpkg/info/PACKAGE.list und suchen Sie nach einer Symboldatei mit der Erweiterung .png oder .svg. Dies sind die typischsten
  • Standard, themenspezifisches Symbol. Diese befinden sich normalerweise im Ordner /usr/share/icons. Zum Beispiel verlasse ich mich in meinen Indikatoren wie Udisks Indicator häufig auf das, was in /usr/share/icons/gnome enthalten ist, da dies Standard ist und mit jeder Ubuntu-Installation geliefert wird. Wenn Sie beim Abfragen von dpkg kein Symbol finden, verwendet das Paket möglicherweise ein Standardsymbol.

Zur Quelle gehen

Wenn ein Indikator in Python oder Ruby geschrieben ist, kann das Durchsuchen des Quellcodes nach Hinweisen relativ einfach sein, da es sich um Skripts handelt und es ausreicht, grep zum Durchsuchen des Quellcodes zu verwenden. Kompilierte Sprachen wie C und Vala werden nicht mit Quellcode geliefert, daher müssten Sie diesen entweder über apt-get source package-name oder von jedem Ort beziehen, an dem Sie das Paket bezogen haben. (Abenteuerlustige Benutzer könnten hexdump verwenden oder die ausführbare Datei dekompilieren, aber meiner Meinung nach ist es zu viel Arbeit, nur um neugierig auf ein Symbol zu sein.).

NOTE: 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 nach Namen benennen , ohne verlängerungen. In meinem udisks-indicator benutze ich diese Zeile, um eines der Standardsymbole aufzurufen:

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

Beachten Sie das Fehlen der Erweiterung .svg oder .png. In diesem Fall haben wir also einen Namen für das Symbol und können es mit Linux-Standardbefehlen wie locate oder find finden.

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, dass /usr/share/pixmaps/indicator-diskman.png das letzte Bild ist, das die Anzeige 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

Obwohl es keinen festgelegten Standard gibt, gibt es eine Reihe typischer Stellen, an denen Symbole angezeigt werden, und wir können dpkg verwenden, um Informationen darüber abzufragen, welche Dateien mit den einzelnen Paketen geliefert werden. Letztendlich ist es vielleicht nicht der technischste Vorschlag, aber Sie können Entwicklern eine E-Mail senden oder bei 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.

4