1

Most of my icons in my system tray are white, but one is coloured. I would like to change the coloured one to be just white, like the others.

The icon in question belongs to Flameshot, and they said in their Github issues that they won't provide an option for a monochrome system tray icon, because that should be handled by some other process.

So what is this other process? How do I change the system tray icon? Is it in a theme somehow?

How?

Thanks.

1 Answer 1

3

Not sure what distro, desktop environment, and theme you are using - all of which might matter for specific commands. Most Linux desktops will follow standard locations for icons. While the app probably wouldn't intentionally use different filenames on different distros, if one distro had a different version and the dev changed the filename, then that could matter.

This has a decent general overview of various locations.

In general, if an app is installed under your user context then you will want to start looking under ~/.local/share/icons and if it was installed for all users, you will want to look under /usr/share/icons. Those are just the most common locations there are others that I am not diving into here.

Here is what I found on Fedora 33 (Cinnamon spin) using the default theme set (Mint-Y-Aqua for icons):

$ sudo dnf install -y flameshot
 
$ dnf list --installed --cacheonly --quiet flameshot
Installed Packages
flameshot.x86_64    0.8.5-1.fc33     @updates
 
$ cd /usr/share/icons
$ find . -type f -iname '*flameshot*'
./breeze-dark/status/22/flameshot-tray.svg
./breeze-dark/status/22@3x/flameshot-tray.svg
./breeze-dark/status/22@2x/flameshot-tray.svg
./hicolor/128x128/apps/flameshot.png
./hicolor/128x128/apps/org.flameshot.Flameshot.png
./hicolor/scalable/apps/org.flameshot.Flameshot.svg
./hicolor/scalable/apps/flameshot.svg
./hicolor/48x48/apps/flameshot.png
./hicolor/48x48/apps/org.flameshot.Flameshot.png
./breeze/status/22/flameshot-tray.svg
./breeze/status/22x@3x/flameshot-tray.svg
./breeze/status/22@2x/flameshot-tray.svg

Based on the filenames, I made a guess that one of the flameshot-tray.svg would be the culprit we're looking for. If this were a png or a jpg, we could just overwrite with a new image of the same size.

SVG are text-file based definitions of how to render an image. I am not very well versed with editing this format so if you need help for the actual SVG editing to make it monochrome, you'll have to ask someone else for that one. But possibly Image Magik's convert tool could help, assuming that it supports svg format.

That said, I can replace it with another icon and test if it works bc I was planning to uninstall after this post anyway (I prefer Shutter/maim/scrot myself) so I didn't really care. If you make modifications that you care about, I would recommend making backups first.

