all repos — openbox @ 23aea9b42f24195d915ca3f0c4fa9dca778ba1cd

openbox fork - make it a bit more like ryudo

better border support for stuff. add a borderColor resource, and allow borders with gradients. basically, they can only be used with flat stuff (not raised/lowered)
Dana Jansens danakj@orodu.net
commit

23aea9b42f24195d915ca3f0c4fa9dca778ba1cd

parent

1f5dd220e735a0a9c0532ff8aa8b361d3327b0f2

5 files changed, 94 insertions(+), 40 deletions(-)

jump to
M src/Image.ccsrc/Image.cc

@@ -107,54 +107,57 @@ for (unsigned int i = 0; i < height; i += 2)

XDrawLine(display, pixmap, peninterlace.gc(), 0, i, width, i); } - if (texture.texture() & BTexture::FlatBorder) { - BPen penborder(texture.colorTo()); - XDrawRectangle(display, pixmap, penborder.gc(), 0, 0, width-1, height-1); + int left = 0, top = 0, right = width - 1, bottom = height - 1; + + if (texture.texture() & BTexture::Border) { + BPen penborder(texture.borderColor()); + XDrawRectangle(display, pixmap, penborder.gc(), + left, top, right, bottom); } if (texture.texture() & BTexture::Bevel1) { if (texture.texture() & BTexture::Raised) { XDrawLine(display, pixmap, penshadow.gc(), - 0, height - 1, width - 1, height - 1); + left, bottom, right, bottom); XDrawLine(display, pixmap, penshadow.gc(), - width - 1, height - 1, width - 1, 0); + right, bottom, right, top); XDrawLine(display, pixmap, penlight.gc(), - 0, 0, width - 1, 0); + left, top, right, top); XDrawLine(display, pixmap, penlight.gc(), - 0, height - 1, 0, 0); + left, bottom, left, top); } else if (texture.texture() & BTexture::Sunken) { XDrawLine(display, pixmap, penlight.gc(), - 0, height - 1, width - 1, height - 1); + left, bottom, right, bottom); XDrawLine(display, pixmap, penlight.gc(), - width - 1, height - 1, width - 1, 0); + right, bottom, right, top); XDrawLine(display, pixmap, penshadow.gc(), - 0, 0, width - 1, 0); + left, top, right, top); XDrawLine(display, pixmap, penshadow.gc(), - 0, height - 1, 0, 0); + left, bottom, left, top); } } else if (texture.texture() & BTexture::Bevel2) { if (texture.texture() & BTexture::Raised) { XDrawLine(display, pixmap, penshadow.gc(), - 1, height - 3, width - 3, height - 3); + left + 1, bottom - 2, right - 2, bottom - 2); XDrawLine(display, pixmap, penshadow.gc(), - width - 3, height - 3, width - 3, 1); + right - 2, bottom - 2, right - 2, top + 1); XDrawLine(display, pixmap, penlight.gc(), - 1, 1, width - 3, 1); + left + 1, top + 1, right - 2, top + 1); XDrawLine(display, pixmap, penlight.gc(), - 1, height - 3, 1, 1); + left + 1, bottom - 2, left + 1, top + 1); } else if (texture.texture() & BTexture::Sunken) { XDrawLine(display, pixmap, penlight.gc(), - 1, height - 3, width - 3, height - 3); + left + 1, bottom - 2, right - 2, bottom - 2); XDrawLine(display, pixmap, penlight.gc(), - width - 3, height - 3, width - 3, 1); + right - 2, bottom - 2, right - 2, top + 1); XDrawLine(display, pixmap, penshadow.gc(), - 1, 1, width - 3, 1); + left + 1, top + 1, right - 2, top + 1); XDrawLine(display, pixmap, penshadow.gc(), - 1, height - 3, 1, 1); + left + 1, bottom - 2, left + 1, top + 1); } }

@@ -192,6 +195,8 @@ else if (texture.texture() & BTexture::PipeCross) pcgradient();

if (texture.texture() & BTexture::Bevel1) bevel1(); else if (texture.texture() & BTexture::Bevel2) bevel2(); + + if (texture.texture() & BTexture::Border) border(texture); if (inverted) invert();

@@ -812,6 +817,46 @@ *(pb++) = bb;

