วิธีการดัมพ์ไอคอนของโปรแกรม X ที่กำลังทำงานอยู่?


9

มีวิธีรับไอคอนของโปรแกรม X ที่กำลังทำงานอยู่หรือไม่? เมื่อคุณสลับระหว่างหน้าต่างคุณจะเห็นไอคอนของมันเช่นผ่าน xfwm4


รอคุณต้องการมันผ่านเชลล์ (เป็นไฟล์) หรือผ่าน C ++ หรือไม่?
Bobby

@ บ๊อบบี้อะไรก็ได้ ..
เดซี่

คำตอบ:


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

(และคลิกที่หน้าต่างที่คุณต้องการรับไอคอนดู-idตัวเลือกของ xprop ด้วย)

แนวคิดคือการใช้ xprop เพื่อรับคุณสมบัติเป็นรายการของจำนวนเต็ม 32 บิตทศนิยมและใช้ Perl เพื่อแปลงที่เป็นรูปแบบกราฟิก (pam เลือกที่นี่เพื่อความเรียบง่ายแม้ว่าฉันต้องเรียงลำดับไบต์ตั้งแต่ _NET_WM_ICON เป็น ARGB ในขณะที่ pam คือ RGBA

( หมายเหตุเกี่ยวกับรูปแบบ pamมันเป็นรูปแบบnetpbm , netpbm เป็นกล่องเครื่องมือจัดการภาพ Unix ที่น่านับถืออย่างไรก็ตามเนื่องจากปัญหาต่าง ๆ ส่วนใหญ่เป็นรุ่นลิขสิทธิ์รุ่น netpbm รุ่นใหม่ไม่ใช่แพ็คเกจโดย debian และเป็นผลของอนุพันธ์เช่น Ubuntu ซึ่งหมายความว่ายูทิลิตี้การแปลง pam ส่วนใหญ่ไม่มีอยู่ในระบบอื่นที่มี netpbm ที่ใหม่กว่าคุณสามารถไพพ์เอาท์พุทด้านบนpamrgbatopngเพื่อสร้างอิมเมจ png)


เยี่ยมมากฉันทิ้งไอคอนและแปลงเป็นรูปแบบ PNG
เดซี่

0

ฉัน stumbled เมื่อนี้โพสต์บล็อก อ้างจากมัน:

เพื่อแสดงให้เห็นว่าวิธีนี้สามารถทำได้ในทางปฏิบัติฉันได้เขียนโปรแกรมเล็ก ๆ ชื่อว่า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;
}

ฉันได้รับจากหน้านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.