2012-02-19 42 views
1

總之,我想編寫一個Gnome-Shell樣式的窗口切換器。所以我需要獲取所有窗口的快照。我目前的計劃是這樣的:用Xlib保存最小化窗口的快照

char filename[101]; 
sprintf(filename, "%d.png", (int)win_list[i]); 
GdkWindow *win_gdk = gdk_x11_window_foreign_new_for_display 
    (gdk_display_get_default(), win_list[i]); 
gint _w, _h; 
gdk_drawable_get_size(GDK_DRAWABLE(win_gdk), &_w, &_h); 
XEvent _xevent; 
_xevent.xexpose = 
    (XExposeEvent) 
    { 
      .type = Expose, 
      .send_event = True, 
      .display = xsu_vars.dpy, 
      .window = win_list[i], 
      .x = 0, .y = 0, .width = _w, .height = _h, 
      .count = 0 
    }; 
XSendEvent(xsu_vars.dpy, win_list[i], False, 0, &_xevent); 
GdkPixbuf *_pb = gdk_pixbuf_get_from_drawable(
    NULL, GDK_DRAWABLE(win_gdk), NULL, 0, 0, 0, 0, _w, _h); 
if(_pb != NULL) { 
    cairo_surface_t *_surf_cairo = cairo_image_surface_create(
      CAIRO_FORMAT_RGB24, _w, _h); 
    cairo_t *_cr = cairo_create(_surf_cairo); 
    gdk_cairo_set_source_pixbuf(_cr, _pb, 0, 0); 
    cairo_paint(_cr); 
    cairo_surface_write_to_png(_surf_cairo, filename); 
    printf("%s saved successfully!\n", filename); 
} else { 
    printf("failed...\n"); 
} 

該計劃行之有效很好,但它不會產生那些不同的桌面最小化窗口上正確的圖像 - 他們應該是這樣的: enter image description here

請注意,我發送一個揭露事件到所有窗口之前生成它們的pixbufs。

更新: 似乎xlib不支持。所以唯一的方法可能是手動創建緩存。

回答

0

是的,您的更新是正確的。當一個窗口未被映射(或被掩蓋)時,X只是放棄其內容;它們不存在於任何地方以便被快照。

我相信libwnck包含執行此操作的代碼,以及編寫切換器的其他部分,順便說一句。它基本上是一個用於編寫窗口切換器之類的東西的庫。