pr++; pg++; pb++; } + } +} + + +void BImage::border(const BTexture &texture) { + register unsigned int i; + int r = texture.borderColor().red(), + g = texture.borderColor().green(), + b = texture.borderColor().blue(); + + unsigned char *pr, *pg, *pb; + + // top line + pr = red; + pg = green; + pb = blue; + for (i = 0; i < width; ++i) { + *pr++ = r; + *pg++ = g; + *pb++ = b; + } + + // left and right lines (pr,pg,pb are already lined up) + for (i = 1; i < height - 1; ++i) { + *pr = r; + *pg = g; + *pb = b; + pr += width - 1; + pg += width - 1; + pb += width - 1; + *pr++ = r; + *pg++ = g; + *pb++ = b; + } + + // bottom line (pr,pg,pb are already lined up) + for (i = 0; i < width; ++i) { + *pr++ = r; + *pg++ = g; + *pb++ = b; } }
M src/Image.hhsrc/Image.hh

@@ -66,6 +66,7 @@

void invert(void); void bevel1(void); void bevel2(void); + void border(const BTexture &texture); void dgradient(void); void egradient(void); void hgradient(void);
M src/Screen.ccsrc/Screen.cc

@@ -2520,6 +2520,8 @@

texture.setColor(readDatabaseColor(rname + ".color", default_color, style)); texture.setColorTo(readDatabaseColor(rname + ".colorTo", default_color, style)); + texture.setBorderColor(readDatabaseColor(rname + ".borderColor", + default_color, style)); return texture; }
M src/Texture.ccsrc/Texture.cc

@@ -46,14 +46,14 @@

BTexture::BTexture(const BaseDisplay * const _display, unsigned int _screen, BImageControl* _ctrl) : c(_display, _screen), ct(_display, _screen), - lc(_display, _screen), sc(_display, _screen), t(0), + lc(_display, _screen), sc(_display, _screen), bc(_display, _screen), t(0), dpy(_display), ctrl(_ctrl), scrn(_screen) { } BTexture::BTexture(const string &d, const BaseDisplay * const _display, unsigned int _screen, BImageControl* _ctrl) : c(_display, _screen), ct(_display, _screen), - lc(_display, _screen), sc(_display, _screen), t(0), + lc(_display, _screen), sc(_display, _screen), bc(_display, _screen), t(0), dpy(_display), ctrl(_ctrl), scrn(_screen) { setDescription(d); }

@@ -128,14 +128,15 @@ }

if (descr.find("sunken") != string::npos) addTexture(BTexture::Sunken); - else if (descr.find("flatborder") != string::npos) - addTexture(BTexture::FlatBorder); else if (descr.find("flat") != string::npos) addTexture(BTexture::Flat); else addTexture(BTexture::Raised); - if (! (texture() & (BTexture::Flat | BTexture::FlatBorder))) { + if (texture() & BTexture::Flat) { + if (descr.find("border") != string::npos) + addTexture(BTexture::Border); + } else { if (descr.find("bevel2") != string::npos) addTexture(BTexture::Bevel2); else

@@ -160,6 +161,7 @@ c.setDisplay(_display, _screen);

ct.setDisplay(_display, _screen); lc.setDisplay(_display, _screen); sc.setDisplay(_display, _screen); + bc.setDisplay(_display, _screen); }

@@ -168,6 +170,7 @@ c = tt.c;

ct = tt.ct; lc = tt.lc; sc = tt.sc; + bc = tt.bc; descr = tt.descr; t = tt.t; dpy = tt.dpy;
M src/Texture.hhsrc/Texture.hh

@@ -35,24 +35,25 @@ public:

enum Type { // bevel options Flat = (1l<<0), - FlatBorder = (1l<<1), - Sunken = (1l<<2), - Raised = (1l<<3), + Sunken = (1l<<1), + Raised = (1l<<2), // textures - Solid = (1l<<4), - Gradient = (1l<<5), + Solid = (1l<<3), + Gradient = (1l<<4), // gradients - Horizontal = (1l<<6), - Vertical = (1l<<7), - Diagonal = (1l<<8), - CrossDiagonal = (1l<<9), - Rectangle = (1l<<10), - Pyramid = (1l<<11), - PipeCross = (1l<<12), - Elliptic = (1l<<13), + Horizontal = (1l<<5), + Vertical = (1l<<6), + Diagonal = (1l<<7), + CrossDiagonal = (1l<<8), + Rectangle = (1l<<9), + Pyramid = (1l<<10), + PipeCross = (1l<<11), + Elliptic = (1l<<12), // bevel types - Bevel1 = (1l<<14), - Bevel2 = (1l<<15), + Bevel1 = (1l<<13), + Bevel2 = (1l<<14), + // flat border + Border = (1l<<15), // inverted image Invert = (1l<<16), // parent relative image

@@ -69,11 +70,13 @@ unsigned int _screen = ~(0u), BImageControl* _ctrl = 0);

void setColor(const BColor &_color); void setColorTo(const BColor &_colorTo) { ct = _colorTo; } + void setBorderColor(const BColor &_borderColor) { bc = _borderColor; } const BColor &color(void) const { return c; } const BColor &colorTo(void) const { return ct; } const BColor &lightColor(void) const { return lc; } const BColor &shadowColor(void) const { return sc; } + const BColor &borderColor(void) const { return bc; } unsigned long texture(void) const { return t; } void setTexture(const unsigned long _texture) { t = _texture; }

@@ -98,7 +101,7 @@ Pixmap render(const unsigned int width, const unsigned int height,

const Pixmap old = 0); private: - BColor c, ct, lc, sc; + BColor c, ct, lc, sc, bc; std::string descr; unsigned long t; const BaseDisplay *dpy;