Varsayılan olmayan durum menüleri (aka göstergeler) tarafından kullanılan simge dosyalarını nasıl bulabilirim?


9

Bazı varsayılan olmayan durum menüleri (uygulama göstergeleri veya gösterge uygulamaları olarak da bilinir) tarafından kullanılan simgelerin konumunu bulmak istiyorum .

resim açıklamasını buraya girin

Bu simgeler resim dosyaları nerede bulunur?

Ekran görüntümde ownCloud ve Radiotray var, ancak lütfen bu belirli simgelere özgü olmayan genel bir cevap istiyorum. Dosya adlarını veya dosya türlerini bilmiyorum, bu yüzden arama zor.

Yanıtlar:


9

Varsayılan olmayan gösterge simgeleri için varsayılan konum?

Bu simgelerin depolandığı varsayılan bir konum yoktur. Herhangi bir uygulama (-developer) bunları uygun görüldüğü yerlerde saklayabilir.

Ancak iyi haber, göstergelerin genellikle sonsuz dosya ve görüntü listesi yüklememesidir. Aramamızı komutun çıktısına bakarak (koda bakmak dışında) sınırlayabiliriz:

dpkg-query -L <packagename>

Benim örneğimde

dpkg-query -L placesfiles

resim açıklamasını buraya girin

bu diğerleri arasında aşağıdaki görüntüleri çıktılar:

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

... bu da aramayı oldukça sınırlandıracaktı.

