unsigned int opacity;
wintype windowType;
unsigned long damage_sequence; /* sequence when damage was created */
+ Bool destroyed;
Bool need_configure;
XConfigureEvent queue_configure;
{
XRenderFreePicture (dpy, w->shadow);
w->shadow = None;
- w->extents = win_extents (dpy, w);
+
+ if (w->extents != None)
+ XFixesDestroyRegion (dpy, w->extents);
+
+ /* rebuild the shadow */
+ w->extents = win_extents (dpy, w);
}
+
+ /* fading windows need to be drawn, mark them as damaged.
+ when a window maps, if it tries to fade in but it already at the right
+ opacity (map/unmap/map fast) then it will never get drawn without this
+ until it repaints */
+ w->damaged = 1;
}
int
{
XRenderFreePicture (dpy, w->shadow);
w->shadow = None;
+
+ if (w->extents != None)
+ XFixesDestroyRegion (dpy, w->extents);
+
+ /* rebuild the shadow */
w->extents = win_extents(dpy, w);
}
/* Must do this last as it might destroy f->w in callbacks */
win *w;
for (w = list; w; w = w->next)
- if (w->id == id)
+ if (w->id == id && !w->destroyed)
return w;
return 0;
}
Drawable draw = w->id;
#if HAS_NAME_WINDOW_PIXMAP
- if (hasNamePixmap && !w->pixmap)
- w->pixmap = XCompositeNameWindowPixmap (dpy, w->id);
+ if (hasNamePixmap && !w->pixmap) {
+ set_ignore (dpy, NextRequest (dpy));
+ w->pixmap = XCompositeNameWindowPixmap (dpy, w->id);
+ }
if (w->pixmap)
draw = w->pixmap;
#endif
if (prev)
{
for (p = &list; *p; p = &(*p)->next)
- if ((*p)->id == prev)
+ if ((*p)->id == prev && !(*p)->destroyed)
break;
}
else
else
{
new->damage_sequence = NextRequest (dpy);
+ set_ignore (dpy, NextRequest (dpy));
new->damage = XDamageCreate (dpy, id, XDamageReportNonEmpty);
}
new->alphaPict = None;
new->shadow_width = 0;
new->shadow_height = 0;
new->opacity = OPAQUE;
+ new->destroyed = False;
new->need_configure = False;
new->borderClip = None;
/* rehook */
for (prev = &list; *prev; prev = &(*prev)->next)
{
- if ((*prev)->id == new_above)
+ if ((*prev)->id == new_above && !(*prev)->destroyed)
break;
}
w->next = *prev;
XFixesDestroyRegion (dpy, extents);
add_damage (dpy, damage);
}
+
+ clipChanged = True;
}
+
w->a.override_redirect = ce->override_redirect;
restack_win (dpy, w, ce->above);
- clipChanged = True;
}
static void
win **prev, *w;
for (prev = &list; (w = *prev); prev = &w->next)
- if (w->id == id)
+ if (w->id == id && w->destroyed)
{
finish_unmap_win (dpy, w);
*prev = w->next;
{
win *w = find_win (dpy, id);
+ if (w) w->destroyed = True;
+
#if HAS_NAME_WINDOW_PIXMAP
if (w && w->pixmap && fade && winTypeFade[w->windowType])
set_fade (dpy, w, w->opacity*1.0/OPAQUE, 0.0, fade_out_step,
- destroy_callback, False, (w->a.map_state != IsUnmapped));
+ destroy_callback, False, True);
else
#endif
{
fade_out_step, 0, True, False);
else
{
- w->opacity = get_opacity_prop(dpy, w, OPAQUE);
- determine_mode(dpy, w);
+ w->opacity = get_opacity_prop(dpy, w, OPAQUE);
+ determine_mode(dpy, w);
if (w->shadow)
{
XRenderFreePicture (dpy, w->shadow);
w->shadow = None;
+
+ if (w->extents != None)
+ XFixesDestroyRegion (dpy, w->extents);
+
+ /* rebuild the shadow */
w->extents = win_extents (dpy, w);
}
}