Моя цель состоит в том, чтобы получить значок, который в настоящее время находится на окне. (Затем использующий некоторые img инструменты я изменю тот значок, затем сохраню его к местоположению, я могу сделать эту часть никакая потребность в справке здесь). Затем я хотел бы установить значок окна на значок, который я сохранил в местоположении на жестком диске.
Я делаю это в js-ctypes, таким образом, мне требуется долгое время поэтому, если я вхожу в неправильное направление, я трачу впустую тонну времени, таким образом, это действительно помогает спросить об этом. Поскольку я не могу сделать быстрого теста. Если бы можно просто указать на меня в правильном направлении, я был бы очень признателен за его.
Здесь был то, как я думал о выполнении его:
XQuerySubtree
)XGetWindowProperty
и атом _NET_WM_ICON
/usr/noida/Desktop/new icon.png
)/usr/noida/Desktop/new icon.png
ко всем окнам в массиве, таким образом, это изменяет значок, отображенный на окне (если существует один в человечности, нет) и изменяет значок в меню Alt + Tab и изменяет значок на прикреплении. XSendEvent
из a XClientMessageEvent
с атомом _NET_WM_ICON
?Я думаю в правильном направлении?
Спасибо
Изображение цели - мы видим здесь, что окну не отобразили значок на нем, но его значок отображен в прикреплении слева. И в меню Alt + Tab. Таким образом, я надеялся путем изменения значка на всех окнах к моему специализированному значку, он изменится на прикреплении и alt+tab меню. И для дистрибутивов Linux, которые действительно показывают значок в окне, я надеюсь что быть измененным также. В изображении здесь Blue Arrow указывает на три связанных области значка.
Представление приложения в Тире и средство запуска Единицы определяется в .desktop файле. Такие .desktop файлы включают строку для установки команды для запуска приложения, строка для установки значка приложения и переменного количества возможных строк для установки дополнительных свойств.
Видеть текущее содержание средства запуска Единицы командой:
gsettings get com.canonical.Unity.Launcher favorites
При выполнении этой команды Вы будете (a.o). получите список ссылок на .desktop файлы, в порядке как они появляются в средстве запуска. Упоминание приложения в списке похоже: application://thunderbird.desktop
. Это относится (в этом примере) в файл, thunderbird.desktop
.
Когда Единица собирает свою информацию о входе в систему, она сначала изучает локальный каталог для .desktop файлов, (~/.local/share/applications
), и во-вторых в /usr/share/applications
. Если .desktop файл существует в обоих каталогах, локальный имеет предпочтение. Обычно, во время Вашей сессии, значок средства запуска остается связанным с .desktop файлом в любом из этих каталогов.
Когда содержание связанного файла на рабочем столе редактируется во время Вашей сессии, результат сразу применяется. Однако значок, как это появляется в средстве запуска Единицы, не изменяется до Вас также:
Так как Вы не можете удалить значок запущенного приложения от средства запуска, изменение значка запущенного приложения не возможно.
Для изменения значка приложения в средстве запуска, которое не работает однако можно использовать эти два сценария ниже.
Первый копирует .desktop файл в локальный каталог и редактирует Icon=
строка в локальной копии. Второй обновляет значок в средстве запуска (и повторно связывает его при необходимости).
как использовать
Скопируйте сценарий ниже в пустой файл, сохраните его как change_icon.py
, выполните его командой:
python3 change_icon.py <applicationnamme.desktop> </path/to/new/icon>
например:
python3 change_icon.py thunderbird.desktop </path/to/new/icon>
для более гладкого использования:
создайте каталог ~/bin
, скопируйте сценарий в каталог, удалите расширение языка из сценария, сделайте это исполняемым файлом и (после того, как выйдите из системы / вход в систему), можно просто использовать сценарий командой:
change_icon <applicationnamme.desktop> </path/to/new/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)
как использовать
Скопируйте сценарий ниже в пустой файл, сохраните его как refresh.py
, выполните его командой:
python3 refresh.py <applicationnamme.desktop>
для более гладкого использования:
Как в сценарии выше, скопируйте сценарий в ~/bin
, удалите расширение языка, сделайте его исполняемым файлом и (после того, как выйдите из системы / вход в систему), можно просто использовать сценарий командой:
refresh <applicationnamme.desktop>
например:
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)