From 27aa20a319d9b390ae5bc6ac230d84b509866dfc Mon Sep 17 00:00:00 2001 From: Derek Stevens Date: Sun, 20 Feb 2022 13:43:24 -0700 Subject: [PATCH] add config.h, fix tag pixel bug, tweak colors, add libframe with cursor fix --- .gitignore | 2 + acme.c | 69 +++++----- build.sh | 5 + config.def.h | 59 +++++++++ dat.h | 3 +- libframe/frbox.c | 143 +++++++++++++++++++++ libframe/frdelete.c | 139 ++++++++++++++++++++ libframe/frdraw.c | 200 +++++++++++++++++++++++++++++ libframe/frinit.c | 106 ++++++++++++++++ libframe/frinsert.c | 285 ++++++++++++++++++++++++++++++++++++++++++ libframe/frptofchar.c | 106 ++++++++++++++++ libframe/frselect.c | 123 ++++++++++++++++++ libframe/frstr.c | 33 +++++ libframe/frutil.c | 99 +++++++++++++++ libframe/libframe.a | Bin 0 -> 178518 bytes libframe/mkfile | 37 ++++++ libframe/portdate | 9 ++ mkfile | 5 +- regx.c | 32 ++--- text.c | 20 ++- wind.c | 33 ++++- 21 files changed, 1457 insertions(+), 51 deletions(-) create mode 100644 config.def.h create mode 100644 libframe/frbox.c create mode 100644 libframe/frdelete.c create mode 100644 libframe/frdraw.c create mode 100644 libframe/frinit.c create mode 100644 libframe/frinsert.c create mode 100644 libframe/frptofchar.c create mode 100644 libframe/frselect.c create mode 100644 libframe/frstr.c create mode 100644 libframe/frutil.c create mode 100644 libframe/libframe.a create mode 100644 libframe/mkfile create mode 100644 libframe/portdate diff --git a/.gitignore b/.gitignore index 633ca46..718d5ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +config.h **/*.o +**/*.a **/o.* acme diff --git a/acme.c b/acme.c index 1392d61..e6bf45d 100644 --- a/acme.c +++ b/acme.c @@ -15,6 +15,9 @@ #include #include "edit.h" +/* configuration file */ +#include "config.h" + void mousethread(void*); void keyboardthread(void*); void waitthread(void*); @@ -37,9 +40,7 @@ enum { }; Rune snarfrune[NSnarf + 1]; -char* fontnames[2] = { - "/lib/font/bit/lucsans/typeunicode.7.font", - "/lib/font/bit/lucm/unicode.9.font"}; +char* fontnames[2] = {PRIMARY_FONT, SECONDARY_FONT}; Command* command; @@ -53,13 +54,14 @@ void derror(Display* d, char* errorstr) { error(errorstr); } +// we need to share this btw mainthread and mousethread + void threadmain(int argc, char* argv[]) { int i; char *p, *loadfile; - Column* c; - int ncol; Display* d; - + int ncol; + Column* c; rfork(RFENVG | RFNAMEG); ncol = -1; @@ -71,10 +73,10 @@ void threadmain(int argc, char* argv[]) { _threaddebuglevel = ~0; } break; case 'a': - globalindent[AUTOINDENT] = TRUE; + globalindent[AUTOINDENT] = !AUTOINDENT_DEFAULT; break; case 'b': - bartflag = TRUE; + bartflag = !CLICKFOCUS_DEFAULT; break; case 'c': p = ARGF(); @@ -95,7 +97,7 @@ void threadmain(int argc, char* argv[]) { goto Usage; break; case 'i': - globalindent[SPACESINDENT] = TRUE; + globalindent[SPACESINDENT] = !TABSTOSPACES_DEFAULT; break; case 'l': loadfile = ARGF(); @@ -501,6 +503,7 @@ void mousethread(void* v) { char* act; enum { MResize, MMouse, MPlumb, MWarnings, NMALT }; static Alt alts[NMALT + 1]; + int click; USED(v); threadsetname("mousethread"); @@ -521,6 +524,7 @@ void mousethread(void* v) { alts[NMALT].op = CHANEND; for (;;) { + click = 0; qlock(&row.lk); flushwarnings(); qunlock(&row.lk); @@ -532,7 +536,7 @@ void mousethread(void* v) { draw( screen, screen->r, - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x222222FF), + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_EMPTY), nil, ZP); iconinit(); @@ -630,8 +634,10 @@ void mousethread(void* v) { goto Continue; } if (m.buttons) { - if (w) + if (w) { + click = 1; winlock(w, 'M'); + } t->eq0 = ~0; if (w) wincommit(w, t); @@ -647,6 +653,7 @@ void mousethread(void* v) { activecol = t->col; /* button 1 only */ if (t->w != nil && t == &t->w->body) activewin = t->w; + } else if (m.buttons & 2) { if (textselect2(t, &q0, &q1, &argt)) execute(t, q0, q1, FALSE, argt); @@ -659,6 +666,10 @@ void mousethread(void* v) { goto Continue; } Continue: + /*if (click && w) { + /* draw hilighted border around active window + windrawideco(w, w->col->row->col, w->col->row->ncol); + }*/ qunlock(&row.lk); break; } @@ -968,34 +979,36 @@ Cursor2 boxcursor2 = { 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; void iconinit(void) { - Rectangle r; + Rectangle r, r1; Image* tmp; if (tagcols[BACK] == nil) { /* Black */ tagcols[BACK] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, DBlack); + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_TAG_BG); tagcols[HIGH] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x1F9B92FF); + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_TAG_HI); tagcols[BORD] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x797979FF); + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_TAG_BD); tagcols[TEXT] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x797979FF); - tagcols[HTEXT] = display->black; + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_TAG_TX); + tagcols[HTEXT] = + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_TAG_HT); /* Blue */ textcols[BACK] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x000F19FF); + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_BODY_BG); textcols[HIGH] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x1F9B92FF); + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_BODY_HI); textcols[BORD] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x93A1A1FF); + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_BODY_BD); textcols[TEXT] = - allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x93A1A1FF); - textcols[HTEXT] = display->black; + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_BODY_TX); + textcols[HTEXT] = + allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_BODY_HT); } - r = Rect(0, 0, Scrollwid + ButtonBorder, font->height + 1); + r = Rect(0, 0, Scrollwid, font->height + 1); if (button && eqrect(r, button->r)) return; @@ -1007,24 +1020,22 @@ void iconinit(void) { button = allocimage(display, r, screen->chan, 0, DNofill); draw(button, r, tagcols[BACK], nil, r.min); - r.max.x -= ButtonBorder; border(button, r, ButtonBorder, tagcols[BORD], ZP); r = button->r; modbutton = allocimage(display, r, screen->chan, 0, DNofill); draw(modbutton, r, tagcols[BACK], nil, r.min); - r.max.x -= ButtonBorder; border(modbutton, r, ButtonBorder, tagcols[BORD], ZP); r = insetrect(r, ButtonBorder); - tmp = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x09998DFF); + tmp = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, COLOR_BTN_MD); draw(modbutton, r, tmp, nil, ZP); freeimage(tmp); r = button->r; - colbutton = allocimage(display, r, screen->chan, 0, 0x586E75FF); + colbutton = allocimage(display, r, screen->chan, 0, COLOR_BTN_CO); - but2col = allocimage(display, r, screen->chan, 1, 0x797979FF); - but3col = allocimage(display, r, screen->chan, 1, 0x36D3C6FF); + but2col = allocimage(display, r, screen->chan, 1, COLOR_B2_HI); + but3col = allocimage(display, r, screen->chan, 1, COLOR_B3_HI); } /* diff --git a/build.sh b/build.sh index 4e2ede8..67be0c6 100755 --- a/build.sh +++ b/build.sh @@ -1,7 +1,12 @@ #!/bin/sh +if [ ! -e ./config.h ]; then + cp config.def.h config.h +fi + clang-format -i ./*.c clang-format -i ./mail/*.c +clang-format -i ./libframe/*.c mk clean mk diff --git a/config.def.h b/config.def.h new file mode 100644 index 0000000..c316082 --- /dev/null +++ b/config.def.h @@ -0,0 +1,59 @@ +/****************** + * acme9k1 config * + ******************/ + +/********** + * colors * + **********/ + +/* when column is empty */ +#define COLOR_EMPTY 0x222222FF + +/* tag & body colors: bg, hilight, border, text, hilighted text */ +#define COLOR_TAG_BG 0x000000FF +#define COLOR_TAG_HI 0x1F9b92FF +#define COLOR_TAG_BD 0x797979FF +#define COLOR_TAG_TX 0xC9C9C9FF +#define COLOR_TAG_HT 0x000000FF + +#define COLOR_BODY_BG 0x000F19FF +#define COLOR_BODY_HI 0x1F9B92FF +#define COLOR_BODY_BD 0x797979FF +#define COLOR_BODY_TX 0x93A1A1FF +#define COLOR_BODY_HT 0x000000FF + +/* button colors: dirty file (mod) indicator and column handles */ + +#define COLOR_BTN_MD 0x1F9B92FF +#define COLOR_BTN_CO 0x586E75FF + +/* button 2 and 3 selection colors */ + +#define COLOR_B2_HI 0x797979FF +#define COLOR_B3_HI 0x002B36FF + +/********* + * fonts * + *********/ + +/* can use either x fonts via fontsrv or p9p fonts */ + +#define PRIMARY_FONT "/mnt/font/SauceCodeProNerdFontComplete-Regular/9a/font" +#define SECONDARY_FONT "/lib/font/bit/lucm/unicode.9.font" + + +/******** + * misc * + ********/ + +/* 0 = focus follows mouse, 1 = click to focus; -b flag will invert this */ + +#define CLICKFOCUS_DEFAULT 0 + +/* 0 = literal tabs, 1 = tabs to spaces; -i flag will invert this */ + +#define TABSTOSPACES_DEFAULT 0 + +/* 0 = no auto indent, 1 = autoindent; -a flag will invert this */ + +#define AUTOINDENT_DEFAULT 0 diff --git a/dat.h b/dat.h index 1bff575..e2cb494 100644 --- a/dat.h +++ b/dat.h @@ -215,7 +215,7 @@ void textinit(Text*, File*, Rectangle, Reffont*, Image**); void textinsert(Text*, uint, Rune*, uint, int); int textload(Text*, uint, char*, int); Rune textreadc(Text*, uint); -void textredraw(Text*, Rectangle, Font*, Image*, int); +void textredraw(Text*, Rectangle, Font*, Image*, int, int); void textreset(Text*); int textresize(Text*, Rectangle, int); void textscrdraw(Text*); @@ -304,6 +304,7 @@ void winmousebut(Window*); void winaddincl(Window*, Rune*, int); void wincleartag(Window*); char *winctlprint(Window*, char*, int); +void windrawideco(Window*, Column**, int); struct Column { diff --git a/libframe/frbox.c b/libframe/frbox.c new file mode 100644 index 0000000..f27baaa --- /dev/null +++ b/libframe/frbox.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include + +#define SLOP 25 + +void _fraddbox(Frame* f, int bn, int n) /* add n boxes after bn, shift the rest + * up, box[bn+n]==box[bn] */ +{ + int i; + + if (bn > f->nbox) + drawerror(f->display, "_fraddbox"); + if (f->nbox + n > f->nalloc) + _frgrowbox(f, n + SLOP); + for (i = f->nbox; --i >= bn;) + f->box[i + n] = f->box[i]; + f->nbox += n; +} + +void _frclosebox(Frame* f, int n0, int n1) /* inclusive */ +{ + int i; + + if (n0 >= f->nbox || n1 >= f->nbox || n1 < n0) + drawerror(f->display, "_frclosebox"); + n1++; + for (i = n1; i < f->nbox; i++) + f->box[i - (n1 - n0)] = f->box[i]; + f->nbox -= n1 - n0; +} + +void _frdelbox(Frame* f, int n0, int n1) /* inclusive */ +{ + if (n0 >= f->nbox || n1 >= f->nbox || n1 < n0) + drawerror(f->display, "_frdelbox"); + _frfreebox(f, n0, n1); + _frclosebox(f, n0, n1); +} + +void _frfreebox(Frame* f, int n0, int n1) /* inclusive */ +{ + int i; + + if (n1 < n0) + return; + if (n0 >= f->nbox || n1 >= f->nbox) + drawerror(f->display, "_frfreebox"); + n1++; + for (i = n0; i < n1; i++) + if (f->box[i].nrune >= 0) + free(f->box[i].ptr); +} + +void _frgrowbox(Frame* f, int delta) { + f->nalloc += delta; + f->box = realloc(f->box, f->nalloc * sizeof(Frbox)); + if (f->box == 0) + drawerror(f->display, "_frgrowbox"); +} + +static void dupbox(Frame* f, int bn) { + uchar* p; + + if (f->box[bn].nrune < 0) + drawerror(f->display, "dupbox"); + _fraddbox(f, bn, 1); + if (f->box[bn].nrune >= 0) { + p = _frallocstr(f, NBYTE(&f->box[bn]) + 1); + strcpy((char*)p, (char*)f->box[bn].ptr); + f->box[bn + 1].ptr = p; + } +} + +static uchar* runeindex(uchar* p, int n) { + int i, w; + Rune rune; + + for (i = 0; i < n; i++, p += w) + if (*p < Runeself) + w = 1; + else { + w = chartorune(&rune, (char*)p); + USED(rune); + } + return p; +} + +static void truncatebox( + Frame* f, Frbox* b, int n) /* drop last n chars; no allocation done */ +{ + if (b->nrune < 0 || b->nrune < n) + drawerror(f->display, "truncatebox"); + b->nrune -= n; + runeindex(b->ptr, b->nrune)[0] = 0; + b->wid = stringwidth(f->font, (char*)b->ptr); +} + +static void chopbox( + Frame* f, Frbox* b, int n) /* drop first n chars; no allocation done */ +{ + char* p; + + if (b->nrune < 0 || b->nrune < n) + drawerror(f->display, "chopbox"); + p = (char*)runeindex(b->ptr, n); + memmove((char*)b->ptr, p, strlen(p) + 1); + b->nrune -= n; + b->wid = stringwidth(f->font, (char*)b->ptr); +} + +void _frsplitbox(Frame* f, int bn, int n) { + dupbox(f, bn); + truncatebox(f, &f->box[bn], f->box[bn].nrune - n); + chopbox(f, &f->box[bn + 1], n); +} + +void _frmergebox(Frame* f, int bn) /* merge bn and bn+1 */ +{ + Frbox* b; + + b = &f->box[bn]; + _frinsure(f, bn, NBYTE(&b[0]) + NBYTE(&b[1]) + 1); + strcpy((char*)runeindex(b[0].ptr, b[0].nrune), (char*)b[1].ptr); + b[0].wid += b[1].wid; + b[0].nrune += b[1].nrune; + _frdelbox(f, bn + 1, bn + 1); +} + +int _frfindbox( + Frame* f, int bn, ulong p, + ulong q) /* find box containing q and put q on a box boundary */ +{ + Frbox* b; + + for (b = &f->box[bn]; bn < f->nbox && p + NRUNE(b) <= q; bn++, b++) + p += NRUNE(b); + if (p != q) + _frsplitbox(f, bn++, (int)(q - p)); + return bn; +} diff --git a/libframe/frdelete.c b/libframe/frdelete.c new file mode 100644 index 0000000..c386a5f --- /dev/null +++ b/libframe/frdelete.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include +#include + +int frdelete(Frame* f, ulong p0, ulong p1) { + Point pt0, pt1, ppt0; + Frbox* b; + int n0, n1, n, w0; + ulong cn1; + Rectangle r; + int nn0; + Image* col; + + if (p0 >= f->nchars || p0 == p1 || f->b == nil) + return 0; + if (p1 > f->nchars) + p1 = f->nchars; + n0 = _frfindbox(f, 0, 0, p0); + if (n0 == f->nbox) + drawerror(f->display, "off end in frdelete"); + n1 = _frfindbox(f, n0, p0, p1); + pt0 = _frptofcharnb(f, p0, n0); + pt1 = frptofchar(f, p1); + if (f->p0 == f->p1) + frtick(f, frptofchar(f, f->p0), 0); + nn0 = n0; + ppt0 = pt0; + _frfreebox(f, n0, n1 - 1); + f->modified = 1; + + /* + * Invariants: + * - pt0 points to beginning, pt1 points to end + * - n0 is box containing beginning of stuff being deleted + * - n1, b are box containing beginning of stuff to be kept after deletion + * - cn1 is char position of n1 + * - f->p0 and f->p1 are not adjusted until after all deletion is done + */ + b = &f->box[n1]; + cn1 = p1; + while (pt1.x != pt0.x && n1 < f->nbox) { + _frcklinewrap0(f, &pt0, b); + _frcklinewrap(f, &pt1, b); + n = _frcanfit(f, pt0, b); + if (n == 0) + drawerror(f->display, "_frcanfit==0"); + r.min = pt0; + r.max = pt0; + r.max.y += f->font->height; + if (b->nrune > 0) { + w0 = b->wid; + if (n != b->nrune) { + _frsplitbox(f, n1, n); + b = &f->box[n1]; + } + r.max.x += b->wid; + draw(f->b, r, f->b, nil, pt1); + cn1 += b->nrune; + + /* blank remainder of line */ + r.min.x = r.max.x; + r.max.x += w0 - b->wid; + if (r.max.x > f->r.max.x) + r.max.x = f->r.max.x; + draw(f->b, r, f->cols[BACK], nil, r.min); + } else { + r.max.x += _frnewwid0(f, pt0, b); + if (r.max.x > f->r.max.x) + r.max.x = f->r.max.x; + col = f->cols[BACK]; + if (f->p0 <= cn1 && cn1 < f->p1) + col = f->cols[HIGH]; + draw(f->b, r, col, nil, pt0); + cn1++; + } + _fradvance(f, &pt1, b); + pt0.x += _frnewwid(f, pt0, b); + f->box[n0++] = f->box[n1++]; + b++; + } + if (n1 == f->nbox && pt0.x != pt1.x) /* deleting last thing in window; must + clean up */ + frselectpaint(f, pt0, pt1, f->cols[BACK]); + if (pt1.y != pt0.y) { + Point pt2; + + pt2 = _frptofcharptb(f, 32767, pt1, n1); + if (pt2.y > f->r.max.y) + drawerror(f->display, "frptofchar in frdelete"); + if (n1 < f->nbox) { + int q0, q1, q2; + + q0 = pt0.y + f->font->height; + q1 = pt1.y + f->font->height; + q2 = pt2.y + f->font->height; + if (q2 > f->r.max.y) + q2 = f->r.max.y; + draw( + f->b, + Rect(pt0.x, pt0.y, pt0.x + (f->r.max.x - pt1.x), q0), + f->b, + nil, + pt1); + draw( + f->b, + Rect(f->r.min.x, q0, f->r.max.x, q0 + (q2 - q1)), + f->b, + nil, + Pt(f->r.min.x, q1)); + frselectpaint(f, Pt(pt2.x, pt2.y - (pt1.y - pt0.y)), pt2, f->cols[BACK]); + } else + frselectpaint(f, pt0, pt2, f->cols[BACK]); + } + _frclosebox(f, n0, n1 - 1); + if ( + nn0 > 0 && f->box[nn0 - 1].nrune >= 0 && + ppt0.x - f->box[nn0 - 1].wid >= (int)f->r.min.x) { + --nn0; + ppt0.x -= f->box[nn0].wid; + } + _frclean(f, ppt0, nn0, n0 < f->nbox - 1 ? n0 + 1 : n0); + if (f->p1 > p1) + f->p1 -= p1 - p0; + else if (f->p1 > p0) + f->p1 = p0; + if (f->p0 > p1) + f->p0 -= p1 - p0; + else if (f->p0 > p0) + f->p0 = p0; + f->nchars -= p1 - p0; + if (f->p0 == f->p1) + frtick(f, frptofchar(f, f->p0), 1); + pt0 = frptofchar(f, f->nchars); + n = f->nlines; + f->nlines = (pt0.y - f->r.min.y) / f->font->height + (pt0.x > f->r.min.x); + return n - f->nlines; +} diff --git a/libframe/frdraw.c b/libframe/frdraw.c new file mode 100644 index 0000000..bd541c9 --- /dev/null +++ b/libframe/frdraw.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include +#include + +void _frdrawtext(Frame* f, Point pt, Image* text, Image* back) { + Frbox* b; + int nb; + + for (nb = 0, b = f->box; nb < f->nbox; nb++, b++) { + _frcklinewrap(f, &pt, b); + if (!f->noredraw && b->nrune >= 0) + stringbg(f->b, pt, text, ZP, f->font, (char*)b->ptr, back, ZP); + pt.x += b->wid; + } +} + +static int nbytes(char* s0, int nr) { + char* s; + Rune r; + + s = s0; + while (--nr >= 0) + s += chartorune(&r, s); + return s - s0; +} + +void frdrawsel(Frame* f, Point pt, ulong p0, ulong p1, int issel) { + Image *back, *text; + + if (f->ticked) + frtick(f, frptofchar(f, f->p0), 0); + + if (p0 == p1) { + frtick(f, pt, issel); + return; + } + + if (issel) { + back = f->cols[HIGH]; + text = f->cols[HTEXT]; + } else { + back = f->cols[BACK]; + text = f->cols[TEXT]; + } + + frdrawsel0(f, pt, p0, p1, back, text); +} + +Point frdrawsel0( + Frame* f, Point pt, ulong p0, ulong p1, Image* back, Image* text) { + Frbox* b; + int nb, nr, w, x, trim; + Point qt; + uint p; + char* ptr; + + if (p0 > p1) + sysfatal("libframe: frdrawsel0 p0=%lud > p1=%lud", p0, p1); + + p = 0; + b = f->box; + trim = 0; + for (nb = 0; nb < f->nbox && p < p1; nb++) { + nr = b->nrune; + if (nr < 0) + nr = 1; + if (p + nr <= p0) + goto Continue; + if (p >= p0) { + qt = pt; + _frcklinewrap(f, &pt, b); + /* fill in the end of a wrapped line */ + if (pt.y > qt.y) + draw(f->b, Rect(qt.x, qt.y, f->r.max.x, pt.y), back, nil, qt); + } + ptr = (char*)b->ptr; + if (p < p0) { /* beginning of region: advance into box */ + ptr += nbytes(ptr, p0 - p); + nr -= (p0 - p); + p = p0; + } + trim = 0; + if (p + nr > p1) { /* end of region: trim box */ + nr -= (p + nr) - p1; + trim = 1; + } + if (b->nrune < 0 || nr == b->nrune) + w = b->wid; + else + w = stringnwidth(f->font, ptr, nr); + x = pt.x + w; + if (x > f->r.max.x) + x = f->r.max.x; + draw(f->b, Rect(pt.x, pt.y, x, pt.y + f->font->height), back, nil, pt); + if (b->nrune >= 0) + stringnbg(f->b, pt, text, ZP, f->font, ptr, nr, back, ZP); + pt.x += w; + Continue: + b++; + p += nr; + } + /* if this is end of last plain text box on wrapped line, fill to end of line + */ + if ( + p1 > p0 && b > f->box && b < f->box + f->nbox && b[-1].nrune > 0 && !trim) { + qt = pt; + _frcklinewrap(f, &pt, b); + if (pt.y > qt.y) + draw(f->b, Rect(qt.x, qt.y, f->r.max.x, pt.y), back, nil, qt); + } + return pt; +} + +void frredraw(Frame* f) { + int ticked; + Point pt; + + if (f->p0 == f->p1) { + ticked = f->ticked; + if (ticked) + frtick(f, frptofchar(f, f->p0), 0); + frdrawsel0(f, frptofchar(f, 0), 0, f->nchars, f->cols[BACK], f->cols[TEXT]); + if (ticked) + frtick(f, frptofchar(f, f->p0), 1); + return; + } + + pt = frptofchar(f, 0); + pt = frdrawsel0(f, pt, 0, f->p0, f->cols[BACK], f->cols[TEXT]); + pt = frdrawsel0(f, pt, f->p0, f->p1, f->cols[HIGH], f->cols[HTEXT]); + pt = frdrawsel0(f, pt, f->p1, f->nchars, f->cols[BACK], f->cols[TEXT]); +} + +static void _frtick(Frame* f, Point pt, int ticked) { + Rectangle r; + + if (f->ticked == ticked || f->tick == 0 || !ptinrect(pt, f->r)) + return; + pt.x -= f->tickscale; /* looks best just left of where requested */ + r = Rect(pt.x, pt.y, pt.x + FRTICKW * f->tickscale, pt.y + f->font->height); + /* can go into left border but not right */ + if (r.max.x > f->r.max.x) + r.max.x = f->r.max.x; + if (ticked) { + draw(f->tickback, f->tickback->r, f->b, nil, pt); + draw(f->b, r, f->tick, nil, ZP); + } else + draw(f->b, r, f->tickback, nil, ZP); + f->ticked = ticked; +} + +void frtick(Frame* f, Point pt, int ticked) { + if (f->tickscale != scalesize(f->display, 1)) { + if (f->ticked) + _frtick(f, pt, 0); + frinittick(f); + } + _frtick(f, pt, ticked); +} + +Point _frdraw(Frame* f, Point pt) { + Frbox* b; + int nb, n; + + for (b = f->box, nb = 0; nb < f->nbox; nb++, b++) { + _frcklinewrap0(f, &pt, b); + if (pt.y == f->r.max.y) { + f->nchars -= _frstrlen(f, nb); + _frdelbox(f, nb, f->nbox - 1); + break; + } + if (b->nrune > 0) { + n = _frcanfit(f, pt, b); + if (n == 0) + break; + if (n != b->nrune) { + _frsplitbox(f, nb, n); + b = &f->box[nb]; + } + pt.x += b->wid; + } else { + if (b->bc == '\n') { + pt.x = f->r.min.x; + pt.y += f->font->height; + } else + pt.x += _frnewwid(f, pt, b); + } + } + return pt; +} + +int _frstrlen(Frame* f, int nb) { + int n; + + for (n = 0; nb < f->nbox; nb++) + n += NRUNE(&f->box[nb]); + return n; +} diff --git a/libframe/frinit.c b/libframe/frinit.c new file mode 100644 index 0000000..da63bc1 --- /dev/null +++ b/libframe/frinit.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include + +void frinit(Frame* f, Rectangle r, Font* ft, Image* b, Image* cols[NCOL]) { + f->font = ft; + f->display = b->display; + f->maxtab = 8 * stringwidth(ft, "0"); + f->nbox = 0; + f->nalloc = 0; + f->nchars = 0; + f->nlines = 0; + f->p0 = 0; + f->p1 = 0; + f->box = 0; + f->lastlinefull = 0; + if (cols != 0) + memmove(f->cols, cols, sizeof f->cols); + frsetrects(f, r, b); + if (f->tick == nil && f->cols[BACK] != 0) + frinittick(f); +} + +void frinittick(Frame* f) { + Image* b; + Font* ft; + + if (f->cols[BACK] == nil || f->display == nil) + return; + f->tickscale = scalesize(f->display, 1); + b = f->display->screenimage; + ft = f->font; + if (f->tick) + freeimage(f->tick); + f->tick = allocimage( + f->display, + Rect(0, 0, f->tickscale * FRTICKW, ft->height), + b->chan, + 0, + DWhite); + if (f->tick == nil) + return; + if (f->tickback) + freeimage(f->tickback); + f->tickback = allocimage(f->display, f->tick->r, b->chan, 0, DWhite); + if (f->tickback == 0) { + freeimage(f->tick); + f->tick = 0; + return; + } + /* background color */ + draw(f->tick, f->tick->r, f->cols[BACK], nil, ZP); + /* vertical line */ + draw( + f->tick, + Rect( + f->tickscale * (FRTICKW / 2), + 0, + f->tickscale * (FRTICKW / 2 + 1), + ft->height), + f->cols[TEXT], + nil, + ZP); + /* box on each end */ + draw( + f->tick, + Rect(0, 0, f->tickscale * FRTICKW, f->tickscale * FRTICKW), + f->cols[TEXT], + nil, + ZP); + draw( + f->tick, + Rect( + 0, + ft->height - f->tickscale * FRTICKW, + f->tickscale * FRTICKW, + ft->height), + f->cols[TEXT], + nil, + ZP); +} + +void frsetrects(Frame* f, Rectangle r, Image* b) { + f->b = b; + f->entire = r; + f->r = r; + f->r.max.y -= (r.max.y - r.min.y) % f->font->height; + f->maxlines = (r.max.y - r.min.y) / f->font->height; +} + +void frclear(Frame* f, int freeall) { + if (f->nbox) + _frdelbox(f, 0, f->nbox - 1); + if (f->box) + free(f->box); + if (freeall) { + freeimage(f->tick); + freeimage(f->tickback); + f->tick = 0; + f->tickback = 0; + } + f->box = 0; + f->ticked = 0; +} diff --git a/libframe/frinsert.c b/libframe/frinsert.c new file mode 100644 index 0000000..b6accef --- /dev/null +++ b/libframe/frinsert.c @@ -0,0 +1,285 @@ +#include +#include +#include +#include +#include + +#define DELTA 25 +#define TMPSIZE 256 +static Frame frame; + +static Point bxscan(Frame* f, Rune* sp, Rune* ep, Point* ppt) { + int w, c, nb, delta, nl, nr, rw; + Frbox* b; + char *s, tmp[TMPSIZE + 3]; /* +3 for rune overflow */ + uchar* p; + + frame.r = f->r; + frame.b = f->b; + frame.font = f->font; + frame.maxtab = f->maxtab; + frame.nbox = 0; + frame.nchars = 0; + memmove(frame.cols, f->cols, sizeof frame.cols); + delta = DELTA; + nl = 0; + for (nb = 0; sp < ep && nl <= f->maxlines; nb++, frame.nbox++) { + if (nb == frame.nalloc) { + _frgrowbox(&frame, delta); + if (delta < 10000) + delta *= 2; + } + b = &frame.box[nb]; + c = *sp; + if (c == '\t' || c == '\n') { + b->bc = c; + b->wid = 5000; + b->minwid = (c == '\n') ? 0 : stringwidth(frame.font, " "); + b->nrune = -1; + if (c == '\n') + nl++; + frame.nchars++; + sp++; + } else { + s = tmp; + nr = 0; + w = 0; + while (sp < ep) { + c = *sp; + if (c == '\t' || c == '\n') + break; + rw = runetochar(s, sp); + if (s + rw >= tmp + TMPSIZE) + break; + w += runestringnwidth(frame.font, sp, 1); + sp++; + s += rw; + nr++; + } + *s++ = 0; + p = _frallocstr(f, s - tmp); + b = &frame.box[nb]; + b->ptr = p; + memmove(p, tmp, s - tmp); + b->wid = w; + b->nrune = nr; + frame.nchars += nr; + } + } + _frcklinewrap0(f, ppt, &frame.box[0]); + return _frdraw(&frame, *ppt); +} + +static void chopframe(Frame* f, Point pt, ulong p, int bn) { + Frbox* b; + + for (b = &f->box[bn];; b++) { + if (b >= &f->box[f->nbox]) + drawerror(f->display, "endofframe"); + _frcklinewrap(f, &pt, b); + if (pt.y >= f->r.max.y) + break; + p += NRUNE(b); + _fradvance(f, &pt, b); + } + f->nchars = p; + f->nlines = f->maxlines; + if (b < &f->box[f->nbox]) /* BUG */ + _frdelbox(f, (int)(b - f->box), f->nbox - 1); +} + +void frinsert(Frame* f, Rune* sp, Rune* ep, ulong p0) { + Point pt0, pt1, opt0, ppt0, ppt1, pt; + Frbox* b; + int n, n0, nn0, y; + ulong cn0; + Image *col, *tcol; + Rectangle r; + static struct { Point pt0, pt1; } * pts; + static int nalloc = 0; + int npts; + + if (p0 > f->nchars || sp == ep || f->b == nil) + return; + n0 = _frfindbox(f, 0, 0, p0); + cn0 = p0; + nn0 = n0; + pt0 = _frptofcharnb(f, p0, n0); + ppt0 = pt0; + opt0 = pt0; + pt1 = bxscan(f, sp, ep, &ppt0); + ppt1 = pt1; + if (n0 < f->nbox) { + _frcklinewrap(f, &pt0, b = &f->box[n0]); /* for frdrawsel() */ + _frcklinewrap0(f, &ppt1, b); + } + f->modified = 1; + /* + * ppt0 and ppt1 are start and end of insertion as they will appear when + * insertion is complete. pt0 is current location of insertion position + * (p0); pt1 is terminal point (without line wrap) of insertion. + */ + if (f->p0 == f->p1) + frtick(f, frptofchar(f, f->p0), 0); + + /* + * Find point where old and new x's line up + * Invariants: + * pt0 is where the next box (b, n0) is now + * pt1 is where it will be after the insertion + * If pt1 goes off the rectangle, we can toss everything from there on + */ + for (b = &f->box[n0], npts = 0; + pt1.x != pt0.x && pt1.y != f->r.max.y && n0 < f->nbox; + b++, n0++, npts++) { + _frcklinewrap(f, &pt0, b); + _frcklinewrap0(f, &pt1, b); + if (b->nrune > 0) { + n = _frcanfit(f, pt1, b); + if (n == 0) + drawerror(f->display, "_frcanfit==0"); + if (n != b->nrune) { + _frsplitbox(f, n0, n); + b = &f->box[n0]; + } + } + if (npts == nalloc) { + pts = realloc(pts, (npts + DELTA) * sizeof(pts[0])); + nalloc += DELTA; + b = &f->box[n0]; + } + pts[npts].pt0 = pt0; + pts[npts].pt1 = pt1; + /* has a text box overflowed off the frame? */ + if (pt1.y == f->r.max.y) + break; + _fradvance(f, &pt0, b); + pt1.x += _frnewwid(f, pt1, b); + cn0 += NRUNE(b); + } + if (pt1.y > f->r.max.y) + drawerror(f->display, "frinsert pt1 too far"); + if (pt1.y == f->r.max.y && n0 < f->nbox) { + f->nchars -= _frstrlen(f, n0); + _frdelbox(f, n0, f->nbox - 1); + } + if (n0 == f->nbox) + f->nlines = (pt1.y - f->r.min.y) / f->font->height + (pt1.x > f->r.min.x); + else if (pt1.y != pt0.y) { + int q0, q1; + + y = f->r.max.y; + q0 = pt0.y + f->font->height; + q1 = pt1.y + f->font->height; + f->nlines += (q1 - q0) / f->font->height; + if (f->nlines > f->maxlines) + chopframe(f, ppt1, p0, nn0); + if (pt1.y < y) { + r = f->r; + r.min.y = q1; + r.max.y = y; + if (q1 < y) + draw(f->b, r, f->b, nil, Pt(f->r.min.x, q0)); + r.min = pt1; + r.max.x = pt1.x + (f->r.max.x - pt0.x); + r.max.y = q1; + draw(f->b, r, f->b, nil, pt0); + } + } + /* + * Move the old stuff down to make room. The loop will move the stuff + * between the insertion and the point where the x's lined up. + * The draw()s above moved everything down after the point they lined up. + */ + for ((y = pt1.y == f->r.max.y ? pt1.y : 0), b = &f->box[n0 - 1]; --npts >= 0; + --b) { + pt = pts[npts].pt1; + if (b->nrune > 0) { + r.min = pt; + r.max = r.min; + r.max.x += b->wid; + r.max.y += f->font->height; + draw(f->b, r, f->b, nil, pts[npts].pt0); + /* clear bit hanging off right */ + if (npts == 0 && pt.y > pt0.y) { + /* + * first new char is bigger than first char we're + * displacing, causing line wrap. ugly special case. + */ + r.min = opt0; + r.max = opt0; + r.max.x = f->r.max.x; + r.max.y += f->font->height; + if (f->p0 <= cn0 && cn0 < f->p1) /* b+1 is inside selection */ + col = f->cols[HIGH]; + else + col = f->cols[BACK]; + draw(f->b, r, col, nil, r.min); + } else if (pt.y < y) { + r.min = pt; + r.max = pt; + r.min.x += b->wid; + r.max.x = f->r.max.x; + r.max.y += f->font->height; + if (f->p0 <= cn0 && cn0 < f->p1) /* b+1 is inside selection */ + col = f->cols[HIGH]; + else + col = f->cols[BACK]; + draw(f->b, r, col, nil, r.min); + } + y = pt.y; + cn0 -= b->nrune; + } else { + r.min = pt; + r.max = pt; + r.max.x += b->wid; + r.max.y += f->font->height; + if (r.max.x >= f->r.max.x) + r.max.x = f->r.max.x; + cn0--; + if (f->p0 <= cn0 && cn0 < f->p1) { /* b is inside selection */ + col = f->cols[HIGH]; + tcol = f->cols[HTEXT]; + } else { + col = f->cols[BACK]; + tcol = f->cols[TEXT]; + } + draw(f->b, r, col, nil, r.min); + y = 0; + if (pt.x == f->r.min.x) + y = pt.y; + } + } + /* insertion can extend the selection, so the condition here is different */ + if (f->p0 < p0 && p0 <= f->p1) { + col = f->cols[HIGH]; + tcol = f->cols[HTEXT]; + } else { + col = f->cols[BACK]; + tcol = f->cols[TEXT]; + } + frselectpaint(f, ppt0, ppt1, col); + _frdrawtext(&frame, ppt0, tcol, col); + _fraddbox(f, nn0, frame.nbox); + for (n = 0; n < frame.nbox; n++) + f->box[nn0 + n] = frame.box[n]; + if ( + nn0 > 0 && f->box[nn0 - 1].nrune >= 0 && + ppt0.x - f->box[nn0 - 1].wid >= f->r.min.x) { + --nn0; + ppt0.x -= f->box[nn0].wid; + } + n0 += frame.nbox; + _frclean(f, ppt0, nn0, n0 < f->nbox - 1 ? n0 + 1 : n0); + f->nchars += frame.nchars; + if (f->p0 >= p0) + f->p0 += frame.nchars; + if (f->p0 > f->nchars) + f->p0 = f->nchars; + if (f->p1 >= p0) + f->p1 += frame.nchars; + if (f->p1 > f->nchars) + f->p1 = f->nchars; + if (f->p0 == f->p1) + frtick(f, frptofchar(f, f->p0), 1); +} diff --git a/libframe/frptofchar.c b/libframe/frptofchar.c new file mode 100644 index 0000000..9c92cd2 --- /dev/null +++ b/libframe/frptofchar.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include + +Point _frptofcharptb(Frame* f, ulong p, Point pt, int bn) { + uchar* s; + Frbox* b; + int w, l; + Rune r; + + for (b = &f->box[bn]; bn < f->nbox; bn++, b++) { + _frcklinewrap(f, &pt, b); + if (p < (l = NRUNE(b))) { + if (b->nrune > 0) + for (s = b->ptr; p > 0; s += w, p--) { + if ((r = *s) < Runeself) + w = 1; + else + w = chartorune(&r, (char*)s); + pt.x += stringnwidth(f->font, (char*)s, 1); + if (r == 0 || pt.x > f->r.max.x) + drawerror(f->display, "frptofchar"); + } + break; + } + p -= l; + _fradvance(f, &pt, b); + } + return pt; +} + +Point frptofchar(Frame* f, ulong p) { + return _frptofcharptb(f, p, f->r.min, 0); +} + +Point _frptofcharnb( + Frame* f, ulong p, int nb) /* doesn't do final _fradvance to next line */ +{ + Point pt; + int nbox; + + nbox = f->nbox; + f->nbox = nb; + pt = _frptofcharptb(f, p, f->r.min, 0); + f->nbox = nbox; + return pt; +} + +static Point _frgrid(Frame* f, Point p) { + p.y -= f->r.min.y; + p.y -= p.y % f->font->height; + p.y += f->r.min.y; + if (p.x > f->r.max.x) + p.x = f->r.max.x; + return p; +} + +ulong frcharofpt(Frame* f, Point pt) { + Point qt; + int w, bn; + uchar* s; + Frbox* b; + ulong p; + Rune r; + + pt = _frgrid(f, pt); + qt = f->r.min; + for (b = f->box, bn = 0, p = 0; bn < f->nbox && qt.y < pt.y; bn++, b++) { + _frcklinewrap(f, &qt, b); + if (qt.y >= pt.y) + break; + _fradvance(f, &qt, b); + p += NRUNE(b); + } + for (; bn < f->nbox && qt.x <= pt.x; bn++, b++) { + _frcklinewrap(f, &qt, b); + if (qt.y > pt.y) + break; + if (qt.x + b->wid > pt.x) { + if (b->nrune < 0) + _fradvance(f, &qt, b); + else { + s = b->ptr; + for (;;) { + if ((r = *s) < Runeself) + w = 1; + else + w = chartorune(&r, (char*)s); + if (r == 0) + drawerror(f->display, "end of string in frcharofpt"); + qt.x += stringnwidth(f->font, (char*)s, 1); + s += w; + if (qt.x > pt.x) + break; + p++; + } + } + } else { + p += NRUNE(b); + _fradvance(f, &qt, b); + } + } + return p; +} diff --git a/libframe/frselect.c b/libframe/frselect.c new file mode 100644 index 0000000..4f48f8c --- /dev/null +++ b/libframe/frselect.c @@ -0,0 +1,123 @@ +#include +#include +#include +#include +#include + +static int region(int a, int b) { + if (a < b) + return -1; + if (a == b) + return 0; + return 1; +} + +void frselect(Frame* f, Mousectl* mc) /* when called, button 1 is down */ +{ + ulong p0, p1, q; + Point mp, pt0, pt1, qt; + int reg, b, scrled; + + mp = mc->m.xy; + b = mc->m.buttons; + + f->modified = 0; + frdrawsel(f, frptofchar(f, f->p0), f->p0, f->p1, 0); + p0 = p1 = frcharofpt(f, mp); + f->p0 = p0; + f->p1 = p1; + pt0 = frptofchar(f, p0); + pt1 = frptofchar(f, p1); + frdrawsel(f, pt0, p0, p1, 1); + reg = 0; + do { + scrled = 0; + if (f->scroll) { + if (mp.y < f->r.min.y) { + (*f->scroll)(f, -(f->r.min.y - mp.y) / (int)f->font->height - 1); + p0 = f->p1; + p1 = f->p0; + scrled = 1; + } else if (mp.y > f->r.max.y) { + (*f->scroll)(f, (mp.y - f->r.max.y) / (int)f->font->height + 1); + p0 = f->p0; + p1 = f->p1; + scrled = 1; + } + if (scrled) { + if (reg != region(p1, p0)) + q = p0, p0 = p1, p1 = q; /* undo the swap that will happen below */ + pt0 = frptofchar(f, p0); + pt1 = frptofchar(f, p1); + reg = region(p1, p0); + } + } + q = frcharofpt(f, mp); + if (p1 != q) { + if (reg != region(q, p0)) { /* crossed starting point; reset */ + if (reg > 0) + frdrawsel(f, pt0, p0, p1, 0); + else if (reg < 0) + frdrawsel(f, pt1, p1, p0, 0); + p1 = p0; + pt1 = pt0; + reg = region(q, p0); + if (reg == 0) + frdrawsel(f, pt0, p0, p1, 1); + } + qt = frptofchar(f, q); + if (reg > 0) { + if (q > p1) + frdrawsel(f, pt1, p1, q, 1); + else if (q < p1) + frdrawsel(f, qt, q, p1, 0); + } else if (reg < 0) { + if (q > p1) + frdrawsel(f, pt1, p1, q, 0); + else + frdrawsel(f, qt, q, p1, 1); + } + p1 = q; + pt1 = qt; + } + f->modified = 0; + if (p0 < p1) { + f->p0 = p0; + f->p1 = p1; + } else { + f->p0 = p1; + f->p1 = p0; + } + if (scrled) + (*f->scroll)(f, 0); + flushimage(f->display, 1); + if (!scrled) + readmouse(mc); + mp = mc->m.xy; + } while (mc->m.buttons == b); +} + +void frselectpaint(Frame* f, Point p0, Point p1, Image* col) { + int n; + Point q0, q1; + + q0 = p0; + q1 = p1; + q0.y += f->font->height; + q1.y += f->font->height; + n = (p1.y - p0.y) / f->font->height; + if (f->b == nil) + drawerror(f->display, "frselectpaint b==0"); + if (p0.y == f->r.max.y) + return; + if (n == 0) + draw(f->b, Rpt(p0, q1), col, nil, ZP); + else { + if (p0.x >= f->r.max.x) + p0.x = f->r.max.x - 1; + draw(f->b, Rect(p0.x, p0.y, f->r.max.x, q0.y), col, nil, ZP); + if (n > 1) + draw(f->b, Rect(f->r.min.x, q0.y, f->r.max.x, p1.y), col, nil, ZP); + draw(f->b, Rect(f->r.min.x, p1.y, q1.x, q1.y), col, nil, ZP); + } +} diff --git a/libframe/frstr.c b/libframe/frstr.c new file mode 100644 index 0000000..4d98e5f --- /dev/null +++ b/libframe/frstr.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include +#include + +#define CHUNK 16 +#define ROUNDUP(n) ((n + CHUNK) & ~(CHUNK - 1)) + +uchar* _frallocstr(Frame* f, unsigned n) { + uchar* p; + + p = malloc(ROUNDUP(n)); + if (p == 0) + drawerror(f->display, "out of memory"); + return p; +} + +void _frinsure(Frame* f, int bn, unsigned n) { + Frbox* b; + uchar* p; + + b = &f->box[bn]; + if (b->nrune < 0) + drawerror(f->display, "_frinsure"); + if (ROUNDUP(b->nrune) > n) /* > guarantees room for terminal NUL */ + return; + p = _frallocstr(f, n); + b = &f->box[bn]; + memmove(p, b->ptr, NBYTE(b) + 1); + free(b->ptr); + b->ptr = p; +} diff --git a/libframe/frutil.c b/libframe/frutil.c new file mode 100644 index 0000000..8435861 --- /dev/null +++ b/libframe/frutil.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include +#include + +int _frcanfit(Frame* f, Point pt, Frbox* b) { + int left, w, nr; + uchar* p; + Rune r; + + left = f->r.max.x - pt.x; + if (b->nrune < 0) + return b->minwid <= left; + if (left >= b->wid) + return b->nrune; + for (nr = 0, p = b->ptr; *p; p += w, nr++) { + r = *p; + if (r < Runeself) + w = 1; + else + w = chartorune(&r, (char*)p); + left -= stringnwidth(f->font, (char*)p, 1); + if (left < 0) + return nr; + } + drawerror(f->display, "_frcanfit can't"); + return 0; +} + +void _frcklinewrap(Frame* f, Point* p, Frbox* b) { + if ((b->nrune < 0 ? b->minwid : b->wid) > f->r.max.x - p->x) { + p->x = f->r.min.x; + p->y += f->font->height; + } +} + +void _frcklinewrap0(Frame* f, Point* p, Frbox* b) { + if (_frcanfit(f, *p, b) == 0) { + p->x = f->r.min.x; + p->y += f->font->height; + } +} + +void _fradvance(Frame* f, Point* p, Frbox* b) { + if (b->nrune < 0 && b->bc == '\n') { + p->x = f->r.min.x; + p->y += f->font->height; + } else + p->x += b->wid; +} + +int _frnewwid(Frame* f, Point pt, Frbox* b) { + b->wid = _frnewwid0(f, pt, b); + return b->wid; +} + +int _frnewwid0(Frame* f, Point pt, Frbox* b) { + int c, x; + + c = f->r.max.x; + x = pt.x; + if (b->nrune >= 0 || b->bc != '\t') + return b->wid; + if (x + b->minwid > c) + x = pt.x = f->r.min.x; + x += f->maxtab; + x -= (x - f->r.min.x) % f->maxtab; + if (x - pt.x < b->minwid || x > c) + x = pt.x + b->minwid; + return x - pt.x; +} + +void _frclean(Frame* f, Point pt, int n0, int n1) /* look for mergeable boxes */ +{ + Frbox* b; + int nb, c; + + c = f->r.max.x; + for (nb = n0; nb < n1 - 1; nb++) { + b = &f->box[nb]; + _frcklinewrap(f, &pt, b); + while (b[0].nrune >= 0 && nb < n1 - 1 && b[1].nrune >= 0 && + pt.x + b[0].wid + b[1].wid < c) { + _frmergebox(f, nb); + n1--; + b = &f->box[nb]; + } + _fradvance(f, &pt, &f->box[nb]); + } + for (; nb < f->nbox; nb++) { + b = &f->box[nb]; + _frcklinewrap(f, &pt, b); + _fradvance(f, &pt, &f->box[nb]); + } + f->lastlinefull = 0; + if (pt.y >= f->r.max.y) + f->lastlinefull = 1; +} diff --git a/libframe/libframe.a b/libframe/libframe.a new file mode 100644 index 0000000000000000000000000000000000000000..452179d166591deb30175ccadc3ead3e402706ae GIT binary patch literal 178518 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 = rf; t->tabstop = maxtab; memmove(t->fr.cols, cols, sizeof t->fr.cols); - textredraw(t, r, rf->f, screen, -1); + textredraw(t, r, rf->f, screen, -1, 0); } -void textredraw(Text* t, Rectangle r, Font* f, Image* b, int odx) { +void textdrawactive(Text* t, int active) { + Image* b; + Rectangle br; + + b = t->fr.cols[BACK]; + if (active) + b = t->fr.cols[HIGH]; + br.min = t->scrollr.max; + br.max.x = br.min.x + 1; + br.max.y = br.min.y + Dy(t->all); + draw(screen, br, b, nil, b->r.min); +} + +void textredraw(Text* t, Rectangle r, Font* f, Image* b, int odx, int active) { int maxt; Rectangle rr; @@ -64,6 +77,7 @@ void textredraw(Text* t, Rectangle r, Font* f, Image* b, int odx) { textfill(t); textsetselect(t, t->q0, t->q1); } + /*textdrawactive(t, active);*/ } int textresize(Text* t, Rectangle r, int keepextra) { @@ -80,7 +94,7 @@ int textresize(Text* t, Rectangle r, int keepextra) { t->lastsr = nullrect; r.min.x += Scrollwid + Scrollgap; frclear(&t->fr, 0); - textredraw(t, r, t->fr.font, t->fr.b, odx); + textredraw(t, r, t->fr.font, t->fr.b, odx, 0); if (keepextra && t->fr.r.max.y < t->all.max.y && !t->fr.noredraw) { /* draw background in bottom fringe of window */ r.min.x -= Scrollgap; diff --git a/wind.c b/wind.c index 88ae454..9f7208a 100644 --- a/wind.c +++ b/wind.c @@ -89,6 +89,35 @@ void wininit(Window* w, Window* clone, Rectangle r) { } } +void windrawideco(Window* active, Column** allcols, int ncol) { + Window* wptr; + Column* cptr; + int wcnt, ccnt; + + for (ccnt = 0; ccnt < ncol; ccnt++) { + cptr = allcols[ccnt]; + for (wcnt = 0; wcnt < cptr->nw; wcnt++) { + wptr = cptr->w[wcnt]; + winlock(wptr, 'M'); + textredraw( + &wptr->tag, + wptr->tag.scrollr, + wptr->tag.fr.font, + screen, + -1, + wptr->id == active->id); + textredraw( + &wptr->body, + wptr->body.scrollr, + wptr->body.fr.font, + screen, + -1, + wptr->id == active->id); + winunlock(wptr); + } + } +} + /* * Draw the appropriate button. */ @@ -573,8 +602,10 @@ void wincommit(Window* w, Text* t) { if (f->ntext > 1) for (i = 0; i < f->ntext; i++) textcommit(f->text[i], FALSE); /* no-op for t */ - if (t->what == Body) + if (t->what == Body) { + winresize(w, w->r, TRUE, TRUE); return; + } r = parsetag(w, 0, &i); if (runeeq(r, i, w->body.file->name, w->body.file->nname) == FALSE) { seq++;