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

15

O Google Chrome foi recentemente atualizado 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:

Como posso consertar / substituir?

    
por faviouz 22.05.2014 / 18:07

2 respostas

14

Editar: veja abaixo para atualização sobre como substituir o ícone de notificação

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

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

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

  2. Isso lhe dará 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.py no seu editor preferido. Após as importações iniciais, adicione a seguinte linha:

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

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

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

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

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

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

    file.write(text)

  7. Execute o utilitário data_pack.py no arquivo pak chrome (copiei para a pasta grit-i18n-read-only primeiro):

    ./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 miniaturas de imagens. Eu encontrei os ícones de notificação nomeados como 6866 & amp; 6867.

Editar

Embora existam algumas respostas mais simples abaixo, eu consegui hackear algum código para re-empacotar os recursos que você poderia tentar depois de editar os ícones. Isso produziria um novo arquivo .pak , que eu não tentei usar, por isso não posso dizer com certeza que isso resultaria em novos ícones de notificação.

Na função principal em data_pack.py , comentei todo o código no bloco else 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)

Em seguida, basta executar ./data_pack.py . Isso pressupõe que chrome_100_percent.pak esteja no diretório atual e forneça um novo arquivo chrome_100_percent_new.pak , que você pode tentar copiar sobre /opt/google/chrome/chrome_100_percent.pak .

Acredito que alguns ícones adicionais na pak de recursos relacionados ao ícone de notificação foram identificados; editar o acima para incluir esses deve ser bastante simples.

Edição final

Agora que estou em casa e tive a chance de trabalhar nisso, consegui substituir o ícone de notificação do chrome. Como observou o @Glutanimate, você está com uma resolução de 16x16, então não tenho certeza de quanta melhoria você pode realmente conseguir, mas suponho que seja subjetivo.

Eu simplesmente abri os ícones acima mencionados (6864 - 6867) no GIMP, que os detectaram como PNGs em escala de cinza. Eu colei um novo ícone no mesmo arquivo no GIMP, tentando manter as mesmas propriedades da imagem (por exemplo, tons de cinza). Em seguida, 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 substituí os originais. Eu então corri novamente o data_pack.py , já tendo feito as modificações detalhadas acima.

Mantive uma cópia de backup do pak original com mv /opt/google/chrome/chrome_100_percent.pak /opt/google/chrome/chrome_100_percent.bak e movi meu arquivo .pak modificado em seu lugar. Eu verificaria se o chrome está fechado ao fazer isso e verifique 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 é fechado por padrão agora.

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

Última edição final: OK, eu menti - tentei um PNG 32x32 e parece que funcionou muito bem. Então você vai. Aqui algumas imagens de resultados.

  • Ícone original: você provavelmente reconhecerá o ícone padrão 'nenhuma notificação não lida' em meu painel aqui entre meus ícones de caixa de depósito e clima:

  • Novo ícone: minha versão modificada de 32 x 32 pixels no mesmo local:

(Fonte: Ícones em lote de Adam Whitcroft)

    
por rocketman10404 28.05.2014 / 14:14
8

Editar:

Parece que o problema foi com node-chrome-pak . modificado data_pack.py do rocketman10404 está funcionando bem, mesmo com ícones 32px:

Por favor, use suas instruções em seu lugar.

Resposta original :

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

Embora eu tenha conseguido substituir os ícones de notificação em chrome_100_percent.pak por essa ferramenta, devo informar que não consegui tornar as alterações visíveis. Ainda assim, acho que vale a pena descrever os passos que dei para chegar a esse ponto. Espero que outra pessoa aceite isso e encontre uma maneira de realmente fazer isso funcionar.

Instalando o node.js

node-chrome-pak precisará do node.js para ser executado. 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

Faz o download do script e descompacta 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 over:

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

Descompacte o arquivo .pak :

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 seu recurso. Você desejará preservar esse nome, pois é importante para reempacotar os arquivos.

A parte difícil agora está em identificar os ícones corretos. Se não estou completamente enganado, os seguintes arquivos devem ser os usados na bandeja do sistema:

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

Tendo identificado os ícones que você procurava, você pode continuar a modificá-los e substituí-los. Se você quiser, pode usar os ícones que criei para essa finalidade:

Os arquivos de origem e .png s exportados em diferentes resoluções são hospedados em GitHub .

Aí vem a primeira limitação que encontrei: Se você substituir os ícones por uma imagem em qualquer resolução superior ao original, o Google Chrome será corrompido e parará 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 systray, mesmo se você conseguisse que este método funcionasse.

É claro que há a possibilidade de que essa limitação tenha sido introduzida pela maneira como o node-chrome-pak foi projetado. Pode ser possível substituir os ícones por outros maiores se você criar um script python personalizado baseado na resposta do @ rocketman10404.

Reempacotando os recursos e substituindo os existentes

Após modificar / substituir os ícones existentes, você terá que criar um arquivo pak 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 ponto crucial deste método

Nas minhas tentativas, não consegui fazer o Chrome mostrar os ícones atualizados. Mesmo se eu tivesse certeza de que todos os ícones foram substituídos corretamente e realmente presentes no arquivo pak modificado (ao desempacotá-lo novamente) ainda não consegui substituir o ícone real na bandeja do sistema.

Infelizmente, não tenho ideia do motivo.

    
por Glutanimate 28.05.2014 / 15:10