Comment remplacer l'icône de notification basse résolution de Google Chrome?

15

Google Chrome a récemment été mis à niveau vers la version 35.0.1916.114 sur mon installation Ubuntu 14.04.

Depuis lors, l'icône de notification a commencé à apparaître sur la barre d'état système. Cependant, il semble qu'il utilise une icône de faible résolution - il semble déformé:

entrez la description de l'image ici

Comment puis-je le réparer / le remplacer?

fabiomaia
la source
1
Les icônes sont stockées dans /usr/share/icons, si cela vous aide
MrVaykadji
@MrVaykadji: Merci pour l'aide! J'ai regardé sous ce répertoire, mais je n'ai trouvé aucune icône de notification Google Chrome. Je suppose que ceux-ci sont dans un répertoire différent.
fabiomaia
1
peut /opt- être ? C'est là que les binaires Google sont installés.
MrVaykadji
2
Zut. Et Google-Chrome n'est pas open source, donc si c'est codé en dur (c'est-à-dire à l'intérieur des binaires), vous ne pourrez pas changer cette icône. Vous pouvez peut-être essayer de jeter un œil à tous les fichiers ayant "chrome" dans leur nom, avec catfishpar exemple, ou d'autres méthodes vous permettant de rechercher sur tout le disque.
MrVaykadji
1
Cette icône de notification est erronée sur au moins 3 points: elle ne respecte pas les préférences de l'utilisateur; il ne respecte pas les couleurs Ubuntu; il utilise une résolution très basse.
Rael Gugelmin Cunha

Réponses:

14

Modifier: voir ci-dessous pour une mise à jour sur le remplacement de l'icône de notification

Si vos binaires chrome sont installés à l'emplacement typique, vous les trouverez dans /opt/google/chrome. Dans ce dossier, vous devriez trouver le fichier chrome_100_percent.pakqui contient l'icône de notification. Voici les étapes que j'ai utilisées pour l'extraire, en utilisant les informations de cette question de débordement de pile :

  1. Extraire le code du projet grit-i18n avec

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

  2. Cela vous donnera un dossier dans votre CWD appelé grit-i18n-read-only. CD dans ce dossier

    cd grit-i18n-read-only

  3. Copiez le module python data_pack dans ce dossier

    cp grit/format/data_pack.py .

  4. Modifiez data_pack.pydans votre éditeur préféré. Après les importations initiales, ajoutez la ligne suivante:

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

  5. Vers la fin du fichier dans la mainfonction, supprimez la ligne

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

    (La réponse Stack Overflow indique que cela se produit à la ligne 160, d'après mon expérience, la version actuelle l'a à la ligne 201)

  6. À sa place, insérez les lignes suivantes en retrait de manière appropriée (3 fois):

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

    file.write(text)

  7. Exécutez l' data_pack.pyutilitaire sur le fichier chrome pak (je l'ai d'abord copié dans le grit-i18n-read-onlydossier):

    ./data_pack.py ../chrome_100_percent.pak

Cela se traduira par de nombreux nouveaux fichiers dans le répertoire actuel, tous nommés sous forme de numéros sans extension. Votre navigateur de fichiers (par exemple nautilus) devrait être en mesure de déterminer les types de fichiers et d'afficher les vignettes des images. J'ai trouvé les icônes de notification nommées 6866 et 6867.


Éditer

Bien qu'il existe des réponses plus simples ci-dessous, j'ai réussi à pirater ensemble du code pour reconditionner les ressources que vous pourriez essayer après avoir modifié les icônes. Cela produirait un nouveau .pakfichier, que je n'ai pas essayé d'utiliser moi-même, donc je ne peux pas dire avec certitude que cela entraînerait avec succès de nouvelles icônes de notification.

Dans la fonction principale de data_pack.py, j'ai commenté tout le code du elsebloc et ajouté les lignes suivantes:

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

Ensuite, lancez-vous ./data_pack.py. Cela suppose qu'il se chrome_100_percent.paktrouve dans le répertoire courant et devrait vous donner un nouveau chrome_100_percent_new.pakfichier que vous pourriez essayer de copier /opt/google/chrome/chrome_100_percent.pak.

Je crois que quelques icônes supplémentaires dans le paquet de ressources liées à l'icône de notification ont été identifiées; la modification de ce qui précède pour les inclure devrait être assez simple.


Édition finale

Maintenant que je suis de retour à la maison et que j'ai eu la chance de travailler davantage, j'ai réussi à remplacer l'icône de notification de Chrome. Comme l'a noté @Glutanimate, vous êtes coincé avec une résolution 16x16, donc je ne sais pas quelle amélioration vous pouvez réellement obtenir, mais je suppose que c'est subjectif.

J'ai simplement ouvert les icônes susmentionnées (6864 - 6867) dans GIMP, qui les ont détectées en tant que PNG en niveaux de gris. J'ai collé une nouvelle icône dans le même fichier dans GIMP, essayant ainsi de conserver les mêmes propriétés d'image (par exemple en niveaux de gris). J'ai ensuite exporté ces fichiers au format PNG, décochant TOUTES les options proposées par GIMP mais en conservant un niveau de compression de 9. Les fichiers résultants avaient des extensions .png, j'ai donc supprimé celles-ci et remplacé les originaux. J'ai ensuite relancé data_pack.py, après avoir déjà effectué les modifications détaillées ci-dessus.

