시스템 트레이의 아이콘을 변경하는 방법은 무엇입니까?

시스템 트레이의 아이콘을 변경하는 방법은 무엇입니까?

시스템 트레이에 있는 대부분의 아이콘은 흰색이지만 그 중 하나는 컬러입니다. 다른 색상과 마찬가지로 색상을 흰색으로 변경하고 싶습니다.

문제의 아이콘은 Flameshot에 속하며 Github 문제에서 단색 시스템 트레이 아이콘에 대한 옵션을 제공하지 않을 것이라고 밝혔습니다. 이는 다른 프로세스에서 처리해야 하기 때문입니다.

그렇다면 이 다른 프로세스는 무엇입니까? 시스템 트레이 아이콘을 변경하는 방법은 무엇입니까? 어떤 방식으로든 테마에 존재하나요?

어떻게?

감사해요.

답변1

어떤 배포판, 데스크탑 환경, 테마를 사용하고 있는지 잘 모르겠습니다. 이 모든 것이 특정 명령에 중요할 수 있습니다. 대부분의 Linux 데스크탑은 표준 아이콘 배치를 따릅니다. 애플리케이션이 의도적으로 여러 배포판에서 서로 다른 파일 이름을 사용하지 않을 수도 있지만, 한 배포판의 버전이 다르고 개발자가 파일 이름을 변경하는 경우 이는 중요할 수 있습니다.

이것다양한 위치에 대한 일반적인 개요가 있습니다.

일반적으로 애플리케이션이 사용자 컨텍스트에 설치되어 있는 경우 아래를 살펴봐야 하며 ~/.local/share/icons, 모든 사용자용으로 설치된 경우 아래를 살펴봐야 합니다 /usr/share/icons. 이는 가장 일반적인 위치일 뿐이며 여기서는 깊이 다루지 않을 다른 위치도 있습니다.

기본 테마 세트(아이콘은 Mint-Y-Aqua)를 사용하여 Fedora 33(Cinnamon 스핀)에서 찾은 내용은 다음과 같습니다.

$ 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

파일 이름으로 볼 때 그 중 하나가 flameshot-tray.svg우리가 찾고 있는 범인인 것으로 추측됩니다. png 또는 jpg인 경우 동일한 크기의 새 이미지로 덮어쓸 수 있습니다.

SVG는 텍스트 파일을 기반으로 한 이미지 렌더링의 정의입니다. 저는 이 형식을 편집하는 데 익숙하지 않기 때문에 실제 SVG 편집을 통해 흑백으로 만드는 데 도움이 필요하면 다른 사람에게 문의해야 합니다. 그러나 Image Magik의 변환 도구는 svg 형식을 지원한다고 가정하면 도움이 될 수 있습니다.

즉, 다른 아이콘으로 교체하고 작동하는지 테스트할 수 있으며, 이 게시물 후에 제거할 계획이므로(저는 Shutter/maim/scrot를 선호합니다) 별로 상관하지 않습니다. 관심 있는 사항을 변경하는 경우 먼저 백업을 만드는 것이 좋습니다.

hicolor는 gnome 테마에 대한 일종의 기본 아이콘 위치입니다(나는 브리즈 테마를 전혀 사용하지 않으며 원할 경우 무시할 수 있습니다). 응용 프로그램에 "firefox"와 같은 아이콘 이름이 있는 경우 일반적으로 ~/.local/share/icons, /usr/share/icons 및 기타 특정 테마와 같은 모든 현재 폴더에서 아이콘을 확인한 다음 확인하기 위해 hicolor. 위에 제공한 링크에서 이에 대해 더 자세히 읽을 수 있거나 GTK의 아이콘 파서 API를 호출하고 결과를 출력하는 스크립트를 사용할 수 있습니다(여기 있는 것 처럼- 또는 링크된 Python 스크립트의 수정된 버전을 보려면 이 문서의 하단을 참조하세요.

어쨌든 다음 명령을 실행하여 Flameshot-tray.svg 파일을 firefox.svg로 바꾸고 아이콘 캐시를 다시 작성했습니다.

# 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/*

응용 프로그램이 다시 시작되면 해당 시스템 트레이 아이콘이 단색 Firefox 아이콘으로 나타납니다. 파일 이름과 명령은 배포판에 따라 다를 수 있지만 이를 통해 필요한 단계와 살펴볼 위치에 대한 좋은 아이디어를 얻을 수 있습니다.


보너스: 제가 언급한 수정된 Python 스크립트는 저에게 더 잘 맞습니다. 나는 이것을 아이콘 경로를 찾는 데 사용합니다. 짧은 버전은 GTK API를 사용하여 조회를 수행한다는 것입니다.

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

용법:

# 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

관련 정보