C'è un modo per ottenere l'icona di un programma X in esecuzione? Quando si passa da una finestra all'altra, è possibile visualizzarne l'icona, ad esempio tramite xfwm4.
C'è un modo per ottenere l'icona di un programma X in esecuzione? Quando si passa da una finestra all'altra, è possibile visualizzarne l'icona, ad esempio tramite xfwm4.
Risposte:
Questo funziona per me. Potrebbe non funzionare con tutte le applicazioni e tutti i gestori di finestre. Il pam
formato è almeno supportato da ImageMagick, quindi puoi visualizzarlo display
e convertirlo in altri formati se necessario con 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
(e fai clic sulla finestra da cui vuoi ottenere l'icona, vedi anche l' -id
opzione di xprop )
L'idea è di usare xprop per ottenere la proprietà come un elenco di numeri decimali a 32 bit e usare perl per convertirlo in un formato grafico (pam scelto qui per semplicità anche se ho dovuto riordinare i byte poiché _NET_WM_ICON è ARGB mentre pam è RGBA.
( una nota sul formato pam . È un formato netpbm , netpbm è un venerabile toolbox di manipolazione delle immagini Unix. Tuttavia, a causa di vari problemi, principalmente quelli di licenza, le versioni più recenti di netpbm non sono pacchetti di debian e di conseguenza i suoi derivati come ubuntu as bene, il che significa che la maggior parte delle utility di conversione pam non sono presenti lì. Su altri sistemi che hanno netpbm più recente, è possibile reindirizzare l'output sopra pamrgbatopng
per generare un'immagine png)
Mi sono imbattuto in questo post del blog. Per citare da esso:
Per dimostrare come ciò può essere fatto in pratica, ho scritto un piccolo programma chiamato xgeticon che consente all'utente di scegliere la finestra di un'applicazione X in esecuzione e salvare l'icona estratta nel file fornito come argomento.
usare linux libwnck può farlo
#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;
}
Ho capito da questa pagina