all repos — openbox @ a79651294c54a784b34c85e3832e8c7ca4f3aa17

openbox fork - make it a bit more like ryudo

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!
Dana Jansens danakj@orodu.net
commit

a79651294c54a784b34c85e3832e8c7ca4f3aa17

parent

efedb4df9c18ff68630ecb6fa9c012b459207e7d

2 files changed, 20 insertions(+), 7 deletions(-)

jump to
M render/render.crender/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 @@ Pixmap oldp;

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 @@ sw = a->surface.parent->w;

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 @@ if ((a->surface.grad != RR_SURFACE_SOLID) || (a->surface.interlaced))

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); }
M render/render.hrender/render.h

@@ -237,9 +237,13 @@ gint shadow_offset_x, gint shadow_offset_y);

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,