11 #include <xcb/composite.h>
12 #include <xcb/damage.h>
22 /* queried things, don't read them directly from the struct */
26 xcb_visualid_t visual;
34 d_list_t *plugin_data;
36 xcb_damage_damage_t damage;
38 gboolean waiting_attr;
39 xcb_get_window_attributes_cookie_t ck_get_attr;
40 gboolean waiting_geom;
41 xcb_get_geometry_cookie_t ck_get_geom;
42 gboolean waiting_pixmap;
43 xcb_void_cookie_t ck_get_pixmap;
46 static void window_get_attributes_reply(d_window_priv_t *w);
47 static void window_get_geometry_reply(d_window_priv_t *w);
50 window_new(xcb_window_t id, struct d_screen *sc)
54 w = malloc(sizeof(d_window_priv_t));
63 screen_stacking_add(sc, (d_window_t*)w);
65 w->ck_get_attr = xcb_get_window_attributes(sc->dpy->conn, id);
66 w->waiting_attr = TRUE;
68 w->ck_get_geom = xcb_get_geometry(sc->dpy->conn, id);
69 w->waiting_geom = TRUE;
71 w->waiting_pixmap = FALSE;
73 w->plugin_data = list_new();
75 //printf("new window 0x%x\n", w->id);
77 return (d_window_t*)w;
81 window_ref(d_window_t *pubw)
83 d_window_priv_t *w = (d_window_priv_t*)pubw;
89 window_unref(d_window_t *pubw)
91 d_window_priv_t *w = (d_window_priv_t*)pubw;
93 if (w && --w->ref == 0) {
96 screen_stacking_remove(w->sc, (d_window_t*)w);
98 if ((p = window_get_pixmap(pubw))) {
99 xcb_free_pixmap(w->sc->dpy->conn, p);
100 w->pixmap = XCB_NONE;
103 list_unref(w->plugin_data);
109 window_update_pixmap(d_window_priv_t *w)
113 if (window_is_zombie((d_window_t*)w)) return;
115 /* XXX can we save it for until we get the new pixmap? */
116 if ((p = window_get_pixmap((d_window_t*)w))) {
117 xcb_free_pixmap(w->sc->dpy->conn, p);
118 w->pixmap = XCB_NONE;
121 //printf("updating pixmap for 0x%x\n", w->id);
123 w->pixmap = xcb_generate_id(w->sc->dpy->conn);
125 xcb_composite_name_window_pixmap_checked(w->sc->dpy->conn,
127 w->waiting_pixmap = TRUE;
128 xcb_flush(w->sc->dpy->conn);
132 window_show(d_window_t *pubw)
134 d_window_priv_t *w = (d_window_priv_t*)pubw;
138 //printf("show window 0x%x\n", w->id);
140 window_update_pixmap(w);
145 window_hide(d_window_t *pubw)
147 d_window_priv_t *w = (d_window_priv_t*)pubw;
151 //printf("hide window 0x%x\n", w->id);
157 window_fake_unmapped(d_window_t *pubw)
159 d_window_priv_t *w = (d_window_priv_t*)pubw;
165 window_become_zombie(d_window_t *pubw)
167 d_window_priv_t *w = (d_window_priv_t*)pubw;
169 if (w->zombie) return;
175 window_is_zombie(d_window_t *pubw)
177 d_window_priv_t *w = (d_window_priv_t*)pubw;
182 window_is_input_only(d_window_t *pubw)
184 d_window_priv_t *w = (d_window_priv_t*)pubw;
186 window_get_attributes_reply(w);
187 return w->input_only;
191 window_get_area(d_window_t *pubw, int *x, int *y, int *width, int *height,
194 d_window_priv_t *w = (d_window_priv_t*)pubw;
196 window_get_geometry_reply(w);
201 *border_width = w->bw;
205 window_get_attributes_reply(d_window_priv_t *w)
207 xcb_get_window_attributes_reply_t *rep;
208 xcb_generic_error_t *err = NULL;
210 rep = xcb_get_window_attributes_reply(w->sc->dpy->conn,
215 w->input_only = rep->_class == XCB_WINDOW_CLASS_INPUT_ONLY;
216 w->attr_mapped = rep->map_state != XCB_MAP_STATE_UNMAPPED;
217 w->visual = rep->visual;
218 //printf("0x%x attributes mapped %d\n", w->id, w->mapped);
222 w->input_only = TRUE;
223 w->attr_mapped = FALSE;
224 w->visual = XCB_NONE;
227 printf("error getting attributes for window 0x%x\n", w->id);
230 w->waiting_attr = FALSE;
234 window_get_geometry_reply(d_window_priv_t *w)
236 xcb_get_geometry_reply_t *rep;
237 xcb_generic_error_t *err = NULL;
239 rep = xcb_get_geometry_reply(w->sc->dpy->conn,
248 w->bw = rep->border_width;
257 printf("error getting geometry for window 0x%x\n", w->id);
260 w->waiting_geom = FALSE;
264 window_is_mapped(d_window_t *pubw)
266 d_window_priv_t *w = (d_window_priv_t*)pubw;
271 window_is_attr_mapped(d_window_t *pubw)
273 d_window_priv_t *w = (d_window_priv_t*)pubw;
275 window_get_attributes_reply(w);
276 return w->attr_mapped;
280 window_get_pixmap(d_window_t *pubw)
282 d_window_priv_t *w = (d_window_priv_t*)pubw;
284 if (w->waiting_pixmap) {
285 xcb_generic_error_t *err;
286 //printf("** checking get pixmap 0x%x\n", w->id);
287 err = xcb_request_check(w->sc->dpy->conn, w->ck_get_pixmap);
289 w->pixmap = XCB_NONE;
290 printf("error getting named pixmap for window 0x%x\n", w->id);
293 w->waiting_pixmap = FALSE;
295 //printf("returning pixmap 0x%x for window 0x%x\n", w->pixmap, w->id);
300 window_get_visual(d_window_t *pubw)
302 d_window_priv_t *w = (d_window_priv_t*)pubw;
304 window_get_attributes_reply(w);
309 window_configure(d_window_t *pubw, int x, int y, int width, int height,
312 d_window_priv_t *w = (d_window_priv_t*)pubw;
314 /* this overrides any reply from our get_geometry call */
316 w->waiting_geom = FALSE;
321 w->bw = border_width;
325 window_move(d_window_t *w)
331 window_resize(d_window_t *w)
333 window_update_pixmap((d_window_priv_t*)w);
337 window_add_plugin_data(d_window_t *pubw, int id, void *data)
339 d_window_priv_t *w = (d_window_priv_t*)pubw;
340 plugin_data_add(w->plugin_data, id, data);
344 window_find_plugin_data(d_window_t *pubw, int id)
346 d_window_priv_t *w = (d_window_priv_t*)pubw;
347 return plugin_data_find(w->plugin_data, id);
351 window_remove_plugin_data(d_window_t *pubw, int id)
353 d_window_priv_t *w = (d_window_priv_t*)pubw;
354 plugin_data_remove(w->plugin_data, id);
358 window_create_damage(d_window_t *pubw)
360 d_window_priv_t *w = (d_window_priv_t*)pubw;
362 if (!window_is_input_only(pubw)) {
363 assert(w->damage == XCB_NONE);
364 w->damage = xcb_generate_id(w->sc->dpy->conn);
365 //printf("creating damage 0x%x\n", w->damage);
366 xcb_damage_create(w->sc->dpy->conn, w->damage, w->id,
367 XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY);
371 void window_destroy_damage(d_window_t *pubw)
373 d_window_priv_t *w = (d_window_priv_t*)pubw;
376 //printf("destroying damage 0x%x\n", w->damage);
377 xcb_damage_destroy(w->sc->dpy->conn, w->damage);
378 w->damage = XCB_NONE;