Como substituir o ícone de notificação de baixa resolução do Google Chrome?

15

O Google Chrome foi atualizado recentemente para a versão 35.0.1916.114 na minha instalação do Ubuntu 14.04.

Desde então, o ícone de notificação começou a aparecer na bandeja do sistema. No entanto, parece que está usando um ícone de baixa resolução - parece distorcido:

insira a descrição da imagem aqui

Como posso corrigir / substituir?

fabiomaia
fonte
11
Os ícones são armazenados em /usr/share/icons, se isso ajuda
MrVaykadji
@MrVaykadji: Obrigado pela ajuda! Procurei nesse diretório, mas não encontrei nenhum ícone de notificação do Google Chrome. Eu estou supondo que aqueles estão em um diretório diferente.
Fabiomaia
11
talvez /opt? É aí que os binários do Google estão instalados.
MrVaykadji
2
Droga. E o Google-Chrome não é de código aberto; portanto, se esse código é codificado (ou seja, dentro dos binários), você não poderá alterar esse ícone. Talvez você possa tentar dar uma olhada em todos os arquivos com "chrome" no nome, catfishpor exemplo, ou outros métodos que permitem pesquisar em todo o disco.
MrVaykadji
11
Este ícone de notificação está errado em pelo menos 3 pontos: não respeita as preferências do usuário; não respeita as cores do Ubuntu; está usando uma resolução muito baixa.
Rael Gugelmin Cunha

Respostas:

14

Editar: veja abaixo a atualização sobre a substituição do ícone de notificação

Se os binários cromados estiverem instalados no local típico, você os encontrará em /opt/google/chrome. Nessa pasta, você deve encontrar o arquivo chrome_100_percent.pakque contém o ícone de notificação. Aqui estão as etapas que eu usei para extraí-lo, usando as informações desta pergunta de estouro de pilha :

  1. Faça o checkout do código para o projeto grit-i18n com

    svn checkout http://grit-i18n.googlecode.com/svn/trunk/ grit-i18n-read-only

  2. Isso fornecerá uma pasta no seu CWD chamada grit-i18n-read-only. CD nesta pasta

    cd grit-i18n-read-only

  3. Copie o módulo python data_pack para esta pasta

    cp grit/format/data_pack.py .

  4. Edite data_pack.pyno seu editor preferido. Após as importações iniciais, adicione a seguinte linha:

    sys.path.append(os.getcwd())

  5. No final do arquivo na mainfunção, remova a linha

    print '%s: %s' % (resource_id, text)

    (a resposta Stack Overflow afirma que isso ocorre na linha 160, na minha experiência, a versão atual está na linha 201)

  6. Em seu lugar, insira as seguintes linhas recuadas adequadamente (3 vezes):

    file = open(str(resource_id), "wb")

    file.write(text)

  7. Execute o data_pack.pyutilitário no arquivo chrome pak (copiei-o grit-i18n-read-onlyprimeiro na pasta):

    ./data_pack.py ../chrome_100_percent.pak

Isso resultará em muitos arquivos novos no diretório atual, todos nomeados como números sem extensão. Seu navegador de arquivos (por exemplo, nautilus) deve ser capaz de determinar os tipos de arquivo e mostrar as miniaturas das imagens. Encontrei os ícones de notificação denominados 6866 e 6867.


Editar

Embora haja algumas respostas mais simples abaixo, eu consegui hackear algum código para reorganizar os recursos que você poderia tentar após editar os ícones. Isso produziria um novo .pakarquivo, que eu ainda não tentei usar, então não posso afirmar com certeza que isso resultaria em novos ícones de notificação.

Na função principal in data_pack.py, comentei todo o código do elsebloco e adicionei as seguintes linhas:

# Read in the modified icon resource files
file = open('6864', 'r')
icon1 = file.read()
file.close()
file = open('6865', 'r')
icon2 = file.read()
file.close()
file = open('6866', 'r')
icon3 = file.read()
file.close()
file = open('6867', 'r')
icon4 = file.read()
file.close()

