From a79651294c54a784b34c85e3832e8c7ca4f3aa17 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 7 Mar 2007 22:57:10 +0000 Subject: [PATCH] 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! --- render/render.c | 17 +++++++++++++---- 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, -- 2.39.2