実行中のXプログラムのアイコンをダンプする方法は?

実行中のXプログラムのアイコンをダンプする方法は?

実行中のXプログラムのアイコンを取得する方法はありますか?たとえば、xfwm4を介してウィンドウを切り替えると、対応するアイコンが表示されます。

答え1

これは私にとって効果的です。すべてのアプリケーションとすべてのウィンドウマネージャでは機能しない可能性があります。この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ビット10進整数リストにインポートし、Perlを使用してグラフィック形式に変換することです。ここでは単純化のためにpamを選択しましたが、_NET_WM_ICONはARGBで、pamはバイトを並べ替える必要がありました。 RGBA。

pam 形式に関する注意。それネットワークPBM形式のnetpbmは、古いUnix画像処理ツールボックスです。ただし、さまざまな問題(主にライセンスの問題)のため、最新のnetpbmバージョンはDebianとその派生バージョン(Ubuntuなど)によってパッケージ化されていません。これは、ほとんどのpam変換ユーティリティが存在しないことを意味します。最新のnetpbmを使用する他のシステムでは、上記の出力をパイプしてpamrgbatopngpng画像を生成できます。

答え2

に基づいて@Stéphane Chazelas信じられないほどのクリップ最初のエントリだけでなく、次のエントリもダンプするスクリプトを作成しました。みんな特定のウィンドウに画像として表示するアイコン.png

#!/bin/bash
if [[ "$1" == '--help' ]]; then
    echo "Show information or extract a window's icons to NAME-WIDTH.png"
    echo "Usage: ${0##*/} [NAME]"
    exit
fi

if [[ "$1" ]]; then
    cmd=(convert -set 'filename:w' '%w' - "${1}-%[filename:w].png")
else
    cmd=(identify -)
fi

split_icons() {
    xprop -notype 32c _NET_WM_ICON |
    awk -v RS=', | = ' '
        NR == 1         { h  = $1; i++; next }
        NR == i + 1     { x  = $1;        printf "%s = %s", h, x; next }
        NR == i + 2     { s  = x * $1 } { printf ", %s", $1 }
        NR == i + 2 + s { i += s + 2;     printf "\n" }
    '
}

to_pam() {
    perl -0777 -pe '@_=/\d+/g;
    printf "P7\nWIDTH %d\nHEIGHT %d\n", splice@_,0,2;
    printf "DEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n";
    $_=pack "N*", @_;
    s/(.)(...)/$2$1/gs'
}

while read -r data; do to_pam <<< "$data" | "${cmd[@]}"; done < <(split_icons)

アイコン情報を表示するためのパラメータがないと、identifyファイルは生成されません。与えられた値に基づいてNAMEアイコンを抽出し、convertそれを使用してNAME-<width>.png

使用例:

$ extract-icons --help
Show information or extract a window's icons to NAME-WIDTH.png
Usage: extract-icons [NAME]

$ extract-icons  # ... click on firefox ...
-=>/tmp/magick-14339JS01_CgEl3Yi PAM 64x64 64x64+0+0 8-bit TrueColor sRGB 16.5KB 0.000u 0:00.000
-=>/tmp/magick-14342I14cdBFZKQIm PAM 16x16 16x16+0+0 8-bit TrueColor sRGB 1.09KB 0.000u 0:00.000
-=>/tmp/magick-14345gjMYsrl4Jhmh PAM 128x128 128x128+0+0 8-bit TrueColor sRGB 65.6KB 0.000u 0:00.000
-=>/tmp/magick-14348Wdmu9LGUEH0j PAM 32x32 32x32+0+0 8-bit TrueColor sRGB 4.16KB 0.000u 0:00.000
-=>/tmp/magick-14351HICEECbK3LRi PAM 48x48 48x48+0+0 8-bit TrueColor sRGB 9.28KB 0.000u 0:00.000

$ extract-icons firefox
$ ls -l
total 36.864
-rw-r--r-- 1 rodrigo rodrigo 14.882 2020-09-16 18:44 firefox-128.png
-rw-r--r-- 1 rodrigo rodrigo  1.175 2020-09-16 18:44 firefox-16.png
-rw-r--r-- 1 rodrigo rodrigo  2.265 2020-09-16 18:44 firefox-32.png
-rw-r--r-- 1 rodrigo rodrigo  3.870 2020-09-16 18:44 firefox-48.png
-rw-r--r-- 1 rodrigo rodrigo  5.996 2020-09-16 18:44 firefox-64.png

完全なスクリプトを取得し、以下のようないくつかのオプションを追加できます。xdg-extract-icons私のxdg-toolsリポジトリ

答え3

私は偶然偶然発見したこれブログ投稿。引用するには:

実際にこれを行う方法を示すために、私は次のような小さなプログラムを書いています。グラフィックアイコンこれにより、ユーザーは実行中のXアプリケーションのウィンドウを選択し、抽出されたアイコンを引数として提供されるファイルに保存できます。

答え4

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

私からこのページ

関連情報