Сохраняйте снимки свернутых окон с помощью Xlib - PullRequest
1 голос
/ 19 февраля 2012

Короче говоря, я хочу написать переключатель окон в стиле 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");
}

Программа работает хорошо, но она не будет генерировать правильные изображения для тех окон, которые находятся на другом свернутом рабочем столе - они будут выглядеть так: enter image description here

Обратите внимание, что я отправляю событие expose всем окнам, прежде чем генерировать их буферы.

ОБНОВЛЕНИЕ: Похоже, xlib не поддерживает это.Так что единственным способом может быть создание кеша вручную.

Ответы [ 2 ]

1 голос
/ 09 октября 2013
0 голосов
/ 21 февраля 2012

Да, ваше обновление верно.Когда окно не отображается (или закрыто), X просто отбрасывает его содержимое;они нигде не существуют, чтобы их можно было снимать.

Я полагаю, что libwnck содержит код для этой и других частей написания переключателя, кстати.Это в основном библиотека для написания таких вещей, как переключатели окон.

...