요약하면 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");
}
프로그램이 잘 잘 작동하지만, 최소화 다른 바탕 화면에있는 그 창에 대한 올바른 이미지를 생성하지 않습니다 - 그들은 같을 것이다 :
pixbufs를 생성하기 전에 모든 창에 expose 이벤트를 보냅니다.
업데이트 : xlib에서 지원하지 않는 것 같습니다. 그래서 유일한 방법은 캐시를 수동으로 생성하는 것입니다.