【问题标题】:Save snapshots of minimized windows with Xlib使用 Xlib 保存最小化窗口的快照
【发布时间】:2012-02-19 13:25:51
【问题描述】:

简而言之,我想写一个 Gnome-Shell 风格的窗口切换器。所以我需要获取所有窗口的快照。我当前的程序如下所示:

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");
}

该程序运行良好,但它不会为那些在不同的最小化桌面上的窗口生成正确的图像——它们看起来像这样:

请注意,在生成它们的 pixbuf 之前,我向所有窗口发送了一个暴露事件。

更新: 似乎 xlib 不支持这一点。所以唯一的方法可能是手动创建缓存。

【问题讨论】:

    标签: x11 xlib xorg


    【解决方案1】:

    这可以通过 Composite 扩展来实现 - 请参阅教程中的 "Preventing the backing pixmap from being freed when the window is hidden/destroyed" 部分。

    【讨论】:

      【解决方案2】:

      是的,您的更新是正确的。当一个窗口未被映射(或被覆盖)时,X 只是丢弃它的内容;它们不存在于任何地方以便进行快照。

      我相信 libwnck 包含执行此操作的代码以及编写切换器的其他部分,顺便说一句。它基本上是一个用于编写窗口切换器之类的库。

      【讨论】:

        猜你喜欢
        • 2011-05-30
        • 2011-11-13
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多