Allow a configurable border color. - sam - An updated version of the sam text editor.
(HTM) git clone git://vernunftzentrum.de/sam.git
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit 24c99b85f003d2e76ca80334f5e8604e8ef15398
(DIR) parent bbfde92dd63eb2d1d28f48aff13ecd90e6574c76
(HTM) Author: Rob King <jking@deadpixi.com>
Date: Sun, 14 Aug 2016 23:24:39 -0500
Allow a configurable border color.
Diffstat:
include/libg.h | 4 ++--
libXg/bitblt.c | 9 ++++++---
libXg/border.c | 36 ++++++++++++++++---------------
libXg/gcs.c | 12 ++++--------
libXg/getrect.c | 4 ++--
libXg/libgint.h | 4 ++--
libXg/menuhit.c | 4 ++--
libXg/xtbinit.c | 8 +++++---
libframe/frdelete.c | 8 ++++----
libframe/frinsert.c | 10 +++++-----
libframe/frselect.c | 8 ++++----
samterm/flayer.c | 20 ++++++++++----------
samterm/scroll.c | 8 ++++----
13 files changed, 69 insertions(+), 66 deletions(-)
---
(DIR) diff --git a/include/libg.h b/include/libg.h
@@ -155,7 +155,7 @@ extern int rectclip(Rectangle*, Rectangle);
extern void xtbinit(Errfunc, char*, int*, char**, char**);
extern void bclose(void);
extern void berror(char*);
-extern void bitblt2(Bitmap*, Point, Bitmap*, Rectangle, Fcode, unsigned long);
+extern void bitblt2(Bitmap*, Point, Bitmap*, Rectangle, Fcode, unsigned long, unsigned long);
extern void bitblt(Bitmap*, Point, Bitmap*, Rectangle, Fcode);
extern void copymasked(Bitmap*, Point, Bitmap*, Bitmap*, Rectangle);
extern int bitbltclip(void*);
@@ -179,7 +179,7 @@ extern int ptinrect(Point, Rectangle);
extern int rectXrect(Rectangle, Rectangle);
extern int eqpt(Point, Point);
extern int eqrect(Rectangle, Rectangle);
-extern void border(Bitmap*, Rectangle, int, Fcode);
+extern void border(Bitmap*, Rectangle, int, Fcode, unsigned long);
extern void cursorswitch(Cursor*);
extern void cursorset(Point);
extern Rectangle bscreenrect(Rectangle*);
(DIR) diff --git a/libXg/bitblt.c b/libXg/bitblt.c
@@ -7,17 +7,20 @@
void
bitblt(Bitmap *d, Point p, Bitmap *s, Rectangle r, Fcode f)
{
- bitblt2(d, p, s, r, f, _bgpixel);
+ bitblt2(d, p, s, r, f, _fgpixel, _bgpixel);
}
void
-bitblt2(Bitmap *d, Point p, Bitmap *s, Rectangle r, Fcode f, unsigned long bg)
+bitblt2(Bitmap *d, Point p, Bitmap *s, Rectangle r, Fcode f, unsigned long fg, unsigned long bg)
{
int sx, sy, dx, dy, bfunc;
GC g;
unsigned long plane;
Bitmap *btmp;
+ if (fg == 0)
+ fg = _fgpixel;
+
if (bg == 0)
bg = _bgpixel;
@@ -35,7 +38,7 @@ bitblt2(Bitmap *d, Point p, Bitmap *s, Rectangle r, Fcode f, unsigned long bg)
dx -= d->r.min.x;
dy -= d->r.min.y;
}
- g = _getcopygc2(f, d, s, &bfunc, bg);
+ g = _getcopygc2(f, d, s, &bfunc, fg, bg);
if(bfunc == UseCopyArea)
XCopyArea(_dpy, (Drawable)s->id, (Drawable)d->id, g,
sx, sy, Dx(r), Dy(r), dx, dy);
(DIR) diff --git a/libXg/border.c b/libXg/border.c
@@ -3,26 +3,28 @@
#include <libc.h>
#include <libg.h>
+extern unsigned long _borderpixel;
+
void
-border(Bitmap *l, Rectangle r, int i, Fcode c)
+border(Bitmap *l, Rectangle r, int i, Fcode c, unsigned long bg)
{
if(i > 0){
- bitblt(l, r.min,
- l, Rect(r.min.x, r.min.y, r.max.x, r.min.y+i), c);
- bitblt(l, Pt(r.min.x, r.max.y-i),
- l, Rect(r.min.x, r.max.y-i, r.max.x, r.max.y), c);
- bitblt(l, Pt(r.min.x, r.min.y+i),
- l, Rect(r.min.x, r.min.y+i, r.min.x+i, r.max.y-i), c);
- bitblt(l, Pt(r.max.x-i, r.min.y+i),
- l, Rect(r.max.x-i, r.min.y+i, r.max.x, r.max.y-i), c);
+ bitblt2(l, r.min,
+ l, Rect(r.min.x, r.min.y, r.max.x, r.min.y+i), c, _borderpixel, bg);
+ bitblt2(l, Pt(r.min.x, r.max.y-i),
+ l, Rect(r.min.x, r.max.y-i, r.max.x, r.max.y), c, _borderpixel, bg);
+ bitblt2(l, Pt(r.min.x, r.min.y+i),
+ l, Rect(r.min.x, r.min.y+i, r.min.x+i, r.max.y-i), c, _borderpixel, bg);
+ bitblt2(l, Pt(r.max.x-i, r.min.y+i),
+ l, Rect(r.max.x-i, r.min.y+i, r.max.x, r.max.y-i), c, _borderpixel, bg);
}else if(i < 0){
- bitblt(l, Pt(r.min.x, r.min.y+i),
- l, Rect(r.min.x, r.min.y+i, r.max.x, r.min.y), c);
- bitblt(l, Pt(r.min.x, r.max.y),
- l, Rect(r.min.x, r.max.y, r.max.x, r.max.y-i), c);
- bitblt(l, Pt(r.min.x+i, r.min.y+i),
- l, Rect(r.min.x+i, r.min.y+i, r.min.x, r.max.y-i), c);
- bitblt(l, Pt(r.max.x, r.min.y+i),
- l, Rect(r.max.x, r.min.y+i, r.max.x-i, r.max.y-i), c);
+ bitblt2(l, Pt(r.min.x, r.min.y+i),
+ l, Rect(r.min.x, r.min.y+i, r.max.x, r.min.y), c, _borderpixel, bg);
+ bitblt2(l, Pt(r.min.x, r.max.y),
+ l, Rect(r.min.x, r.max.y, r.max.x, r.max.y-i), c, _borderpixel, bg);
+ bitblt2(l, Pt(r.min.x+i, r.min.y+i),
+ l, Rect(r.min.x+i, r.min.y+i, r.min.x, r.max.y-i), c, _borderpixel, bg);
+ bitblt2(l, Pt(r.max.x, r.min.y+i),
+ l, Rect(r.max.x, r.min.y+i, r.max.x-i, r.max.y-i), c, _borderpixel, bg);
}
}
(DIR) diff --git a/libXg/gcs.c b/libXg/gcs.c
@@ -201,18 +201,16 @@ _getgc(Bitmap *b, unsigned long gcvm, XGCValues *pgcv)
GC
_getfillgc(Fcode f, Bitmap *b, unsigned long val)
{
- return _getfillgc2(f, b, val, _bgpixel);
+ return _getfillgc2(f, b, val, _fgpixel, _bgpixel);
}
GC
-_getfillgc2(Fcode f, Bitmap *b, unsigned long val, unsigned long bg)
+_getfillgc2(Fcode f, Bitmap *b, unsigned long val, unsigned long fg, unsigned long bg)
{
int xf, m;
unsigned long v, spix, vmax;
XGCValues gcv;
- unsigned long fg = _fgpixel;
-
f &= F;
vmax = _ld2dmask[b->ldepth];
v = val & vmax;
@@ -303,19 +301,17 @@ _getfillgc2(Fcode f, Bitmap *b, unsigned long val, unsigned long bg)
GC
_getcopygc(Fcode f, Bitmap *db, Bitmap *sb, int *bltfunc)
{
- return _getcopygc2(f, db, sb, bltfunc, _bgpixel);
+ return _getcopygc2(f, db, sb, bltfunc, _fgpixel, _bgpixel);
}
GC
-_getcopygc2(Fcode f, Bitmap *db, Bitmap *sb, int *bltfunc, unsigned long bg)
+_getcopygc2(Fcode f, Bitmap *db, Bitmap *sb, int *bltfunc, unsigned long fg, unsigned long bg)
{
unsigned long spix, df, sf;
int xf, c;
XGCValues gcv;
unsigned long gcvm;
- unsigned long fg = _fgpixel;
-
f &= F;
gcvm = 0;
df = db->flag;
(DIR) diff --git a/libXg/getrect.c b/libXg/getrect.c
@@ -57,9 +57,9 @@ getrect(int but, Mouse *m){
r.max = m->xy;
do{
rc = rcanon(r);
- border(&screen, rc, 2, F&~D);
+ border(&screen, rc, 2, F&~D, _bgpixel);
*m = emouse();
- border(&screen, rc, 2, F&~D);
+ border(&screen, rc, 2, F&~D, _bgpixel);
r.max = m->xy;
}while(m->buttons & but);
(DIR) diff --git a/libXg/libgint.h b/libXg/libgint.h
@@ -34,8 +34,8 @@ typedef char* caddr_t;
/* Return a GCs for solid filling/strings/etc., segments/points, and tiling */
extern GC _getfillgc(Fcode, Bitmap*, unsigned long);
extern GC _getcopygc(Fcode, Bitmap*, Bitmap*, int*);
-extern GC _getfillgc2(Fcode, Bitmap*, unsigned long, unsigned long);
-extern GC _getcopygc2(Fcode, Bitmap*, Bitmap*, int*, unsigned long);
+extern GC _getfillgc2(Fcode, Bitmap*, unsigned long, unsigned long, unsigned long);
+extern GC _getcopygc2(Fcode, Bitmap*, Bitmap*, int*, unsigned long, unsigned long);
extern GC _getgc(Bitmap*, unsigned long, XGCValues *);
/* convert between different bitmap depths */
(DIR) diff --git a/libXg/menuhit.c b/libXg/menuhit.c
@@ -117,7 +117,7 @@ menuscrollpaint(Rectangle scrollr, int off, int nitem, int nitemdrawn)
r.max.y = scrollr.min.y + (Dy(scrollr)*(off+nitemdrawn))/nitem;
if(r.max.y < r.min.y+2)
r.max.y = r.min.y+2;
- border(&screen, r, 1, F);
+ border(&screen, r, 1, F, _bgpixel);
if(menutxt == 0){
menutxt = balloc(Rect(0, 0, 16, 16), 0);
if(menutxt)
@@ -197,7 +197,7 @@ menuhit(int but, Mouse *m, Menu *menu)
b = &screen;
bitblt(b, menur.min, &screen, menur, S);
bitblt(&screen, menur.min, &screen, menur, 0);
- border(&screen, menur, Blackborder, F);
+ border(&screen, menur, Blackborder, F, _bgpixel);
r = menurect(textr, lasti);
cursorset(divpt(add(r.min, r.max), 2));
menupaint(menu, textr, off, nitemdrawn);
(DIR) diff --git a/libXg/xtbinit.c b/libXg/xtbinit.c
@@ -41,8 +41,8 @@ XftColor bgcolor;
extern char *machine;
Display *_dpy;
Widget _toplevel;
-unsigned long _fgpixel, _bgpixel, _cmdbgpixel;
-XColor _fgcolor, _bgcolor, _cmdbgcolor;
+unsigned long _fgpixel, _bgpixel, _cmdbgpixel, _borderpixel;
+XColor _fgcolor, _bgcolor, _cmdbgcolor, _bordercolor;
int _ld2d[6] = { 1, 2, 4, 8, 16, 24 };
unsigned long _ld2dmask[6] = { 0x1, 0x3, 0xF, 0xFF, 0xFFFF, 0x00FFFFFF };
Colormap _libg_cmap;
@@ -163,7 +163,7 @@ xtbinit(Errfunc f, char *class, int *pargc, char **argv, char **fallbacks)
widg = XtCreateManagedWidget("gwin", gwinWidgetClass, _toplevel, args, n);
char bgspec[512] = {0};
- snprintf(bgspec, sizeof(bgspec) - 1, "%s", getenv("BACKGROUND") ? getenv("BACKGROUND") : "#ffffff");
+ strncpy(bgspec, getenv("BACKGROUND") ? getenv("BACKGROUND") : "#ffffff", sizeof(bgspec) - 1);
char tbg[512], cbg[512];
if (sscanf(bgspec, "%511[^:]:%s", &tbg, &cbg) == 1)
@@ -173,6 +173,7 @@ xtbinit(Errfunc f, char *class, int *pargc, char **argv, char **fallbacks)
XAllocNamedColor(_dpy, DefaultColormap(_dpy, DefaultScreen(_dpy)), getenv("FOREGROUND") ? getenv("FOREGROUND") : "#000000", &_fgcolor, &_fgcolor);
XAllocNamedColor(_dpy, DefaultColormap(_dpy, DefaultScreen(_dpy)), tbg, &_bgcolor, &_bgcolor);
XAllocNamedColor(_dpy, DefaultColormap(_dpy, DefaultScreen(_dpy)), cbg, &_cmdbgcolor, &_cmdbgcolor);
+ XAllocNamedColor(_dpy, DefaultColormap(_dpy, DefaultScreen(_dpy)), getenv("BORDER") ? getenv("BORDER") : "#add8e6", &_bordercolor, &_bordercolor);
n = 0;
XtSetArg(args[n], XtNdepth, &depth); n++;
@@ -195,6 +196,7 @@ xtbinit(Errfunc f, char *class, int *pargc, char **argv, char **fallbacks)
_fgpixel = _fgcolor.pixel;
_bgpixel = _bgcolor.pixel;
_cmdbgpixel = _cmdbgcolor.pixel;
+ _borderpixel = _bordercolor.pixel;
XRenderColor xrcolor = {0};
xrcolor.red = _fgcolor.red;
(DIR) diff --git a/libframe/frdelete.c b/libframe/frdelete.c
@@ -53,10 +53,10 @@ frdelete(Frame *f, ulong p0, ulong p1)
r.max = pt1;
r.max.x += b->wid;
r.max.y += f->fheight;
- bitblt2(f->b, pt0, f->b, r, S, f->bg);
+ bitblt2(f->b, pt0, f->b, r, S, 0, f->bg);
if(pt0.y == pt1.y)
r.min.x = r.max.x-(pt1.x-pt0.x);
- bitblt2(f->b, r.min, f->b, r, 0, f->bg);
+ bitblt2(f->b, r.min, f->b, r, 0, 0, f->bg);
}
_fradvance(f, &pt1, b);
pt0.x += _frnewwid(f, pt0, b);
@@ -75,8 +75,8 @@ frdelete(Frame *f, ulong p0, ulong p1)
q0 = pt0.y+f->fheight;
q1 = pt1.y+f->fheight;
q2 = pt2.y+f->fheight;
- bitblt2(f->b, pt0, f->b, Rect(pt1.x, pt1.y, f->r.max.x, q1), S, f->bg);
- bitblt2(f->b, Pt(f->r.min.x, q0), f->b, Rect(f->r.min.x, q1, f->r.max.x, q2), S, f->bg);
+ bitblt2(f->b, pt0, f->b, Rect(pt1.x, pt1.y, f->r.max.x, q1), S, 0, f->bg);
+ bitblt2(f->b, Pt(f->r.min.x, q0), f->b, Rect(f->r.min.x, q1, f->r.max.x, q2), S, 0, f->bg);
frselectf(f, Pt(pt2.x, pt2.y-(pt1.y-pt0.y)), pt2, 0);
}else
frselectf(f, pt0, pt2, 0);
(DIR) diff --git a/libframe/frinsert.c b/libframe/frinsert.c
@@ -185,10 +185,10 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0)
r.min.y = q0;
r.max.y = y-(q1-q0);
if(q1 < y)
- bitblt2(f->b, Pt(f->r.min.x, q1), f->b, r, S, f->bg);
+ bitblt2(f->b, Pt(f->r.min.x, q1), f->b, r, S, 0, f->bg);
r.min = pt0;
r.max.y = q0;
- bitblt2(f->b, pt1, f->b, r, S, f->bg);
+ bitblt2(f->b, pt1, f->b, r, S, 0, f->bg);
}
}
/*
@@ -203,14 +203,14 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0)
r.max = r.min;
r.max.x += b->wid;
r.max.y += f->fheight;
- bitblt2(f->b, pt, f->b, r, S, f->bg);
+ bitblt2(f->b, pt, f->b, r, S, 0, f->bg);
if(pt.y < y){ /* clear bit hanging off right */
r.min = pt;
r.max = pt;
r.min.x += b->wid;
r.max.x = f->r.max.x;
r.max.y += f->fheight;
- bitblt2(f->b, r.min, f->b, r, 0, f->bg);
+ bitblt2(f->b, r.min, f->b, r, 0, 0, f->bg);
}
y = pt.y;
}else{
@@ -220,7 +220,7 @@ frinsert(Frame *f, Rune *sp, Rune *ep, ulong p0)
r.max.y += f->fheight;
if(r.max.x >= f->r.max.x)
r.max.x = f->r.max.x;
- bitblt2(f->b, r.min, f->b, r, 0, f->bg);
+ bitblt2(f->b, r.min, f->b, r, 0, 0, f->bg);
y = (pt.x == f->left)? pt.y : 0;
}
}
(DIR) diff --git a/libframe/frselect.c b/libframe/frselect.c
@@ -70,16 +70,16 @@ frselectf(Frame *f, Point p0, Point p1, Fcode c)
q1.x++;
else
p0.x--;
- bitblt2(f->b, p0, f->b, Rpt(p0, q1), c, f->bg);
+ bitblt2(f->b, p0, f->b, Rpt(p0, q1), c, 0, f->bg);
}else{
if(p0.x >= f->r.max.x)
p0.x = f->r.max.x-1;
- bitblt2(f->b, p0, f->b, Rect(p0.x, p0.y, f->r.max.x, q0.y), c, f->bg);
+ bitblt2(f->b, p0, f->b, Rect(p0.x, p0.y, f->r.max.x, q0.y), c, 0, f->bg);
if(n > 1)
bitblt2(f->b, Pt(f->r.min.x, q0.y),
- f->b, Rect(f->r.min.x, q0.y, f->r.max.x, p1.y), c, f->bg);
+ f->b, Rect(f->r.min.x, q0.y, f->r.max.x, p1.y), c, 0, f->bg);
bitblt2(f->b, Pt(f->r.min.x, p1.y),
- f->b, Rect(f->r.min.x, p1.y, q1.x, q1.y), c, f->bg);
+ f->b, Rect(f->r.min.x, p1.y, q1.x, q1.y), c, 0, f->bg);
}
}
(DIR) diff --git a/samterm/flayer.c b/samterm/flayer.c
@@ -65,7 +65,7 @@ flinit(Flayer *l, Rectangle r, XftFont *ft, unsigned long bg)
l->origin = l->p0 = l->p1 = 0;
frinit(&l->f, inset(flrect(l, r), FLMARGIN), ft, &screen, bg);
newvisibilities(1);
- bitblt2(&screen, l->entire.min, &screen, l->entire, 0, l->bg);
+ bitblt2(&screen, l->entire.min, &screen, l->entire, 0, 0, l->bg);
scrdraw(l, 0L);
flborder(l, 0);
}
@@ -74,12 +74,12 @@ void
flclose(Flayer *l)
{
if(l->visible == All)
- bitblt2(&screen, l->entire.min, &screen, l->entire, 0, l->bg);
+ bitblt2(&screen, l->entire.min, &screen, l->entire, 0, 0, l->bg);
else if(l->visible == Some){
if(l->f.b == 0)
l->f.b = balloc(l->entire, screen.ldepth);
if(l->f.b){
- bitblt2(l->f.b, l->entire.min, l->f.b, l->entire, 0, l->bg);
+ bitblt2(l->f.b, l->entire.min, l->f.b, l->entire, 0, 0, l->bg);
flrefresh(l, l->entire, 0);
}
}
@@ -95,8 +95,8 @@ void
flborder(Flayer *l, int wide)
{
if(flprepare(l)){
- border(l->f.b, l->entire, FLMARGIN, 0);
- border(l->f.b, l->entire, wide? FLMARGIN : 1, F&~D);
+ border(l->f.b, l->entire, FLMARGIN, 0, l->bg);
+ border(l->f.b, l->entire, wide? FLMARGIN : 1, F&~D, l->bg);
if(l->visible==Some)
flrefresh(l, l->entire, 0);
}
@@ -166,7 +166,7 @@ newvisibilities(int redraw)
case V(Some, All):
if(l->f.b){
- bitblt2(&screen, l->entire.min, l->f.b, l->entire, S, l->bg);
+ bitblt2(&screen, l->entire.min, l->f.b, l->entire, S, 0, l->bg);
bfree(l->f.b);
l->f.b = &screen;
break;
@@ -319,7 +319,7 @@ flreshape(Rectangle dr)
lDrect = dr;
move = 0;
/* no moving on rio; must repaint */
- bitblt2(&screen, lDrect.min, &screen, lDrect, 0, l->bg);
+ bitblt2(&screen, lDrect.min, &screen, lDrect, 0, 0, l->bg);
for(i=0; i<nllist; i++){
l = llist[i];
f = &l->f;
@@ -371,8 +371,8 @@ flprepare(Flayer *l)
f->b = &screen;
else if((f->b = balloc(l->entire, screen.ldepth))==0)
return 0;
- bitblt2(f->b, l->entire.min, f->b, l->entire, 0, l->bg);
- border(f->b, l->entire, l==llist[0]? FLMARGIN : 1, F&~D);
+ bitblt2(f->b, l->entire.min, f->b, l->entire, 0, 0, l->bg);
+ border(f->b, l->entire, l==llist[0]? FLMARGIN : 1, F&~D, l->bg);
n = f->nchars;
frinit(f, f->entire, f->font, f->b, l->bg);
r = (*l->textfn)(l, n, &n);
@@ -410,7 +410,7 @@ flrefresh(Flayer *l, Rectangle r, int i)
Top:
if((t=llist[i++]) == l){
if(!justvis)
- bitblt2(&screen, r.min, l->f.b, r, S, l->bg);
+ bitblt2(&screen, r.min, l->f.b, r, S, 0, l->bg);
somevis = 1;
}else{
if(!rectXrect(t->entire, r))
(DIR) diff --git a/samterm/scroll.c b/samterm/scroll.c
@@ -38,7 +38,7 @@ void
scrflip(Flayer *l, Rectangle r)
{
if(rectclip(&r, l->scroll))
- bitblt2(l->f.b, r.min, l->f.b, r, F&~D, l->bg);
+ bitblt2(l->f.b, r.min, l->f.b, r, F&~D, 0, l->bg);
}
void
@@ -67,12 +67,12 @@ scrdraw(Flayer *l, long tot)
r1.max.x = Dx(r);
}else
b = l->f.b;
- bitblt2(b, r1.min, b, r1, F, l->bg);
+ bitblt2(b, r1.min, b, r1, F, 0, l->bg);
texture(b, inset(r1, 1), darkgrey, S);
r2 = scrpos(r1, l->origin, l->origin+l->f.nchars, tot);
- bitblt2(b, r2.min, b, r2, 0, l->bg);
+ bitblt2(b, r2.min, b, r2, 0, 0, l->bg);
if(b!=l->f.b)
- bitblt2(l->f.b, r.min, b, r1, S, l->bg);
+ bitblt2(l->f.b, r.min, b, r1, S, 0, l->bg);
}
void