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;
33 d_list_t *plugin_data;
35 xcb_damage_damage_t damage;
37 gboolean waiting_attr;
38 xcb_get_window_attributes_cookie_t ck_get_attr;
39 gboolean waiting_geom;
40 xcb_get_geometry_cookie_t ck_get_geom;
41 gboolean waiting_pixmap;
42 xcb_void_cookie_t ck_get_pixmap;
45 static void window_get_attributes_reply(d_window_priv_t *w);
46 static void window_get_geometry_reply(d_window_priv_t *w);
49 window_new(xcb_window_t id, struct d_screen *sc)
53 w = malloc(sizeof(d_window_priv_t));
61 screen_stacking_add(sc, (d_window_t*)w);
63 w->ck_get_attr = xcb_get_window_attributes(sc->dpy->conn, id);
64 w->waiting_attr = TRUE;
66 w->ck_get_geom = xcb_get_geometry(sc->dpy->conn, id);
67 w->waiting_geom = TRUE;
69 w->waiting_pixmap = FALSE;
71 w->plugin_data = list_new();
73 //printf("new window 0x%x\n", w->id);
75 return (d_window_t*)w;
79 window_ref(d_window_t *pubw)
81 d_window_priv_t *w = (d_window_priv_t*)pubw;
87 window_unref(d_window_t *pubw)
89 d_window_priv_t *w = (d_window_priv_t*)pubw;
91 if (w && --w->ref == 0) {
94 screen_stacking_remove(w->sc, (d_window_t*)w);
96 if ((p = window_get_pixmap(pubw))) {
97 xcb_free_pixmap(w->sc->dpy->conn, p);
101 list_unref(w->plugin_data);
107 window_update_pixmap(d_window_priv_t *w)
111 if (window_is_zombie((d_window_t*)w)) return;
113 /* XXX can we save it for until we get the new pixmap? */
114 if ((p = window_get_pixmap((d_window_t*)w))) {
115 xcb_free_pixmap(w->sc->dpy->conn, p);
116 w->pixmap = XCB_NONE;
119 //printf("updating pixmap for 0x%x\n", w->id);
121 w->pixmap = xcb_generate_id(w->sc->dpy->conn);
123 xcb_composite_name_window_pixmap_checked(w->sc->dpy->conn,
125 w->waiting_pixmap = TRUE;
126 xcb_flush(w->sc->dpy->conn);
130 window_show(d_window_t *pubw)
132 d_window_priv_t *w = (d_window_priv_t*)pubw;
134 window_is_mapped(pubw); /* kill any ongoing request */
136 //printf("show window 0x%x\n", w->id);
138 window_update_pixmap(w);
143 window_hide(d_window_t *pubw)
145 d_window_priv_t *w = (d_window_priv_t*)pubw;
147 window_is_mapped(pubw); /* kill any ongoing request */
149 //printf("hide window 0x%x\n", w->id);
155 window_become_zombie(d_window_t *pubw)
157 d_window_priv_t *w = (d_window_priv_t*)pubw;
159 if (w->zombie) return;
165 window_is_zombie(d_window_t *pubw)
167 d_window_priv_t *w = (d_window_priv_t*)pubw;
172 window_is_input_only(d_window_t *pubw)
174 d_window_priv_t *w = (d_window_priv_t*)pubw;
176 window_get_attributes_reply(w);
177 return w->input_only;
181 window_get_area(d_window_t *pubw, int *x, int *y, int *width, int *height,
184 d_window_priv_t *w = (d_window_priv_t*)pubw;
186 window_get_geometry_reply(w);
191 *border_width = w->bw;
195 window_get_attributes_reply(d_window_priv_t *w)
197 xcb_get_window_attributes_reply_t *rep;
198 xcb_generic_error_t *err = NULL;
200 rep = xcb_get_window_attributes_reply(w->sc->dpy->conn,
205 w->input_only = rep->_class == XCB_WINDOW_CLASS_INPUT_ONLY;
206 w->mapped = rep->map_state != XCB_MAP_STATE_UNMAPPED;
207 w->visual = rep->visual;
211 w->input_only = TRUE;
213 w->visual = XCB_NONE;
216 printf("error getting attributes for window 0x%x\n", w->id);
223 window_get_geometry_reply(d_window_priv_t *w)
225 xcb_get_geometry_reply_t *rep;
226 xcb_generic_error_t *err = NULL;
228 rep = xcb_get_geometry_reply(w->sc->dpy->conn,
237 w->bw = rep->border_width;
246 printf("error getting geometry for window 0x%x\n", w->id);
253 window_is_mapped(d_window_t *pubw)
255 d_window_priv_t *w = (d_window_priv_t*)pubw;
257 window_get_attributes_reply(w);
262 window_get_pixmap(d_window_t *pubw)
264 d_window_priv_t *w = (d_window_priv_t*)pubw;
266 if (w->waiting_pixmap) {
267 xcb_generic_error_t *err;
268 //printf("** checking get pixmap 0x%x\n", w->id);
269 err = xcb_request_check(w->sc->dpy->conn, w->ck_get_pixmap);
271 w->pixmap = XCB_NONE;
272 printf("error getting named pixmap for window 0x%x\n", w->id);
275 w->waiting_pixmap = FALSE;
277 //printf("returning pixmap 0x%x for window 0x%x\n", w->pixmap, w->id);
282 window_get_visual(d_window_t *pubw)
284 d_window_priv_t *w = (d_window_priv_t*)pubw;
286 window_get_attributes_reply(w);
291 window_configure(d_window_t *pubw, int x, int y, int width, int height,
294 d_window_priv_t *w = (d_window_priv_t*)pubw;
296 /* this overrides any reply from our get_geometry call */
298 w->waiting_geom = FALSE;
303 w->bw = border_width;
307 window_move(d_window_t *w)
313 window_resize(d_window_t *w)
315 window_update_pixmap((d_window_priv_t*)w);
319 window_add_plugin_data(d_window_t *pubw, int id, void *data)
321 d_window_priv_t *w = (d_window_priv_t*)pubw;
322 plugin_data_add(w->plugin_data, id, data);
326 window_find_plugin_data(d_window_t *pubw, int id)
328 d_window_priv_t *w = (d_window_priv_t*)pubw;
329 return plugin_data_find(w->plugin_data, id);
333 window_remove_plugin_data(d_window_t *pubw, int id)
335 d_window_priv_t *w = (d_window_priv_t*)pubw;
336 plugin_data_remove(w->plugin_data, id);
340 window_create_damage(d_window_t *pubw)
342 d_window_priv_t *w = (d_window_priv_t*)pubw;
344 if (!window_is_input_only(pubw)) {
345 assert(w->damage == XCB_NONE);
346 w->damage = xcb_generate_id(w->sc->dpy->conn);
347 //printf("creating damage 0x%x\n", w->damage);
348 xcb_damage_create(w->sc->dpy->conn, w->damage, w->id,
349 XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY);
353 void window_destroy_damage(d_window_t *pubw)
355 d_window_priv_t *w = (d_window_priv_t*)pubw;
358 //printf("destroying damage 0x%x\n", w->damage);
359 xcb_damage_destroy(w->sc->dpy->conn, w->damage);
360 w->damage = XCB_NONE;