summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-01-19 19:21:10 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2020-01-19 19:21:10 +0100
commit09eac381e58e74051ab7ddb1e96fc32671d3cada (patch)
tree2111457c356853a44ffc859d1e8cf6951dc14bab
parent16f11e4cd6a925d10aaef1416bbe2d8874618f74 (diff)
parent47bae09b33f677b9e1f5b45190ec5216f5d988e0 (diff)
downloadplan9front-09eac381e58e74051ab7ddb1e96fc32671d3cada.tar.xz
merge
-rw-r--r--sys/src/cmd/acme/cols.c13
-rw-r--r--sys/src/cmd/acme/dat.h1
-rw-r--r--sys/src/cmd/acme/exec.c2
-rw-r--r--sys/src/cmd/acme/fns.h3
-rw-r--r--sys/src/cmd/acme/util.c10
-rw-r--r--sys/src/cmd/acme/wind.c31
6 files changed, 41 insertions, 19 deletions
diff --git a/sys/src/cmd/acme/cols.c b/sys/src/cmd/acme/cols.c
index d069d64fe..6beb2edb0 100644
--- a/sys/src/cmd/acme/cols.c
+++ b/sys/src/cmd/acme/cols.c
@@ -112,7 +112,7 @@ void
colclose(Column *c, Window *w, int dofree)
{
Rectangle r;
- int i;
+ int i, didmouse, up;
/* w is locked */
if(!c->safe)
@@ -126,7 +126,7 @@ colclose(Column *c, Window *w, int dofree)
w->tag.col = nil;
w->body.col = nil;
w->col = nil;
- restoremouse(w);
+ didmouse = restoremouse(w);
if(dofree){
windelete(w);
winclose(w);
@@ -138,17 +138,24 @@ colclose(Column *c, Window *w, int dofree)
draw(screen, r, display->white, nil, ZP);
return;
}
+ up = 0;
if(i == c->nw){ /* extend last window down */
w = c->w[i-1];
r.min.y = w->r.min.y;
r.max.y = c->r.max.y;
}else{ /* extend next window up */
+ up = 1;
w = c->w[i];
r.max.y = w->r.max.y;
}
draw(screen, r, textcols[BACK], nil, ZP);
- if(c->safe)
+ if(c->safe) {
+ if(!didmouse && up)
+ w->showdel = TRUE;
winresize(w, r, FALSE);
+ if(!didmouse && up)
+ movetodel(w);
+ }
}
void
diff --git a/sys/src/cmd/acme/dat.h b/sys/src/cmd/acme/dat.h
index bfc16e913..5daf89e04 100644
--- a/sys/src/cmd/acme/dat.h
+++ b/sys/src/cmd/acme/dat.h
@@ -546,6 +546,7 @@ char wdir[];
int editing;
int messagesize; /* negotiated in 9P version setup */
int globalindent[NINDENT];
+Rune *delcmd; /* what command deleted the window. eg, Del, Delete, Delmesg */
Channel *cplumb; /* chan(Plumbmsg*) */
Channel *cwait; /* chan(Waitmsg) */
diff --git a/sys/src/cmd/acme/exec.c b/sys/src/cmd/acme/exec.c
index 3dbd001c5..a975f56c9 100644
--- a/sys/src/cmd/acme/exec.c
+++ b/sys/src/cmd/acme/exec.c
@@ -147,6 +147,8 @@ execute(Text *t, uint aq0, uint aq1, int external, Text *argt)
}
r = runemalloc(q1-q0);
bufread(t->file, q0, r, q1-q0);
+ free(delcmd);
+ delcmd = runesmprint("%.*S", q1-q0, r);
e = lookup(r, q1-q0);
if(!external && t->w!=nil && t->w->nopen[QWevent]>0){
f = 0;
diff --git a/sys/src/cmd/acme/fns.h b/sys/src/cmd/acme/fns.h
index 021799c4b..2a2508087 100644
--- a/sys/src/cmd/acme/fns.h
+++ b/sys/src/cmd/acme/fns.h
@@ -19,10 +19,11 @@ void undo(Text*, Text*, Text*, int, int, Rune*, int);
char* getname(Text*, Text*, Rune*, int, int);
void scrsleep(uint);
void savemouse(Window*);
-void restoremouse(Window*);
+int restoremouse(Window*);
void clearmouse(void);
void allwindows(void(*)(Window*, void*), void*);
uint loadfile(int, uint, int*, int(*)(void*, uint, Rune*, int), void*);
+void movetodel(Window*);
Window* errorwin(Mntdir*, int);
Window* errorwinforwin(Window*);
diff --git a/sys/src/cmd/acme/util.c b/sys/src/cmd/acme/util.c
index bf00a9e65..44f77192e 100644
--- a/sys/src/cmd/acme/util.c
+++ b/sys/src/cmd/acme/util.c
@@ -367,12 +367,18 @@ savemouse(Window *w)
mousew = w;
}
-void
+int
restoremouse(Window *w)
{
- if(mousew!=nil && mousew==w)
+ int did;
+
+ did = 0;
+ if(mousew!=nil && mousew==w) {
moveto(mousectl, prevmouse);
+ did = 1;
+ }
mousew = nil;
+ return did;
}
void
diff --git a/sys/src/cmd/acme/wind.c b/sys/src/cmd/acme/wind.c
index 7c222a17c..a624f50d3 100644
--- a/sys/src/cmd/acme/wind.c
+++ b/sys/src/cmd/acme/wind.c
@@ -90,20 +90,23 @@ wininit(Window *w, Window *clone, Rectangle r)
}
int
-delrunepos(Window *w)
+tagrunepos(Window *w, Rune *s)
{
int n;
- Rune rune;
-
- for(n=0; n<w->tag.file->nc; n++) {
- bufread(w->tag.file, n, &rune, 1);
- if(rune == ' ')
- break;
- }
- n += 2;
- if(n >= w->tag.file->nc)
+ Rune *r, *rr;
+
+ if(s == nil)
return -1;
- return n;
+
+ n = w->tag.file->nc;
+ r = runemalloc(n+1);
+ bufread(w->tag.file, 0, r, n);
+ r[n] = L'\0';
+
+ rr = runestrstr(r, s);
+ if(rr == nil || rr == r)
+ return -1;
+ return rr - r;
}
void
@@ -111,7 +114,9 @@ movetodel(Window *w)
{
int n;
- n = delrunepos(w);
+ n = tagrunepos(w, delcmd);
+ free(delcmd);
+ delcmd = nil;
if(n < 0)
return;
moveto(mousectl, addpt(frptofchar(&w->tag, n), Pt(4, w->tag.font->height-4)));
@@ -138,7 +143,7 @@ wintaglines(Window *w, Rectangle r)
if(!w->tagexpand) {
/* use just as many lines as needed to show the Del */
- n = delrunepos(w);
+ n = tagrunepos(w, delcmd);
if(n < 0)
return 1;
p = subpt(frptofchar(&w->tag, n), w->tag.r.min);