获取窗口图标,然后更改图标

我的目标是获取当前窗口上的图标。 (然后使用一些img工具我将修改该图标,然后将其保存到一个位置,我可以做这部分,请不要在这里需要帮助)。 然后我想将窗口图标设置为我已保存在硬盘驱动器上的位置的图标。

我在js-ctypes中这样做,所以这需要我很长时间,所以如果我走向错误的方向,我会浪费大量的时间,所以它真的有助于询问它。 因为我不能做快速测试。 如果你们都能指出我正确的方向,我会非常感激。

以下是我在考虑这样做的方式:

  1. 我已经有一个windows数组(用XQuerySubtree
  2. 使用XGetWindowPropertyXGetWindowPropertyprimefaces获取当前应用图标的RGBA数据
  3. (使用我的img工具修改图标并保存到硬盘驱动器,例如在桌面上/usr/noida/Desktop/new icon.png
  4. /usr/noida/Desktop/new icon.png中的图标应用到arrays中的所有窗口,因此它会更改窗口上显示的图标(如果有的话,在ubuntu中没有),并在Alt + Tab菜单中更改图标,和更改docker上的图标。
    • 使用带有atom _NET_WM_ICON XSendEventXClientMessageEvent应用图标的路径?

我在想正确的方向吗?

谢谢


目标图像 – 我们在这里看到窗口上没有图标,但它的图标显示在左侧的停靠栏中。 并在Alt + Tab菜单中。 所以我希望通过将所有窗口上的图标更改为我的自定义图标,它将在Dock和alt + tab菜单上更改。 对于在窗口中显示图标的Linux发行版,我希望也可以更改。 在此处的图像中,蓝色箭头指向三个相关的图标区域。

显示我想改变哪些图标

定义图标的位置

Dash中的应用程序表示和Unity启动程序在.desktop文件中定义。 这样的.desktop文件包括用于设置运行应用程序的命令的行,用于设置应用程序图标的行以及用于设置其他属性的不同数量的可能行​​。

要按命令查看当前Unity启动程序的内容:

 gsettings get com.canonical.Unity.Launcher favorites 

如果运行此命令,您将(ao)按照它们在启动器中显示的顺序获取.desktop文件的引用列表。 列表中的application://thunderbird.desktop如下: application://thunderbird.desktop 。 它(在此示例中)指向文件thunderbird.desktop

当Unity收集登录信息时,它首先会查看.desktop文件的本地目录,( ~/.local/share/applications ),其次是/usr/share/applications 。 如果两个目录中都存在.desktop文件,则本地文件具有首选项。 通常,在会话期间,启动器的图标与这些目录中的任何一个目录中的.desktop文件保持链接。

在会话期间编辑链接桌面文件的内容时,将立即应用结果。 但是,Unity启动器中显示的图标在您执行以下操作之前不会更改:

  • 注销/登录
  • 从启动器中删除图标并再次锁定它

由于无法从启动器中删除正在运行的应用程序的图标,因此无法更改 正在运行的应用程序的图标。
但是,要更改未运行的启动器中的应用程序图标,可以使用以下两个脚本。
第一个将.desktop文件复制到本地目录,并编辑本地副本中的Icon=行。 第二个刷新启动器中的图标(并在必要时重新链接)。


脚本1; 改变图标

如何使用

将下面的脚本复制到一个空文件中,将其保存为change_icon.py ,然后通过以下命令运行它:

 python3 change_icon.py   

例如:

 python3 change_icon.py thunderbird.desktop  

使用更顺畅:

创建一个目录~/bin ,将脚本复制到目录中,从脚本中删除语言扩展,使其可执行,并且(在注销/登录后),您可以通过命令模拟使用脚本:

 change_icon   

有关存储位置和如何定义图标的更多信息,请点击此处

剧本

 #!/usr/bin/env python3 import os import shutil import sys file = sys.argv[1] new_icon = sys.argv[2] user_home = os.environ["HOME"] dir_1 = user_home+"/.local/share/applications/" dir_2 = "/usr/share/applications/" dtfile_list1 = os.listdir(dir_1) dtfile_list2 = os.listdir(dir_2) subject = dir_1+file if not os.path.exists(subject): try: shutil.copyfile(dir_2+file, dir_1+file) except FileNotFoundError: print("the file "+file+" does not exist") def read_file(file): with open(file) as edit: return edit.readlines() def write_file(file, linelist): with open(file, "wt") as edit: for line in linelist: edit.write(line) subject_lines = read_file(subject) index = [i for i in range(len(subject_lines)) \ if subject_lines[i].startswith("Icon=")][0] subject_lines[index] = "Icon="+new_icon+"\n" write_file(subject, subject_lines) 

脚本2; 刷新启动器中的图标

如何使用

将下面的脚本复制到一个空文件中,将其保存为refresh.py ,然后通过以下命令运行它:

 python3 refresh.py  

使用更顺畅:

就像在上面的脚本中一样,将脚本复制到~/bin ,删除语言扩展,使其可执行,并且(在注销/登录后),您可以通过命令模拟使用脚本:

 refresh  

例如:

 refresh thunderbird.desktop 

剧本

 #!/usr/bin/env python3 import subprocess import time import sys desktopfile = sys.argv[-1] def read_currentlauncher(): # reads the current launcher contents return subprocess.check_output([ "gsettings", "get", "com.canonical.Unity.Launcher", "favorites" ]).decode("utf-8") def set_launcher(llist): # sets a defined unity launcher list current_launcher = str(llist).replace(", ", ",") subprocess.Popen([ "gsettings", "set", "com.canonical.Unity.Launcher", "favorites", current_launcher, ]) def refresh_icon(desktopfile): current_launcher = read_currentlauncher() current_launcher_temp = eval(current_launcher) item = [item for item in current_launcher_temp if desktopfile in item][0] index = current_launcher_temp.index(item) current_launcher_temp.pop(index) set_launcher(current_launcher_temp) time.sleep(2) set_launcher(current_launcher) refresh_icon(desktopfile)