hicolor is a sort of default icon location for gnome themes (i wasn't using the breeze theme at all and could have ignored those if i wanted to). When an application has a icon name such as "firefox" it will generally check under your specific theme in all of the present folders (e.g. ~/.local/share/icons, /usr/share/icons, and a few others) then fallback to checking under hicolor. You can read about that in more detail in the link I provided above or alternately you can use a script that calls GTK's icon resolver api and spits out the results (such as the one here - or see the bottom of this post for a modified version of the linked python script).

Anyway, I ran the following to replace the flameshot-tray.svg files with firefox.svg and rebuild the icon cache:

# replace flameshot icon with firefox icon
sudo find -H /usr/share/icons -type f -iname 'flameshot-tray.svg' -exec cp -a '/usr/share/icons/hicolor/symbolic/apps/firefox-symbolic.svg' "{}" \;
 
# rebuild the icon cache so you can see it right away
# note: this works on cinnamon and presumably all gtk-based
# based DEs (gnome, mate, xfce, etc). I have no clue if it
# would work on KDE but I assume it would not
sudo gtk-update-icon-cache -f /usr/share/icons/*

after relaunching the app, its systray icon appeared as a monochrome firefox icon. Filenames and commands may vary depending on your distro but that should give you a pretty good idea of the steps needed and where to look.


Bonus: here is there modified python script I mentioned which works better for me. I use it to look up icon paths. Short version is that it uses the GTK api to do the look-up.

#!/usr/bin/env python3
 
# ==========================================================================================
# This script is for looking up an icon file path based on the icon name from a *.desktop file.
# Parts of it are based on snippets provided by Stefano Palazzo and kiri on askubuntu.com
#   https://askubuntu.com/questions/52430/how-can-i-find-the-location-of-an-icon-of-a-launcher-in-use
# ==========================================================================================
# The original version(s) simply prompted the user for the icon name.
# However, I have modified this version in the following ways:
#   1. Added ability to pass specific size as arg (e.g. --size=22 or --size=48, etc)
#   2. Added ability to pass icon names as arg (any other arg besides --size)
#       Note: if --size is used with multiple icon names, then it is assummed
#             that all of the icons in the search will be for the same size
#   3. Like kiri's version, I removed the hard-coded size of 48x48 and default to all sizes
#   4. Unlike kiri's version, you can optionally still search for a specific size (using #1)
#   5. Performance improvements from kiri's version (he was checking every even number from
#       0 to 500 -- so 250 iterations. I base mine off the values that actually existing under
#       /etc/share/icons/hicolor - of which there were 17. So his is more flexible but
#       mine should be quicker and more forgiving in terms of HDD wear and tear)
# ==========================================================================================
 
import gi
import sys
import array as arr 
 
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
 
def resolveIconPath( iconName, iconSize = -1 ):
    "This takes a freedesktop.org icon name and prints the GTK 3.0 resolved file location."
 
    iconTheme = Gtk.IconTheme.get_default()
    
    # if looking up a specific size
    if iconSize >= 16:
        msgTemplate = "iconname: \"" + iconName + "\" (size: " + str(iconSize) + "): "
        
        iconFile = iconTheme.lookup_icon(iconName, iconSize, 0)
        if iconFile:
            print(msgTemplate + iconFile.get_filename() + "\n")
        else:
            print("W:" + msgTemplate + " No matching path(s) found.\n")
    else:
        # otherwise, look up *all* sizes that can be found
        sep="===================================================================="
        msgTemplate = sep + "\niconname: \"" + iconName + "\":\n" + sep
        
        foundIconsList = list()
        for resolution in [16, 20, 22, 24, 28, 32, 36, 48, 64, 72, 96, 128, 192, 256, 480, 512, 1024]:
            iconFile = iconTheme.lookup_icon(iconName, resolution, 0)
            if iconFile:
                filePath=str(iconFile.get_filename())
                if not (filePath in foundIconsList):
                    foundIconsList.append(iconFile.get_filename())
 
        if foundIconsList:
            print(msgTemplate + "\n"+ "\n".join(foundIconsList)+ "\n")
        else:
            print("W: iconname: \"" + iconName + "\":  No matching path(s) found.\n")
        return
 
 
# get the total number of args passed (excluding first arg which is the script name)
argumentsLen = len(sys.argv) - 1
 
# define a list for storing all passed icon names
iconNamesList = []
 
# loop through passed args, if we have any and handle appropriately
showHelp=False
size=-1
if argumentsLen > 0:
    for i in range(1, len(sys.argv)):
        arg=str(sys.argv[i])
        #print(i, "arg: " + arg)
        if arg.startswith('--size=') or arg.startswith('-s=') or arg.startswith('-S='):
            tmpSize=(arg.split("=",2))[1]
            if len(tmpSize) > 0 and tmpSize.isnumeric():
                size=int(tmpSize)
            else:
                print("Invalid size '" + tmpSize + "'; Expected --size=xx where xx is a positive integer.")
        elif arg == '--help' or arg == '-h':
            print(str(sys.argv[0]) + " [OPTIONS] [ICON_NAME]\n")
            print("Takes a freedesktop.org/GNOME icon name, as commonly appears in a *.desktop file,")
            print("and performs a lookup to determine matching filesystem path(s). By default, this")
            print("path resolution is determined for all available icon sizes. However, a specific")
            print("size can be used by providing one of the options below.\n")
            print("OPTIONS:")
            print("  -s=n, --size=n   Restricts path resolution to icons matching a specific size.")
            print("                   The value n must be a positive integer correspending to icon size.")
            print("                   When using this option with multiple passed icon names, the size")
            print("                   restrictions are applied to *all* of the resolved icons. Querying")
            print("                   different sizes for different icons is only possible via the use of")
            print("                   multiple calls or by parsing the default output.\n")
            print("  -h, --help       Display this help page and exit.\n")
            exit()
        else:
            iconNamesList.append(arg)
 
# if no icon names were passed on command line, then prompt user
if len(iconNamesList) == 0:
    iconNamesList.append(input("Icon name (case sensitive): "))
 
#print("size: " + str(size))
#print("iconNamesList: ")
if len(iconNamesList) > 0:
    for iconName in iconNamesList:
        if size < 16:
            # find all sizes (on my system, 16x16 was the smallest size icons under hicolor)
            resolveIconPath(iconName)
        else:
            # use custom size
            resolveIconPath(iconName, size)

Usage:

# view help
get-icon-path.py --help
 
# lookup all matching icons
get-icon-path.py firefox
 
# lookup all matching icons for a specific size (16x16)
get-icon-path.py --size=16 firefox
 
# lookup specific size for multiple icons in one command
get-icon-path.py --size=16 firefox gimp

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .