¿Cómo volcar el icono de un programa X en ejecución?


9

¿Hay alguna manera de obtener el ícono de un programa X en ejecución? Cuando cambia de una ventana a otra, puede ver su ícono, por ejemplo, a través de xfwm4.


Espera, ¿lo quieres a través del shell (en un archivo) o C ++?
Bobby

@Bobby lo que funcione ..
margarita

Respuestas:


9

Esto funciona para mi. Podría no funcionar con todas las aplicaciones y todos los administradores de ventanas. El pamformato es al menos compatible con ImageMagick, por lo que puede verlo displayy convertirlo a otros formatos si es necesario 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

(y haga clic en la ventana de la que desea obtener el icono, consulte también la -idopción de xprop )

La idea es usar xprop para obtener la propiedad como una lista de enteros decimales de 32 bits y usar perl para convertirlo a un formato gráfico (pam elegido aquí por simplicidad, aunque tuve que reordenar los bytes ya que _NET_WM_ICON es ARGB mientras que pam es RGBA.

( una nota sobre el formato pam . Es un formato netpbm , netpbm es una venerable caja de herramientas de manipulación de imágenes de Unix. Sin embargo, debido a varios problemas, principalmente licencias, las versiones más nuevas de netpbm no son paquetes de debian y, como resultado, sus derivados como ubuntu como bueno, lo que significa que la mayoría de las utilidades de conversión de pam no están presentes allí. En otros sistemas que tienen netpbm más nuevos, puede canalizar la salida anterior pamrgbatopngpara generar una imagen png)


Genial, volqué el icono y lo convertí a formato PNG.
Margarita

0

Me topé con esta publicación de blog. Para citarlo:

Para demostrar cómo se puede hacer esto en la práctica, escribí un pequeño programa llamado xgeticon que permitía al usuario elegir la ventana de una aplicación X en ejecución y guardar el icono extraído en el archivo proporcionado como argumento.


0

utilizar Linux Libwnck puede hacerlo

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

Lo obtengo de esta página

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.