# Write resource pak of only notification icons
iconData = {6864: icon1, 6865: icon2, 6866: icon3, 6867: icon4}
WriteDataPack(iconData, 'tmp.pak', BINARY)

# Create copy of original pak without notification icons
dataPack = ReadDataPack('chrome_100_percent.pak')
# List of icon resources to remove
toRemove = set([6864,6865,6866,6867])
whiteList = set(dataPack.resources.keys()).difference(toRemove)
whiteListFile = open('whitelist.txt', 'w')
for i in whiteList:
  whiteListFile.write(str(i)+'\n')
whiteListFile.close()
newDataPack = RePack('tmp2.pak', ['chrome_100_percent.pak'], 'whitelist.txt')

# Merge the two paks together
combinedPack = RePack('chrome_100_percent_new.pak', ['tmp2.pak', 'tmp.pak'], None)

Então, apenas corra ./data_pack.py. Isso pressupõe que chrome_100_percent.pakestá no diretório atual e deve fornecer um novo chrome_100_percent_new.pakarquivo para o qual você pode tentar copiar /opt/google/chrome/chrome_100_percent.pak.

Acredito que alguns ícones adicionais no pacote de recursos relacionados ao ícone de notificação foram identificados; editar o acima para incluir esses itens deve ser bem direto.


Edição final

Agora que voltei para casa e tive a chance de trabalhar um pouco mais nisso, consegui substituir com sucesso o ícone de notificação do chrome. Como o @Glutanimate observou, você está preso com uma resolução de 16x16, então não tenho certeza de quantas melhorias você pode realmente alcançar, mas suponho que seja subjetivo.

Eu simplesmente abri os ícones mencionados acima (6864 - 6867) no GIMP, que os detectaram como PNGs em escala de cinza. Colei um novo ícone no mesmo arquivo no GIMP, tentando manter as mesmas propriedades de imagem (por exemplo, escala de cinza). Eu os exportei como PNGs, desmarcando TODAS as opções que o GIMP oferece, mas mantendo um nível de compactação de 9. Os arquivos resultantes tinham extensões .png, então os removi e substitui os originais. Voltei a executar data_pack.py, já tendo feito as modificações detalhadas acima.

Eu mantive uma cópia de backup do pak original mv /opt/google/chrome/chrome_100_percent.pak /opt/google/chrome/chrome_100_percent.bake movi meu arquivo .pak modificado em seu lugar. Eu garantiria que o chrome estivesse fechado ao fazer isso e verifique novamente se não há processos do chrome em execução, e acredito que o chrome tenha uma nova configuração para permitir processos em segundo plano, mesmo quando o navegador estiver fechado por padrão agora.

Eis que meus ícones de notificação no Unity refletem minhas alterações.

Edição finalmente final: OK, eu menti - tentei um PNG 32x32 e parece ter funcionado muito bem. Então, lá vai você. Aqui estão algumas capturas de tela de resultados.

  • Ícone original: você provavelmente reconhecerá o ícone padrão 'sem notificações não lidas' no meu painel aqui entre meus ícones da caixa de depósito e do clima:

Ícone original

  • Novo ícone: Minha versão modificada de 32x32px no mesmo local:

Novo ícone

(Fonte: Ícones de lote de Adam Whitcroft)

rocketman10404
fonte
Obrigado pela atualização! Posso confirmar que os ícones de 32px estão funcionando bem com o data_pack.py. Modifiquei o snippet que você postou para incluir todos os ícones de notificação. Espero que você não se importe.
Glutanimado
11
FWIW, você também pode usar esse método para remover completamente o indicador sem desativar o sistema de notificações ( consulte askubuntu.com/a/473416/81372 ).
Glutanimado
Companheiro, eu ficaria feliz se você limpar um pouco o tutorial ... Todas as modificações no data.py são necessárias? Eu estou um pouco confuso. Sem querer ofender, eu só quero segui-lo.
deckoff
11
Bom corte. Só para acrescentar, você pode encontrar mais ícones aqui thenounproject.com/search/?q=bell
GC5
Agora, com o Chrome 36+, os ícones são 6894 ... 6897
gc5 21/07
8

