มีวิธีรับไอคอนของโปรแกรม X ที่กำลังทำงานอยู่หรือไม่? เมื่อคุณสลับระหว่างหน้าต่างคุณจะเห็นไอคอนของมันเช่นผ่าน xfwm4
มีวิธีรับไอคอนของโปรแกรม X ที่กำลังทำงานอยู่หรือไม่? เมื่อคุณสลับระหว่างหน้าต่างคุณจะเห็นไอคอนของมันเช่นผ่าน xfwm4
คำตอบ:
มันใช้งานได้สำหรับฉัน อาจไม่ทำงานกับแอปพลิเคชันทั้งหมดและตัวจัดการหน้าต่างทั้งหมด 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
(และคลิกที่หน้าต่างที่คุณต้องการรับไอคอนดู-id
ตัวเลือกของ xprop ด้วย)
แนวคิดคือการใช้ xprop เพื่อรับคุณสมบัติเป็นรายการของจำนวนเต็ม 32 บิตทศนิยมและใช้ Perl เพื่อแปลงที่เป็นรูปแบบกราฟิก (pam เลือกที่นี่เพื่อความเรียบง่ายแม้ว่าฉันต้องเรียงลำดับไบต์ตั้งแต่ _NET_WM_ICON เป็น ARGB ในขณะที่ pam คือ RGBA
( หมายเหตุเกี่ยวกับรูปแบบ pamมันเป็นรูปแบบnetpbm , netpbm เป็นกล่องเครื่องมือจัดการภาพ Unix ที่น่านับถืออย่างไรก็ตามเนื่องจากปัญหาต่าง ๆ ส่วนใหญ่เป็นรุ่นลิขสิทธิ์รุ่น netpbm รุ่นใหม่ไม่ใช่แพ็คเกจโดย debian และเป็นผลของอนุพันธ์เช่น Ubuntu ซึ่งหมายความว่ายูทิลิตี้การแปลง pam ส่วนใหญ่ไม่มีอยู่ในระบบอื่นที่มี netpbm ที่ใหม่กว่าคุณสามารถไพพ์เอาท์พุทด้านบนpamrgbatopng
เพื่อสร้างอิมเมจ png)
ฉัน stumbled เมื่อนี้โพสต์บล็อก อ้างจากมัน:
เพื่อแสดงให้เห็นว่าวิธีนี้สามารถทำได้ในทางปฏิบัติฉันได้เขียนโปรแกรมเล็ก ๆ ชื่อว่าxgeticonซึ่งให้ผู้ใช้เลือกหน้าต่างของแอปพลิเคชั่น X ที่กำลังรันและบันทึกไอคอนที่คลายบีบอัดลงในไฟล์ที่มีให้เป็นอาร์กิวเมนต์
ใช้ 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;
}
ฉันได้รับจากหน้านี้