ref: 1f46b5b9cd0d9688cb15d60c8f1a06e9471768a4
parent: d55bcedd72dae2af3849c127365c1f828d059fba
author: qwx <qwx@sciops.net>
date: Wed Jun 22 16:52:13 EDT 2022
vdir: don't always reset scroll offset
--- a/vdir-tweaks
+++ b/vdir-tweaks
@@ -196,7 +196,7 @@
+};
--- a/vdir.c
+++ b/vdir.c
-@@ -20,6 +20,12 @@
+@@ -20,6 +20,13 @@
Slowscroll = 10,
};
@@ -204,12 +204,13 @@
+ Nback = 64,
+};
+char *backlist[Nback];
++int backoff[Nback];
+int backp = -1;
+
enum
{
Emouse,
-@@ -47,6 +53,8 @@
+@@ -47,6 +54,8 @@
Rectangle homer;
Rectangle upr;
Rectangle cdr;
@@ -218,7 +219,7 @@
Rectangle newdirr;
Rectangle newfiler;
Rectangle viewr;
-@@ -60,6 +68,8 @@
+@@ -60,6 +69,8 @@
Image *iup;
Image *inewfile;
Image *inewfolder;
@@ -227,7 +228,7 @@
Image *toolbg;
Image *toolfg;
Image *viewbg;
-@@ -68,6 +78,7 @@
+@@ -68,6 +79,7 @@
Image *selfg;
Image *scrollbg;
Image *scrollfg;
@@ -235,10 +236,34 @@
int sizew;
int lineh;
int nlines;
-@@ -146,8 +157,38 @@
+@@ -121,8 +133,10 @@
+ return 1;
}
++int scrollclamp(int);
++
void
+-loaddirs(void)
++loaddirs(int fixoff)
+ {
+ int fd, i, m;
+
+@@ -135,7 +149,10 @@
+ free(dirs);
+ ndirs = dirreadall(fd, &dirs);
+ qsort(dirs, ndirs, sizeof *dirs, (int(*)(void*,void*))dircmp);
+- offset = 0;
++ if(!fixoff)
++ scrollclamp(offset);
++ else
++ offset = 0;
+ close(fd);
+ m = 1;
+ for(i=0; i < ndirs; i++){
+@@ -146,10 +163,43 @@
+ }
+
+ void
+pushback(void)
+{
+ if(strlen(path) < 1)
@@ -249,6 +274,7 @@
+ backp++;
+ if((backlist[backp] = strdup(path)) == nil)
+ sysfatal("strdup: %r");
++ backoff[backp] = offset;
+}
+
+int
@@ -258,12 +284,14 @@
+
+ if(backp < 0)
+ return 0;
++ offset = backoff[backp];
++ backoff[backp] = 0;
+ p = backlist[backp];
+ backlist[backp] = nil;
+ backp--;
+ strecpy(path, path+sizeof path, p);
+ free(p);
-+ loaddirs();
++ loaddirs(0);
+ return 1;
+}
+
@@ -272,9 +300,12 @@
{
+ pushback();
snprint(path, sizeof path, abspath(path, ".."));
- loaddirs();
+- loaddirs();
++ loaddirs(1);
}
-@@ -157,6 +198,7 @@
+
+ void
+@@ -157,6 +207,7 @@
{
char newpath[256] = {0};
@@ -282,9 +313,50 @@
if(dir == nil)
snprint(newpath, sizeof path, home);
else if(dir[0] == '/')
-@@ -273,7 +315,7 @@
+@@ -167,7 +218,7 @@
+ showerrstr("Directory does not exist");
+ else
+ snprint(path, sizeof path, abspath(path, newpath));
+- loaddirs();
++ loaddirs(1);
}
+ void
+@@ -187,7 +238,7 @@
+ goto cleanup;
+ }
+ close(fd);
+- loaddirs();
++ loaddirs(0);
+ cleanup:
+ free(p);
+ }
+@@ -209,7 +260,7 @@
+ goto cleanup;
+ }
+ close(fd);
+- loaddirs();
++ loaddirs(0);
+ cleanup:
+ free(p);
+ }
+@@ -257,7 +308,7 @@
+ if(doexec(cmd) < 0)
+ showerrstr("Cannot remove file/directory");
+ else
+- loaddirs();
++ loaddirs(0);
+ }
+
+ void
+@@ -269,11 +320,11 @@
+ if(doexec(cmd) < 0)
+ showerrstr("Cannot rename file/directory");
+ else
+- loaddirs();
++ loaddirs(0);
+ }
+
int
-plumbfile(char *path, char *name)
+plumbfile(char *path, char *name, int isdir)
@@ -291,7 +363,7 @@
{
char *f;
int e;
-@@ -280,9 +322,12 @@
+@@ -280,11 +331,14 @@
f = smprint("%s/%s", path, name);
e = access(f, 0)==0;
@@ -305,9 +377,12 @@
+ plumbsendtext(plumbfd, "vdir", nil, path, name);
+ }else{
alert("Error", "File does not exist anymore", nil, mctl, kctl);
- loaddirs();
+- loaddirs();
++ loaddirs(0);
redraw();
-@@ -346,6 +391,8 @@
+ }
+ free(f);
+@@ -346,6 +400,8 @@
iup = loadicon(big, updata, sizeof updata);
inewfile = loadicon(big, newfiledata, sizeof newfiledata);
inewfolder = loadicon(big, newfolderdata, sizeof newfolderdata);
@@ -316,7 +391,7 @@
}
char*
-@@ -366,7 +413,7 @@
+@@ -366,7 +422,7 @@
p->x += Toolpadding;
r = Rect(p->x, p->y, p->x+16, p->y+16);
@@ -325,7 +400,7 @@
p->x += 16+Toolpadding;
return r;
}
-@@ -379,12 +426,12 @@
+@@ -379,12 +435,12 @@
s = t;
if(*s && (p.x+stringwidth(font, s)) > n){
@@ -340,7 +415,7 @@
}
return p;
}
-@@ -407,7 +454,7 @@
+@@ -407,7 +463,7 @@
p = addpt(viewr.min, Pt(Toolpadding, Toolpadding));
p.y += n*lineh;
r = Rpt(p, addpt(p, Pt(Dx(viewr)-2*Toolpadding, lineh)));
@@ -349,7 +424,7 @@
t = mdate(d);
snprint(buf, sizeof buf, "%*lld %s", sizew, d.length, t);
free(t);
-@@ -414,12 +461,12 @@
+@@ -414,12 +470,12 @@
img = (d.qid.type&QTDIR) ? folder : file;
p.y -= Padding;
dy = (lineh-12)/2;
@@ -364,7 +439,7 @@
}
void
-@@ -440,22 +487,25 @@
+@@ -440,22 +496,25 @@
Point p;
int i, h, y;
@@ -398,7 +473,7 @@
if(ndirs>0){
h = ((double)nlines/ndirs)*Dy(scrollr);
y = ((double)offset/ndirs)*Dy(scrollr);
-@@ -462,10 +512,11 @@
+@@ -462,10 +521,11 @@
scrposr = Rect(scrollr.min.x, scrollr.min.y+y, scrollr.max.x-1, scrollr.min.y+y+h);
}else
scrposr = Rect(scrollr.min.x, scrollr.min.y, scrollr.max.x-1, scrollr.max.y);
@@ -411,7 +486,7 @@
flushimage(display, 1);
}
-@@ -506,18 +557,42 @@
+@@ -506,18 +566,42 @@
}
void
@@ -457,12 +532,12 @@
viewr.min.x += Scrollwidth;
viewr.min.y = toolr.max.y+1;
nlines = Dy(viewr)/lineh;
-@@ -542,13 +617,21 @@
+@@ -542,13 +626,21 @@
cd(nil);
redraw();
break;
+ case Kesc:
-+ loaddirs();
++ loaddirs(0);
+ redraw();
+ break;
case Kup:
@@ -481,7 +556,7 @@
}
}
-@@ -557,9 +640,8 @@
+@@ -557,9 +649,8 @@
{
Point p;
@@ -493,7 +568,7 @@
return p;
}
-@@ -579,63 +661,36 @@
+@@ -579,63 +670,36 @@
void
evtmouse(Mouse m)
{
@@ -555,7 +630,7 @@
redraw();
- }else if(ptinrect(m.xy, cdr)){
+ }else if(ptinrect(m.xy, refr)){
-+ loaddirs();
++ loaddirs(0);
+ redraw();
+ }else if(ptinrect(m.xy, backr)){
+ if(back())
@@ -571,7 +646,7 @@
}else if(ptinrect(m.xy, newdirr)){
m.xy = cept("Create directory");
if(enter("Create directory", buf, sizeof buf, mctl, kctl, nil)>0){
-@@ -656,10 +711,39 @@
+@@ -656,11 +720,40 @@
if(d.qid.type & QTDIR){
cd(d.name);
redraw();
@@ -579,7 +654,7 @@
- if(plumbfile(path, d.name))
- flash(n);
}
-+ }
+ }
+ }else if(m.buttons&2 && oldbuttons == 0){
+ if(ptinrect(m.xy, viewr)){
+ n = indexat(m.xy);
@@ -611,6 +686,16 @@
+ d = dirs[offset+n];
+ if(plumbfile(path, d.name, d.qid.type & QTDIR))
+ flash(n);
- }
++ }
}else if(m.buttons&8)
scrollup(Slowscroll);
+ else if(m.buttons&16)
+@@ -736,7 +829,7 @@
+ alts[Eresize].c = mctl->resizec;
+ alts[Ekeyboard].c = kctl->c;
+ readhome();
+- loaddirs();
++ loaddirs(1);
+ initcolors();
+ initimages();
+ evtresize();