ref: 08cf9c4f436c3fcc7bfbbf6d3386fddb5f9dea7c
parent: 56dc18887a7df44e90ceea06adb55475cb508593
author: qwx <qwx@sciops.net>
date: Sun May 8 19:19:16 EDT 2022
vdir-tweaks: update - backwards history - refresh button - smooth drawing using backbuffer - mouse scrolling continues until buttons released - middle mouse scroll offset centered on mouse position - keyboard shortcut tweaks older tweaks: - different plumbing for dirs - changes to clicking behavior: buttons and location
--- a/vdir-tweaks
+++ b/vdir-tweaks
@@ -1,9 +1,290 @@
diff 663d1a8c4432f3cef70466c04699fb6ebaafbc22 uncommitted
+--- a/alert.c
++++ b/alert.c
+@@ -62,7 +62,7 @@
+ o = addpt(screen->r.min, Pt((Dx(screen->r)-w)/2, (Dy(screen->r)-h)/2));
+ r = Rect(o.x, o.y, o.x+w, o.y+h);
+ if(save==nil){+- save = allocimage(display, r, b->chan, 0, DNofill);
++ save = allocimage(display, r, screen->chan, 0, DNofill);
+ if(save==nil)
+ break;
+ draw(save, r, b, nil, r.min);
+--- a/icons.h
++++ b/icons.h
+@@ -420,3 +420,181 @@
+ 0x46, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+
+ };
++
++uchar backdata[] = {++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00
++};
++
++uchar refdata[] = {++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
++ 0x00, 0x00, 0x00, 0x00
++};
--- a/vdir.c
+++ b/vdir.c
-@@ -273,7 +273,7 @@
+@@ -20,6 +20,12 @@
+ Slowscroll = 10,
+ };
+
++enum{++ Nback = 64,
++};
++char *backlist[Nback];
++int backp = -1;
++
+ enum
+ {+ Emouse,
+@@ -47,6 +53,8 @@
+ Rectangle homer;
+ Rectangle upr;
+ Rectangle cdr;
++Rectangle refr;
++Rectangle backr;
+ Rectangle newdirr;
+ Rectangle newfiler;
+ Rectangle viewr;
+@@ -60,6 +68,8 @@
+ Image *iup;
+ Image *inewfile;
+ Image *inewfolder;
++Image *iref;
++Image *iback;
+ Image *toolbg;
+ Image *toolfg;
+ Image *viewbg;
+@@ -68,6 +78,7 @@
+ Image *selfg;
+ Image *scrollbg;
+ Image *scrollfg;
++Image *fb;
+ int sizew;
+ int lineh;
+ int nlines;
+@@ -146,8 +157,38 @@
}
+ void
++pushback(void)
++{++ if(strlen(path) < 1)
++ return;
++ if(backp == Nback-1)
++ memmove(backlist, backlist+1, (Nback-1) * sizeof *backlist);
++ else
++ backp++;
++ if((backlist[backp] = strdup(path)) == nil)
++ sysfatal("strdup: %r");++}
++
++int
++back(void)
++{++ char *p;
++
++ if(backp < 0)
++ return 0;
++ p = backlist[backp];
++ backlist[backp] = nil;
++ backp--;
++ strecpy(path, path+sizeof path, p);
++ free(p);
++ loaddirs();
++ return 1;
++}
++
++void
+ up(void)
+ {++ pushback();
+ snprint(path, sizeof path, abspath(path, ".."));
+ loaddirs();
+ }
+@@ -157,6 +198,7 @@
+ {+ char newpath[256] = {0};+
++ pushback();
+ if(dir == nil)
+ snprint(newpath, sizeof path, home);
+ else if(dir[0] == '/')
+@@ -273,7 +315,7 @@
+ }
+
int
-plumbfile(char *path, char *name)
+plumbfile(char *path, char *name, int isdir)
@@ -10,7 +291,7 @@
{char *f;
int e;
-@@ -280,9 +280,12 @@
+@@ -280,9 +322,12 @@
f = smprint("%s/%s", path, name);e = access(f, 0)==0;
@@ -26,8 +307,208 @@
alert("Error", "File does not exist anymore", nil, mctl, kctl);loaddirs();
redraw();
-@@ -588,40 +591,10 @@
- else if(m.buttons == 0)
+@@ -346,6 +391,8 @@
+ iup = loadicon(big, updata, sizeof updata);
+ inewfile = loadicon(big, newfiledata, sizeof newfiledata);
+ inewfolder = loadicon(big, newfolderdata, sizeof newfolderdata);
++ iref = loadicon(big, refdata, sizeof refdata);
++ iback = loadicon(big, backdata, sizeof backdata);
+ }
+
+ char*
+@@ -366,7 +413,7 @@
+
+ p->x += Toolpadding;
+ r = Rect(p->x, p->y, p->x+16, p->y+16);
+- draw(screen, r, c, i, ZP);
++ draw(fb, r, c, i, ZP);
+ p->x += 16+Toolpadding;
+ return r;
+ }
+@@ -379,12 +426,12 @@
+
+ s = t;
+ if(*s && (p.x+stringwidth(font, s)) > n){+- p = string(screen, p, i, ZP, font, ellipsis);
++ p = string(fb, p, i, ZP, font, ellipsis);
+ while (*s && (p.x+stringwidth(font, s)) > n) s++;
+ }
+ for( ; *s; s++){+ s += chartorune(&rn, s) - 1;
+- p = runestringn(screen, p, i, ZP, font, &rn, 1);
++ p = runestringn(fb, p, i, ZP, font, &rn, 1);
+ }
+ return p;
+ }
+@@ -407,7 +454,7 @@
+ p = addpt(viewr.min, Pt(Toolpadding, Toolpadding));
+ p.y += n*lineh;
+ r = Rpt(p, addpt(p, Pt(Dx(viewr)-2*Toolpadding, lineh)));
+- draw(screen, r, bg, nil, ZP);
++ draw(fb, r, bg, nil, ZP);
+ t = mdate(d);
+ snprint(buf, sizeof buf, "%*lld %s", sizew, d.length, t);
+ free(t);
+@@ -414,12 +461,12 @@
+ img = (d.qid.type&QTDIR) ? folder : file;
+ p.y -= Padding;
+ dy = (lineh-12)/2;
+- draw(screen, Rect(p.x, p.y+dy, p.x+12, p.y+dy+12), fg, img, ZP);
++ draw(fb, Rect(p.x, p.y+dy, p.x+12, p.y+dy+12), fg, img, ZP);
+ p.x += 12+4+Padding;
+ p.y += Padding;
+ p = drawtext(p, fg, d.name, viewr.max.x - stringwidth(font, buf) - 2*Padding - Toolpadding);
+ p.x = viewr.max.x - stringwidth(font, buf) - 2*Padding - Toolpadding;
+- string(screen, p, fg, ZP, font, buf);
++ string(fb, p, fg, ZP, font, buf);
+ }
+
+ void
+@@ -440,22 +487,25 @@
+ Point p;
+ int i, h, y;
+
+- draw(screen, screen->r, viewbg, nil, ZP);
+- p = addpt(screen->r.min, Pt(0, Toolpadding));
+- draw(screen, toolr, toolbg, nil, ZP);
+- line(screen, Pt(toolr.min.x, toolr.max.y), toolr.max, 0, 0, 0, toolfg, ZP);
++ draw(fb, fb->r, viewbg, nil, ZP);
++ p = Pt(0, Toolpadding);
++ draw(fb, toolr, toolbg, nil, ZP);
++ line(fb, Pt(toolr.min.x, toolr.max.y), toolr.max, 0, 0, 0, toolfg, ZP);
+ homer = drawbutton(&p, toolfg, ihome);
+ cdr = drawbutton(&p, toolfg, icd);
++ backr = drawbutton(&p, toolfg, iback);
+ upr = drawbutton(&p, toolfg, iup);
++ refr = drawbutton(&p, toolfg, iref);
++
+ p.x += Toolpadding;
+ p.y = toolr.min.y + (Toolpadding+16+Toolpadding-font->height)/2;
+ pathr = Rect(p.x, p.y, p.x + stringwidth(font, path), p.y + font->height);
+- p = drawtext(p, toolfg, path, screen->r.max.x - 2*(Toolpadding+16+Toolpadding));
+- p.x = screen->r.max.x - 2*(Toolpadding+16+Toolpadding);
+- p.y = screen->r.min.y + Toolpadding;
++ p = drawtext(p, toolfg, path, fb->r.max.x - 2*(Toolpadding+16+Toolpadding));
++ p.x = fb->r.max.x - 2*(Toolpadding+16+Toolpadding);
++ p.y = fb->r.min.y + Toolpadding;
+ newdirr = drawbutton(&p, toolfg, inewfolder);
+ newfiler = drawbutton(&p, toolfg, inewfile);
+- draw(screen, scrollr, scrollbg, nil, ZP);
++ draw(fb, scrollr, scrollbg, nil, ZP);
+ if(ndirs>0){+ h = ((double)nlines/ndirs)*Dy(scrollr);
+ y = ((double)offset/ndirs)*Dy(scrollr);
+@@ -462,10 +512,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);
+- draw(screen, scrposr, scrollfg, nil, ZP);
++ draw(fb, scrposr, scrollfg, nil, ZP);
+ for(i = 0; i<nlines && offset+i<ndirs; i++){+ drawdir(i, 0);
+ }
++ draw(screen, screen->r, fb, nil, ZP);
+ flushimage(display, 1);
+ }
+
+@@ -506,18 +557,42 @@
+ }
+
+ void
++scroll(Mouse m)
++{++ int dy;
++
++ if(m.buttons & 1){++ dy = 1+nlines*((double)(m.xy.y - scrollr.min.y)/Dy(scrollr));
++ scrollup(dy);
++ }else if(m.buttons & 2){++ if(nlines<ndirs){++ offset = scrollclamp((m.xy.y-Dy(scrposr)/2 - (scrollr.min.y)) * ndirs/Dy(scrollr));
++ redraw();
++ }
++ }else if(m.buttons & 4){++ dy = 1+nlines*((double)(m.xy.y - scrollr.min.y)/Dy(scrollr));
++ scrolldown(dy);
++ }
++}
++
++void
+ evtresize(void)
+ {+ if(getwindow(display, Refnone)<0)
+ sysfatal("cannot reattach: %r");+ lineh = Padding+font->height+Padding;
+- toolr = screen->r;
++ freeimage(fb);
++ if((fb = allocimage(display,
++ Rect(0,0,Dx(screen->r),Dy(screen->r)),
++ screen->chan, 0, DNofill)) == nil)
++ sysfatal("allocimage: %r");++ toolr = fb->r;
+ toolr.max.y = toolr.min.y+16+2*Toolpadding;
+- scrollr = screen->r;
++ scrollr = fb->r;
+ scrollr.min.y = toolr.max.y+1;
+ scrollr.max.x = scrollr.min.x + Scrollwidth;
+ scrollr = insetrect(scrollr, 1);
+- viewr = screen->r;
++ viewr = fb->r;
+ viewr.min.x += Scrollwidth;
+ viewr.min.y = toolr.max.y+1;
+ nlines = Dy(viewr)/lineh;
+@@ -542,13 +617,21 @@
+ cd(nil);
+ redraw();
+ break;
++ case Kesc:
++ loaddirs();
++ redraw();
++ break;
+ case Kup:
+ up();
+ redraw();
+ break;
+- case 0x20:
+- plumbsendtext(plumbfd, "vdir", nil, nil, path);
++ case Kbs:
++ back();
++ redraw();
+ break;
++ case 0x0a:
++ plumbsendtext(plumbfd, "vdirw", nil, nil, path);
++ break;
+ }
+ }
+
+@@ -557,9 +640,8 @@
+ {+ Point p;
+
+- p = screen->r.min;
+- p.x += (Dx(screen->r)-stringwidth(font, text)-4)/2;
+- p.y += (Dy(screen->r)-font->height-4)/2;
++ p.x = (Dx(fb->r)-stringwidth(font, text)-4)/2;
++ p.y = (Dy(fb->r)-font->height-4)/2;
+ return p;
+ }
+
+@@ -579,63 +661,36 @@
+ void
+ evtmouse(Mouse m)
+ {+- int n, dy;
++ int n;
+ Dir d;
+ char buf[256] = {0};+
+- if(oldbuttons == 0 && m.buttons != 0 && ptinrect(m.xy, scrollr))
++ m.xy = subpt(m.xy, screen->r.min);
++ if(m.buttons != 0 && (ptinrect(m.xy, scrollr) || scrolling)){+ scrolling = 1;
+- else if(m.buttons == 0)
++ scroll(m);
++ }else
scrolling = 0;
- if(m.buttons&1){@@ -64,14 +545,24 @@
- if(scrolling){- dy = 1+nlines*((double)(m.xy.y - scrollr.min.y)/Dy(scrollr));
- scrolldown(dy);
+- }else if(ptinrect(m.xy, homer)){ + if(m.buttons&1 && oldbuttons == 0){-+ if(scrolling){-+ dy = 1+nlines*((double)(m.xy.y - scrollr.min.y)/Dy(scrollr));
-+ scrollup(dy);
- }else if(ptinrect(m.xy, homer)){++ if(ptinrect(m.xy, homer)){cd(nil);
redraw();
-@@ -634,8 +607,6 @@
+ }else if(ptinrect(m.xy, upr)){+ up();
+ redraw();
+- }else if(ptinrect(m.xy, cdr)){++ }else if(ptinrect(m.xy, refr)){++ loaddirs();
++ redraw();
++ }else if(ptinrect(m.xy, backr)){++ if(back())
++ redraw();
++ }else if(ptinrect(m.xy, cdr) || ptinrect(m.xy, pathr)){+ m.xy = cept("Go to directory");+ if(enter("Go to directory", buf, sizeof buf, mctl, kctl, nil)>0){cd(buf);
redraw();
}
@@ -80,7 +571,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 +627,47 @@
+@@ -656,10 +711,39 @@
if(d.qid.type & QTDIR){cd(d.name);
redraw();
@@ -88,16 +579,16 @@
- if(plumbfile(path, d.name))
- flash(n);
}
-+ }
++ }
+ }else if(m.buttons&2 && oldbuttons == 0){-+ if(ptinrect(m.xy, viewr)){-+ n = indexat(m.xy);
-+ if(n==-1)
-+ return;
-+ d = dirs[offset+n];
++ if(ptinrect(m.xy, viewr)){++ n = indexat(m.xy);
++ if(n==-1)
++ return;
++ d = dirs[offset+n];
+ menu2.lasthit = 0;
-+ switch(menuhit(2, mctl, &menu2, nil)){-+ case Mdelete:
++ switch(menuhit(2, mctl, &menu2, nil)){++ case Mdelete:
+ rm(d.name);
+ redraw();
+ break;
@@ -109,17 +600,9 @@
+ }
+ break;
+ }
-+ }else if(scrolling){-+ if(nlines<ndirs){-+ offset = scrollclamp((m.xy.y - scrollr.min.y) * ndirs/Dy(scrollr));
-+ redraw();
-+ }
+ }
+ }if((m.buttons&4) && oldbuttons == 0){-+ if(scrolling){-+ dy = 1+nlines*((double)(m.xy.y - scrollr.min.y)/Dy(scrollr));
-+ scrolldown(dy);
-+ }else if(ptinrect(m.xy, pathr)){++ if(ptinrect(m.xy, pathr)){+ plumbsendtext(plumbfd, "vdirw", nil, nil, path);
+ }else if(ptinrect(m.xy, viewr)){+ n = indexat(m.xy);
--
⑨