要するに、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を生成する前にすべてのウィンドウに公開イベントを送信することに注意してください。
更新: xlibはそれをサポートしていないようです。したがって、唯一の方法は手動でキャッシュを作成することです。