Ich möchte die Position der Symbole finden, die von einigen nicht standardmäßigen Statusmenüs (auch Anwendungsindikatoren oder Indikator-Applets genannt) verwendet werden.
Wo befinden sich diese Symbolbilddateien?
In meinem Screenshot habe ich ownCloud und Radiotray, aber ich hätte gerne eine allgemeine Antwort, die sich nicht auf diese speziellen Symbole bezieht, bitte. Ich kenne die Dateinamen oder Dateitypen nicht, daher ist die Suche schwierig.
Akzeptierte Antwort:
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 , die gute Nachricht ist, dass Indikatoren normalerweise keine endlosen Listen von Dateien und Bildern installieren. Wir können unsere Suche einschränken, indem wir (abgesehen vom Durchsuchen des Codes) in die Ausgabe des Befehls schauen:
dpkg-query -L <packagename>
In meinem Beispiel von
dpkg-query -L placesfiles
dies würde unter anderem die folgenden Bilder ausgeben:
//eadn-wc01-5196795.nxedge.io/opt/placesfiles/images/dir_icon.png
//eadn-wc01-5196795.nxedge.io/opt/placesfiles/images/placesfiles64.png
//eadn-wc01-5196795.nxedge.io/usr/share/pixmaps/placesfiles.png
…Was die Suche ziemlich einschränken würde.
Von 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”:
Im Fall von Radiotray , habe ich folgende .png
gefunden Dateien (durch Ausführen von dpkg-query -L radiotray | grep png
):
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray_connecting.png
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray_on.png
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray_off.png
//eadn-wc01-5196795.nxedge.io/usr/share/radiotray/images/radiotray.png
//eadn-wc01-5196795.nxedge.io/usr/share/pixmaps/radiotray.png
Wenn wir wirklich müssen Sie herausfinden, indem Sie den Code durchsuchen
…können wir (innerhalb) installierter 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 mit dem radiotray
Beispiel
dpkg-query -L radiotray | xargs grep icon
in der Ausgabe finden wir u.a.:
/usr/lib/python2.7/dist-packages/radiotray/SysTrayGui.py
self.icon.set_from_file(APP_ICON_CONNECT)
Ein Blick in die Datei SysTrayGui.py
, 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 Icons im Modul common
definiert sind im (Unter-)Verzeichnis lib
. (Sehen Sie hier, wie Python seine 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…
Außergewöhnliche Situationen
Mit praktisch allen meinen Indikatoren gelang es mir, die entsprechenden Symbole mit der/den oben genannten Methode(n) zu finden.
Verwandt:Finden Sie nahezu doppelte Dateien in einem Ordner?Es stellt sich jedoch heraus, dass es möglich ist, Bilder zusammen mit dem Code zu einer einzigen ausführbaren Datei zu kompilieren. Es muss nicht erklärt werden, dass Sie in solchen Fällen weder ein separates Image finden, noch diese ersetzen können, ohne den Code zu bearbeiten und neu zu kompilieren.
Der Fall von owncloud scheint ein solcher Fall zu sein. Die Verwendung der obigen Methode(n) zeigte, dass eine Reihe von Symbolen in /usr/share/icons/hicolor/<size>/apps
installiert wurde . Keines dieser Symbole wird jedoch im Indikator auf Ubuntu verwendet .
OP hat ziemlich viel Arbeit geleistet, bevor (und nachdem) er diese Frage gestellt hat. Einer davon sollte 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 liefert. Die Ausgabe enthielt einen Abschnitt:
('146028888067', 2, 'org.kde.StatusNotifierItem-22055-1', '/StatusNotifierItem/menu', '/tmp/iconcache-50ePXx', '', '', '', 'owncloud', 'ownCloud')
Schauen Sie in das Verzeichnis /tmp/iconcache-50ePXx
, habe ich die genauen Symbole gefunden, die vom Indikator verwendet wurden:
… was zu beweisen scheint, dass diese Symbole im laufenden Betrieb generiert werden; das Schließen von owncloud lässt das Verzeichnis und seine Icons verschwinden.
Es stellte sich heraus, dass es möglich war, das Symbol des Indikators zu ändern, indem diese Symbole ersetzt wurden:
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. Am bequemsten wäre natürlich, den Code des owncloud-Clients zu ändern.
Fortsetzung folgt…