Como encontro os arquivos de ícones usados ​​por menus de status não padrão (também conhecidos como indicadores)?

9

Eu gostaria de encontrar a localização dos ícones usados ​​por alguns menus de status não padrão (também chamados de indicadores de aplicativos ou applets de indicadores).

insira a descrição da imagem aqui

Onde estão localizados esses arquivos de imagem de ícones?

Na minha captura de tela, tenho ownCloud e Radiotray, mas gostaria de uma resposta geral não específica para esses ícones em particular. Como não sei os nomes ou os tipos de arquivos, é difícil pesquisar.

Tom Brossman
fonte

Respostas:

9

Local padrão para ícones indicadores não padrão?

Não há local padrão onde esses ícones são armazenados. Qualquer aplicativo (desenvolvedor) pode armazená-los onde for considerado apropriado.

No entanto , a boa notícia é que os indicadores geralmente não instalam listas intermináveis ​​de arquivos e imagens. Podemos limitar nossa pesquisa (além de procurar no código) procurando na saída do comando:

dpkg-query -L <packagename>

No meu exemplo de

dpkg-query -L placesfiles

insira a descrição da imagem aqui

isso produziria, entre outras, as seguintes imagens:

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

... O que tornaria a pesquisa bastante limitada.

Do homem 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”:

