実行中の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を使用する他のシステムでは、上記の出力をパイプしてpamrgbatopng
png画像を生成できます。
答え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;
}
私からこのページ