J'ai gardé une copie de sauvegarde du mv /opt/google/chrome/chrome_100_percent.pak /opt/google/chrome/chrome_100_percent.bakpaquet d' origine avec et déplacé mon fichier .pak modifié à sa place. Je m'assurerais que Chrome est fermé lors de cette opération, et je vérifie qu'aucun processus Chrome n'est en cours d'exécution, et je crois que Chrome a un nouveau paramètre pour autoriser les processus d'arrière-plan même lorsque le navigateur est fermé par défaut maintenant.

Et voilà, mes icônes de notification dans Unity reflètent mes modifications.

Final-Final Edit: OK, j'ai menti - j'ai essayé un PNG 32x32 et cela semble avoir très bien fonctionné. Alors voilà. Voici quelques captures d'écran des résultats.

  • Icône d'origine: vous reconnaîtrez probablement l'icône par défaut `` Aucune notification non lue '' dans mon panneau ici entre ma boîte de dépôt et les icônes météo:

Icône d'origine

  • Nouvelle icône: Ma version modifiée 32x32px au même emplacement:

Nouvelle icône

(Source: icônes de lot d'Adam Whitcroft)

rocketman10404
la source
Merci pour la mise à jour! Je peux confirmer que les icônes 32px fonctionnent correctement avec data_pack.py. J'ai modifié l'extrait de code que vous avez publié pour tenir compte de toutes les icônes de notification. J'espère que ça ne vous dérange pas.
Glutanimate
1
FWIW, vous pouvez également utiliser cette méthode pour supprimer complètement l'indicateur sans désactiver le système de notifications (cf. askubuntu.com/a/473416/81372 ).
Glutanimate
Mate, je serais heureux si vous nettoyiez un peu le tutoriel ... Toutes les modifications de data.py sont-elles nécessaires? Je suis un peu confus. Aucune infraction signifiait, je veux juste le suivre.
deckoff
1
Joli hack. Juste pour ajouter, vous pouvez trouver plus d'icônes ici thenounproject.com/search/?q=bell
gc5
Avec Chrome 36+, les icônes sont désormais 6894 ... 6897
gc5
8

Éditer:

On dirait que le problème était avec node-chrome-pak. La modification de rocketman10404 data_pack.pyfonctionne très bien, même avec des icônes 32px:

entrez la description de l'image ici

Veuillez utiliser ses instructions à la place.


Réponse originale :

L'excellente réponse de @ rocketman10404 m'a conduit à node-chrome-pak , un script node.js qui peut compresser, décompresser et remplacer des ressources spécifiques dans les .pakfichiers de Chrome / ium .

Bien que j'aie réussi à remplacer les icônes de notification chrome_100_percent.pakavec cet outil, je dois signaler que je n'ai pas pu rendre les modifications visibles. Je pense que cela vaut la peine de décrire les mesures que j'ai prises pour obtenir ce point. J'espère que quelqu'un d'autre s'en occupera et trouvera un moyen de le faire fonctionner.

Installation de node.js

node-chrome-pakaura besoin de node.js pour fonctionner. Vous pouvez installer la dernière version en ajoutant le PPA nodejs de Chris Lea:

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

Télécharger le script et décompresser les ressources de Chrome

Téléchargez le script:

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

Copiez votre local chrome_100_percent.paksur:

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

Décompressez le .pakfichier:

node ./main.js unpack chrome_100_percent.pak

Identification et modification des icônes de notification

La dernière action aura créé un nouveau dossier appelé ./extracted. Vous y trouverez toutes les ressources contenues dans le fichier pak. Ils sont nommés d'après leur ID de ressource. Vous souhaiterez conserver ce nom car il est important pour reconditionner les fichiers.

La partie difficile consiste maintenant à identifier les icônes correctes. Si je ne me trompe pas complètement, les fichiers suivants doivent être ceux utilisés dans le systray:

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

Après avoir identifié les icônes que vous cherchiez, vous pouvez procéder à leur modification et leur remplacement. Si vous le souhaitez, vous pouvez utiliser les icônes que j'ai créées à cet effet:

      

      

Les fichiers source et les .pngs exportés dans différentes résolutions sont hébergés sur GitHub .

Voici la première limitation que j'ai trouvée: Si vous remplacez les icônes par une image dans une résolution supérieure à celle de Google Chrome d'origine, elle sera corrompue et cessera de fonctionner correctement . Pour ce projet particulier, vous devrez rester avec une résolution 16x16. En effet, cela signifie que vous ne pourriez pas améliorer de manière significative les icônes de la barre d'état système actuelle, même si vous deviez faire fonctionner cette méthode.

Bien sûr, il est possible que cette limitation ait été introduite par la façon dont a node-chrome-pakété conçu. Il peut être possible de remplacer les icônes par des icônes plus grandes si vous créez un script python personnalisé basé sur la réponse de @ rocketman10404.

Reconditionnement des ressources et remplacement des ressources existantes

Après avoir modifié / remplacé les icônes existantes, vous devrez créer un pakfichier mis à jour ...

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

... et utilisez-le pour remplacer celui existant:

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

Le cœur de cette méthode

Dans mes tentatives, je n'ai pas réussi à faire afficher à Chrome les icônes mises à jour. Même si je m'assurais que toutes les icônes étaient remplacées correctement et réellement présentes dans le pakfichier modifié (en le déballant à nouveau), je ne pouvais toujours pas remplacer l'icône réelle dans la barre d'état système.

Malheureusement, je n'ai aucune idée pourquoi.

Glutanimate
la source