No caso do Radiotray , encontrei os seguintes .pngarquivos (em execução 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

Se realmente precisamos descobrir, pesquisando o código

... podemos procurar nos arquivos instalados (dentro) por correspondências da string "icon". Muitos dos indicadores são escritos em uma das linguagens de script (como python), o que significa que são muito bem pesquisáveis.

Um exemplo

Novamente usando o radiotrayexemplo

dpkg-query -L radiotray | xargs grep icon

na saída encontramos ao:

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

Examinando o arquivo SysTrayGui.py, podemos ver:

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

A partir disso, podemos concluir que os ícones mencionados são definidos no módulo commondentro do diretório (sub) lib. (Veja aqui como o python encontra os módulos, seção Subdiretórios )

Neste módulo, podemos ler a seção:

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

...E aqui estamos...

Situações excepcionais

Com a prática de todos os meus indicadores, consegui encontrar os ícones correspondentes usando o (s) método (s) acima.

No entanto, é possível compilar imagens juntamente com o código em um único executável. Não é necessário explicar que, nesses casos, você não encontrará uma imagem separada, nem poderá substituí-la sem editar o código e recompilar.

O caso da owncloud parece ser esse o caso. O uso dos métodos acima mostrou que um conjunto de ícones foi instalado no interior /usr/share/icons/hicolor/<size>/apps. Nenhum desses ícones acaba sendo usado no indicador no ubuntu .

O OP trabalhou bastante antes (e depois) ele fez essa pergunta. Um deles era correr:

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

... o que nos fornece algumas informações úteis. A saída incluiu uma seção:

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

Olhando para o diretório /tmp/iconcache-50ePXx, encontrei os ícones exatos que foram usados ​​pelo indicador:

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

... o que parece provar que esses ícones são gerados em tempo real; fechar owncloud faz com que o diretório e seus ícones desapareçam.

Acabou sendo possível alterar o ícone do indicador substituindo estes ícones:

insira a descrição da imagem aqui

o que prova que esses são realmente os ícones que estávamos procurando.

Entretanto, para automatizar o que eu fiz manualmente, seria necessário um script / wrapper, pois o nome do diretório criado é alterado toda vez que o owncloud é iniciado. A opção mais conveniente seria, obviamente, que o código do owncloud-client fosse alterado.

Veja também nossa discussão aqui .

Continua...

Jacob Vlijm
fonte
Não dpkg -Lfaz a mesma coisa?
Kaz Wolfe
@KazWolfe aparentemente, aqui não é mencionado, porém: manpages.ubuntu.com/manpages/precise/man1/dpkg.1.html
Jacob Vlijm
Obrigado, isso é útil para encontrar os ícones do Radiotray. Estou atrás do ícone monocromático ownCloud da minha captura de tela ( exemplo do código-fonte ownCloud no GitHub aqui ) - e não está entre os resultados retornados com dpkg-query -L. Procurando com a find / -name state-ok -type faparência de ter parado, mas vou deixá-lo funcionando durante a noite.
Tom Brossman
@ TomBrossman Tenho certeza de que podemos descobrir. Vou instalar o ownCloud para ver.
Jacob Vlijm
11
@ TomBrossman O servidor pode estar temporariamente inoperante, recebo o erro 404 - não encontrado em algumas partes. Olhando para o arquivo .deb baixado, o owncloud instala alguns ícones /usr/share/icons/hicolor/<size>/apps . Infelizmente, o arquivo .deb não é instalado: Errors were encountered while processing:
tentarei
4

Ícones e suas possíveis localizações

Existem duas maneiras pelas quais o indicador pode empregar ícones:

  • Ícone personalizado. Isso geralmente ocorre /usr/share/pixmaps/, embora seja possível que alguns dos autores enviem ícones indicadores para outros diretórios. Jacob Vlijm, cuja resposta está nesta página e também é autor do indicador SpaceView, por exemplo, escolheu colocar ícones para esse indicador /opt/spaceview/icon. Com esse tipo de ícone, é um pouco complicado, mas não complexo - use dpkg -L <package name>ou cat /var/lib/dpkg/info/PACKAGE.listprocure um arquivo de ícone, com .pngou .svgextensão. Estes são os mais típicos
  • Ícone padrão, específico ao tema. Estes normalmente podem ser encontrados na /usr/share/iconspasta Por exemplo, em meus indicadores, como o Udisks Indicator, frequentemente confio no que está dentro /usr/share/icons/gnome, pois eles são padrão e vêm com qualquer instalação do Ubuntu. Se você não encontrar um ícone na consulta dpkg, é provável que o pacote use um ícone padrão.

Indo para a fonte

Se um indicador for escrito em Python ou Ruby, procurar pistas no código fonte pode ser relativamente fácil, pois esses são scripts, e é suficiente usá-lo greppara pesquisar no código fonte. Linguagens compiladas, como C e Vala, não vêm com código-fonte; portanto, você precisa obtê-lo, via apt-get source package-nameou de onde quer que tenha obtido o pacote. (Usuários aventureiros podem usar hexdumpou descompilar o arquivo executável, mas IMHO é muito trabalho apenas por curiosidade sobre um ícone).

NOTA : se um ícone residir em um dos diretórios padrão, como /usr/share/icons/ou /usr/share/pixmaps, o autor do software pode optar por chamá-lo simplesmente pelo nome, sem extensões. Por exemplo, no meu udisks-indicatoreu uso esta linha para chamar um dos ícones padrão:

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

Observe a falta .svgou .pngextensão. Portanto, nesse caso, temos um nome do ícone e podemos localizá-lo usando comandos padrão do Linux, como locateou find.

Pesquise usando ferramentas padrão do Linux

Se você realmente deseja ter um comando para pesquisar ícones, use esta combinação simples:

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

Aqui está um exemplo. Sei que o indicador diskman usa um ícone personalizado. Então, o que esse comando nos diz?

$ 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

Observe a /usr/share/pixmaps/indicator-diskman.pngúltima imagem, que é o que o indicador realmente mostra no painel.

E se o indicador usar um ícone padrão? Bem, obviamente, não haverá saída:

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

$

Conclusão

Embora não haja um padrão definido, há um conjunto de locais típicos para onde os ícones vão, e podemos usar dpkgpara consultar informações sobre quais arquivos vêm com cada pacote específico. Finalmente, talvez não seja a sugestão mais técnica, mas considere enviar um email aos desenvolvedores ou passar pelo IRC ou pelo bate-papo e simplesmente perguntar-lhes "Ei, que ícone seu indicador usa?". Os desenvolvedores geralmente ficam felizes em ouvir as pessoas que usam seu software e não se importam em responder a uma pergunta rápida.

Sergiy Kolodyazhnyy
fonte
Obrigado, esta resposta também foi muito útil, mas minha sincronização da área de trabalho do ownCloud está fazendo algo estranho com os ícones e espero descobrir isso também.
Tom Brossman
@ TomBrossman fazendo algo estranho, o que exatamente você quer dizer?
Sergiy Kolodyazhnyy
O aplicativo Desktop Sync do ownCloud instala uma série de ícones que ele não usa. Eu esperava personalizá-los e substituí-los, mas como os gera instantaneamente /tmp, não é prático. Porém, é fácil personalizá-los para a maioria dos aplicativos, usando sua resposta, pois eles usam o (s) conjunto (s) de ícones instalados.
Tom Brossman