void clientwin_destroy(ClientWin *cw, bool destroyed) { MainWin *mw = cw->mainwin; session_t * const ps = mw->ps; free_picture(ps, &cw->origin); free_picture(ps, &cw->destination); free_pixmap(ps, &cw->pixmap); free_pixmap(ps, &cw->cpixmap); if (cw->src.window && !destroyed) { free_damage(ps, &cw->damage); // Stop listening to events, this should be safe because we don't // monitor window re-map anyway XSelectInput(ps->dpy, cw->src.window, 0); if (cw->redirected) XCompositeUnredirectWindow(ps->dpy, cw->src.window, CompositeRedirectAutomatic); } if (cw->mini.window) { // Somehow it doesn't work without unmapping firstly XUnmapWindow(ps->dpy, cw->mini.window); XDestroyWindow(ps->dpy, cw->mini.window); } free(cw); }
static void meta_surface_actor_x11_dispose (GObject *object) { MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (object); detach_pixmap (self); free_damage (self); G_OBJECT_CLASS (meta_surface_actor_x11_parent_class)->dispose (object); }
static void window_decorated_notify (MetaWindow *window, GParamSpec *pspec, gpointer user_data) { MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (user_data); detach_pixmap (self); free_damage (self); create_damage (self); }
void clientwin_map(ClientWin *cw) { session_t *ps = cw->mainwin->ps; free_damage(ps, &cw->damage); cw->damage = XDamageCreate(ps->dpy, cw->src.window, XDamageReportDeltaRectangles); XRenderSetPictureTransform(ps->dpy, cw->origin, &cw->mainwin->transform); clientwin_render(cw); XMapWindow(ps->dpy, cw->mini.window); XRaiseWindow(ps->dpy, cw->mini.window); }