acme3k/acme3k.patch

2652 lines
73 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.
+
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)
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
+
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 */