Adamdan 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 durumunda , aşağıdaki .pngdosyaları buldum (çalışıyor 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

Biz ise gerçekten kod ararken, bulmak gerekir

... "icon" dizesinin eşleşmeleri için yüklenmiş dosyaları (içeride) arayabiliriz. Göstergelerin çoğu, senaryo dillerinden birinde (örneğin python) yazılmıştır , bu da çok iyi arama yapabildikleri anlamına gelir.

Bir örnek

Yine radiotrayörneği kullanarak

dpkg-query -L radiotray | xargs grep icon

çıktıda ao buluyoruz:

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

Dosyaya bakarak SysTrayGui.pyşunları görebiliriz:

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

Bundan, bahsedilen simgelerin common(alt) dizinin içindeki modülde tanımlandığı sonucuna varabiliriz lib. (Bkz buraya piton o modülleri nasıl bulduğu, bölüm alt dizinleri )

Bu modülde bölümü okuyabiliriz:

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

...ve işte buradayız...

İstisnai durumlar

Tüm göstergelerimin pratikte, yukarıdaki yöntemleri kullanarak ilgili simgeleri bulmayı başardım.

Bununla birlikte, görüntüleri kodla birlikte tek bir yürütülebilir dosyada derlemek mümkün görünmektedir. Bu gibi durumlarda ayrı bir görüntü bulamayacağınızı veya kodu düzenlemeden ve yeniden derlemeden bunları değiştiremeyeceğinizi açıklamaya gerek yoktur.

Owncloud vakası böyle bir durum gibi görünüyor. Yukarıdaki yöntem (ler) kullanılarak içeride bir dizi simge yüklendiğini gösterdi /usr/share/icons/hicolor/<size>/apps. Bu simgelerin hiçbiri ubuntu üzerindeki göstergede kullanılmaz .

OP bu soruyu daha önce (ve sonra) oldukça çalıştı. Bunlardan biri koşmaktı:

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

... bize oldukça faydalı bilgiler veriyor. Çıktıda bir bölüm vardı:

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

Dizine bakarak /tmp/iconcache-50ePXx, gösterge tarafından kullanılan kesin simgeleri buldum:

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin

... bu simgelerin anında oluşturulduğunu kanıtlıyor gibi görünüyor; owncloud'u kapatmak dizini ve simgelerini yok eder.

Aşağıdaki simgeleri değiştirerek göstergenin simgesini değiştirmek mümkün oldu:

resim açıklamasını buraya girin

ki bunlar gerçekten aradığımız ikonlar.

Ancak manuel olarak yaptığım şeyi otomatikleştirmek için, kendi dizinin her başlatıldığında oluşturulan dizinin adı değiştiği için bir komut dosyası / paketleyici gerektirir. En uygun seçenek elbette owncloud-istemcisinin kodunun değiştirilmesidir.

Ayrıca buradaki tartışmamıza bakın .

Devam edecek...


dpkg -LAynı şeyi yapmıyor mu ?
Kaz Wolfe

@KazWolfe görünüşe göre, burada olsa belirtilmeyen: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm

Teşekkürler, bu Radiotray simgelerini bulmak için yararlıdır. Ekran görüntümden ( burada GitHub'daki ownCloud kaynak kodundan örnek) ownCloud monokrom simgesinden sonrayım - ve döndürülen sonuçlar arasında değil dpkg-query -L. find / -name state-ok -type fGörünüşe göre arama durdu ama ben bir gece çalışır durumda bırakacağım.
Tom Brossman

@TomBrossman Eminim bulabiliriz. Görmek için ownCloud'u kuracağım.
Jacob Vlijm

1
@TomBrossman Sunucu geçici olarak kapalı olabilir, bazı bölümlerde 404 bulunamadı hatası alıyorum .. İndirilen .deb dosyasına bakıldığında, owncloud /usr/share/icons/hicolor/<size>/apps olsa da bazı simgeleri yükler . Ne yazık ki, .deb dosyası yüklenmiyor: Errors were encountered while processing:Daha sonra tekrar deneyeceğim ...
Jacob Vlijm

4

Simgeler ve potansiyel konumları

Göstergenin simgeleri kullanmasının iki yolu vardır:

  • Özel simge. /usr/share/pixmaps/Bazı yazarların diğer dizinlere gösterge simgeleri göndermeleri mümkün olsa da, bu genellikle geçerlidir . Cevabı bu sayfada olan ve aynı zamanda SpaceView göstergesinin yazarı olan Jacob Vlijm, bu gösterge için simgeleri yerleştirmeyi seçti /opt/spaceview/icon. Bu tür simgelerle biraz zor ama karmaşık değil - dpkg -L <package name>veya cat /var/lib/dpkg/info/PACKAGE.listsimgesini kullanarak .pngveya .svguzantısı olan bir simge dosyası arayın . Bunlar en tipik
  • Standart, temaya özel simge. Bunlar genellikle /usr/share/iconsklasörde bulunabilir . Örneğin, Udisks Göstergesi gibi göstergelerimde, /usr/share/icons/gnomestandart olan ve herhangi bir Ubuntu kurulumuyla birlikte geldiklerinden sık sık neler olduğuna güveniyorum . Sorgudan bir simge bulamazsanız dpkg, paketin standart bir simge kullanması ihtimali vardır.

Kaynağa gitmek

Python veya Ruby'de bir gösterge yazılırsa, ipuçları için kaynak koduna bakmak nispeten kolay olabilir, çünkü bunlar komut dosyalarıdır ve grepkaynak kodu aramak için kullanmak yeterlidir . C ve Vala gibi derlenmiş diller kaynak koduyla birlikte gelmez, bu yüzden apt-get source package-namepaketi nereden veya nereden ederseniz edin. (Maceracı kullanıcılar hexdumpyürütülebilir dosyayı kullanabilir veya kaynak koda dönüştürebilirler, ancak IMHO bir simge hakkında merak için çok fazla iş yapar).

NOT : Bir simge /usr/share/icons/veya gibi standart dizinlerden /usr/share/pixmapsbirinde bulunuyorsa, yazılımın yazarı simgeyi uzantılar olmadan yalnızca adıyla çağırmayı seçebilir. Örneğin, benim udisks-indicatorstandart hatlardan birini aramak için bu hattı kullanın:

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

Eksikliğine .svgveya .pnguzantısına dikkat edin . Böylece, bu durumda, simgenin bir adı vardır ve bunu locateveya gibi Linux standart komutlarını kullanarak bulabiliriz find.

Standart Linux araçlarını kullanarak arama yapın

Simgeleri aramak için gerçekten bir komut almak istiyorsanız, şu basit kombinasyonu kullanın:

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

İşte bir örnek. Bir gösterge diskçisinin özel bir simge kullandığını biliyorum. Peki bu komut bize ne anlatıyor?

$ 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.pngGöstergenin panelde gösterdiği son görüntüye dikkat edin .

Gösterge standart bir simge kullanıyorsa ne olacak? Açıkçası çıktı olmayacak:

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

$

Sonuç

Belirlenmiş bir standart olmasa da, simgelerin gittiği tipik yerler vardır ve dpkgher bir pakette hangi dosyaların geldiği hakkında bilgi sorgulamak için kullanabiliriz . Son olarak, belki de en teknik öneri değildir, ancak geliştiricilere IRC veya sohbetlerini e-posta ile göndermeyi veya durdurmayı düşünün ve onlara sadece "Hey, göstergeniz hangi simgeyi kullanıyor?" Geliştiriciler genellikle yazılımlarını kullanan ve hızlı bir soruyu cevaplamaktan çekinmeyen insanlardan duymaktan memnuniyet duyarlar.


Teşekkürler, bu cevap da çok yardımcı oldu ama kendiCloud masaüstü senkronizasyon simgeler ile garip bir şey yapıyor ve ben de anlamaya umuyoruz.
Tom Brossman

@TomBrossman tuhaf bir şey yaparak, tam olarak ne demek istiyorsun?
Sergiy Kolodyazhnyy

ownCloud'un Desktop Sync uygulaması, kullanmadığı bir dizi simge yükler. Onları özelleştirmeyi ve değiştirmeyi umuyordum, ancak onları anında oluşturduğundan /tmppratik değil. Yüklü simge kümelerini kullandıkları için yanıtınızı kullanarak çoğu uygulama için bunları özelleştirmek kolaydır.
Tom Brossman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.