9 #include <xcb/composite.h>
10 #include <xcb/damage.h>
20 /* queried things, don't read them directly from the struct */
24 xcb_visualid_t visual;
31 d_list_t *plugin_data;
33 xcb_damage_damage_t damage;
35 xcb_get_window_attributes_cookie_t ck_get_attr;
36 xcb_get_geometry_cookie_t ck_get_geom;
37 xcb_void_cookie_t ck_get_pixmap;
40 static void window_get_attributes_reply(d_window_priv_t *w);
41 static void window_get_geometry_reply(d_window_priv_t *w);
44 window_new(xcb_window_t id, struct d_screen *sc)
48 w = malloc(sizeof(d_window_priv_t));
56 screen_stacking_add(sc, (d_window_t*)w);
58 w->ck_get_attr = xcb_get_window_attributes(sc->dpy->conn, id);
59 w->ck_get_geom = xcb_get_geometry(sc->dpy->conn, id);
61 w->ck_get_pixmap.sequence = 0;
63 w->plugin_data = list_new();
65 //printf("new window 0x%x\n", w->id);
67 return (d_window_t*)w;
71 window_ref(d_window_t *pubw)
73 d_window_priv_t *w = (d_window_priv_t*)pubw;
79 window_unref(d_window_t *pubw)
81 d_window_priv_t *w = (d_window_priv_t*)pubw;
83 if (w && --w->ref == 0) {
86 screen_stacking_remove(w->sc, (d_window_t*)w);
88 if ((p = window_get_pixmap(pubw))) {
89 xcb_free_pixmap(w->sc->dpy->conn, p);
93 list_unref(w->plugin_data);
99 window_update_pixmap(d_window_priv_t *w)
103 /* XXX can we save it for until we get the new pixmap? */
104 if ((p = window_get_pixmap((d_window_t*)w))) {
105 xcb_free_pixmap(w->sc->dpy->conn, p);
106 w->pixmap = XCB_NONE;
109 //printf("updating pixmap for 0x%x\n", w->id);
111 w->pixmap = xcb_generate_id(w->sc->dpy->conn);
113 xcb_composite_name_window_pixmap_checked(w->sc->dpy->conn,
115 xcb_flush(w->sc->dpy->conn);
119 window_show(d_window_t *pubw)
121 d_window_priv_t *w = (d_window_priv_t*)pubw;
123 window_is_mapped(pubw); /* kill any ongoing request */
125 //printf("show window 0x%x\n", w->id);
127 window_update_pixmap(w);
132 window_hide(d_window_t *pubw)
134 d_window_priv_t *w = (d_window_priv_t*)pubw;
136 window_is_mapped(pubw); /* kill any ongoing request */
138 //printf("hide window 0x%x\n", w->id);
144 window_become_zombie(d_window_t *pubw)
146 d_window_priv_t *w = (d_window_priv_t*)pubw;
148 if (w->zombie) return;
154 window_is_zombie(d_window_t *pubw)
156 d_window_priv_t *w = (d_window_priv_t*)pubw;
161 window_is_input_only(d_window_t *pubw)
163 d_window_priv_t *w = (d_window_priv_t*)pubw;
164 if (w->ck_get_attr.sequence)
165 window_get_attributes_reply(w);
166 return w->input_only;
170 window_get_area(d_window_t *pubw, int *x, int *y, int *width, int *height,
173 d_window_priv_t *w = (d_window_priv_t*)pubw;
174 if (w->ck_get_geom.sequence)
175 window_get_geometry_reply(w);
180 *border_width = w->bw;
184 window_get_attributes_reply(d_window_priv_t *w)
186 xcb_get_window_attributes_reply_t *rep;
187 xcb_generic_error_t *err = NULL;
189 rep = xcb_get_window_attributes_reply(w->sc->dpy->conn,
194 w->input_only = rep->_class == XCB_WINDOW_CLASS_INPUT_ONLY;
195 w->mapped = rep->map_state != XCB_MAP_STATE_UNMAPPED;
196 w->visual = rep->visual;
200 w->input_only = TRUE;
202 w->visual = XCB_NONE;
205 printf("error getting attributes for window 0x%x\n", w->id);
208 w->ck_get_attr.sequence = 0;
212 window_get_geometry_reply(d_window_priv_t *w)
214 xcb_get_geometry_reply_t *rep;
215 xcb_generic_error_t *err = NULL;
217 rep = xcb_get_geometry_reply(w->sc->dpy->conn,
226 w->bw = rep->border_width;
235 printf("error getting geometry for window 0x%x\n", w->id);
238 w->ck_get_geom.sequence = 0;
242 window_is_mapped(d_window_t *pubw)
244 d_window_priv_t *w = (d_window_priv_t*)pubw;
245 if (w->ck_get_attr.sequence)
246 window_get_attributes_reply(w);
251 window_get_pixmap(d_window_t *pubw)
253 d_window_priv_t *w = (d_window_priv_t*)pubw;
255 if (w->ck_get_pixmap.sequence) {
256 xcb_generic_error_t *err;
257 //printf("** checking get pixmap 0x%x\n", w->id);
258 err = xcb_request_check(w->sc->dpy->conn, w->ck_get_pixmap);
260 w->pixmap = XCB_NONE;
261 printf("error getting named pixmap for window 0x%x\n", w->id);
264 w->ck_get_pixmap.sequence = 0;
266 //printf("returning pixmap 0x%x for window 0x%x\n", w->pixmap, w->id);
271 window_get_visual(d_window_t *pubw)
273 d_window_priv_t *w = (d_window_priv_t*)pubw;
274 if (w->ck_get_attr.sequence)
275 window_get_attributes_reply(w);
280 window_configure(d_window_t *pubw, int x, int y, int width, int height,
283 d_window_priv_t *w = (d_window_priv_t*)pubw;
285 /* this overrides any reply from our get_geometry call */
286 if (w->ck_get_geom.sequence)
287 w->ck_get_geom.sequence = 0;
292 w->bw = border_width;
296 window_move(d_window_t *w)
302 window_resize(d_window_t *w)
304 window_update_pixmap((d_window_priv_t*)w);
308 window_add_plugin_data(d_window_t *pubw, int id, void *data)
310 d_window_priv_t *w = (d_window_priv_t*)pubw;
311 plugin_data_add(w->plugin_data, id, data);
315 window_find_plugin_data(d_window_t *pubw, int id)
317 d_window_priv_t *w = (d_window_priv_t*)pubw;
318 return plugin_data_find(w->plugin_data, id);
322 window_remove_plugin_data(d_window_t *pubw, int id)
324 d_window_priv_t *w = (d_window_priv_t*)pubw;
325 plugin_data_remove(w->plugin_data, id);
329 window_create_damage(d_window_t *pubw)
331 d_window_priv_t *w = (d_window_priv_t*)pubw;
333 if (!window_is_input_only(pubw)) {
334 assert(w->damage == XCB_NONE);
335 w->damage = xcb_generate_id(w->sc->dpy->conn);
336 xcb_damage_create(w->sc->dpy->conn, w->damage, w->id,
337 XCB_DAMAGE_REPORT_LEVEL_NON_EMPTY);
341 void window_destroy_damage(d_window_t *pubw)
343 d_window_priv_t *w = (d_window_priv_t*)pubw;
346 xcb_damage_destroy(w->sc->dpy->conn, w->damage);
347 w->damage = XCB_NONE;