6 #include <xcb/composite.h>
16 /* queried things, don't read them directly from the struct */
27 xcb_get_window_attributes_cookie_t ck_get_attr;
28 xcb_get_geometry_cookie_t ck_get_geom;
29 xcb_void_cookie_t ck_get_pixmap;
32 static void window_get_attributes_reply(d_window_priv_t *w);
33 static void window_get_geometry_reply(d_window_priv_t *w);
36 window_new(xcb_window_t id, struct d_screen *sc)
40 w = malloc(sizeof(d_window_priv_t));
45 w->opacity = WINDOW_OPACITY_MAX;
48 screen_stacking_add(sc, (d_window_t*)w);
50 w->ck_get_attr = xcb_get_window_attributes(sc->dpy->conn, id);
51 w->ck_get_geom = xcb_get_geometry(sc->dpy->conn, id);
53 w->ck_get_pixmap.sequence = 0;
55 //printf("new window 0x%x\n", w->id);
57 return (d_window_t*)w;
61 window_ref(d_window_t *pubw)
63 d_window_priv_t *w = (d_window_priv_t*)pubw;
69 window_unref(d_window_t *pubw)
71 d_window_priv_t *w = (d_window_priv_t*)pubw;
73 if (w && --w->ref == 0) {
76 screen_stacking_remove(w->sc, (d_window_t*)w);
78 if ((p = window_get_pixmap(pubw))) {
79 xcb_free_pixmap(w->sc->dpy->conn, p);
88 window_show(d_window_t *pubw)
90 d_window_priv_t *w = (d_window_priv_t*)pubw;
93 if (window_is_mapped(pubw)) return;
95 printf("show window 0x%x\n", w->id);
97 /* XXX can we save it for until we get the new pixmap? */
98 if ((p = window_get_pixmap(pubw))) {
99 xcb_free_pixmap(w->sc->dpy->conn, p);
100 w->pixmap = XCB_NONE;
104 w->pixmap = xcb_generate_id(w->sc->dpy->conn);
106 xcb_composite_name_window_pixmap_checked(w->sc->dpy->conn,
108 xcb_flush(w->sc->dpy->conn);
112 window_hide(d_window_t *pubw)
114 d_window_priv_t *w = (d_window_priv_t*)pubw;
116 if (!window_is_mapped(pubw)) return;
118 printf("hide window 0x%x\n", w->id);
124 window_become_zombie(d_window_t *pubw)
126 d_window_priv_t *w = (d_window_priv_t*)pubw;
128 if (w->zombie) return;
134 window_is_zombie(d_window_t *pubw)
136 d_window_priv_t *w = (d_window_priv_t*)pubw;
141 window_is_input_only(d_window_t *pubw)
143 d_window_priv_t *w = (d_window_priv_t*)pubw;
144 if (w->ck_get_attr.sequence)
145 window_get_attributes_reply(w);
146 return w->input_only;
150 window_get_area(d_window_t *pubw, int *x, int *y, int *width, int *height)
152 d_window_priv_t *w = (d_window_priv_t*)pubw;
153 if (w->ck_get_geom.sequence)
154 window_get_geometry_reply(w);
162 window_get_attributes_reply(d_window_priv_t *w)
164 xcb_get_window_attributes_reply_t *rep;
165 xcb_generic_error_t *err = NULL;
167 rep = xcb_get_window_attributes_reply(w->sc->dpy->conn,
172 w->input_only = rep->_class == XCB_WINDOW_CLASS_INPUT_ONLY;
173 w->mapped = rep->map_state != XCB_MAP_STATE_UNMAPPED;
177 w->input_only = TRUE;
181 printf("error getting attributes for window 0x%x\n", w->id);
184 w->ck_get_attr.sequence = 0;
188 window_get_geometry_reply(d_window_priv_t *w)
190 xcb_get_geometry_reply_t *rep;
191 xcb_generic_error_t *err = NULL;
193 rep = xcb_get_geometry_reply(w->sc->dpy->conn,
200 w->w = rep->width + rep->border_width * 2;
201 w->h = rep->height + rep->border_width * 2;
209 printf("error getting geometry for window 0x%x\n", w->id);
212 w->ck_get_geom.sequence = 0;
216 window_is_mapped(d_window_t *pubw)
218 d_window_priv_t *w = (d_window_priv_t*)pubw;
219 if (w->ck_get_attr.sequence)
220 window_get_attributes_reply(w);
225 window_get_pixmap(d_window_t *pubw)
227 d_window_priv_t *w = (d_window_priv_t*)pubw;
228 if (w->ck_get_pixmap.sequence) {
229 xcb_generic_error_t *err;
230 //printf("** checking get pixmap 0x%x\n", w->id);
231 err = xcb_request_check(w->sc->dpy->conn, w->ck_get_pixmap);
233 printf("error getting named pixmap for window 0x%x\n", w->id);
236 w->pixmap = XCB_NONE;
238 //printf("returning pixmap 0x%x for window 0x%x\n", w->pixmap, w->id);