diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-03-07 22:57:10 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-03-07 22:57:10 +0000 |
| commit | a79651294c54a784b34c85e3832e8c7ca4f3aa17 (patch) | |
| tree | 8c5e7f7544f728db4f292860bbcf19b3ce7784a0 | |
| parent | efedb4df9c18ff68630ecb6fa9c012b459207e7d (diff) | |
Split RrPaint to RrPaint and RrPaintPixmap, so you can paint things other than windows. If you don't free the returned pixmap though, you will be leaking memory in the server!
| -rw-r--r-- | render/render.c | 17 | ||||
| -rw-r--r-- | render/render.h | 10 |
2 files changed, 20 insertions, 7 deletions
diff --git a/render/render.c b/render/render.c index 669761d5..df47d6db 100644 --- a/render/render.c +++ b/render/render.c @@ -38,7 +38,7 @@ static void pixel_data_to_pixmap(RrAppearance *l, gint x, gint y, gint w, gint h); -void RrPaint(RrAppearance *a, Window win, gint w, gint h) +Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h) { gint i, transferred = 0, sw, sh, partial_w, partial_h; RrPixel32 *source, *dest; @@ -46,11 +46,11 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) RrRect tarea; /* area in which to draw textures */ gboolean resized; - if (w <= 0 || h <= 0) return; + if (w <= 0 || h <= 0) return None; if (a->surface.parentx < 0 || a->surface.parenty < 0) { /* ob_debug("Invalid parent co-ordinates\n"); */ - return; + return None; } resized = (a->w != w || a->h != h); @@ -80,7 +80,7 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) sh = a->surface.parent->h; if (a->surface.parentx >= sw || a->surface.parenty >= sh) { - return; + return oldp; } source = (a->surface.parent->surface.pixel_data + @@ -164,8 +164,17 @@ void RrPaint(RrAppearance *a, Window win, gint w, gint h) pixel_data_to_pixmap(a, 0, 0, w, h); } + return oldp; +} + +void RrPaint(RrAppearance *a, Window win, gint w, gint h) +{ + Pixmap oldp; + + oldp = RrPaintPixmap(a, w, h); XSetWindowBackgroundPixmap(RrDisplay(a->inst), win, a->pixmap); XClearWindow(RrDisplay(a->inst), win); + /* free this after changing the visible pixmap */ if (oldp) XFreePixmap(RrDisplay(a->inst), oldp); } diff --git a/render/render.h b/render/render.h index d03db8d5..a327756f 100644 --- a/render/render.h +++ b/render/render.h @@ -237,9 +237,13 @@ RrSize *RrFontMeasureString (const RrFont *f, const gchar *str, gint RrFontHeight (const RrFont *f, gint shadow_offset_y); gint RrFontMaxCharWidth (const RrFont *f); -void RrPaint (RrAppearance *a, Window win, gint w, gint h); -void RrMinsize (RrAppearance *a, gint *w, gint *h); -void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b); +/* Paint into the appearance. The old pixmap is returned (if there was one). It + is the responsibility of the caller to call XFreePixmap on the return when + it is non-null. */ +Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h); +void RrPaint (RrAppearance *a, Window win, gint w, gint h); +void RrMinsize (RrAppearance *a, gint *w, gint *h); +void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b); gboolean RrPixmapToRGBA(const RrInstance *inst, Pixmap pmap, Pixmap mask, |