Editar:

Parece que o problema estava com node-chrome-pak. O rocketman10404 modificado data_pack.pyestá funcionando bem, mesmo com ícones de 32px:

insira a descrição da imagem aqui

Por favor, use as instruções dele .


Resposta original :

A excelente resposta de @ rocketman10404 me levou ao node-chrome-pak , um script node.js que pode compactar, descompactar e substituir recursos específicos nos .pakarquivos do Chrome / ium .

Embora eu tenha conseguido substituir os ícones de notificação chrome_100_percent.pakpor essa ferramenta, tenho que informar que não foi possível tornar as alterações visíveis. Ainda acho que vale a pena se esforçar para descrever os passos que tomei para chegar a esse ponto. Espero que alguém aceite isso e encontre uma maneira de fazê-lo funcionar.

Instalando o node.js

node-chrome-pakprecisará do node.js para executar. Você pode instalar a versão mais recente adicionando o PPA nodejs de Chris Lea:

sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

Fazendo o download do script e descompactando os recursos do Chrome

Faça o download do script:

git clone https://bitbucket.org/hikipro/node-chrome-pak.git
cd node-chrome-pak

Copie seu local chrome_100_percent.pak:

cp /opt/google/chrome/chrome_100_percent.pak ./chrome_100_percent.pak

Descompacte o .pakarquivo:

node ./main.js unpack chrome_100_percent.pak

Identificando e Modificando os Ícones de Notificação

A última ação terá criado uma nova pasta chamada ./extracted. Nele, você encontrará todos os recursos contidos no arquivo pak. Eles são nomeados após o ID do recurso. Você deseja preservar esse nome, pois é importante reembalar os arquivos.

A parte difícil agora está na identificação dos ícones corretos. Se não me engano completamente, os seguintes arquivos devem ser os usados ​​na bandeja do sistema:

6864.png
6865.png
6866.png
6867.png

Depois de identificar os ícones que você estava procurando, você pode modificá-los e substituí-los. Se você quiser, pode usar os ícones que eu criei para esse fim:

      

      

Os arquivos de origem e os exportados .pngem diferentes resoluções estão hospedados no GitHub .

Aí vem a primeira limitação que encontrei: Se você substituir os ícones por uma imagem em qualquer resolução superior ao Google Chrome original, ela será corrompida e deixará de funcionar corretamente . Para este projeto em particular, você terá que ficar com uma resolução de 16x16. Com efeito, isso significa que você não seria capaz de melhorar significativamente os ícones atuais da bandeja, mesmo que esse método funcionasse.

Claro que há a possibilidade de que essa limitação tenha sido introduzida pela maneira como node-chrome-pakfoi projetada. Talvez seja possível substituir os ícones por outros maiores, se você criar um script python personalizado com base na resposta de @ rocketman10404.

Reempacotando os recursos e substituindo os existentes

Após modificar / substituir os ícones existentes, você precisará criar um pakarquivo atualizado ...

node ./main.js pack ./extracted ./chrome_100_percent_modified.pak

... e use-o para substituir o existente:

sudo cp ./chrome_100_percent_modified.pak /opt/google/chrome/chrome_100_percent.pak

O cerne deste método

Nas minhas tentativas, não consegui fazer o Chrome mostrar os ícones atualizados. Mesmo se eu certificasse que todos os ícones fossem substituídos corretamente e realmente estivessem presentes no pakarquivo modificado (descompactando-o novamente), ainda não consegui substituir o ícone real na bandeja do sistema.

Infelizmente não tenho ideia do porquê disso.

Glutanimado
fonte