acme3k/acme3k.patch

2652 lines
73 KiB
Diff
Raw Normal View History

2023-11-03 19:29:03 -04:00
diff --git a/src/cmd/acme/LICENSE b/src/cmd/acme/LICENSE
new file mode 100644
index 00000000..6110e313
--- /dev/null
+++ b/src/cmd/acme/LICENSE
@@ -0,0 +1,257 @@
+Copyright © 2000-2009 Lucent Technologies. All Rights Reserved.
+Portions Copyright © 2001-2008 Russ Cox
+Portions Copyright © 2008-2009 Google Inc.
+
+===================================================================
+
+The bulk of this software is derived from Plan 9 and is thus distributed
+under the Lucent Public License, Version 1.02, reproduced below.
+
+There are a few exceptions: libutf, libfmt, and libregexp are distributed
+under simpler BSD-like boilerplates. See the LICENSE files in those
+directories. There are other exceptions, also marked with LICENSE files
+in their directories or marked at the top of the file.
+
+The bitmap fonts in the font/luc, font/lucm, font/lucsans, and font/pelm
+directory are copyright B&H Inc. and distributed under more restricted
+terms under agreement with B&H. See the NOTICE file in those directories.
+
+===================================================================
+
+Lucent Public License Version 1.02
+
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS PUBLIC
+LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE
+PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+1. DEFINITIONS
+
+"Contribution" means:
+
+ a. in the case of Lucent Technologies Inc. ("LUCENT"), the Original
+ Program, and
+ b. in the case of each Contributor,
+
+ i. changes to the Program, and
+ ii. additions to the Program;
+
+ where such changes and/or additions to the Program were added to the
+ Program by such Contributor itself or anyone acting on such
+ Contributor's behalf, and the Contributor explicitly consents, in
+ accordance with Section 3C, to characterization of the changes and/or
+ additions as Contributions.
+
+"Contributor" means LUCENT and any other entity that has Contributed a
+Contribution to the Program.
+
+"Distributor" means a Recipient that distributes the Program,
+modifications to the Program, or any part thereof.
+
+"Licensed Patents" mean patent claims licensable by a Contributor
+which are necessarily infringed by the use or sale of its Contribution
+alone or when combined with the Program.
+
+"Original Program" means the original version of the software
+accompanying this Agreement as released by LUCENT, including source
+code, object code and documentation, if any.
+
+"Program" means the Original Program and Contributions or any part
+thereof
+
+"Recipient" means anyone who receives the Program under this
+Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a. Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free copyright
+ license to reproduce, prepare derivative works of, publicly display,
+ publicly perform, distribute and sublicense the Contribution of such
+ Contributor, if any, and such derivative works, in source code and
+ object code form.
+
+ b. Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free patent
+ license under Licensed Patents to make, use, sell, offer to sell,
+ import and otherwise transfer the Contribution of such Contributor, if
+ any, in source code and object code form. The patent license granted
+ by a Contributor shall also apply to the combination of the
+ Contribution of that Contributor and the Program if, at the time the
+ Contribution is added by the Contributor, such addition of the
+ Contribution causes such combination to be covered by the Licensed
+ Patents. The patent license granted by a Contributor shall not apply
+ to (i) any other combinations which include the Contribution, nor to
+ (ii) Contributions of other Contributors. No hardware per se is
+ licensed hereunder.
+
+ c. Recipient understands that although each Contributor grants the
+ licenses to its Contributions set forth herein, no assurances are
+ provided by any Contributor that the Program does not infringe the
+ patent or other intellectual property rights of any other entity. Each
+ Contributor disclaims any liability to Recipient for claims brought by
+ any other entity based on infringement of intellectual property rights
+ or otherwise. As a condition to exercising the rights and licenses
+ granted hereunder, each Recipient hereby assumes sole responsibility
+ to secure any other intellectual property rights needed, if any. For
+ example, if a third party patent license is required to allow
+ Recipient to distribute the Program, it is Recipient's responsibility
+ to acquire that license before distributing the Program.
+
+ d. Each Contributor represents that to its knowledge it has sufficient
+ copyright rights in its Contribution, if any, to grant the copyright
+ license set forth in this Agreement.
+
+3. REQUIREMENTS
+
+A. Distributor may choose to distribute the Program in any form under
+this Agreement or under its own license agreement, provided that:
+
+ a. it complies with the terms and conditions of this Agreement;
+
+ b. if the Program is distributed in source code or other tangible
+ form, a copy of this Agreement or Distributor's own license agreement
+ is included with each copy of the Program; and
+
+ c. if distributed under Distributor's own license agreement, such
+ license agreement:
+
+ i. effectively disclaims on behalf of all Contributors all warranties
+ and conditions, express and implied, including warranties or
+ conditions of title and non-infringement, and implied warranties or
+ conditions of merchantability and fitness for a particular purpose;
+ ii. effectively excludes on behalf of all Contributors all liability
+ for damages, including direct, indirect, special, incidental and
+ consequential damages, such as lost profits; and
+ iii. states that any provisions which differ from this Agreement are
+ offered by that Contributor alone and not by any other party.
+
+B. Each Distributor must include the following in a conspicuous
+ location in the Program:
+
+ Copyright (C) 2003, Lucent Technologies Inc. and others. All Rights
+ Reserved.
+
+C. In addition, each Contributor must identify itself as the
+originator of its Contribution in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution.
+Also, each Contributor must agree that the additions and/or changes
+are intended to be a Contribution. Once a Contribution is contributed,
+it may not thereafter be revoked.
+
+4. COMMERCIAL DISTRIBUTION
+
+Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use
+of the Program, the Distributor who includes the Program in a
+commercial product offering should do so in a manner which does not
+create potential liability for Contributors. Therefore, if a
+Distributor includes the Program in a commercial product offering,
+such Distributor ("Commercial Distributor") hereby agrees to defend
+and indemnify every Contributor ("Indemnified Contributor") against
+any losses, damages and costs (collectively"Losses") arising from
+claims, lawsuits and other legal actions brought by a third party
+against the Indemnified Contributor to the extent caused by the acts
+or omissions of such Commercial Distributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement.
+In order to qualify, an Indemnified Contributor must: a) promptly
+notify the Commercial Distributor in writing of such claim, and b)
+allow the Commercial Distributor to control, and cooperate with the
+Commercial Distributor in, the defense and any related settlement
+negotiations. The Indemnified Contributor may participate in any such
+claim at its own expense.
+
+For example, a Distributor might include the Program in a commercial
+product offering, Product X. That Distributor is then a Commercial
+Distributor. If that Commercial Distributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Distributor's responsibility
+alone. Under this section, the Commercial Distributor would have to
+defend claims against the Contributors related to those performance
+claims and warranties, and if a court requires any Contributor to pay
+any damages as a result, the Commercial Distributor must pay those
+damages.
+
+5. NO WARRANTY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement, including but not limited to
+the risks and costs of program errors, compliance with applicable
+laws, damage to or loss of data, programs or equipment, and
+unavailability or interruption of operations.
+
+6. DISCLAIMER OF LIABILITY
+
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. EXPORT CONTROL
+
+Recipient agrees that Recipient alone is responsible for compliance
+with the United States export administration regulations (and the
+export control laws and regulation of any other countries).
+
+8. GENERAL
+
+If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further
+action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.
+
+If Recipient institutes patent litigation against a Contributor with
+respect to a patent applicable to software (including a cross-claim or
+counterclaim in a lawsuit), then any patent licenses granted by that
+Contributor to such Recipient under this Agreement shall terminate as
+of the date such litigation is filed. In addition, if Recipient
+institutes patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Program
+itself (excluding combinations of the Program with other software or
+hardware) infringes such Recipient's patent(s), then such Recipient's
+rights granted under Section 2(b) shall terminate as of the date such
+litigation is filed.
+
+All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of
+time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use
+and distribution of the Program as soon as reasonably practicable.
+However, Recipient's obligations under this Agreement and any licenses
+granted by Recipient relating to the Program shall continue and
+survive.
+
+LUCENT may publish new versions (including revisions) of this
+Agreement from time to time. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new
+version of the Agreement is published, Contributor may elect to
+distribute the Program (including its Contributions) under the new
+version. No one other than LUCENT has the right to modify this
+Agreement. Except as expressly stated in Sections 2(a) and 2(b) above,
+Recipient receives no rights or licenses to the intellectual property
+of any Contributor under this Agreement, whether expressly, by
+implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.
+
+This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No
+party to this Agreement will bring a legal action under this Agreement
+more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.
+
2023-10-31 21:32:48 -04:00
diff --git a/src/cmd/acme/acme.c b/src/cmd/acme/acme.c
index da24e706..28c429ec 100644
--- a/src/cmd/acme/acme.c
+++ b/src/cmd/acme/acme.c
@@ -11,9 +11,11 @@
#include <libsec.h>
#include "dat.h"
#include "fns.h"
- /* for generating syms in mkfile only: */
- #include <bio.h>
- #include "edit.h"
+#include "config.h"
+
+/* for generating syms in mkfile only: */
+#include <bio.h>
+#include "edit.h"
void mousethread(void*);
void keyboardthread(void*);
@@ -21,28 +23,21 @@ void waitthread(void*);
void xfidallocthread(void*);
void newwindowthread(void*);
void plumbproc(void*);
-int timefmt(Fmt*);
+int timefmt(Fmt*);
Reffont **fontcache;
int nfontcache;
-char wdir[512] = ".";
+char wdir[512] = ".";
Reffont *reffonts[2];
int snarffd = -1;
int mainpid;
-int swapscrollbuttons = FALSE;
-char *mtpt;
+char *mtpt;
enum{
NSnarf = 1000 /* less than 1024, I/O buffer size */
};
Rune snarfrune[NSnarf+1];
-char *fontnames[2] =
-{
- "/lib/font/bit/lucsans/euro.8.font",
- "/lib/font/bit/lucm/unicode.9.font"
-};
-
Command *command;
void shutdownthread(void*);
@@ -57,12 +52,6 @@ derror(Display *d, char *errorstr)
error(errorstr);
}
-int
-threadmaybackground(void)
-{
- return 1;
-}
-
void
threadmain(int argc, char *argv[])
{
@@ -71,7 +60,6 @@ threadmain(int argc, char *argv[])
Column *c;
int ncol;
Display *d;
-
rfork(RFENVG|RFNAMEG);
ncol = -1;
@@ -84,11 +72,26 @@ threadmain(int argc, char *argv[])
}
break;
case 'a':
- globalindent |= IndentAuto;
+ if(globalautoindent)
+ globalautoindent = FALSE;
+ else
+ globalautoindent = TRUE;
break;
- case 'b':
+
+/* bartmode/flag is now an option to be turned on config.h, just
+ * because it is way too useful to leave it as an meaningless
+ * flag, especially since considering how almost everyone seems
+ * to even miss its existence.
+ *
+ * to get to the point, it denies window focus following mouse.
+ * how fickle those mice can truly be when decieveth by a soothing
+ * treat, a teat or two.
+ */
+
+/* case 'b':
bartflag = TRUE;
- break;
+ break; */
+
case 'c':
p = ARGF();
if(p == nil)
@@ -107,9 +110,6 @@ threadmain(int argc, char *argv[])
if(fontnames[1] == nil)
goto Usage;
break;
- case 'i':
- globalindent |= IndentSpaces;
- break;
case 'l':
loadfile = ARGF();
if(loadfile == nil)
@@ -130,7 +130,7 @@ threadmain(int argc, char *argv[])
break;
default:
Usage:
- fprint(2, "usage: acme -aibr -c ncol -f fontname -F fixedwidthfontname -l loadfile -W winsize\n");
+ fprint(2, "usage: acme -a -c ncol -f fontname -F fixedwidthfontname -l loadfile -W winsize\n");
threadexitsall("usage");
}ARGEND
@@ -392,7 +392,7 @@ int erroutfd;
void
acmeerrorproc(void *v)
{
- char *buf, *s;
+ char *buf;
int n;
USED(v);
@@ -400,11 +400,8 @@ acmeerrorproc(void *v)
buf = emalloc(8192+1);
while((n=read(errorfd, buf, 8192)) >= 0){
buf[n] = '\0';
- s = estrdup(buf);
- sendp(cerr, s);
- free(s);
+ sendp(cerr, estrdup(buf));
}
- free(buf);
}
void
@@ -558,7 +555,7 @@ mousethread(void *v)
case MResize:
if(getwindow(display, Refnone) < 0)
error("attach to window");
- draw(screen, screen->r, display->white, nil, ZP);
+ draw(screen, screen->r, tagcols[BACK], nil, ZP);
iconinit();
scrlresize();
rowresize(&row, screen->clipr);
@@ -626,10 +623,14 @@ mousethread(void *v)
goto Continue;
}
/* scroll buttons, wheels, etc. */
- if(w != nil && m.scroll != 0){
+ if(w != nil && (m.buttons & (8|16))){
+ if(m.buttons & 8)
+ but = Kscrolloneup;
+ else
+ but = Kscrollonedown;
winlock(w, 'M');
t->eq0 = ~0;
- textmomentumscroll(t, m.scroll);
+ texttype(t, but);
winunlock(w);
goto Continue;
}
@@ -971,74 +972,6 @@ Cursor boxcursor = {
0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x00, 0x00}
};
-Cursor2 boxcursor2 = {
- {-15, -15},
- {0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xC0, 0x03, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF},
- {0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0x00, 0x00, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x3F, 0xFF, 0xFF, 0xFC,
- 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00}
-};
-
void
iconinit(void)
{
@@ -1046,19 +979,19 @@ iconinit(void)
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;
+
+ tagcols[BACK] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TAGBG);
+ tagcols[HIGH] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TAGHLBG);
+ tagcols[BORD] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_COLBUTTON);
+ tagcols[TEXT] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TAGFG);
+ tagcols[HTEXT] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TAGHLFG);
+
+ textcols[BACK] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TXTBG);
+ textcols[HIGH] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TXTHLBG);
+ textcols[BORD] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_SCROLLBG);
+ textcols[TEXT] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TXTFG);
+ textcols[HTEXT] = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TXTHLFG);
+
}
r = Rect(0, 0, Scrollwid+ButtonBorder, font->height+1);
@@ -1082,15 +1015,15 @@ iconinit(void)
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, DMedblue);
+ tmp = allocimage(display, Rect(0,0,1,1), RGBA32, 1, C_TMPBUTTON);
draw(modbutton, r, tmp, nil, ZP);
freeimage(tmp);
r = button->r;
- colbutton = allocimage(display, r, screen->chan, 0, DPurpleblue);
+ colbutton = allocimage(display, r, RGBA32, 1, C_WINBUTTON);
- but2col = allocimage(display, r, screen->chan, 1, 0xAA0000FF);
- but3col = allocimage(display, r, screen->chan, 1, 0x006600FF);
+ but2col = allocimage(display, r, screen->chan, 1, C_BUTTON2HL);
+ but3col = allocimage(display, r, screen->chan, 1, C_BUTTON3HL);
}
/*
diff --git a/src/cmd/acme/addr.c b/src/cmd/acme/addr.c
index 6aee8993..2ccae960 100644
--- a/src/cmd/acme/addr.c
+++ b/src/cmd/acme/addr.c
@@ -240,12 +240,12 @@ address(uint showerr, Text *t, Range lim, Range ar, void *a, uint q0, uint q1, i
case '5': case '6': case '7': case '8': case '9':
n = c -'0';
while(q<q1){
- nc = (*getc)(a, q++);
- if(nc<'0' || '9'<nc){
+ c = (*getc)(a, q++);
+ if(c<'0' || '9'<c){
q--;
break;
}
- n = n*10+(nc-'0');
+ n = n*10+(c-'0');
}
if(*evalp)
r = number(showerr, t, r, n, dir, size, evalp);
diff --git a/src/cmd/acme/cols.c b/src/cmd/acme/cols.c
index 63247a84..5c8d4586 100644
--- a/src/cmd/acme/cols.c
+++ b/src/cmd/acme/cols.c
@@ -29,7 +29,7 @@ colinit(Column *c, Rectangle r)
Rectangle r1;
Text *t;
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
c->r = r;
c->w = nil;
c->nw = 0;
@@ -89,19 +89,19 @@ coladd(Column *c, Window *w, Window *clone, int y)
/*
* figure out where to split v to make room for w
*/
-
+
/* new window stops where next window begins */
if(i < c->nw)
ymax = c->w[i]->r.min.y-Border;
else
ymax = c->r.max.y;
-
+
/* new window must start after v's tag ends */
y = max(y, v->tagtop.max.y+Border);
-
+
/* new window must start early enough to end before ymax */
y = min(y, ymax - minht);
-
+
/* if y is too small, too many windows in column */
if(y < v->tagtop.max.y+Border)
buggered = 1;
@@ -118,7 +118,7 @@ coladd(Column *c, Window *w, Window *clone, int y)
r1.min.y = winresize(v, r1, FALSE, FALSE);
r1.max.y = r1.min.y+Border;
draw(screen, r1, display->black, nil, ZP);
-
+
/*
* leave r with w's coordinates
*/
@@ -142,7 +142,7 @@ coladd(Column *c, Window *w, Window *clone, int y)
c->nw++;
c->w[i] = w;
c->safe = TRUE;
-
+
/* if there were too many windows, redraw the whole column */
if(buggered)
colresize(c, c->r);
@@ -181,7 +181,7 @@ colclose(Column *c, Window *w, int dofree)
memmove(c->w+i, c->w+i+1, (c->nw-i)*sizeof(Window*));
c->w = realloc(c->w, c->nw*sizeof(Window*));
if(c->nw == 0){
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
return;
}
up = 0;
@@ -232,7 +232,7 @@ colmousebut(Column *c)
void
colresize(Column *c, Rectangle r)
{
- int i, old, new;
+ int i;
Rectangle r1, r2;
Window *w;
@@ -245,19 +245,13 @@ colresize(Column *c, Rectangle r)
r1.max.y += Border;
draw(screen, r1, display->black, nil, ZP);
r1.max.y = r.max.y;
- new = Dy(r) - c->nw*(Border + font->height);
- old = Dy(c->r) - c->nw*(Border + font->height);
for(i=0; i<c->nw; i++){
w = c->w[i];
w->maxlines = 0;
if(i == c->nw-1)
r1.max.y = r.max.y;
- else{
- r1.max.y = r1.min.y;
- if(new > 0 && old > 0 && Dy(w->r) > Border+font->height){
- r1.max.y += (Dy(w->r)-Border-font->height)*new/old + Border + font->height;
- }
- }
+ else
+ r1.max.y = r1.min.y+(Dy(w->r)+Border)*Dy(r)/Dy(c->r);
r1.max.y = max(r1.max.y, r1.min.y + Border+font->height);
r2 = r1;
r2.max.y = r2.min.y+Border;
@@ -479,7 +473,7 @@ coldragwin(Column *c, Window *w, int but)
Column *nc;
clearmouse();
- setcursor2(mousectl, &boxcursor, &boxcursor2);
+ setcursor(mousectl, &boxcursor);
b = mouse->buttons;
op = mouse->xy;
while(mouse->buttons == b)
2023-11-03 19:29:03 -04:00
diff --git a/src/cmd/acme/config.h b/src/cmd/acme/config.h
new file mode 100644
index 00000000..c7258e6f
--- /dev/null
+++ b/src/cmd/acme/config.h
@@ -0,0 +1,101 @@
+/*
+ * fontnames-array takes two fonts, first one
+ * it treats as a proportional-width font and uses
+ * everywhere possible and as a main UI font, while
+ * the second font it treats as a fixed-width font,
+ * changeable to any text window by executing `Font`
+ * from tag window.
+ *
+ * Note: `Font` can also be executed
+ * with arguments with any `fontsrv -p .` approved
+ * fonts, thus allowing you to experiment with font
+ * sizes and whether you want anti-aliasing or not.
+ */
+
+char *fontnames[2] = {
+ "/lib/font/bit/profont/profont-12.font",
+ "/lib/font/bit/mntcarlo/mntcarlo.font"
+};
+
+/*
+ * globalautoindent tries to guess where to
+ * indent by the context of the previous line.
+ *
+ * comes highly suggested.
+ */
+
+int globalautoindent = TRUE;
+
+/*
+ * swapping scroll buttons makes B1 scroll down
+ * instead of up and B2 up instead of down
+ */
+
+int swapscrollbuttons = FALSE;
+
+/*
+ * bartflag triggers quote unquote experimental
+ * mode, in which instead of mouse following focus
+ * from window to window etc. it in fact, does not.
+ *
+ * comes highly suggested.
+ */
+
+int bartflag = TRUE;
+
+/*
+ * colors-constants. now let me take a minute to explain
+ * them. C_TAGBG/FG/HLBG/HLFG are respectively your tag
+ * windows background, foreground, highlighted back- and
+ * foreground color. The same exact applies to C_TXT*-
+ * variants of the same constant just in this case it handles
+ * the colorscheme of the text window.
+ *
+ * C_WINBUTTON is the button which you adjust your columns
+ * position with. C_COLBUTTON represents a separate text
+ * windows button. C_TMPBUTTON is the so-called "dirty"
+ * or "unclean" -marker aka notifying the file as modified put
+ * in the middle of C_COLBUTTON. C_SCROLLBG is plain and simple
+ * your scrollbars background color.
+ *
+ * the last two defines are for defining the color of the specific
+ * buttons highlight background.
+ */
+
+/*
+#define C_TAGBG 0xFFFFFFFF
+#define C_TAGFG 0x000000FF
+#define C_TAGHLBG 0x999999FF
+#define C_TAGHLFG 0x000000FF
+
+#define C_TXTBG 0xFFFFFFFF
+#define C_TXTFG 0x000000FF
+#define C_TXTHLBG 0x999999FF
+#define C_TXTHLFG 0x000000FF
+
+#define C_WINBUTTON 0x4d4d4dFF
+#define C_COLBUTTON 0x55aaaaFF
+#define C_TMPBUTTON 0x55aaaaFF
+#define C_SCROLLBG 0x999999FF
+
+#define C_BUTTON2HL 0x55aaaaFF
+#define C_BUTTON3HL 0x55aaaaFF
+*/
+#define C_TAGBG 0x2B303BFF
+#define C_TAGFG 0xC0C5CEFF
+#define C_TAGHLBG 0x006CA5FF
+#define C_TAGHLFG 0xEFF1F5FF
+
+#define C_TXTBG 0x2B303BFF
+#define C_TXTFG 0xC0C5CEFF
+#define C_TXTHLBG 0x006CA5FF
+#define C_TXTHLFG 0xEFF1F5FF
+
+#define C_WINBUTTON 0x543F5EFF
+#define C_COLBUTTON 0x65737EFF
+#define C_TMPBUTTON 0x65737EFF
+#define C_SCROLLBG 0x222222FF
+
+#define C_BUTTON2HL 0xB47EADFF
+#define C_BUTTON3HL 0xBF616AFF
+
2023-10-31 21:32:48 -04:00
diff --git a/src/cmd/acme/dat.h b/src/cmd/acme/dat.h
index 1dfc6a65..8c4b14ee 100644
--- a/src/cmd/acme/dat.h
+++ b/src/cmd/acme/dat.h
@@ -198,13 +198,6 @@ struct Text
int needundo;
};
-enum
-{
- /* default is tab indent, i.e. b'0 */
- IndentSpaces = 0x1,
- IndentAuto = 0x2
-};
-
uint textbacknl(Text*, uint, uint);
uint textbsinsert(Text*, uint, Rune*, uint, int, int*);
int textbswidth(Text*, Rune);
@@ -234,7 +227,6 @@ int textselect3(Text*, uint*, uint*);
void textsetorigin(Text*, uint, int);
void textsetselect(Text*, uint, uint);
void textshow(Text*, uint, uint, int);
-void textmomentumscroll(Text*, int);
void texttype(Text*, Rune);
struct Window
@@ -248,7 +240,7 @@ struct Window
uchar isscratch;
uchar filemenu;
uchar dirty;
- uchar indent;
+ uchar autoindent;
uchar showdel;
int id;
Range addr;
@@ -533,7 +525,6 @@ Image *button;
Image *but2col;
Image *but3col;
Cursor boxcursor;
-Cursor2 boxcursor2;
Row row;
int timerpid;
Disk *disk;
@@ -560,7 +551,7 @@ extern char wdir[]; /* must use extern because no dimension given */
int editing;
int erroutfd;
int messagesize; /* negotiated in 9P version setup */
-int globalindent;
+int globalautoindent;
int dodollarsigns;
char* mtpt;
diff --git a/src/cmd/acme/ecmd.c b/src/cmd/acme/ecmd.c
index 357dd89f..ef92e339 100644
--- a/src/cmd/acme/ecmd.c
+++ b/src/cmd/acme/ecmd.c
@@ -28,7 +28,7 @@ int append(File*, Cmd*, long);
int pdisplay(File*);
void pfilename(File*);
void looper(File*, Cmd*, int);
-void filelooper(Text*, Cmd*, int);
+void filelooper(Cmd*, int);
void linelooper(File*, Cmd*);
Address lineaddr(long, Address, int);
int filematch(File*, String*);
@@ -131,11 +131,14 @@ cmdexec(Text *t, Cmd *cp)
char*
edittext(Window *w, int q, Rune *r, int nr)
{
+ File *f;
+
+ f = w->body.file;
switch(editing){
case Inactive:
return "permission denied";
case Inserting:
- eloginsert(w->body.file, q, r, nr);
+ eloginsert(f, q, r, nr);
return nil;
case Collecting:
collection = runerealloc(collection, ncollection+nr+1);
@@ -155,13 +158,11 @@ filelist(Text *t, Rune *r, int nr)
if(nr == 0)
return nil;
r = skipbl(r, nr, &nr);
+ if(r[0] != '<')
+ return runestrdup(r);
+ /* use < command to collect text */
clearcollection();
- if(r[0] != '<'){
- if((collection = runestrdup(r)) != nil)
- ncollection += runestrlen(r);
- }else
- /* use < command to collect text */
- runpipe(t, '<', r+1, nr-1, Collecting);
+ runpipe(t, '<', r+1, nr-1, Collecting);
return collection;
}
@@ -583,7 +584,7 @@ X_cmd(Text *t, Cmd *cp)
{
USED(t);
- filelooper(t, cp, cp->cmdc=='X');
+ filelooper(cp, cp->cmdc=='X');
return TRUE;
}
@@ -632,8 +633,8 @@ runpipe(Text *t, int cmd, Rune *cr, int ncr, int state)
/*
* The editoutlk exists only so that we can tell when
* the editout file has been closed. It can get closed *after*
- * the process exits because, since the process cannot be
- * connected directly to editout (no 9P kernel support),
+ * the process exits because, since the process cannot be
+ * connected directly to editout (no 9P kernel support),
* the process is actually connected to a pipe to another
* process (arranged via 9pserve) that reads from the pipe
* and then writes the data in the pipe to editout using
@@ -703,7 +704,7 @@ printposn(Text *t, int mode)
if (t != nil && t->file != nil && t->file->name != nil)
warning(nil, "%.*S:", t->file->nname, t->file->name);
-
+
switch(mode) {
case PosnChars:
warning(nil, "#%d", addr.r.q0);
@@ -711,7 +712,7 @@ printposn(Text *t, int mode)
warning(nil, ",#%d", addr.r.q1);
warning(nil, "\n");
return;
-
+
default:
case PosnLine:
l1 = 1+nlcount(t, 0, addr.r.q0, nil);
@@ -977,10 +978,9 @@ alllocker(Window *w, void *v)
}
void
-filelooper(Text *t, Cmd *cp, int XY)
+filelooper(Cmd *cp, int XY)
{
int i;
- Text *targ;
if(Glooping++)
editerror("can't nest %c command", "YX"[XY]);
@@ -1001,26 +1001,8 @@ filelooper(Text *t, Cmd *cp, int XY)
*/
allwindows(alllocker, (void*)1);
globalincref = 1;
-
- /*
- * Unlock the window running the X command.
- * We'll need to lock and unlock each target window in turn.
- */
- if(t && t->w)
- winunlock(t->w);
-
- for(i=0; i<loopstruct.nw; i++) {
- targ = &loopstruct.w[i]->body;
- if(targ && targ->w)
- winlock(targ->w, cp->cmdc);
- cmdexec(targ, cp->u.cmd);
- if(targ && targ->w)
- winunlock(targ->w);
- }
-
- if(t && t->w)
- winlock(t->w, cp->cmdc);
-
+ for(i=0; i<loopstruct.nw; i++)
+ cmdexec(&loopstruct.w[i]->body, cp->u.cmd);
allwindows(alllocker, (void*)0);
globalincref = 0;
free(loopstruct.w);
diff --git a/src/cmd/acme/edit.c b/src/cmd/acme/edit.c
index 82a19b0d..d3f82059 100644
--- a/src/cmd/acme/edit.c
+++ b/src/cmd/acme/edit.c
@@ -515,7 +515,7 @@ parsecmd(int nest)
if(nextc() == 'g')
cmd.flag = getch();
}
-
+
}
}
}
@@ -613,7 +613,7 @@ simpleaddr(void)
addr.num = getnum(1);
break;
case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
+ case '5': case '6': case '7': case '8': case '9':
addr.num = getnum(1);
addr.type='l';
break;
@@ -635,11 +635,9 @@ simpleaddr(void)
case '.':
case '$':
case '\'':
- if(addr.type=='"')
- break;
- /* fall through */
+ if(addr.type!='"')
case '"':
- editerror("bad address syntax");
+ editerror("bad address syntax");
break;
case 'l':
case '#':
diff --git a/src/cmd/acme/elog.c b/src/cmd/acme/elog.c
index 8a8951fb..c5650f03 100644
--- a/src/cmd/acme/elog.c
+++ b/src/cmd/acme/elog.c
@@ -243,7 +243,7 @@ elogapply(File *f)
* but using coordinates relative to the unmodified buffer. As we apply the log,
* we have to update the coordinates to be relative to the modified buffer.
* Textinsert and textdelete will do this for us; our only work is to apply the
- * convention that an insertion at t->q0==t->q1 is intended to select the
+ * convention that an insertion at t->q0==t->q1 is intended to select the
* inserted text.
*/
@@ -337,7 +337,7 @@ elogapply(File *f)
}
fbuffree(buf);
elogterm(f);
-
+
/*
* Bad addresses will cause bufload to crash, so double check.
* If changes were out of order, we expect problems so don't complain further.
diff --git a/src/cmd/acme/exec.c b/src/cmd/acme/exec.c
index 1c8083d8..deaef0cb 100644
--- a/src/cmd/acme/exec.c
+++ b/src/cmd/acme/exec.c
@@ -109,7 +109,7 @@ Exectab exectab[] = {
{ LGet, get, FALSE, TRUE, XXX },
{ LID, id, FALSE, XXX, XXX },
{ LIncl, incl, FALSE, XXX, XXX },
- { LIndent, indent, FALSE, IndentAuto, XXX },
+ { LIndent, indent, FALSE, XXX, XXX },
{ LKill, xkill, FALSE, XXX, XXX },
{ LLoad, dump, FALSE, FALSE, XXX },
{ LLocal, local, FALSE, XXX, XXX },
@@ -192,9 +192,8 @@ execute(Text *t, uint aq0, uint aq1, int external, Text *argt)
f |= 2;
}
aa = getbytearg(argt, TRUE, TRUE, &a);
- if(a){
+ if(a){
if(strlen(a) > EVENTSIZE){ /* too big; too bad */
- free(r);
free(aa);
free(a);
warning(nil, "argument string too long\n");
@@ -674,7 +673,7 @@ checksha1(char *name, File *f, Dir *d)
DigestState *h;
uchar out[20];
uchar *buf;
-
+
fd = open(name, OREAD);
if(fd < 0)
return;
@@ -690,7 +689,7 @@ checksha1(char *name, File *f, Dir *d)
f->qidpath = d->qid.path;
f->mtime = d->mtime;
}
-}
+}
void
putfile(File *f, int q0, int q1, Rune *namer, int nname)
@@ -699,7 +698,7 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
Rune *r;
Biobuf *b;
char *s, *name;
- int i, fd, q, ret, retc;
+ int i, fd, q;
Dir *d, *d1;
Window *w;
int isapp;
@@ -722,7 +721,6 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
goto Rescue1;
}
}
-
fd = create(name, OWRITE, 0666);
if(fd < 0){
warning(nil, "can't create file %s: %r\n", name);
@@ -762,14 +760,9 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
warning(nil, "can't write file %s: %r\n", name);
goto Rescue2;
}
- ret = Bterm(b);
- retc = close(fd);
+ Bterm(b);
free(b);
b = nil;
- if(ret < 0 || retc < 0) {
- warning(nil, "can't write file %s: %r\n", name);
- goto Rescue2; // flush or close failed
- }
if(runeeq(namer, nname, f->name, f->nname)){
if(q0!=0 || q1!=f->b.nc){
f->mod = TRUE;
@@ -786,9 +779,10 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
// in case we don't have read permission.
// (The create above worked, so we probably
// still have write permission.)
+ close(fd);
fd = open(name, OWRITE);
+
d1 = dirfstat(fd);
- close(fd);
if(d1 != nil){
free(d);
d = d1;
@@ -821,11 +815,11 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
if(b != nil) {
Bterm(b);
free(b);
- close(fd);
}
free(h);
fbuffree(s);
fbuffree(r);
+ close(fd);
/* fall through */
Rescue1:
@@ -834,65 +828,6 @@ putfile(File *f, int q0, int q1, Rune *namer, int nname)
free(name);
}
-static void
-trimspaces(Text *et)
-{
- File *f;
- Rune *r;
- Text *t;
- uint q0, n, delstart;
- int c, i, marked;
-
- t = &et->w->body;
- f = t->file;
- marked = 0;
-
- if(t->w!=nil && et->w!=t->w){
- /* can this happen when t == &et->w->body? */
- c = 'M';
- if(et->w)
- c = et->w->owner;
- winlock(t->w, c);
- }
-
- r = fbufalloc();
- q0 = f->b.nc;
- delstart = q0; /* end of current space run, or 0 if no active run; = q0 to delete spaces before EOF */
- while(q0 > 0) {
- n = RBUFSIZE;
- if(n > q0)
- n = q0;
- q0 -= n;
- bufread(&f->b, q0, r, n);
- for(i=n; ; i--) {
- if(i == 0 || (r[i-1] != ' ' && r[i-1] != '\t')) {
- // Found non-space or start of buffer. Delete active space run.
- if(q0+i < delstart) {
- if(!marked) {
- marked = 1;
- seq++;
- filemark(f);
- }
- textdelete(t, q0+i, delstart, TRUE);
- }
- if(i == 0) {
- /* keep run active into tail of next buffer */
- if(delstart > 0)
- delstart = q0;
- break;
- }
- delstart = 0;
- if(r[i-1] == '\n')
- delstart = q0+i-1; /* delete spaces before this newline */
- }
- }
- }
- fbuffree(r);
-
- if(t->w!=nil && et->w!=t->w)
- winunlock(t->w);
-}
-
void
put(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg)
{
@@ -915,8 +850,6 @@ put(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg)
warning(nil, "no file name\n");
return;
}
- if(w->indent & IndentAuto)
- trimspaces(et);
namer = bytetorune(name, &nname);
putfile(f, 0, f->b.nc, namer, nname);
xfidlog(w, "put");
@@ -1387,59 +1320,37 @@ incl(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg)
static Rune LON[] = { 'O', 'N', 0 };
static Rune LOFF[] = { 'O', 'F', 'F', 0 };
static Rune Lon[] = { 'o', 'n', 0 };
-static Rune Loff[] = { 'o', 'f', 'f', 0 };
-
-static Rune LTAB[] = { 'T', 'A', 'B', 0 };
-static Rune LSPACE[] = { 'S', 'P', 'A', 'C', 'E', 0 };
-static Rune Ltab[] = { 't', 'a', 'b', 0 };
-static Rune Lspace[] = { 's', 'p', 'a', 'c', 'e', 0 };
enum {
IGlobal = -2,
- IError = -1
+ IError = -1,
+ Ion = 0,
+ Ioff = 1
};
static int
-indentval(Rune *s, int n, int windent)
+indentval(Rune *s, int n)
{
if(n < 2)
return IError;
if(runestrncmp(s, LON, n) == 0){
- globalindent |= IndentAuto;
+ globalautoindent = TRUE;
warning(nil, "Indent ON\n");
return IGlobal;
}
if(runestrncmp(s, LOFF, n) == 0){
- globalindent &= ~IndentAuto;
+ globalautoindent = FALSE;
warning(nil, "Indent OFF\n");
return IGlobal;
}
- if(runestrncmp(s, LTAB, n) == 0){
- globalindent &= ~IndentSpaces;
- warning(nil, "Indent TAB\n");
- return IGlobal;
- }
- if(runestrncmp(s, LSPACE, n) == 0){
- globalindent |= IndentSpaces;
- warning(nil, "Indent SPACE\n");
- return IGlobal;
- }
- if(runestrncmp(s, Lon, n) == 0)
- return windent | IndentAuto;
- if(runestrncmp(s, Loff, n) == 0)
- return windent & ~IndentAuto;
- if(runestrncmp(s, Ltab, n) == 0)
- return windent & ~IndentSpaces;
- if(runestrncmp(s, Lspace, n) == 0)
- return windent | IndentSpaces;
- return IError;
+ return runestrncmp(s, Lon, n) == 0;
}
static void
fixindent(Window *w, void *arg)
{
USED(arg);
- w->indent = globalindent;
+ w->autoindent = globalautoindent;
}
void
@@ -1447,7 +1358,7 @@ indent(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg)
{
Rune *a, *r;
Window *w;
- int na, len, indent;
+ int na, len, autoindent;
USED(_0);
USED(_1);
@@ -1456,19 +1367,19 @@ indent(Text *et, Text *_0, Text *argt, int _1, int _2, Rune *arg, int narg)
w = nil;
if(et!=nil && et->w!=nil)
w = et->w;
- indent = IError;
+ autoindent = IError;
getarg(argt, FALSE, TRUE, &r, &len);
if(r!=nil && len>0)
- indent = indentval(r, len, w->indent);
+ autoindent = indentval(r, len);
else{
a = findbl(arg, narg, &na);
if(a != arg)
- indent = indentval(arg, narg-na, w->indent);
+ autoindent = indentval(arg, narg-na);
}
- if(indent == IGlobal)
+ if(autoindent == IGlobal)
allwindows(fixindent, nil);
- else if(w != nil && indent >= 0)
- w->indent = indent;
+ else if(w != nil && autoindent >= 0)
+ w->autoindent = autoindent;
}
void
diff --git a/src/cmd/acme/fns.h b/src/cmd/acme/fns.h
index c0339c23..8dc02378 100644
--- a/src/cmd/acme/fns.h
+++ b/src/cmd/acme/fns.h
@@ -95,7 +95,6 @@ void flushwarnings(void);
void startplumbing(void);
long nlcount(Text*, long, long, long*);
long nlcounttopos(Text*, long, long, long);
-Rune* parsetag(Window*, int, int*);
Runestr runestr(Rune*, uint);
Range range(int, int);
diff --git a/src/cmd/acme/fsys.c b/src/cmd/acme/fsys.c
index d9d4b30d..4c395eb2 100644
--- a/src/cmd/acme/fsys.c
+++ b/src/cmd/acme/fsys.c
@@ -463,7 +463,7 @@ fsyswalk(Xfid *x, Fid *f)
qunlock(&row.lk);
dir = dirtabw;
goto Accept;
-
+
Regular:
if(strcmp(x->fcall.wname[i], "new") == 0){
if(w)
diff --git a/src/cmd/acme/logf.c b/src/cmd/acme/logf.c
index 562026c9..567b8383 100644
--- a/src/cmd/acme/logf.c
+++ b/src/cmd/acme/logf.c
@@ -20,7 +20,7 @@ struct Log
Rendez r;
vlong start; // msg[0] corresponds to 'start' in the global sequence of events
-
+
// queued events (nev=entries in ev, mev=capacity of p)
char **ev;
int nev;
@@ -30,7 +30,7 @@ struct Log
Fid **f;
int nf;
int mf;
-
+
// active (blocked) reads waiting for events
Xfid **read;
int nread;
@@ -43,7 +43,7 @@ void
xfidlogopen(Xfid *x)
{
qlock(&eventlog.lk);
- if(eventlog.nf >= eventlog.mf) {
+ if(eventlog.nf >= eventlog.mf) {
eventlog.mf = eventlog.mf*2;
if(eventlog.mf == 0)
eventlog.mf = 8;
@@ -78,20 +78,20 @@ xfidlogread(Xfid *x)
Fcall fc;
qlock(&eventlog.lk);
- if(eventlog.nread >= eventlog.mread) {
+ if(eventlog.nread >= eventlog.mread) {
eventlog.mread = eventlog.mread*2;
if(eventlog.mread == 0)
eventlog.mread = 8;
eventlog.read = erealloc(eventlog.read, eventlog.mread*sizeof eventlog.read[0]);
}
eventlog.read[eventlog.nread++] = x;
-
+
if(eventlog.r.l == nil)
eventlog.r.l = &eventlog.lk;
x->flushed = FALSE;
while(x->f->logoff >= eventlog.start+eventlog.nev && !x->flushed)
rsleep(&eventlog.r);
-
+
for(i=0; i<eventlog.nread; i++) {
if(eventlog.read[i] == x) {
eventlog.read[i] = eventlog.read[--eventlog.nread];
@@ -112,7 +112,7 @@ xfidlogread(Xfid *x)
fc.data = p;
fc.count = strlen(p);
respond(x, &fc, nil);
- free(p);
+ free(p);
}
void
@@ -177,7 +177,7 @@ xfidlog(Window *w, char *op)
eventlog.start += n;
memmove(eventlog.ev, eventlog.ev+n, eventlog.nev*sizeof eventlog.ev[0]);
}
-
+
// Otherwise grow.
if(eventlog.nev >= eventlog.mev) {
eventlog.mev = eventlog.mev*2;
diff --git a/src/cmd/acme/look.c b/src/cmd/acme/look.c
index 6e97e421..cbbc71bf 100644
--- a/src/cmd/acme/look.c
+++ b/src/cmd/acme/look.c
@@ -30,7 +30,7 @@ plumbthread(void *v)
USED(v);
threadsetname("plumbproc");
-
+
/*
* Loop so that if plumber is restarted, acme need not be.
*/
@@ -46,7 +46,7 @@ plumbthread(void *v)
}
plumbeditfid = fid;
plumbsendfid = plumbopenfid("send", OWRITE|OCEXEC);
-
+
/*
* Relay messages.
*/
@@ -378,7 +378,7 @@ search(Text *ct, Rune *r, uint n)
int
isfilec(Rune r)
{
- static Rune Lx[] = { '.', '-', '+', '/', ':', '@', 0 };
+ static Rune Lx[] = { '.', '-', '+', '/', ':', 0 };
if(isalnum(r))
return TRUE;
if(runestrchr(Lx, r))
@@ -432,9 +432,9 @@ includename(Text *t, Rune *r, int n)
char buf[128];
Rune Lsysinclude[] = { '/', 's', 'y', 's', '/', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 0 };
Rune Lusrinclude[] = { '/', 'u', 's', 'r', '/', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 0 };
- Rune Lusrlocalinclude[] = { '/', 'u', 's', 'r', '/', 'l', 'o', 'c', 'a', 'l',
+ Rune Lusrlocalinclude[] = { '/', 'u', 's', 'r', '/', 'l', 'o', 'c', 'a', 'l',
'/', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 0 };
- Rune Lusrlocalplan9include[] = { '/', 'u', 's', 'r', '/', 'l', 'o', 'c', 'a', 'l',
+ Rune Lusrlocalplan9include[] = { '/', 'u', 's', 'r', '/', 'l', 'o', 'c', 'a', 'l',
'/', 'p', 'l', 'a', 'n', '9', '/', 'i', 'n', 'c', 'l', 'u', 'd', 'e', 0 };
Runestr file;
int i;
@@ -443,7 +443,7 @@ includename(Text *t, Rune *r, int n)
sprint(buf, "/%s/include", objtype);
objdir = bytetorune(buf, &i);
objdir = runerealloc(objdir, i+1);
- objdir[i] = '\0';
+ objdir[i] = '\0';
}
w = t->w;
@@ -477,9 +477,9 @@ includename(Text *t, Rune *r, int n)
Runestr
dirname(Text *t, Rune *r, int n)
{
- Rune *b;
- uint nt;
- int slash, i;
+ Rune *b, c;
+ uint m, nt;
+ int slash;
Runestr tmp;
b = nil;
@@ -490,13 +490,15 @@ dirname(Text *t, Rune *r, int n)
goto Rescue;
if(n>=1 && r[0]=='/')
goto Rescue;
- b = parsetag(t->w, n, &i);
+ b = runemalloc(nt+n+1);
+ bufread(&t->w->tag.file->b, 0, b, nt);
slash = -1;
- for(i--; i >= 0; i--){
- if(b[i] == '/'){
- slash = i;
+ for(m=0; m<nt; m++){
+ c = b[m];
+ if(c == '/')
+ slash = m;
+ if(c==' ' || c=='\t')
break;
- }
}
if(slash < 0)
goto Rescue;
@@ -512,19 +514,6 @@ dirname(Text *t, Rune *r, int n)
return tmp;
}
-static int
-texthas(Text *t, uint q0, Rune *r)
-{
- int i;
-
- if((int)q0 < 0)
- return FALSE;
- for(i=0; r[i]; i++)
- if(q0+i >= t->file->b.nc || textreadc(t, q0+i) != r[i])
- return FALSE;
- return TRUE;
-}
-
int
expandfile(Text *t, uint q0, uint q1, Expand *e)
{
@@ -533,14 +522,12 @@ expandfile(Text *t, uint q0, uint q1, Expand *e)
Rune *r, c;
Window *w;
Runestr rs;
- Rune Lhttpcss[] = {'h', 't', 't', 'p', ':', '/', '/', 0};
- Rune Lhttpscss[] = {'h', 't', 't', 'p', 's', ':', '/', '/', 0};
amax = q1;
if(q1 == q0){
colon = -1;
while(q1<t->file->b.nc && isfilec(c=textreadc(t, q1))){
- if(c == ':' && !texthas(t, q1-4, Lhttpcss) && !texthas(t, q1-5, Lhttpscss)){
+ if(c == ':'){
colon = q1;
break;
}
@@ -548,7 +535,7 @@ expandfile(Text *t, uint q0, uint q1, Expand *e)
}
while(q0>0 && (isfilec(c=textreadc(t, q0-1)) || isaddrc(c) || isregexc(c))){
q0--;
- if(colon<0 && c==':' && !texthas(t, q0-4, Lhttpcss) && !texthas(t, q0-5, Lhttpscss))
+ if(colon<0 && c==':')
colon = q0;
}
/*
@@ -578,23 +565,8 @@ expandfile(Text *t, uint q0, uint q1, Expand *e)
if(n == 0)
return FALSE;
/* see if it's a file name */
- r = runemalloc(n+1);
+ r = runemalloc(n);
bufread(&t->file->b, q0, r, n);
- r[n] = 0;
- /* is it a URL? look for http:// and https:// prefix */
- if(runestrncmp(r, Lhttpcss, 7) == 0 || runestrncmp(r, Lhttpscss, 8) == 0){
- // Avoid capturing end-of-sentence punctuation.
- if(r[n-1] == '.') {
- e->q1--;
- n--;
- }
- e->name = r;
- e->nname = n;
- e->u.at = t;
- e->a0 = e->q1;
- e->a1 = e->q1;
- return TRUE;
- }
/* first, does it have bad chars? */
nname = -1;
for(i=0; i<n; i++){
@@ -610,7 +582,7 @@ expandfile(Text *t, uint q0, uint q1, Expand *e)
if(nname == -1)
nname = n;
for(i=0; i<nname; i++)
- if(!isfilec(r[i]) && r[i] != ' ')
+ if(!isfilec(r[i]))
goto Isntfile;
/*
* See if it's a file name in <>, and turn that into an include
@@ -756,7 +728,7 @@ openfile(Text *t, Expand *e)
/*
* Unrooted path in new window.
* This can happen if we type a pwd-relative path
- * in the topmost tag or the column tags.
+ * in the topmost tag or the column tags.
* Most of the time plumber takes care of these,
* but plumber might not be running or might not
* be configured to accept plumbed directories.
@@ -797,9 +769,9 @@ openfile(Text *t, Expand *e)
runemove(rp, ow->incl[i], n);
winaddincl(w, rp, n);
}
- w->indent = ow->indent;
+ w->autoindent = ow->autoindent;
}else
- w->indent = globalindent;
+ w->autoindent = globalautoindent;
xfidlog(w, "new");
}
if(e->a1 == e->a0)
diff --git a/src/cmd/acme/mail/dat.h b/src/cmd/acme/mail/dat.h
index 66bb3a5d..a7ac6a0b 100644
--- a/src/cmd/acme/mail/dat.h
+++ b/src/cmd/acme/mail/dat.h
@@ -178,3 +178,4 @@ extern int shortmenu;
extern CFsys *mailfs;
extern CFsys *acmefs;
+
diff --git a/src/cmd/acme/mail/html.c b/src/cmd/acme/mail/html.c
index e193fc4d..e3a956b0 100644
--- a/src/cmd/acme/mail/html.c
+++ b/src/cmd/acme/mail/html.c
@@ -67,7 +67,7 @@ char*
readbody(char *type, char *dir, int *np)
{
char *body;
-
+
body = readfile(dir, "body", np);
if(body != nil && strcmp(type, "text/html") == 0)
return formathtml(body, np);
diff --git a/src/cmd/acme/mail/mail.c b/src/cmd/acme/mail/mail.c
index e1047bb8..d79721f8 100644
--- a/src/cmd/acme/mail/mail.c
+++ b/src/cmd/acme/mail/mail.c
@@ -558,16 +558,16 @@ mainctl(void *v)
Unknown:
print("unknown message %c%c\n", e->c1, e->c2);
break;
-
+
case 'E': /* write to body; can't affect us */
break;
-
+
case 'F': /* generated by our actions; ignore */
break;
-
+
case 'K': /* type away; we don't care */
break;
-
+
case 'M':
switch(e->c2){
case 'x':
@@ -597,7 +597,7 @@ mainctl(void *v)
if(na)
free(s);
break;
-
+
case 'l':
case 'L':
buf = nil;
@@ -628,16 +628,17 @@ mainctl(void *v)
winwriteevent(w, e);
free(buf);
break;
-
+
case 'I': /* modify away; we don't care */
case 'D':
case 'd':
case 'i':
break;
-
+
default:
goto Unknown;
}
}
}
}
+
diff --git a/src/cmd/acme/mail/mesg.c b/src/cmd/acme/mail/mesg.c
index 739ce10a..9bfe10e1 100644
--- a/src/cmd/acme/mail/mesg.c
+++ b/src/cmd/acme/mail/mesg.c
@@ -85,7 +85,7 @@ mkaddrs(char *t, char **colon)
int i, nf, inquote;
char **f, *s;
Fmt fmt;
-
+
inquote = 0;
nf = 2;
for(s=t; *s; s++){
@@ -127,7 +127,7 @@ loadinfo(Message *m, char *dir)
data = readfile(dir, "info", &n);
if(data == nil)
return 0;
-
+
p = data;
while((s = line(p, &p)) != nil && *s != 0){
t = strchr(s, ' ');
@@ -282,7 +282,7 @@ mesgadd(Message *mbox, char *dir, Dir *d, char *digest)
if (m->level != 1){
m->recursed = 1;
- readmbox(m, dir, m->name);
+ readmbox(m, dir, m->name);
}
return 1;
}
@@ -351,7 +351,7 @@ readfile(char *dir, char *name, int *np)
fsseek(fid, 0, 0);
free(d);
d = fsdirfstat(fid);
- }
+ }
free(file);
len = 0;
if(d != nil)
@@ -400,13 +400,13 @@ info(Message *m, int ind, int ogf)
i = estrdup(s);
return i;
- }
+ }
i = estrdup("");
i = eappend(i, "\t", p);
i = egrow(i, "\t", stripdate(m->date));
if(ind == 0){
- if(strcmp(m->type, "text")!=0 && strncmp(m->type, "text/", 5)!=0 &&
+ if(strcmp(m->type, "text")!=0 && strncmp(m->type, "text/", 5)!=0 &&
strncmp(m->type, "multipart/", 10)!=0)
i = egrow(i, "\t(", estrstrdup(m->type, ")"));
}else if(strncmp(m->type, "multipart/", 10) != 0)
@@ -647,7 +647,7 @@ mesgsave(Message *m, char *s, int save)
}
return 1;
}
-
+
t = estrstrdup(mbox.name, m->name);
raw = readfile(t, "raw", &n);
unixheader = readfile(t, "unixheader", &k);
@@ -1160,7 +1160,7 @@ tokenizec(char *str, char **args, int max, char *splitc)
if(max <= 0)
return 0;
-
+
/* if(strchr(str, ',') || strchr(str, '"') || strchr(str, '<') || strchr(str, '(')) */
/* splitc = ","; */
for(na=0; *str != '\0';str++){
diff --git a/src/cmd/acme/mail/reply.c b/src/cmd/acme/mail/reply.c
index f28cbef1..5dda0edc 100644
--- a/src/cmd/acme/mail/reply.c
+++ b/src/cmd/acme/mail/reply.c
@@ -78,7 +78,7 @@ mkreply(Message *m, char *label, char *to, Plumbattr *attr, char *quotetext)
Plumbattr *a;
quotereply = (label[0] == 'Q');
-
+
if(quotereply && m && m->replywinid > 0){
snprint(buf, sizeof buf, "%d/body", m->replywinid);
if((fd = fsopen(acmefs, buf, OWRITE)) != nil){
@@ -88,7 +88,7 @@ mkreply(Message *m, char *label, char *to, Plumbattr *attr, char *quotetext)
return;
}
}
-
+
r = emalloc(sizeof(Message));
r->isreply = 1;
if(m != nil)
@@ -212,7 +212,7 @@ execproc(void *v)
q[0] = e->q[0];
q[1] = e->q[1];
prog = e->prog; /* known not to be malloc'ed */
-
+
fd[0] = dup(p[0], -1);
if(q[0])
fd[1] = dup(q[1], -1);
@@ -224,7 +224,7 @@ execproc(void *v)
free(e->argv);
chanfree(e->sync);
free(e);
-
+
threadexec(nil, fd, prog, argv);
close(fd[0]);
close(fd[1]);
diff --git a/src/cmd/acme/mail/util.c b/src/cmd/acme/mail/util.c
index 8ac9f946..888e7e72 100644
--- a/src/cmd/acme/mail/util.c
+++ b/src/cmd/acme/mail/util.c
@@ -104,3 +104,4 @@ ctlprint(CFid *fd, char *fmt, ...)
if(n <= 0)
error("control file write error: %r");
}
+
diff --git a/src/cmd/acme/mail/win.c b/src/cmd/acme/mail/win.c
index 1cf776dd..84c9cee0 100644
--- a/src/cmd/acme/mail/win.c
+++ b/src/cmd/acme/mail/win.c
@@ -196,7 +196,7 @@ wingeter(Window *w, char *buf, int *nb)
while(!fullrune(buf, n))
buf[n++] = wingetec(w);
chartorune(&r, buf);
- }
+ }
*nb = n;
return r;
}
diff --git a/src/cmd/acme/mkfile b/src/cmd/acme/mkfile
index 18bea9e0..2bad712c 100644
--- a/src/cmd/acme/mkfile
+++ b/src/cmd/acme/mkfile
@@ -29,6 +29,7 @@ OFILES=\
HFILES=dat.h\
edit.h\
fns.h\
+ config.h
<$PLAN9/src/mkone
<$PLAN9/src/mkdirs
diff --git a/src/cmd/acme/regx.c b/src/cmd/acme/regx.c
index ec574563..56ea900c 100644
--- a/src/cmd/acme/regx.c
+++ b/src/cmd/acme/regx.c
@@ -15,9 +15,6 @@
Rangeset sel;
Rune *lastregexp;
-#undef class
-#define class regxclass /* some systems declare "class" in system headers */
-
/*
* Machine Information
*/
diff --git a/src/cmd/acme/rows.c b/src/cmd/acme/rows.c
index 7a64fabf..8ed66266 100644
--- a/src/cmd/acme/rows.c
+++ b/src/cmd/acme/rows.c
@@ -28,7 +28,7 @@ rowinit(Row *row, Rectangle r)
Rectangle r1;
Text *t;
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
row->r = r;
row->col = nil;
row->ncol = 0;
@@ -73,7 +73,7 @@ rowadd(Row *row, Column *c, int x)
r = d->r;
if(Dx(r) < 100)
return nil;
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
r1 = r;
r1.max.x = min(x-Border, r.max.x-50);
if(Dx(r1) < 50)
@@ -148,7 +148,7 @@ rowdragcol(Row *row, Column *c, int _0)
USED(_0);
clearmouse();
- setcursor2(mousectl, &boxcursor, &boxcursor2);
+ setcursor(mousectl, &boxcursor);
b = mouse->buttons;
op = mouse->xy;
while(mouse->buttons == b)
@@ -191,7 +191,7 @@ rowdragcol(Row *row, Column *c, int _0)
p.x = c->r.max.x-80-Scrollwid;
r = d->r;
r.max.x = c->r.max.x;
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
r.max.x = p.x;
colresize(d, r);
r = c->r;
@@ -223,7 +223,7 @@ rowclose(Row *row, Column *c, int dofree)
memmove(row->col+i, row->col+i+1, (row->ncol-i)*sizeof(Column*));
row->col = realloc(row->col, row->ncol*sizeof(Column*));
if(row->ncol == 0){
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
return;
}
if(i == row->ncol){ /* extend last column right */
@@ -234,7 +234,7 @@ rowclose(Row *row, Column *c, int dofree)
c = row->col[i];
r.max.x = c->r.max.x;
}
- draw(screen, r, display->white, nil, ZP);
+ draw(screen, r, textcols[BACK], nil, ZP);
colresize(c, r);
}
@@ -316,7 +316,7 @@ rowclean(Row *row)
void
rowdump(Row *row, char *file)
{
- int i, j, fd, m, n, start, dumped;
+ int i, j, fd, m, n, dumped;
uint q0, q1;
Biobuf *b;
char *buf, *a, *fontname;
@@ -434,17 +434,9 @@ rowdump(Row *row, char *file)
m = min(RBUFSIZE, w->tag.file->b.nc);
bufread(&w->tag.file->b, 0, r, m);
n = 0;
- while(n<m) {
- start = n;
- while(n<m && r[n]!='\n')
- n++;
- Bprint(b, "%.*S", n-start, r+start);
- if(n<m) {
- Bputc(b, 0xff); // \n in tag becomes 0xff byte (invalid UTF)
- n++;
- }
- }
- Bprint(b, "\n");
+ while(n<m && r[n]!='\n')
+ n++;
+ Bprint(b, "%.*S\n", n, r);
if(dumped){
q0 = 0;
q1 = t->file->b.nc;
@@ -592,7 +584,7 @@ rowload(Row *row, char *file, int initing)
r2.min.x = x;
if(Dx(r1) < 50 || Dx(r2) < 50)
continue;
- draw(screen, Rpt(r1.min, r2.max), display->white, nil, ZP);
+ draw(screen, Rpt(r1.min, r2.max), textcols[BACK], nil, ZP);
colresize(c1, r1);
colresize(c2, r2);
r2.min.x = x-Border;
@@ -621,7 +613,6 @@ rowload(Row *row, char *file, int initing)
}
textdelete(&row->col[i]->tag, 0, row->col[i]->tag.file->b.nc, TRUE);
textinsert(&row->col[i]->tag, 0, r+n+1, nr-(n+1), TRUE);
- free(r);
break;
case 'w':
l[Blinelen(b)-1] = 0;
@@ -635,7 +626,6 @@ rowload(Row *row, char *file, int initing)
}
textdelete(&row->tag, 0, row->tag.file->b.nc, TRUE);
textinsert(&row->tag, 0, r, nr, TRUE);
- free(r);
break;
default:
done = 1;
@@ -727,10 +717,6 @@ rowload(Row *row, char *file, int initing)
if(l == nil)
goto Rescue2;
l[Blinelen(b)-1] = 0;
- /* convert 0xff in multiline tag back to \n */
- for(i = 0; l[i] != 0; i++)
- if((uchar)l[i] == 0xff)
- l[i] = '\n';
r = bytetorune(l+5*12, &nr);
ns = -1;
for(n=0; n<nr; n++){
diff --git a/src/cmd/acme/text.c b/src/cmd/acme/text.c
index 78e25016..bb151fc3 100644
--- a/src/cmd/acme/text.c
+++ b/src/cmd/acme/text.c
@@ -388,7 +388,7 @@ textinsert(Text *t, uint q0, Rune *r, uint n, int tofile)
textscrdraw(u);
}
}
-
+
}
if(q0 < t->iq1)
t->iq1 += n;
@@ -532,27 +532,6 @@ textreadc(Text *t, uint q)
return r;
}
-static int
-spacebswidth(Text *t)
-{
- uint q, col;
- Rune r;
-
- col = textbswidth(t, 0x15);
- q = t->q0;
- while(q > 0){
- r = textreadc(t, q-1);
- if(r != ' ')
- break;
- q--;
- if(--col % t->tabstop == 0)
- break;
- }
- if(t->q0 == q)
- return 1;
- return t->q0-q;
-}
-
int
textbswidth(Text *t, Rune c)
{
@@ -561,11 +540,8 @@ textbswidth(Text *t, Rune c)
int skipping;
/* there is known to be at least one character to erase */
- if(c == 0x08){ /* ^H: erase character */
- if(t->what == Body && t->w->indent & IndentSpaces)
- return spacebswidth(t);
+ if(c == 0x08) /* ^H: erase character */
return 1;
- }
q = t->q0;
skipping = TRUE;
while(q > 0){
@@ -573,7 +549,7 @@ textbswidth(Text *t, Rune c)
if(r == '\n'){ /* eat at most one more character */
if(q == t->q0) /* eat the newline */
--q;
- break;
+ break;
}
if(c == 0x17){
eq = isalnum(r);
@@ -688,32 +664,6 @@ textcomplete(Text *t)
return rp;
}
-void
-textmomentumscroll(Text *t, int n)
-{
- uint q0;
-
- if(n == 0)
- return;
-
- if(t->what == Tag){
- if(n<0)
- texttype(t, Kscrolloneup);
- else
- texttype(t, Kscrollonedown);
- return;
- }
-
- if(n < 0){
- n = -n;
- q0 = t->org+frcharofpt(&t->fr, Pt(t->fr.r.min.x, t->fr.r.min.y+n*t->fr.font->height));
- textsetorigin(t, q0, TRUE);
- }else{
- q0 = textbacknl(t, t->org, n);
- textsetorigin(t, q0, TRUE);
- }
-}
-
void
texttype(Text *t, Rune r)
{
@@ -741,11 +691,6 @@ texttype(Text *t, Rune r)
if(t->q1 < t->file->b.nc)
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;
case Kscrollonedown:
if(t->what == Tag)
goto Tagdown;
@@ -758,12 +703,7 @@ texttype(Text *t, Rune r)
case_Down:
q0 = t->org+frcharofpt(&t->fr, Pt(t->fr.r.min.x, t->fr.r.min.y+n*t->fr.font->height));
textsetorigin(t, q0, TRUE);
- return;
- case Kup:
- if(t->what == Tag)
- goto Tagup;
- n = t->fr.maxlines/3;
- goto case_Up;
+ return;
case Kscrolloneup:
if(t->what == Tag)
goto Tagup;
@@ -775,27 +715,61 @@ texttype(Text *t, Rune r)
q0 = textbacknl(t, t->org, n);
textsetorigin(t, q0, TRUE);
return;
- case Khome:
+
+/*
+ * Keybindings for moving the cursor up and
+ * down the text via up and down arrow keys.
+ */
+
+ case Kdown:
+ if(t->what == Tag)
+ goto Tagdown;
typecommit(t);
- if(t->org > t->iq1) {
- q0 = textbacknl(t, t->iq1, 1);
- textsetorigin(t, q0, TRUE);
- } else
- textshow(t, 0, 0, FALSE);
+ /* 1rst check for being in the last line*/
+ q0 = t->q0;
+ q1 = q0;
+ if (q1) q1--;
+ nnb = 0;
+ while(q0<t->file->b.nc && textreadc(t, q0)!='\n')
+ q0++;
+ if (q0 == (t->file->b.nc)-1) {
+ textshow(t, q0, q0, TRUE);
+ return;
+ }
+ q0++;
+ /* find old pos in ln */
+ while(q1>1 && textreadc(t, q1)!='\n'){
+ nnb++;
+ q1--;
+ }
+ /* go right until reachg pos or \n */
+ while(q0<t->file->b.nc && (nnb>0 && textreadc(t, q0)!='\n')){
+ q0++;
+ nnb--;
+ }
+ if (q0>1 && q0<t->file->b.nc)
+ textshow(t, q0, q0, TRUE);
return;
- case Kend:
+ case Kup:
+ if(t->what == Tag)
+ goto Tagup;
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);
+ nnb = 0;
+ if(t->q0>0 && textreadc(t, t->q0-1)!='\n')
+ nnb = textbswidth(t, 0x15);
+ /* BOL - 1 if not first line of txt BOL*/
+ if( t->q0-nnb > 1 && textreadc(t, t->q0-nnb-1)=='\n' ) nnb++;
+ textshow(t, t->q0-nnb, t->q0-nnb, TRUE);
return;
- case 0x01: /* ^A: beginning of line */
+
+/*
+ * Home and End now respectively take you to the
+ * beginning and to the end of the line respectively.
+ * Also keep the original ^A and ^E keybindings.
+ */
+
+ case 0x01:
+ case Khome:
typecommit(t);
/* go to where ^U would erase, if not already at BOL */
nnb = 0;
@@ -803,13 +777,17 @@ texttype(Text *t, Rune r)
nnb = textbswidth(t, 0x15);
textshow(t, t->q0-nnb, t->q0-nnb, TRUE);
return;
- case 0x05: /* ^E: end of line */
+ case 0x05:
+ case Kend:
typecommit(t);
q0 = t->q0;
while(q0<t->file->b.nc && textreadc(t, q0)!='\n')
q0++;
textshow(t, q0, q0, TRUE);
return;
+
+/* I'll keep the MAC-keybindings 'cuz im such a nice guy */
+
case Kcmd+'c': /* %C: copy */
typecommit(t);
cut(t, t, nil, TRUE, FALSE, nil, 0);
@@ -821,20 +799,34 @@ texttype(Text *t, Rune r)
case Kcmd+'Z': /* %-shift-Z: redo */
typecommit(t);
undo(t, nil, nil, FALSE, 0, nil, 0);
- return;
- case Kcmd+'s': /* %S: put */
+ return;
+
+/*
+ * Adding Windows and X11 -compatible Ctrl+C, Ctrl+Z and
+ * Ctrl+Y (for redoing). TODO: find out how to check out for
+ * shift press, for Ctrl+Shift+Z in this godforsaken switch()
+ */
+
+ case 0x03: /* Ctrl+C: copy */
typecommit(t);
- put(&t->w->body, nil, nil, XXX, XXX, nil, 0);
+ cut(t, t, nil, TRUE, FALSE, nil, 0);
+ return;
+ case 0x1A: /* Ctrl+Z: undo */
+ typecommit(t);
+ undo(t, nil, nil, TRUE, 0, nil, 0);
+ return;
+ case 0x19: /* Ctrl+Y: redo */
+ typecommit(t);
+ undo(t, nil, nil, FALSE, 0, nil, 0);
return;
Tagdown:
/* expand tag to show all text */
if(!t->w->tagexpand){
- t->w->tagexpand = TRUE;
- winresize(t->w, t->w->r, FALSE, TRUE);
+ t->w->tagexpand = TRUE;
+ winresize(t->w, t->w->r, FALSE, TRUE);
}
return;
-
Tagup:
/* shrink tag to single line */
if(t->w->tagexpand){
@@ -844,11 +836,16 @@ texttype(Text *t, Rune r)
}
return;
}
+
+
+
if(t->what == Body){
seq++;
filemark(t->file);
}
- /* cut/paste must be done after the seq++/filemark */
+
+ /* cut/paste must be done after the seq++/filemark */
+
switch(r){
case Kcmd+'x': /* %X: cut */
typecommit(t);
@@ -870,7 +867,31 @@ texttype(Text *t, Rune r)
textshow(t, t->q0, t->q1, 1);
t->iq1 = t->q1;
return;
+
+ /* Same for Windows / X11 */
+
+ case 0x18: /* Ctrl+X: cut */
+ typecommit(t);
+ if(t->what == Body){
+ seq++;
+ filemark(t->file);
+ }
+ cut(t, t, nil, TRUE, TRUE, nil, 0);
+ textshow(t, t->q0, t->q0, 1);
+ t->iq1 = t->q0;
+ return;
+ case 0x16: /* Ctrl+V: paste */
+ typecommit(t);
+ if(t->what == Body){
+ seq++;
+ filemark(t->file);
+ }
+ paste(t, t, nil, TRUE, FALSE, nil, 0);
+ textshow(t, t->q0, t->q1, 1);
+ t->iq1 = t->q1;
+ return;
}
+
if(t->q1 > t->q0){
if(t->ncache != 0)
error("text.type");
@@ -878,6 +899,7 @@ texttype(Text *t, Rune r)
t->eq0 = ~0;
}
textshow(t, t->q0, t->q0, 1);
+
switch(r){
case 0x06: /* ^F: complete */
case Kins:
@@ -898,9 +920,17 @@ texttype(Text *t, Rune r)
typecommit(t);
t->iq1 = t->q0;
return;
+
+/*
+ * quick hack for DELETE-key, just added it to see what happens and
+ * apparently it works like ^U and erases whole lines. i should learn c
+ */
+
+
case 0x08: /* ^H: erase character */
case 0x15: /* ^U: erase line */
- case 0x17: /* ^W: erase word */
+ case 0x7F:
+ case 0x17: /* ^W: erase word */
if(t->q0 == 0) /* nothing to erase */
return;
nnb = textbswidth(t, r);
@@ -941,20 +971,8 @@ texttype(Text *t, Rune r)
textfill(t->file->text[i]);
t->iq1 = t->q0;
return;
- case '\t':
- if(t->what == Body && t->w->indent & IndentSpaces){
- /* find beginning of previous line using backspace code */
- nnb = textbswidth(t, 0x15); /* ^U case */
- if(nnb == 1 && textreadc(t, t->q0-1) == '\n')
- nnb = 0;
- nnb = t->tabstop - nnb % t->tabstop;
- rp = runemalloc(nnb);
- for(nr = 0; nr < nnb; nr++)
- rp[nr] = ' ';
- }
- break; /* fall through to normal code */
case '\n':
- if(t->w->indent & IndentAuto){
+ if(t->w->autoindent){
/* find beginning of previous line using backspace code */
nnb = textbswidth(t, 0x15); /* ^U case */
rp = runemalloc(nnb + 1);
@@ -1258,7 +1276,7 @@ void
textsetselect(Text *t, uint q0, uint q1)
{
int p0, p1, ticked;
-
+
/* t->fr.p0 and t->fr.p1 are always right; t->q0 and t->q1 may be off */
t->q0 = q0;
t->q1 = q1;
@@ -1411,7 +1429,7 @@ textselect23(Text *t, uint *q0, uint *q1, Image *high, int mask)
{
uint p0, p1;
int buts;
-
+
p0 = xselect(&t->fr, mousectl, high, &p1);
buts = mousectl->m.buttons;
if((buts & mask) == 0){
@@ -1478,7 +1496,7 @@ textdoubleclick(Text *t, uint *q0, uint *q1)
if(textclickhtmlmatch(t, q0, q1))
return;
-
+
for(i=0; left[i]!=nil; i++){
q = *q0;
l = left[i];
@@ -1510,7 +1528,7 @@ textdoubleclick(Text *t, uint *q0, uint *q1)
return;
}
}
-
+
/* try filling out word to right */
while(*q1<t->file->b.nc && isalnum(textreadc(t, *q1)))
(*q1)++;
@@ -1584,7 +1602,7 @@ static int
ishtmlend(Text *t, uint q, uint *q0)
{
int c, c1, c2;
-
+
if(q < 2)
return 0;
if(textreadc(t, --q) != '>')
@@ -1612,7 +1630,7 @@ textclickhtmlmatch(Text *t, uint *q0, uint *q1)
{
int depth, n;
uint q, nq;
-
+
q = *q0;
// after opening tag? scan forward for closing tag
if(ishtmlend(t, q, nil) == 1) {
@@ -1649,7 +1667,7 @@ textclickhtmlmatch(Text *t, uint *q0, uint *q1)
q--;
}
}
-
+
return 0;
}
diff --git a/src/cmd/acme/util.c b/src/cmd/acme/util.c
index 64ad4919..d694634f 100644
--- a/src/cmd/acme/util.c
+++ b/src/cmd/acme/util.c
@@ -107,7 +107,7 @@ errorwin1(Rune *dir, int ndir, Rune **incl, int nincl)
runemove(r, incl[i], n);
winaddincl(w, r, n);
}
- w->indent = globalindent;
+ w->autoindent = globalautoindent;
return w;
}
@@ -132,7 +132,7 @@ errorwin(Mntdir *md, int owner)
}
/*
- * Incoming window should be locked.
+ * Incoming window should be locked.
* It will be unlocked and returned window
* will be locked in its place.
*/
@@ -189,7 +189,7 @@ void
addwarningtext(Mntdir *md, Rune *r, int nr)
{
Warning *warn;
-
+
for(warn = warnings; warn; warn=warn->next){
if(warn->md == md){
bufinsert(&warn->buf, warn->buf.nc, r, nr);
@@ -276,8 +276,6 @@ runeeq(Rune *s1, uint n1, Rune *s2, uint n2)
{
if(n1 != n2)
return FALSE;
- if(n1 == 0)
- return TRUE;
return memcmp(s1, s2, n1*sizeof(Rune)) == 0;
}
diff --git a/src/cmd/acme/wind.c b/src/cmd/acme/wind.c
index d3763239..19b52f5c 100644
--- a/src/cmd/acme/wind.c
+++ b/src/cmd/acme/wind.c
@@ -80,10 +80,10 @@ wininit(Window *w, Window *clone, Rectangle r)
draw(screen, br, button, nil, button->r.min);
w->filemenu = TRUE;
w->maxlines = w->body.fr.maxlines;
- w->indent = globalindent;
+ w->autoindent = globalautoindent;
if(clone){
w->dirty = clone->dirty;
- w->indent = clone->indent;
+ w->autoindent = clone->autoindent;
textsetselect(&w->body, clone->body.q0, clone->body.q1);
winsettag(w);
}
@@ -97,7 +97,7 @@ windrawbutton(Window *w)
{
Image *b;
Rectangle br;
-
+
b = button;
if(!w->isdir && !w->isscratch && (w->body.file->mod || w->body.ncache))
b = modbutton;
@@ -110,22 +110,25 @@ windrawbutton(Window *w)
int
delrunepos(Window *w)
{
- Rune *r;
- int i;
-
- r = parsetag(w, 0, &i);
- free(r);
- i += 2;
- if(i >= w->tag.file->b.nc)
+ int n;
+ Rune rune;
+
+ for(n=0; n<w->tag.file->b.nc; n++) {
+ bufread(&w->tag.file->b, n, &rune, 1);
+ if(rune == ' ')
+ break;
+ }
+ n += 2;
+ if(n >= w->tag.file->b.nc)
return -1;
- return i;
+ return n;
}
void
movetodel(Window *w)
{
int n;
-
+
n = delrunepos(w);
if(n < 0)
return;
@@ -150,7 +153,7 @@ wintaglines(Window *w, Rectangle r)
textresize(&w->tag, r, TRUE);
w->tag.fr.noredraw = 0;
w->tagsafe = FALSE;
-
+
if(!w->tagexpand) {
/* use just as many lines as needed to show the Del */
n = delrunepos(w);
@@ -159,7 +162,7 @@ wintaglines(Window *w, Rectangle r)
p = subpt(frptofchar(&w->tag.fr, n), w->tag.fr.r.min);
return 1 + p.y / w->tag.fr.font->height;
}
-
+
/* can't use more than we have */
if(w->tag.fr.nlines >= w->tag.fr.maxlines)
return w->tag.fr.maxlines;
@@ -221,7 +224,7 @@ winresize(Window *w, Rectangle r, int safe, int keepextra)
moveto(mousectl, p);
}
}
-
+
/* If needed, resize & redraw body. */
r1 = r;
r1.min.y = y;
@@ -290,7 +293,7 @@ winunlock(Window *w)
void
winmousebut(Window *w)
{
- moveto(mousectl, addpt(w->tag.scrollr.min,
+ moveto(mousectl, addpt(w->tag.scrollr.min,
divpt(Pt(Dx(w->tag.scrollr), font->height), 2)));
}
@@ -416,7 +419,11 @@ wincleartag(Window *w)
/* w must be committed */
n = w->tag.file->b.nc;
- r = parsetag(w, 0, &i);
+ r = runemalloc(n);
+ bufread(&w->tag.file->b, 0, r, n);
+ for(i=0; i<n; i++)
+ if(r[i]==' ' || r[i]=='\t')
+ break;
for(; i<n; i++)
if(r[i] == '|')
break;
@@ -433,38 +440,6 @@ wincleartag(Window *w)
textsetselect(&w->tag, w->tag.q0, w->tag.q1);
}
-Rune*
-parsetag(Window *w, int extra, int *len)
-{
- static Rune Ldelsnarf[] = { ' ', 'D', 'e', 'l', ' ', 'S', 'n', 'a', 'r', 'f', 0 };
- static Rune Lspacepipe[] = { ' ', '|', 0 };
- static Rune Ltabpipe[] = { '\t', '|', 0 };
- int i;
- Rune *r, *p, *pipe;
-
- r = runemalloc(w->tag.file->b.nc+extra+1);
- bufread(&w->tag.file->b, 0, r, w->tag.file->b.nc);
- r[w->tag.file->b.nc] = '\0';
-
- /*
- * " |" or "\t|" ends left half of tag
- * If we find " Del Snarf" in the left half of the tag
- * (before the pipe), that ends the file name.
- */
- pipe = runestrstr(r, Lspacepipe);
- if((p = runestrstr(r, Ltabpipe)) != nil && (pipe == nil || p < pipe))
- pipe = p;
- if((p = runestrstr(r, Ldelsnarf)) != nil && (pipe == nil || p < pipe))
- i = p - r;
- else {
- for(i=0; i<w->tag.file->b.nc; i++)
- if(r[i]==' ' || r[i]=='\t')
- break;
- }
- *len = i;
- return r;
-}
-
void
winsettag1(Window *w)
{
@@ -483,7 +458,12 @@ winsettag1(Window *w)
/* there are races that get us here with stuff in the tag cache, so we take extra care to sync it */
if(w->tag.ncache!=0 || w->tag.file->mod)
wincommit(w, &w->tag); /* check file name; also guarantees we can modify tag contents */
- old = parsetag(w, 0, &i);
+ old = runemalloc(w->tag.file->b.nc+1);
+ bufread(&w->tag.file->b, 0, old, w->tag.file->b.nc);
+ old[w->tag.file->b.nc] = '\0';
+ for(i=0; i<w->tag.file->b.nc; i++)
+ if(old[i]==' ' || old[i]=='\t')
+ break;
if(runeeq(old, i, w->body.file->name, w->body.file->nname) == FALSE){
textdelete(&w->tag, 0, i, TRUE);
textinsert(&w->tag, 0, w->body.file->name, w->body.file->nname, TRUE);
@@ -496,8 +476,7 @@ winsettag1(Window *w)
/* compute the text for the whole tag, replacing current only if it differs */
new = runemalloc(w->body.file->nname+100);
i = 0;
- if(w->body.file->nname != 0)
- runemove(new, w->body.file->name, w->body.file->nname);
+ runemove(new+i, w->body.file->name, w->body.file->nname);
i += w->body.file->nname;
runemove(new+i, Ldelsnarf, 10);
i += 10;
@@ -604,7 +583,11 @@ wincommit(Window *w, Text *t)
textcommit(f->text[i], FALSE); /* no-op for t */
if(t->what == Body)
return;
- r = parsetag(w, 0, &i);
+ r = runemalloc(w->tag.file->b.nc);
+ bufread(&w->tag.file->b, 0, r, w->tag.file->b.nc);
+ for(i=0; i<w->tag.file->b.nc; i++)
+ if(r[i]==' ' || r[i]=='\t')
+ break;
if(runeeq(r, i, w->body.file->name, w->body.file->nname) == FALSE){
seq++;
filemark(w->body.file);
@@ -689,7 +672,7 @@ winctlprint(Window *w, char *buf, int fonts)
sprint(buf, "%11d %11d %11d %11d %11d ", w->id, w->tag.file->b.nc,
w->body.file->b.nc, w->isdir, w->dirty);
if(fonts)
- return smprint("%s%11d %q %11d ", buf, Dx(w->body.fr.r),
+ return smprint("%s%11d %q %11d ", buf, Dx(w->body.fr.r),
w->body.reffont->f->name, w->body.fr.maxtab);
return buf;
}
diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
index e7d9f4cb..5aa4a180 100644
--- a/src/cmd/acme/xfid.c
+++ b/src/cmd/acme/xfid.c
@@ -701,24 +701,6 @@ out:
winsetname(w, r, nr);
m += (q+1) - pp;
}else
- if(strncmp(p, "font ", 5) == 0){ /* execute font command */
- pp = p+5;
- m = 5;
- q = memchr(pp, '\n', e-pp);
- if(q==nil || q==pp){
- err = Ebadctl;
- break;
- }
- *q = 0;
- nulls = FALSE;
- cvttorunes(pp, q-pp, r, &nb, &nr, &nulls);
- if(nulls){
- err = "nulls in font string";
- break;
- }
- fontx(&w->body, nil, nil, FALSE, XXX, r, nr);
- m += (q+1) - pp;
- }else
if(strncmp(p, "dump ", 5) == 0){ /* set dump string */
pp = p+5;
m = 5;
@@ -808,12 +790,10 @@ out:
}else
if(strncmp(p, "nomenu", 6) == 0){ /* turn off automatic menu */
w->filemenu = FALSE;
- settag = TRUE;
m = 6;
}else
if(strncmp(p, "menu", 4) == 0){ /* enable automatic menu */
w->filemenu = TRUE;
- settag = TRUE;
m = 4;
}else
if(strncmp(p, "cleartag", 8) == 0){ /* wipe tag right of bar */