From b099753597d2c3b3d150c686df5c16310168477e Mon Sep 17 00:00:00 2001 From: "Roberto E. Vargas Caballero" Date: Sun, 19 Jan 2020 18:36:50 +0100 Subject: [PATCH 1/2] acme: Restore call to movetodel() in colclose --- sys/src/cmd/acme/cols.c | 13 ++++++++++--- sys/src/cmd/acme/fns.h | 3 ++- sys/src/cmd/acme/util.c | 10 ++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/sys/src/cmd/acme/cols.c b/sys/src/cmd/acme/cols.c index f66634d57..c5c3ee35e 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/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 From 47bae09b33f677b9e1f5b45190ec5216f5d988e0 Mon Sep 17 00:00:00 2001 From: "Roberto E. Vargas Caballero" Date: Sun, 19 Jan 2020 19:18:12 +0100 Subject: [PATCH 2/2] Apply http://www.9paste.net/qrstuv/patch/acme-movetodelmesg/ --- sys/src/cmd/acme/dat.h | 1 + sys/src/cmd/acme/exec.c | 2 ++ sys/src/cmd/acme/wind.c | 31 ++++++++++++++++++------------- 3 files changed, 21 insertions(+), 13 deletions(-) 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/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; ntag.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);