+render_window_hide(d_window_t *w)
+{
+ data_t *d;
+ window_data_t *wd;
+
+ d = screen_find_plugin_data(w->sc, PLUGIN_NAME);
+ wd = window_find_plugin_data(w, PLUGIN_NAME);
+ if (wd) {
+ render_window_free(w, wd);
+ window_remove_plugin_data(w, PLUGIN_NAME);
+ }
+
+ window_unref(w);
+
+ /* pass it on */
+ d->window_hide(w);
+}
+
+static
+xcb_render_picture_t solid_picture(d_screen_t *sc,
+ double a, double r,
+ double g, double b)
+{
+ xcb_render_picture_t picture;
+ xcb_render_color_t c;
+
+ picture = xcb_generate_id (sc->dpy->conn);
+
+ c.alpha = a * 0xffff;
+ c.red = a * r * 0xffff;
+ c.green = a * g * 0xffff;
+ c.blue = a * b * 0xffff;
+
+ xcb_render_create_solid_fill (sc->dpy->conn, picture, c);
+ return picture;
+}
+
+static xcb_render_pictformat_t
+find_visual_format(data_t *d, xcb_visualid_t visual)
+{
+ xcb_render_pictscreen_iterator_t si;
+ xcb_render_pictdepth_iterator_t di;
+ xcb_render_pictvisual_iterator_t vi;
+
+ if (!visual) return XCB_NONE;
+
+ /* go through all the screens */
+ si = xcb_render_query_pict_formats_screens_iterator(d->pict_formats);
+ for (; si.rem; xcb_render_pictscreen_next(&si)) {
+ di = xcb_render_pictscreen_depths_iterator(si.data);
+ for (; di.rem; xcb_render_pictdepth_next(&di)) {
+ vi = xcb_render_pictdepth_visuals_iterator(di.data);
+ for (; vi.rem; xcb_render_pictvisual_next(&vi)) {
+ if (vi.data->visual == visual)
+ return vi.data->format;
+ }
+ }
+ }
+ return XCB_NONE;
+}
+
+static xcb_render_picture_t
+render_get_picture(d_window_t *w, window_data_t *wd)
+{
+ if (wd->ck_picture.sequence) {
+ xcb_generic_error_t *err;
+ //printf("** checking create picture 0x%x\n", w->id);
+ err = xcb_request_check(w->sc->dpy->conn, wd->ck_picture);
+ if (err) {
+ wd->picture = XCB_NONE;
+ printf("error creating picture for window 0x%x\n", w->id);
+ free(err);
+ }
+ wd->ck_picture.sequence = 0;
+ }
+ //printf("returning picture 0x%x for window 0x%x\n", wd->picture, w->id);
+ return wd->picture;
+}
+
+static void
+render_free_picture(d_window_t *w, window_data_t *wd)
+{
+ xcb_render_picture_t pict;
+
+ pict = render_get_picture(w, wd);
+ if (pict) xcb_render_free_picture(w->sc->dpy->conn, pict);
+ wd->picture = XCB_NONE;
+}
+
+static void
+render_update_picture(d_window_t *w, data_t *d, window_data_t *wd,
+ gboolean children)
+{
+ xcb_pixmap_t px;
+
+ px = window_get_pixmap(w);
+ //printf("got pixmap 0x%x\n", px);
+ if (px) {
+ xcb_render_pictformat_t format;
+ const uint32_t vals = (children ?
+ XCB_SUBWINDOW_MODE_INCLUDE_INFERIORS :
+ XCB_SUBWINDOW_MODE_CLIP_BY_CHILDREN);
+
+ render_free_picture(w, wd);
+
+ wd->picture = xcb_generate_id(w->sc->dpy->conn);
+ format = find_visual_format(d, window_get_visual(w));
+ wd->ck_picture =
+ xcb_render_create_picture_checked(w->sc->dpy->conn,
+ wd->picture, px, format,
+ XCB_RENDER_CP_SUBWINDOW_MODE,
+ &vals);
+ }
+}
+
+static void
+render_window_reconfigure(d_window_t *w)
+{
+ data_t *d;
+ window_data_t *wd;
+
+ d = screen_find_plugin_data(w->sc, PLUGIN_NAME);
+ wd = window_find_plugin_data(w, PLUGIN_NAME);
+ render_free_picture(w, wd);
+
+ /* pass it on */
+ d->window_hide(w);
+}
+
+static void
+render_screen_paint(d_screen_t *sc)