如何转储正在运行的X程序的图标?


9

有没有办法获取正在运行的X程序的图标?在窗口之间切换时,您可以看到它的图标,例如通过xfwm4。


等待,您是要通过外壳(到文件中)还是通过C ++?
鲍比

@鲍比不管用..
雏菊

Answers:


9

这对我有用。可能不适用于所有应用程序和所有窗口管理器。该pam格式至少受ImageMagick支持,因此您可以使用查看该display格式并将其转换为其他格式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

(然后单击要从中获取图标的窗口,另请参阅xprop的-id选项)

这个想法是使用xprop将该属性作为32位十进制整数的列表来获取,并使用perl将其转换为图形格式(为简单起见,此处选择的pam为简化起见,尽管我不得不重新排列字节,因为_NET_WM_ICON为ARGB而pam为RGBA。

有关pam格式的注释。它是一种netpbm格式,netpbm是一种古老的Unix图像处理工具箱。但是,由于各种问题(主要是许可问题),较新的netpbm版本不是debian打包的,因此其衍生版本如ubuntu as好吧,这意味着大多数pam转换实用程序都不存在。在其他具有较新netpbm的系统上,您可以通过管道输出上述内容pamrgbatopng以生成png图像)


酷,我转储了图标并将其转换为PNG格式。
雏菊2012年

0

我偶然发现了这篇博客文章。引用一下:

为了演示如何在实践中做到这一点,我编写了一个名为xgeticon的小程序,该程序使用户可以选择正在运行的X应用程序的窗口,并将提取的图标保存到作为参数提供的文件中。


0

使用linux libwnck可以做到

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

我从这个页面得到

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.