diff options
| author | Ethan Morgan <ethan@gweithio.com> | 2026-02-13 15:06:35 +0000 |
|---|---|---|
| committer | Ethan Morgan <ethan@gweithio.com> | 2026-02-13 15:06:35 +0000 |
| commit | 5100b165ea37229cbdc9d2614ae0be248ddf3a30 (patch) | |
| tree | b387a0db5fba4bca623a63bef055ca4096488607 /fix.patch | |
| parent | f39a2407b6e6ace6af68e466bfa2f362b9a9dd36 (diff) | |
Diffstat (limited to 'fix.patch')
| -rw-r--r-- | fix.patch | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/fix.patch b/fix.patch new file mode 100644 index 00000000..c04b906a --- /dev/null +++ b/fix.patch @@ -0,0 +1,291 @@ +diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c +index bb7741536..b4968fc0d 100644 +--- a/src/cmd/acme/acme.c ++++ b/src/cmd/acme/acme.c +@@ -1033,63 +1033,58 @@ Cursor2 boxcursor2 = { + 0x00, 0x00, 0x00, 0x00} + }; + +-void +-iconinit(void) +-{ +- Rectangle r; +- Image *tmp; +- +- if(tagcols[BACK] == nil) { +- /* Blue */ +- tagcols[BACK] = allocimagemix(display, DPalebluegreen, DWhite); +- tagcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPalegreygreen); +- tagcols[BORD] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPurpleblue); +- tagcols[TEXT] = display->black; +- tagcols[HTEXT] = display->black; +- +- /* Yellow */ +- textcols[BACK] = allocimagemix(display, DPaleyellow, DWhite); +- textcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DDarkyellow); +- textcols[BORD] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DYellowgreen); +- textcols[TEXT] = display->black; +- textcols[HTEXT] = display->black; +- } +- +- r = Rect(0, 0, Scrollwid, font->height+1); +- if(button && eqrect(r, button->r)) +- return; +- +- if(button){ +- freeimage(button); +- freeimage(modbutton); +- freeimage(colbutton); +- } +- +- button = allocimage(display, r, screen->chan, 0, DNofill); +- draw(button, r, tagcols[BACK], nil, r.min); +- 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); +- border(modbutton, r, ButtonBorder, tagcols[BORD], ZP); +- r = insetrect(r, ButtonBorder); +- tmp = allocimage(display, Rect(0,0,1,1), screen->chan, 1, DMedblue); +- draw(modbutton, r, tmp, nil, ZP); +- freeimage(tmp); +- +- r = button->r; +- colbutton = allocimage(display, r, screen->chan, 0, DPurpleblue); +- +- but2col = allocimage(display, r, screen->chan, 1, 0xAA0000FF); +- but3col = allocimage(display, r, screen->chan, 1, 0x006600FF); +-} + + /* + * /dev/snarf updates when the file is closed, so we must open our own + * fd here rather than use snarffd + */ + ++void ++iconinit(void) ++{ ++ Rectangle r; ++ Image *tmp; ++ ++ /* Blue */ ++ tagcols[BACK] = display->white; ++ tagcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x72DEC2FF); ++ tagcols[BORD] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x72DEC2FF); ++ tagcols[TEXT] = display->black; ++ tagcols[HTEXT] = display->white; ++ ++ /* Yellow */ ++ textcols[BACK] = allocimagemix(display, DWhite, DWhite); ++ textcols[HIGH] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x72DEC2FF); ++ /* Halftone */ ++ textcols[BORD] = allocimage(display, Rect(0,0,2,2), CMAP8, 1, 0x000000FF); ++ draw(textcols[BORD], Rect(1,1,2,2), display->white, nil, ZP); ++ draw(textcols[BORD], Rect(0,0,1,1), display->white, nil, ZP); ++ textcols[TEXT] = display->black; ++ textcols[HTEXT] = display->black; ++ ++ if(button){ ++ freeimage(button); ++ freeimage(modbutton); ++ freeimage(colbutton); ++ } ++ /* Button */ ++ r = Rect(0, 0, Scrollwid, font->height+1); ++ button = allocimage(display, r, screen->chan, 0, DNofill); ++ draw(button, r, tagcols[BORD], nil, r.min); ++ r.max.x -= 4; ++ fillellipse(button, (Point){r.min.x + 5, r.min.y + 7}, 3, 3, display->white, ZP); ++ /* Mod Button */ ++ r = button->r; ++ modbutton = allocimage(display, r, screen->chan, 0, DNofill); ++ draw(modbutton, r, tagcols[BORD], nil, r.min); ++ r = insetrect(r, 2); ++ fillellipse(modbutton, (Point){r.min.x + 3, r.min.y + 5}, 3, 3, display->black, ZP); ++ r = button->r; ++ colbutton = allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x72DEC2FF); ++ but2col = allocimage(display, r, screen->chan, 1, 0x000000FF); ++ but3col = allocimage(display, r, screen->chan, 1, 0x72DEC2FF); ++} ++ + /* rio truncates larges snarf buffers, so this avoids using the + * service if the string is huge */ + +diff --git a/src/cmd/acme/scrl.c b/src/cmd/acme/scrl.c +index 6504699da..ab489ea59 100644 +--- a/src/cmd/acme/scrl.c ++++ b/src/cmd/acme/scrl.c +@@ -69,13 +69,13 @@ textscrdraw(Text *t) + r1.max.x = Dx(r); + r2 = scrpos(r1, t->org, t->org+t->fr.nchars, t->file->b.nc); + if(!eqrect(r2, t->lastsr)){ +- t->lastsr = r2; +- draw(b, r1, t->fr.cols[BORD], nil, ZP); +- draw(b, r2, t->fr.cols[BACK], nil, ZP); +- r2.min.x = r2.max.x-1; +- draw(b, r2, t->fr.cols[BORD], nil, ZP); +- draw(t->fr.b, r, b, nil, Pt(0, r1.min.y)); +-/*flushimage(display, 1); // BUG? */ ++ t->lastsr = r2; ++ draw(b, r1, t->fr.cols[BORD], nil, ZP); ++ r2.max.x = r2.max.x+1; ++ draw(b, r2, t->fr.cols[TEXT], nil, ZP); ++ r2.min.x = r2.max.x-1; ++ draw(b, r2, t->fr.cols[BORD], nil, ZP); ++ draw(t->fr.b, r, b, nil, Pt(0, r1.min.y)); + } + } + +diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c +index 09422dda0..4f70867ed 100644 +--- a/src/cmd/acme/text.c ++++ b/src/cmd/acme/text.c +@@ -692,10 +692,27 @@ texttype(Text *t, Rune r) + textshow(t, t->q1+1, t->q1+1, TRUE); + return; + case Kdown: +- if(t->what == Tag) +- goto Tagdown; +- n = t->fr.maxlines/3; +- goto case_Down; ++ typecommit(t); ++ q0 = t->q0; ++ nnb = 0; ++ if(t->q0>0 && textreadc(t, t->q0-1)!='\n') ++ nnb = textbswidth(t, 0x15); ++ while(q0<t->file->b.nc && textreadc(t, q0)!='\n') ++ q0++; ++ if (q0 == t->file->b.nc) { ++ textshow(t, q0, q0, TRUE); ++ return; ++ } ++ q0++; ++ while(nnb>=0 && q0<t->file->b.nc) { ++ if (textreadc(t, q0)=='\n') ++ break; ++ nnb--; ++ if (nnb >= 0) ++ q0++; ++ } ++ textshow(t, q0, q0, TRUE); ++ return; + case Kscrollonedown: + if(t->what == Tag) + goto Tagdown; +@@ -710,10 +727,26 @@ texttype(Text *t, Rune r) + textsetorigin(t, q0, TRUE); + return; + case Kup: +- if(t->what == Tag) +- goto Tagup; +- n = t->fr.maxlines/3; +- goto case_Up; ++ typecommit(t); ++ nnb = 0; ++ if(t->q0>0 && textreadc(t, t->q0-1)!='\n') ++ nnb = textbswidth(t, 0x15); ++ q1 = nnb; ++ if(t->q0-nnb > 1 && textreadc(t, t->q0-nnb-1)=='\n') ++ nnb++; ++ q0 = t->q0-nnb; ++ textshow(t, q0, q0, TRUE); ++ ++ nnb = textbswidth(t, 0x15); ++ if (nnb <= 1) ++ return; ++ q0 = q0-nnb; ++ while (q1>0 && textreadc(t, q0)!='\n') { ++ q1--; ++ q0++; ++ } ++ textshow(t, q0, q0, TRUE); ++ return; + case Kscrolloneup: + if(t->what == Tag) + goto Tagup; +@@ -726,25 +759,6 @@ texttype(Text *t, Rune r) + textsetorigin(t, q0, TRUE); + return; + case Khome: +- typecommit(t); +- if(t->org > t->iq1) { +- q0 = textbacknl(t, t->iq1, 1); +- textsetorigin(t, q0, TRUE); +- } else +- textshow(t, 0, 0, FALSE); +- return; +- case Kend: +- typecommit(t); +- if(t->iq1 > t->org+t->fr.nchars) { +- if(t->iq1 > t->file->b.nc) { +- // should not happen, but does. and it will crash textbacknl. +- t->iq1 = t->file->b.nc; +- } +- q0 = textbacknl(t, t->iq1, 1); +- textsetorigin(t, q0, TRUE); +- } else +- textshow(t, t->file->b.nc, t->file->b.nc, FALSE); +- return; + case 0x01: /* ^A: beginning of line */ + typecommit(t); + /* go to where ^U would erase, if not already at BOL */ +@@ -753,6 +767,7 @@ texttype(Text *t, Rune r) + nnb = textbswidth(t, 0x15); + textshow(t, t->q0-nnb, t->q0-nnb, TRUE); + return; ++ case Kend: + case 0x05: /* ^E: end of line */ + typecommit(t); + q0 = t->q0; +@@ -760,19 +775,26 @@ texttype(Text *t, Rune r) + q0++; + textshow(t, q0, q0, TRUE); + return; ++ case 0x03: /* Ctrl-c: copy */ + case Kcmd+'c': /* %C: copy */ + typecommit(t); + cut(t, t, nil, TRUE, FALSE, nil, 0); + return; ++ case 0x1a: /* Ctrl-z: undo */ + case Kcmd+'z': /* %Z: undo */ + typecommit(t); + undo(t, nil, nil, TRUE, 0, nil, 0); + return; ++ case 0x19: /* Ctrl-y: redo */ + case Kcmd+'Z': /* %-shift-Z: redo */ + typecommit(t); + undo(t, nil, nil, FALSE, 0, nil, 0); + return; +- ++ case 0x13: /* Ctrl-S: put file */ ++ case Kcmd+'s': ++ typecommit(t); ++ put(&(t->w)->body, nil, nil, XXX, XXX, nil, 0); ++ return; + Tagdown: + /* expand tag to show all text */ + if(!t->w->tagexpand){ +@@ -796,6 +818,7 @@ texttype(Text *t, Rune r) + } + /* cut/paste must be done after the seq++/filemark */ + switch(r){ ++ case 0x18: /* Ctrl-X: cut */ + case Kcmd+'x': /* %X: cut */ + typecommit(t); + if(t->what == Body){ +@@ -806,6 +829,7 @@ texttype(Text *t, Rune r) + textshow(t, t->q0, t->q0, 1); + t->iq1 = t->q0; + return; ++ case 0x16: /* Ctrl-V: paste */ + case Kcmd+'v': /* %V: paste */ + typecommit(t); + if(t->what == Body){ +@@ -1661,4 +1685,4 @@ textreset(Text *t) + t->q1 = 0; + filereset(t->file); + bufreset(&t->file->b); +-} ++} +\ No newline at end of file |