Bagaimana cara menemukan file ikon yang digunakan oleh menu status non-default (alias indikator)?

9

Saya ingin mencari lokasi ikon yang digunakan oleh beberapa menu status non-standar (juga disebut indikator aplikasi atau applet indikator).

masukkan deskripsi gambar di sini

Di mana letak ikon-ikon ini file gambar?

Dalam tangkapan layar saya, saya memilikiCloud dan Radiotray sendiri, tetapi saya ingin jawaban umum yang tidak spesifik untuk ikon-ikon khusus ini. Saya tidak tahu nama file atau tipe file sehingga pencarian sulit.

Tom Brossman
sumber

Jawaban:

9

Lokasi default untuk ikon indikator non-standar?

Tidak ada lokasi default tempat ikon-ikon ini disimpan. Aplikasi apa pun (-developer) dapat menyimpannya di tempat yang dianggap tepat.

Namun , kabar baiknya adalah indikator biasanya tidak menginstal daftar file dan gambar yang tidak ada habisnya. Kami dapat membatasi pencarian kami dengan (selain melihat ke dalam kode) melihat ke dalam output dari perintah:

dpkg-query -L <packagename>

Dalam contoh saya tentang

dpkg-query -L placesfiles

masukkan deskripsi gambar di sini

ini akan antara lain, menampilkan gambar berikut:

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

... Yang akan membuat pencarian sangat terbatas.

Dari manusia 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”:

