/* private stuff */
int ref;
+ int zombieref;
/* queried things, don't read them directly from the struct */
int x, y, w, h, bw;
w = malloc(sizeof(d_window_priv_t));
w->id = id;
w->ref = 1;
+ w->zombieref = 0;
w->sc = sc;
w->zombie = FALSE;
w->mapped = FALSE;
if (w && --w->ref == 0) {
screen_stacking_remove(w->sc, (d_window_t*)w);
- if (w->region) {
- xcb_xfixes_destroy_region(w->sc->dpy->conn, w->region);
- w->region = XCB_NONE;
- }
-
- if (w->pixmap) {
- /* this may cause an error if the pixmap was never valid, but
- that's fine */
- xcb_free_pixmap(w->sc->dpy->conn, w->pixmap);
- w->pixmap = XCB_NONE;
- }
+ assert(w->zombieref == 0);
+ while (w->zombieref)
+ window_zombie_unref(pubw);
list_unref(w->plugin_data);
free(w);
window_update_user_opacity(pubw);
window_update_type(w);
w->mapped = TRUE;
+
+ /* hold one reference for ourselves */
+ window_zombie_ref(pubw);
}
void
XCB_CW_EVENT_MASK, &mask);
w->mapped = FALSE;
+
+ /* try to free zombie things */
+ window_zombie_unref(pubw);
}
void
w->zombie = TRUE;
}
+void
+window_zombie_dead(d_window_t *pubw)
+{
+ d_window_priv_t *w = (d_window_priv_t*)pubw;
+
+ if (!w->zombie) return;
+
+ w->zombie = FALSE;
+}
+
gboolean
window_is_zombie(d_window_t *pubw)
{
w->type = DC_WINDOW_TYPE_NORMAL;
w->client = w->id;
}
-
- printf("window 0x%x type %d\n", w->id, w->type);
+ //printf("window 0x%x type %d\n", w->id, w->type);
}
d_window_type_t
d_window_priv_t *w = (d_window_priv_t*)pubw;
w->opacity = o;
- if (w->mapped)
+ if (w->mapped || w->zombie) {
w->sc->window_opacity_change(pubw);
+ screen_refresh(w->sc);
+ }
+ //printf("mapped %d opacity 0x%x\n", w->mapped, w->opacity);
+}
+
+void
+window_zombie_ref(d_window_t *pubw)
+{
+ d_window_priv_t *w = (d_window_priv_t*)pubw;
+
+ ++w->zombieref;
+}
+
+void
+window_zombie_unref(d_window_t *pubw)
+{
+ d_window_priv_t *w = (d_window_priv_t*)pubw;
+
+ if (--w->zombieref == 0) {
+ w->zombie = FALSE;
+
+ if (w->region) {
+ xcb_xfixes_destroy_region(w->sc->dpy->conn, w->region);
+ w->region = XCB_NONE;
+ }
+
+ if (w->pixmap) {
+ /* this may cause an error if the pixmap was never valid, but
+ that's fine */
+ xcb_free_pixmap(w->sc->dpy->conn, w->pixmap);
+ w->pixmap = XCB_NONE;
+ }
+
+ w->sc->window_zombie_dead(pubw);
+ }
}