shithub: vdir

Download patch

ref: 04ed7515b13f53b4048a1756854f3116dedbf3d6
parent: de7e069124978b0b38c2e0084aa2ad797d98900a
author: phil9 <telephil9@gmail.com>
date: Wed Feb 23 04:51:55 EST 2022

implement delete/rename operations

	when middle-clicking a file or directory, a file operations menu
	will open and propose the following:
	- delete: delete the file or directory (recursively)
	- rename: rename the file or directory

--- a/vdir.c
+++ b/vdir.c
@@ -27,6 +27,14 @@
 	Ekeyboard,
 };
 
+enum
+{
+	Mdelete,
+	Mrename,
+};
+char *menu2str[] = { "delete", "rename", nil };
+Menu menu2 = { menu2str };
+
 const char ellipsis[] = "…";
 
 char *home;
@@ -206,6 +214,59 @@
 }
 
 int
+doexec(char *cmd)
+{
+	int rc;
+	Waitmsg *msg;
+
+	rc = 0;
+	switch(rfork(RFPROC|RFFDG|RFREND)){
+	case -1:
+		rc = -1;
+		break;
+	case 0:
+		execl("/bin/rc", "rc", "-c", cmd, 0);
+		fprint(2, "execl failed: %r");
+		threadexitsall("execl");
+		break;
+	default:
+		msg = wait();
+		if(msg != nil && msg->msg[0] != 0){
+			rc = -1;
+			fprint(2, "error: %s\n", msg->msg); /* TODO: visual reporting */
+		}
+		if(msg != nil)
+			free(msg);
+		break;
+	}
+	return rc;
+}
+
+void
+rm(char *name)
+{
+	char cmd[300];
+
+	snprint(cmd, sizeof cmd, "rm -r %s/%s", path, name);
+	if(doexec(cmd) < 0)
+		alert("Error", "Cannot remove file/directory", mctl, kctl);
+	else
+		loaddirs();
+}
+
+void
+mv(char *from, char *to)
+{
+	char cmd[520];
+
+	snprint(cmd, sizeof cmd, "mv %s/%s %s/%s", path, from, path, to);
+	if(doexec(cmd) < 0)
+		alert("Error", "Cannot rename file/directory", mctl, kctl);
+	else
+		loaddirs();
+}
+
+int
 plumbfile(char *path, char *name)
 {
 	char *f;
@@ -527,7 +588,24 @@
 			scrollup(dy);
 		}
 	}else if(m.buttons&2){
-		if(scrolling){
+		if(ptinrect(m.xy, viewr)){
+			n = indexat(m.xy);
+			if(n==-1)
+				return;
+			d = dirs[offset+n];
+			switch(menuhit(2, mctl, &menu2, nil)){
+			case Mdelete:
+				rm(d.name);
+				redraw();
+				break;
+			case Mrename:
+				if(enter("Rename to", buf, sizeof buf, mctl, kctl, nil)>0){
+					mv(d.name, buf);
+					redraw();
+				}
+				break;
+			}
+		}else if(scrolling){
 			if(nlines<ndirs){
 				offset = scrollclamp((m.xy.y - scrollr.min.y) * ndirs/Dy(scrollr));
 				redraw();