Dalam kasus Radiotray , saya menemukan .pngfile - file berikut (sedang berjalan 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

Jika kita benar - benar perlu mencari tahu, cari kodenya

... kita dapat melihat (dalam) file yang diinstal untuk menemukan kecocokan dari "ikon" string. Banyak indikator ditulis dalam salah satu bahasa skrip (seperti python), yang berarti mereka sangat baik dicari.

Sebuah contoh

Lagi menggunakan radiotraycontoh

dpkg-query -L radiotray | xargs grep icon

dalam output kita temukan ao:

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

Melihat ke dalam file SysTrayGui.py, kita dapat melihat:

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

Dari sini, kita dapat menyimpulkan ikon yang disebutkan didefinisikan dalam modul commondi dalam direktori (sub) lib. (Lihat di sini bagaimana python menemukannya modul, bagian Subdirektori )

Dalam modul ini, kita dapat membaca bagian:

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

... dan di sini kita ...

Situasi luar biasa

Dengan praktis semua indikator saya, saya berhasil menemukan ikon yang sesuai menggunakan metode (s) di atas.

Namun ternyata dimungkinkan, untuk mengkompilasi gambar bersama dengan kode menjadi satu executable. Tidak perlu menjelaskan bahwa dalam kasus seperti itu Anda tidak akan menemukan gambar yang terpisah, Anda juga tidak akan dapat menggantinya tanpa mengedit kode dan mengkompilasi ulang.

Kasus owncloud tampaknya merupakan kasus seperti itu. Menggunakan metode di atas (s) menunjukkan serangkaian ikon dipasang di dalamnya /usr/share/icons/hicolor/<size>/apps. Namun, tidak satu pun dari ikon ini yang digunakan dalam indikator di ubuntu .

OP melakukan beberapa pekerjaan sebelum (dan setelah) dia menanyakan pertanyaan ini. Salah satunya adalah menjalankan:

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

... yang memberi kami beberapa informasi berguna. Output termasuk bagian:

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

Melihat ke direktori /tmp/iconcache-50ePXx, saya menemukan ikon yang tepat yang digunakan oleh indikator:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

... yang tampaknya membuktikan ikon-ikon ini dihasilkan dengan cepat; menutup owncloud membuat direktori dan ikonnya menghilang.

Ternyata dimungkinkan untuk mengubah ikon indikator dengan mengganti ikon-ikon ini:

masukkan deskripsi gambar di sini

yang membuktikan ini memang ikon yang kami cari.

Untuk mengotomatiskan apa yang saya lakukan secara manual, akan membutuhkan skrip / pembungkus, karena nama direktori yang dibuat berubah setiap kali owncloud diluncurkan. Opsi yang paling nyaman tentu saja adalah bahwa kode owncloud-client akan diubah.

Lihat juga diskusi kami di sini .

Bersambung...

Yakub Vlijm
sumber
Tidak dpkg -Lmelakukan hal yang sama?
Kaz Wolfe
@KazWolfe rupanya, ini dia tidak disebutkan: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm
Terima kasih, ini berguna untuk menemukan ikon Radiotray. Saya mencari ikon monochrome ownCloud dari tangkapan layar saya ( contoh dari kode sumber ownCloud di GitHub di sini ) - dan itu bukan salah satu hasil yang dikembalikan dpkg-query -L. Pencarian dengan find / -name state-ok -type ftampilan terhenti tetapi saya akan membiarkannya berjalan semalaman.
Tom Brossman
@ TomBrossman Saya yakin kita bisa mengetahuinya. Saya akan menginstal ownCloud untuk melihatnya.
Jacob Vlijm
1
@ TomBrossman Server mungkin turun sementara, saya mendapatkan 404 -tidak menemukan kesalahan pada beberapa bagian .. Melihat ke dalam file .deb yang diunduh, owncloud menginstal cukup banyak ikon /usr/share/icons/hicolor/<size>/apps . Sayangnya, file .deb tidak dapat diinstal: Errors were encountered while processing:Saya akan mencoba lagi nanti ...
Jacob Vlijm
4

Ikon dan lokasi potensial mereka

Ada dua cara indikator menggunakan ikon:

  • Ikon kustom. Ini biasanya masuk /usr/share/pixmaps/, meskipun ada kemungkinan beberapa penulis mengirim ikon indikator ke direktori lain. Jacob Vlijm, yang jawabannya ada di halaman ini dan yang juga penulis indikator SpaceView, misalnya, memilih untuk menempatkan ikon untuk indikator tersebut /opt/spaceview/icon. Dengan jenis ikon ini sedikit rumit tetapi tidak rumit - gunakan dpkg -L <package name>atau cat /var/lib/dpkg/info/PACKAGE.listdan cari file ikon, dengan .pngatau .svgekstensi. Ini yang paling khas
  • Ikon standar tema khusus. Ini biasanya dapat ditemukan di /usr/share/iconsfolder. Misalnya, dalam indikator saya seperti Indikator Udisks, saya sering mengandalkan apa yang ada di dalamnya /usr/share/icons/gnome, karena ini adalah standar dan dilengkapi dengan instalasi Ubuntu. Jika Anda tidak menemukan ikon dari permintaan dpkg, kemungkinan paket menggunakan ikon standar.

Pergi ke sumbernya

Jika indikator ditulis dalam Python atau Ruby, mencari melalui kode sumber untuk petunjuk bisa relatif mudah, karena ini adalah skrip, dan itu cukup untuk digunakan grepuntuk mencari melalui kode sumber. Bahasa yang dikompilasi seperti C dan Vala tidak datang dengan kode sumber, jadi Anda harus mendapatkannya, baik melalui apt-get source package-nameatau dari mana pun Anda memperoleh paket. (Pengguna petualang bisa menggunakan hexdumpatau mendekompilasi file yang dapat dieksekusi, tapi IMHO itu terlalu banyak bekerja hanya untuk rasa ingin tahu tentang ikon).

CATATAN : jika ikon berada di salah satu direktori standar, seperti /usr/share/icons/atau /usr/share/pixmaps, pembuat perangkat lunak dapat memilih untuk memanggil ikon hanya dengan nama, tanpa ekstensi. Misalnya, di saya, udisks-indicatorsaya menggunakan baris ini untuk memanggil salah satu ikon standar:

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

Perhatikan kekurangan .svgatau .pngekstensi. Jadi, dalam hal ini, kami memiliki nama ikon, dan kami dapat menemukannya menggunakan perintah standar Linux seperti locateatau find.

Cari menggunakan alat Linux standar

Jika Anda benar-benar ingin memiliki perintah untuk mencari ikon, cukup gunakan kombinasi sederhana ini:

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

Ini sebuah contoh. Saya tahu pasti bahwa indikator diskman menggunakan ikon khusus. Jadi apa yang diperintahkan perintah ini kepada kita?

$ 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

Perhatikan /usr/share/pixmaps/indicator-diskman.pnggambar terakhir, yang sebenarnya ditunjukkan oleh indikator di panel.

Dan bagaimana jika indikator menggunakan ikon standar? Yah jelas tidak akan ada output:

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

$

Kesimpulan

Meskipun tidak ada standar yang ditetapkan, ada set tempat khas di mana ikon pergi, dan kita dapat menggunakan dpkguntuk menanyakan informasi tentang file apa yang datang dengan setiap paket tertentu. Akhirnya, mungkin itu bukan saran yang paling teknis, tetapi pertimbangkan untuk mengirim email kepada pengembang atau berhenti dengan IRC atau obrolan mereka, dan hanya bertanya kepada mereka "Hei, ikon apa yang digunakan indikator Anda?". Pengembang biasanya senang mendengar dari orang-orang yang menggunakan perangkat lunak mereka dan tidak keberatan menjawab pertanyaan cepat.

Sergiy Kolodyazhnyy
sumber
Terima kasih, jawaban ini juga sangat membantu tetapi sinkronisasi desktop ownCloud saya melakukan sesuatu yang aneh dengan ikon-ikonnya dan saya berharap untuk mengetahuinya juga.
Tom Brossman
@ TomBrossman dengan melakukan sesuatu yang aneh, apa maksudmu sebenarnya?
Sergiy Kolodyazhnyy
ownCloud's Desktop Sync menginstal sejumlah ikon yang tidak digunakannya. Saya berharap untuk menyesuaikan dan menggantinya, tetapi karena menghasilkan mereka dengan cepat, /tmpitu tidak praktis. Menyesuaikan mereka untuk sebagian besar aplikasi adalah mudah menggunakan jawaban Anda, karena mereka menggunakan set ikon yang terinstal.
Tom Brossman