Fixes for window fade-outs
When a window resizes while it is unmapped, don't destroy it's pixmap, as that kills and fade going on. If a window is already unmapped (and therefore already fading out, don't override the fadeout with a new one when the window is destroyed. When a window maps, if it already has a pixmap, this is stale data, so free it so that a new pixmap can be retrieved from the newly mapped window.
This commit is contained in:
parent
73f6ed3310
commit
2c1a928e59
21
xcompmgr.c
21
xcompmgr.c
|
@ -1192,6 +1192,17 @@ map_win (Display *dpy, Window id, unsigned long sequence, Bool fade)
|
||||||
#endif
|
#endif
|
||||||
w->damaged = 0;
|
w->damaged = 0;
|
||||||
|
|
||||||
|
#if HAS_NAME_WINDOW_PIXMAP
|
||||||
|
/* If the window was previously mapped and its pixmap still exists, it
|
||||||
|
is out of date now, so force us to reacquire it. (If the window
|
||||||
|
re-maps before the unmap fade-out finished) */
|
||||||
|
if (w->pixmap)
|
||||||
|
{
|
||||||
|
XFreePixmap (dpy, w->pixmap);
|
||||||
|
w->pixmap = None;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (fade && fadeWindows)
|
if (fade && fadeWindows)
|
||||||
set_fade (dpy, w, 0, get_opacity_percent (dpy, w, 1.0), fade_in_step, 0, False, True, True);
|
set_fade (dpy, w, 0, get_opacity_percent (dpy, w, 1.0), fade_in_step, 0, False, True, True);
|
||||||
}
|
}
|
||||||
|
@ -1541,7 +1552,9 @@ configure_win (Display *dpy, XConfigureEvent *ce)
|
||||||
}
|
}
|
||||||
w->a.x = ce->x;
|
w->a.x = ce->x;
|
||||||
w->a.y = ce->y;
|
w->a.y = ce->y;
|
||||||
if (w->a.width != ce->width || w->a.height != ce->height)
|
/* Only destroy the pixmap if the window is mapped */
|
||||||
|
if (w->a.map_state != IsUnmapped &&
|
||||||
|
(w->a.width != ce->width || w->a.height != ce->height))
|
||||||
{
|
{
|
||||||
#if HAS_NAME_WINDOW_PIXMAP
|
#if HAS_NAME_WINDOW_PIXMAP
|
||||||
if (w->pixmap)
|
if (w->pixmap)
|
||||||
|
@ -1566,7 +1579,7 @@ configure_win (Display *dpy, XConfigureEvent *ce)
|
||||||
w->a.border_width = ce->border_width;
|
w->a.border_width = ce->border_width;
|
||||||
w->a.override_redirect = ce->override_redirect;
|
w->a.override_redirect = ce->override_redirect;
|
||||||
restack_win (dpy, w, ce->above);
|
restack_win (dpy, w, ce->above);
|
||||||
if (damage)
|
if (w->a.map_state != IsUnmapped && damage)
|
||||||
{
|
{
|
||||||
XserverRegion extents = win_extents (dpy, w);
|
XserverRegion extents = win_extents (dpy, w);
|
||||||
XFixesUnionRegion (dpy, damage, damage, extents);
|
XFixesUnionRegion (dpy, damage, damage, extents);
|
||||||
|
@ -1651,7 +1664,9 @@ destroy_win (Display *dpy, Window id, Bool gone, Bool fade)
|
||||||
win *w = find_win (dpy, id);
|
win *w = find_win (dpy, id);
|
||||||
#if HAS_NAME_WINDOW_PIXMAP
|
#if HAS_NAME_WINDOW_PIXMAP
|
||||||
if (w && w->pixmap && fade && fadeWindows)
|
if (w && w->pixmap && fade && fadeWindows)
|
||||||
set_fade (dpy, w, w->opacity*1.0/OPAQUE, 0.0, fade_out_step, destroy_callback, gone, False, True);
|
set_fade (dpy, w, w->opacity*1.0/OPAQUE, 0.0, fade_out_step,
|
||||||
|
destroy_callback, gone, False,
|
||||||
|
(w->a.map_state != IsUnmapped));
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue