2012-02-19 2 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를 생성하기 전에 모든 창에 expose 이벤트를 보냅니다.

업데이트 : xlib에서 지원하지 않는 것 같습니다. 그래서 유일한 방법은 캐시를 수동으로 생성하는 것입니다.

답변

0

예, 업데이트가 정확합니다. 윈도우가 매핑되지 않았거나 덮여있을 때, X는 그 내용을 버린다. 그들은 스냅 샷을 찍기 위해 어디에도 존재하지 않습니다.

나는 libwnck이 이것을하기위한 코드와 스위처 작성의 다른 부분 인 btw를 가지고 있다고 믿는다. 이것은 기본적으로 윈도우 스위처와 같은 것을 작성하기위한 라이브러리입니다.