Comment vider l'icône d'un programme X en cours d'exécution?

9

Existe-t-il un moyen d'obtenir l'icône d'un programme X en cours d'exécution? Lorsque vous basculez entre les fenêtres, vous pouvez voir son icône, par exemple via xfwm4.

Marguerite
la source
Attendez, le voulez-vous via le shell (dans un fichier) ou via C ++?
Bobby
@Bobby ce qui fonctionne ..
daisy

Réponses:

9

Cela fonctionne pour moi. Peut ne pas fonctionner avec toutes les applications et tous les gestionnaires de fenêtres. Le pamformat est au moins pris en charge par ImageMagick, vous pouvez donc le visualiser avec displayet le convertir en d'autres formats si besoin est avec convert:

xprop -notype 32c _NET_WM_ICON |
  perl -0777 -pe '@_=/\d+/g;
    printf "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", splice@_,0,2;
    $_=pack "N*", @_;
    s/(.)(...)/$2$1/gs' > icon.pam

(et cliquez sur la fenêtre dont vous souhaitez obtenir l'icône, voir également l' -idoption de xprop )

L'idée est d'utiliser xprop pour obtenir la propriété sous la forme d'une liste d'entiers décimaux 32 bits et d'utiliser perl pour la convertir en un format graphique (pam choisi ici pour plus de simplicité même si j'ai dû réorganiser les octets car _NET_WM_ICON est ARGB tandis que pam est RGBA.

( Une note sur le format pam . Il est un netpbm format netpbm étant une boîte à outils de manipulation d'images Unix vénérable. Cependant, en raison de divers problèmes, les licences pour la plupart, des versions plus récentes netpbm ne sont pas des paquets par debian et en raison de ses dérivés comme ubuntu comme eh bien, ce qui signifie que la plupart des utilitaires de conversion pam ne sont pas présents là-bas. Sur d'autres systèmes qui ont un netpbm plus récent, vous pouvez diriger la sortie ci-dessus pamrgbatopngpour générer une image png)

Stéphane Chazelas
la source
Cool, j'ai vidé l'icône et l'ai convertie au format PNG.
daisy
0

Je suis tombé sur ce billet de blog. Pour en citer:

Pour démontrer comment cela peut être fait dans la pratique, j'ai écrit un petit programme appelé xgeticon qui permet à l'utilisateur de choisir la fenêtre d'une application X en cours d'exécution et d'enregistrer l'icône extraite dans le fichier fourni en argument.

Ikem Krueger
la source
0

utiliser linux libwnck peut le faire

#define WNCK_I_KNOW_THIS_IS_UNSTABLE = 1

#include <libwnck/libwnck.h>

int main(int argc,
         char **argv) {
    WnckScreen *screen;

    gdk_init(&argc, &argv);

    screen = wnck_screen_get_default();

    wnck_screen_force_update(screen);

    auto win = wnck_window_get(127926341); // 127926341 is window id, it can be get by linux cli xdotool or wmctrl or other many clis
    GdkPixbuf *r = wnck_window_get_icon(win);
    GError *err = NULL;
    gdk_pixbuf_save(r, "/tmp/prpr.png", "png", &err, "quality", "100", NULL);
    return 0;
}

Je l'obtiens de cette page

chikadance
la source