2012-02-19 22 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を生成する前にすべてのウィンドウに公開イベントを送信することに注意してください。

更新: xlibはそれをサポートしていないようです。したがって、唯一の方法は手動でキャッシュを作成することです。

答えて

0

はい、更新内容は正しいです。ウィンドウがマップされていない(または隠されている)とき、Xは内容を破棄します。スナップショットを作成するためにはどこにも存在しません。

私はlibwnckにこれと他の部分のスイッチャを書くためのコード、btwがあると信じています。これは基本的にウィンドウスイッチャーのようなものを書くためのライブラリです。

関連する問題