Значок Getting окна и затем изменяющийся значок

Моя цель состоит в том, чтобы получить значок, который в настоящее время находится на окне. (Затем использующий некоторые img инструменты я изменю тот значок, затем сохраню его к местоположению, я могу сделать эту часть никакая потребность в справке здесь). Затем я хотел бы установить значок окна на значок, который я сохранил в местоположении на жестком диске.

Я делаю это в js-ctypes, таким образом, мне требуется долгое время поэтому, если я вхожу в неправильное направление, я трачу впустую тонну времени, таким образом, это действительно помогает спросить об этом. Поскольку я не могу сделать быстрого теста. Если бы можно просто указать на меня в правильном направлении, я был бы очень признателен за его.

Здесь был то, как я думал о выполнении его:

  1. У меня уже есть массив окон (получил его с XQuerySubtree)
  2. Получите данные RGBA в настоящее время прикладного значка с XGetWindowProperty и атом _NET_WM_ICON
  3. (используйте мои img инструменты, чтобы изменить значок и сохранить к жесткому диску, позволяет, берут, например, на рабочем столе /usr/noida/Desktop/new icon.png)
  4. Примените значок от /usr/noida/Desktop/new icon.png ко всем окнам в массиве, таким образом, это изменяет значок, отображенный на окне (если существует один в человечности, нет) и изменяет значок в меню Alt + Tab и изменяет значок на прикреплении.
    • примените путь значка с XSendEvent из a XClientMessageEvent с атомом _NET_WM_ICON?

Я думаю в правильном направлении?

Спасибо


Изображение цели - мы видим здесь, что окну не отобразили значок на нем, но его значок отображен в прикреплении слева. И в меню Alt + Tab. Таким образом, я надеялся путем изменения значка на всех окнах к моему специализированному значку, он изменится на прикреплении и alt+tab меню. И для дистрибутивов Linux, которые действительно показывают значок в окне, я надеюсь что быть измененным также. В изображении здесь Blue Arrow указывает на три связанных области значка.

showing i want to change which icons

0
задан 9 October 2014 в 17:42

1 ответ

Где значок определяется

Представление приложения в Тире и средство запуска Единицы определяется в .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= строка в локальной копии. Второй обновляет значок в средстве запуска (и повторно связывает его при необходимости).


Сценарий 1; измените значок

как использовать

Скопируйте сценарий ниже в пустой файл, сохраните его как 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)

Сценарий 2; обновите значок в средстве запуска

как использовать

Скопируйте сценарий ниже в пустой файл, сохраните его как 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)
2
ответ дан 7 October 2019 в 00:00

Другие вопросы по тегам:

Похожие вопросы: