Obtendo o ícone da janela e, em seguida, mudando o ícone

0

Meu objetivo é obter o ícone que está atualmente na janela. (Em seguida, usando algumas ferramentas img vou modificar esse ícone, em seguida, salve-o em um local, eu posso fazer essa parte não precisa de ajuda aqui por favor). Então, gostaria de definir o ícone da janela para o ícone que salvei em um local no disco rígido.

Eu faço isso em js-ctypes, então eu demoro muito, então se eu estou indo na direção errada, eu gasto uma tonelada de tempo, então realmente ajuda perguntar sobre isso. Como eu não posso fazer um teste rápido. Se todos vocês puderem me apontar na direção certa, eu realmente aprecio isso.

Aqui estava como eu estava pensando em fazer isso:

  1. Já tenho uma matriz de janelas (consegui com XQuerySubtree )
  2. Obtenha dados RGBA do ícone aplicado atualmente com XGetWindowProperty e átomo de _NET_WM_ICON
  3. (use minhas ferramentas img para modificar o ícone e salve no disco rígido, por exemplo, na área de trabalho /usr/noida/Desktop/new icon.png )
  4. Aplique o ícone de /usr/noida/Desktop/new icon.png a todas as janelas da matriz, para que ele mude o ícone exibido na janela (se houver um, no ubuntu não existirá) e mude o ícone em Alt + < kbd> Tab , e muda de ícone no dock.
    • aplica o caminho do ícone com XSendEvent de XClientMessageEvent com átomo _NET_WM_ICON ?

Estou pensando na direção certa?

Obrigado

Imagem da meta - vemos aqui que a janela não tem um ícone exibido, mas seu ícone é exibido no encaixe à esquerda. E no menu Alt + Tab . Então, eu estava esperando, mudando o ícone em todas as janelas para o meu ícone personalizado que vai mudar no menu doc e alt + tab. E para as distribuições linux que mostram o ícone na janela, espero que seja alterado também. Na imagem aqui, a seta azul aponta para as três áreas de ícones relacionadas.

    
por Noitidart 09.10.2014 / 15:42

1 resposta

2

Onde o ícone é definido

A representação de uma aplicação no Dash e no iniciador Unity é definida em um arquivo .desktop. Esses arquivos .desktop incluem uma linha para definir o comando para executar o aplicativo, uma linha para definir o ícone do aplicativo e um número variável de linhas possíveis para definir propriedades adicionais.

Para ver o conteúdo atual do iniciador do Unity por comando:

gsettings get com.canonical.Unity.Launcher favorites 

Se você executar este comando, irá (a.o.) obter uma lista de referências aos arquivos .desktop, na ordem em que aparecem no iniciador. A menção de um aplicativo na lista é semelhante a: application://thunderbird.desktop . Refere-se (neste exemplo) ao arquivo thunderbird.desktop .

Quando o Unity reúne suas informações no login, ele primeiro procura no diretório local arquivos .desktop, ( ~/.local/share/applications ) e, em segundo lugar, em /usr/share/applications . Se um arquivo .desktop existir no diretório, o local terá preferência. Normalmente, durante a sua sessão, o ícone do lançador fica vinculado ao arquivo .desktop em qualquer um desses diretórios.

Quando o conteúdo do arquivo da área de trabalho vinculado é editado durante a sessão, o resultado é aplicado imediatamente. No entanto, o ícone como aparece no iniciador do Unity não muda até você:

  • logout / login
  • remova o ícone do iniciador e bloqueie-o novamente

Como você não pode remover o ícone de um aplicativo em execução do ativador, alterando o ícone de um aplicativo em execução não é possível.
Para alterar o ícone de um aplicativo no launcher que não está , você pode usar os dois scripts abaixo.
O primeiro copia o arquivo .desktop para o diretório local e edita a linha Icon= na cópia local. O segundo atualiza o ícone no lançador (e o liga novamente, se necessário).

Script 1; mudar o ícone

como usar

Copie o script abaixo em um arquivo vazio, salve-o como change_icon.py , execute-o pelo comando:

python3 change_icon.py <applicationnamme.desktop> </path/to/new/icon>

por exemplo:

python3 change_icon.py thunderbird.desktop </path/to/new/icon>

para uso mais suave:

crie um diretório ~/bin , copie o script para o diretório, remova a extensão de idioma do script, torne-a executável e (após o logout / login), você pode usar o script usando o comando:

change_icon <applicationnamme.desktop> </path/to/new/icon>

Mais informações sobre onde armazenar e como definir ícones, você pode encontrar aqui

O script

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

Script 2; atualize o ícone no lançador

como usar

Copie o script abaixo em um arquivo vazio, salve-o como refresh.py , execute-o pelo comando:

python3 refresh.py <applicationnamme.desktop>

para uso mais suave:

Como no script acima, copie o script em ~/bin , remova a extensão de idioma, torne-a executável e (após o logout / login), você pode simly usar o script pelo comando:

refresh <applicationnamme.desktop>

por exemplo:

refresh thunderbird.desktop

O script

#!/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)
    
por Jacob Vlijm 20.10.2014 / 10:32