Jak zrzucić ikonę działającego programu X?

9

Czy istnieje sposób, aby uzyskać ikonę uruchomionego programu X? Kiedy przełączasz się między oknami, możesz zobaczyć jego ikonę, np. Przez xfwm4.

stokrotka
źródło
Czekaj, czy chcesz to przez powłokę (do pliku) czy przez C ++?
Bobby
@Bobby cokolwiek działa ..
stokrotka

Odpowiedzi:

9

To działa dla mnie. Może nie działać ze wszystkimi aplikacjami i wszystkimi menedżerami okien. pamFormat jest obsługiwany przez co najmniej ImageMagick, więc można go zobaczyć z displayi konwertować je do innych formatów, w razie potrzeby z 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

(i kliknij okno, z którego chcesz pobrać ikonę, zobacz także -idopcję xprop )

Chodzi o to, aby użyć xprop, aby uzyskać właściwość jako listę 32-bitowych liczb całkowitych dziesiętnych i użyć perla do konwersji tego na format graficzny (pam wybrano tutaj dla uproszczenia, chociaż musiałem zmienić kolejność bajtów, ponieważ _NET_WM_ICON to ARGB, a pam to RGBA.

( uwaga na temat formatu pam . Jest to format netpbm , netpbm jest czcigodnym narzędziem do manipulacji obrazami w Uniksie. Jednak z powodu różnych problemów, głównie związanych z licencjonowaniem, nowsze wersje netpbm nie są pakietami Debiana, w wyniku czego jego pochodne, takie jak ubuntu as co oznacza, że ​​nie ma tam większości narzędzi do konwersji pam. W innych systemach, które mają nowszy netpbm, możesz przesłać wyjście powyżej, pamrgbatopngaby wygenerować obraz png)

Stéphane Chazelas
źródło
Fajnie, zrzuciłem ikonę i przekonwertowałem ją do formatu PNG.
stokrotka
0

Natknąłem się na ten post na blogu. Cytat z tego:

Aby zademonstrować, jak można to zrobić w praktyce, napisałem mały program o nazwie xgeticon, który pozwala użytkownikowi wybrać okno działającej aplikacji X i zapisać wyodrębnioną ikonę w pliku podanym jako argument.

Ikem Krueger
źródło
0

użyj linux libwnck może to zrobić

#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;
}

Dostaję to z tej strony

chikadance
źródło