Misc: Clean up

- Add 4 helper free functions that free XserverRegion, Damage, Picture,
  and Pixmap.

- Rename w->shadow to w->shadow_pict. Add a bool member w->shadow to
  prepare for a future change.
This commit is contained in:
Richard Grenville 2012-09-16 23:12:02 +08:00
parent 4293a4626a
commit 64d53f6534
2 changed files with 82 additions and 119 deletions

View File

@ -278,13 +278,11 @@ run_fades(Display *dpy) {
determine_mode(dpy, w); determine_mode(dpy, w);
if (w->shadow) { if (w->shadow_pict) {
XRenderFreePicture(dpy, w->shadow); XRenderFreePicture(dpy, w->shadow_pict);
w->shadow = None; w->shadow_pict = None;
if (w->extents != None) { free_region(dpy, &w->extents);
XFixesDestroyRegion(dpy, w->extents);
}
/* rebuild the shadow */ /* rebuild the shadow */
w->extents = win_extents(dpy, w); w->extents = win_extents(dpy, w);
@ -900,18 +898,18 @@ win_extents(Display *dpy, win *w) {
w->shadow_dx = shadow_offset_x; w->shadow_dx = shadow_offset_x;
w->shadow_dy = shadow_offset_y; w->shadow_dy = shadow_offset_y;
if (!w->shadow) { if (!w->shadow_pict) {
double opacity = shadow_opacity; double opacity = shadow_opacity;
if (w->mode != WINDOW_SOLID) { if (w->mode != WINDOW_SOLID) {
opacity = opacity * ((double)w->opacity) / ((double)OPAQUE); opacity = opacity * get_opacity_percent(dpy, w);
} }
if (HAS_FRAME_OPACITY(w)) { if (HAS_FRAME_OPACITY(w)) {
opacity = opacity * frame_opacity; opacity = opacity * frame_opacity;
} }
w->shadow = shadow_picture( w->shadow_pict = shadow_picture(
dpy, opacity, w->alpha_pict, dpy, opacity, w->alpha_pict,
w->a.width + w->a.border_width * 2, w->a.width + w->a.border_width * 2,
w->a.height + w->a.border_width * 2, w->a.height + w->a.border_width * 2,
@ -1114,15 +1112,9 @@ paint_all(Display *dpy, XserverRegion region) {
#endif #endif
if (clip_changed) { if (clip_changed) {
win_free_border_size(dpy, w); free_region(dpy, &w->border_size);
if (w->extents) { free_region(dpy, &w->extents);
XFixesDestroyRegion(dpy, w->extents); free_region(dpy, &w->border_clip);
w->extents = None;
}
if (w->border_clip) {
XFixesDestroyRegion(dpy, w->border_clip);
w->border_clip = None;
}
} }
if (!w->border_size) { if (!w->border_size) {
@ -1190,7 +1182,7 @@ paint_all(Display *dpy, XserverRegion region) {
if (win_type_shadow[w->window_type]) { if (win_type_shadow[w->window_type]) {
XRenderComposite( XRenderComposite(
dpy, PictOpOver, cshadow_picture, w->shadow, dpy, PictOpOver, cshadow_picture, w->shadow_pict,
root_buffer, 0, 0, 0, 0, root_buffer, 0, 0, 0, 0,
w->a.x + w->shadow_dx, w->a.y + w->shadow_dy, w->a.x + w->shadow_dx, w->a.y + w->shadow_dy,
w->shadow_width, w->shadow_height); w->shadow_width, w->shadow_height);
@ -1198,7 +1190,7 @@ paint_all(Display *dpy, XserverRegion region) {
if (w->opacity != OPAQUE && !w->alpha_pict) { if (w->opacity != OPAQUE && !w->alpha_pict) {
w->alpha_pict = solid_picture( w->alpha_pict = solid_picture(
dpy, False, (double)w->opacity / OPAQUE, 0, 0, 0); dpy, False, get_opacity_percent(dpy, w), 0, 0, 0);
} }
if (HAS_FRAME_OPACITY(w) && !w->alpha_border_pict) { if (HAS_FRAME_OPACITY(w) && !w->alpha_border_pict) {
@ -1269,8 +1261,7 @@ paint_all(Display *dpy, XserverRegion region) {
} }
} }
XFixesDestroyRegion(dpy, w->border_clip); free_region(dpy, &w->border_clip);
w->border_clip = None;
} }
XFixesDestroyRegion(dpy, region); XFixesDestroyRegion(dpy, region);
@ -1533,29 +1524,13 @@ finish_unmap_win(Display *dpy, win *w) {
} }
#if HAS_NAME_WINDOW_PIXMAP #if HAS_NAME_WINDOW_PIXMAP
if (w->pixmap) { free_pixmap(dpy, &w->pixmap);
XFreePixmap(dpy, w->pixmap);
w->pixmap = None;
}
#endif #endif
if (w->picture) { free_picture(dpy, &w->picture);
set_ignore(dpy, NextRequest(dpy)); free_region(dpy, &w->border_size);
XRenderFreePicture(dpy, w->picture); free_picture(dpy, &w->shadow_pict);
w->picture = None; free_region(dpy, &w->border_clip);
}
win_free_border_size(dpy, w);
if (w->shadow) {
XRenderFreePicture(dpy, w->shadow);
w->shadow = None;
}
if (w->border_clip) {
XFixesDestroyRegion(dpy, w->border_clip);
w->border_clip = None;
}
clip_changed = True; clip_changed = True;
} }
@ -1586,7 +1561,7 @@ unmap_win(Display *dpy, Window id, Bool fade) {
#if HAS_NAME_WINDOW_PIXMAP #if HAS_NAME_WINDOW_PIXMAP
if (w->pixmap && fade && win_type_fade[w->window_type]) { if (w->pixmap && fade && win_type_fade[w->window_type]) {
set_fade(dpy, w, w->opacity * 1.0 / OPAQUE, 0.0, set_fade(dpy, w, get_opacity_percent(dpy, w), 0.0,
fade_out_step, unmap_callback, False, True); fade_out_step, unmap_callback, False, True);
} else } else
#endif #endif
@ -1615,7 +1590,7 @@ get_opacity_prop(Display *dpy, win *w, opacity_t def) {
static double static double
get_opacity_percent(Display *dpy, win *w) { get_opacity_percent(Display *dpy, win *w) {
return w->opacity * 1.0 / OPAQUE; return ((double) w->opacity) / OPAQUE;
} }
static void static void
@ -1625,20 +1600,8 @@ determine_mode(Display *dpy, win *w) {
/* if trans prop == -1 fall back on previous tests */ /* if trans prop == -1 fall back on previous tests */
if (w->alpha_pict) { free_picture(dpy, &w->alpha_pict);
XRenderFreePicture(dpy, w->alpha_pict); free_picture(dpy, &w->alpha_border_pict);
w->alpha_pict = None;
}
if (w->alpha_border_pict) {
XRenderFreePicture(dpy, w->alpha_border_pict);
w->alpha_border_pict = None;
}
if (w->shadow_pict) {
XRenderFreePicture(dpy, w->shadow_pict);
w->shadow_pict = None;
}
if (w->a.class == InputOnly) { if (w->a.class == InputOnly) {
format = 0; format = 0;
@ -1668,13 +1631,11 @@ set_opacity(Display *dpy, win *w, opacity_t opacity) {
w->opacity = opacity; w->opacity = opacity;
determine_mode(dpy, w); determine_mode(dpy, w);
if (w->shadow) { if (w->shadow_pict) {
XRenderFreePicture(dpy, w->shadow); XRenderFreePicture(dpy, w->shadow_pict);
w->shadow = None; w->shadow_pict = None;
if (w->extents != None) { free_region(dpy, &w->extents);
XFixesDestroyRegion(dpy, w->extents);
}
/* rebuild the shadow */ /* rebuild the shadow */
w->extents = win_extents(dpy, w); w->extents = win_extents(dpy, w);
@ -1815,10 +1776,10 @@ add_win(Display *dpy, Window id, Window prev, Bool override_redirect) {
new->alpha_pict = None; new->alpha_pict = None;
new->alpha_border_pict = None; new->alpha_border_pict = None;
new->shadow = False;
new->shadow_pict = None; new->shadow_pict = None;
new->border_size = None; new->border_size = None;
new->extents = None; new->extents = None;
new->shadow = None;
new->shadow_dx = 0; new->shadow_dx = 0;
new->shadow_dy = 0; new->shadow_dy = 0;
new->shadow_width = 0; new->shadow_width = 0;
@ -1957,20 +1918,10 @@ configure_win(Display *dpy, XConfigureEvent *ce) {
if (w->a.width != ce->width || w->a.height != ce->height) { if (w->a.width != ce->width || w->a.height != ce->height) {
#if HAS_NAME_WINDOW_PIXMAP #if HAS_NAME_WINDOW_PIXMAP
if (w->pixmap) { free_pixmap(dpy, &w->pixmap);
XFreePixmap(dpy, w->pixmap); free_picture(dpy, &w->picture);
w->pixmap = None;
if (w->picture) {
XRenderFreePicture(dpy, w->picture);
w->picture = None;
}
}
#endif #endif
free_picture(dpy, &w->shadow_pict);
if (w->shadow) {
XRenderFreePicture(dpy, w->shadow);
w->shadow = None;
}
} }
w->a.width = ce->width; w->a.width = ce->width;
@ -2016,32 +1967,10 @@ finish_destroy_win(Display *dpy, Window id) {
finish_unmap_win(dpy, w); finish_unmap_win(dpy, w);
*prev = w->next; *prev = w->next;
if (w->alpha_pict) { free_picture(dpy, &w->alpha_pict);
XRenderFreePicture(dpy, w->alpha_pict); free_picture(dpy, &w->alpha_border_pict);
w->alpha_pict = None; free_picture(dpy, &w->shadow_pict);
} free_damage(dpy, &w->damage);
if (w->alpha_border_pict) {
XRenderFreePicture(dpy, w->alpha_border_pict);
w->alpha_border_pict = None;
}
if (w->shadow_pict) {
XRenderFreePicture(dpy, w->shadow_pict);
w->shadow_pict = None;
}
/* fix leak, from freedesktop repo */
if (w->shadow) {
XRenderFreePicture(dpy, w->shadow);
w->shadow = None;
}
if (w->damage != None) {
set_ignore(dpy, NextRequest(dpy));
XDamageDestroy(dpy, w->damage);
w->damage = None;
}
cleanup_fade(dpy, w); cleanup_fade(dpy, w);
free(w); free(w);

View File

@ -97,10 +97,10 @@ typedef struct _win {
Picture picture; Picture picture;
Picture alpha_pict; Picture alpha_pict;
Picture alpha_border_pict; Picture alpha_border_pict;
Picture shadow_pict;
XserverRegion border_size; XserverRegion border_size;
XserverRegion extents; XserverRegion extents;
Picture shadow; Bool shadow;
Picture shadow_pict;
int shadow_dx; int shadow_dx;
int shadow_dy; int shadow_dy;
int shadow_width; int shadow_width;
@ -159,6 +159,8 @@ extern Atom atom_client_attr;
// inline functions must be made static to compile correctly under clang: // inline functions must be made static to compile correctly under clang:
// http://clang.llvm.org/compatibility.html#inline // http://clang.llvm.org/compatibility.html#inline
// Helper functions
/** /**
* Normalize an int value to a specific range. * Normalize an int value to a specific range.
* *
@ -255,6 +257,50 @@ print_timestamp(void) {
} }
#endif #endif
/**
* Destroy a <code>XserverRegion</code>.
*/
inline static void
free_region(Display *dpy, XserverRegion *p) {
if (*p) {
XFixesDestroyRegion(dpy, *p);
*p = None;
}
}
/**
* Destroy a <code>Picture</code>.
*/
inline static void
free_picture(Display *dpy, Picture *p) {
if (*p) {
XRenderFreePicture(dpy, *p);
*p = None;
}
}
/**
* Destroy a <code>Pixmap</code>.
*/
inline static void
free_pixmap(Display *dpy, Pixmap *p) {
if (*p) {
XFreePixmap(dpy, *p);
*p = None;
}
}
/**
* Destroy a <code>Damage</code>.
*/
inline static void
free_damage(Display *dpy, Damage *p) {
if (*p) {
XDamageDestroy(dpy, *p);
*p = None;
}
}
/** /**
* Determine if a window has a specific attribute. * Determine if a window has a specific attribute.
* *
@ -544,18 +590,6 @@ ev_damage_notify(XDamageNotifyEvent *ev);
inline static void inline static void
ev_shape_notify(XShapeEvent *ev); ev_shape_notify(XShapeEvent *ev);
/**
* Destory the cached border_size of a window.
*/
inline static void
win_free_border_size(Display *dpy, win *w) {
if (w->border_size) {
set_ignore(dpy, NextRequest(dpy));
XFixesDestroyRegion(dpy, w->border_size);
w->border_size = None;
}
}
/** /**
* Get a region of the screen size. * Get a region of the screen size.
*/ */