shithub: dmenu

Download patch

ref: 235f692a93b73fff063ec4c47ccccc361dab1fb5
parent: 342d92a22a97b02235abe83f4ec420c8aa6622ef
author: glenda <glenda@9front.local>
date: Sun Sep 5 16:17:40 EDT 2021

working implementation without scrolling support

--- a/linesel.c
+++ /dev/null
@@ -1,188 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <draw.h>
-#include <event.h>
-#include <keyboard.h>
-
-#define Ctl(c) ((c) - 64)
-
-Image *fgcolor, *bgcolor;
-char **lines, **matches, *buffer,  *selected;
-usize nlines, nmatches;
-Rune kbinput[512];
-
-static void
-readbuffer(void)
-{
-	Biobuf *bp;
-	char *line, *s;
-
-	if((bp = Bfdopen(0, OREAD)) == nil)
-		sysfatal("setting buffering on fd0: %r");
-	if ((buffer = Brdstr(bp, '\0', 1)) == nil)
-		sysfatal("reading input lines: %r");
-
-	for(line = s = buffer; s = strchr(s, '\n'); line = ++s){
-		*s = '\0';
-		if((lines = realloc(lines, ++nlines * sizeof *lines)) == nil)
-			sysfatal("malloc: %r");
-		lines[nlines-1] = line;
-	}
-	if((matches = malloc(nlines * sizeof *lines)) == nil)
-		sysfatal("malloc: %r");
-}
-
-#define PROMPT "  > "
-
-static void
-redraw(Image *screen)
-{
-	short fh = font->height;
-	Point pt = screen->r.min;
-	usize i;
-	char buf[512];
-
-	draw(screen, screen->r, bgcolor, nil, ZP);
-
-	pt = addpt(pt, Pt(0, fh));
-	snprint(buf, sizeof buf, PROMPT"%S▏", kbinput);
-	string(screen, pt, fgcolor, ZP, font, buf);	
-	pt = addpt(pt, Pt(stringwidth(font, PROMPT), fh));
-
-	for(i = 0; i < nmatches; i++){
-		if (pt.y > screen->r.max.y)
-			break;
-		string(screen, pt, fgcolor, ZP, font, matches[i]);
-		pt = addpt(pt, Pt(0, fh));
-	}
-}
-
-static void
-resetmatches(void)
-{
-	memmove(matches, lines, nlines * sizeof *lines);
-	nmatches = nlines;
-}
-
-static void
-kbadd(Rune r)
-{
-	usize len = runestrlen(kbinput);
-
-	if (len == sizeof kbinput / sizeof *kbinput)
-		return;
-	kbinput[len++] = r;
-	kbinput[len] = L'\0';
-}
-
-static void
-kbbackspace(void)
-{
-	usize len = runestrlen(kbinput);
-
-	if (len == 0)
-		return;
-	kbinput[len - 1] = L'\0';
-}
-
-static void
-kbdelword(void)
-{
-	usize len = runestrlen(kbinput);
-
-	if(len == 0)
-		return;
-	while(len > 0 && isspacerune(kbinput[len-1]))
-		len--;
-	while(len > 0 && !isspacerune(kbinput[len-1]))
-		len--;
-	kbinput[len] = L'\0';
-}
-
-static void
-kbclear(void)
-{
-	kbinput[0] = L'\0';
-}
-
-void
-eresized(int new)
-{
-	if(new && getwindow(display, Refnone) < 0)
-		sysfatal("resize failed: %r");
-	redraw(screen);
-}
-
-static void
-usage(void)
-{
-	print("usage: %s [-b] <choices\n", argv0);
-	exits("usage");
-}
-
-void
-main(int argc, char **argv)
-{
-	Event e;
-	int bflag = 0;
-
-	ARGBEGIN{
-	case 'b':
-		bflag = 1;
-		break;
-	default:
-		usage();
-	}ARGEND;
-
-	readbuffer();
-	resetmatches();
-	selected = matches[0];
-
-	if(initdraw(nil, nil, "linesel") < 0)
-		sysfatal("initdraw: %r");
-	if(bflag){
-		fgcolor = display->white;
-		bgcolor = display->black;
-	}else{
-		fgcolor = display->black;
-		bgcolor = display->white;
-	}
-	einit(Emouse|Ekeyboard);
-	redraw(screen);
-
-	for(;;){
-		switch(event(&e)){
-		case -1:
-			sysfatal("watching channels: %r\n");
-
-		case Ekeyboard:
-			switch(e.kbdc){
-			case Kdel:
-				exits("interrupted with Del");
-			case '\n':
-				goto End;
-			case Kbs:
-				kbbackspace();
-				break;
-			case Ctl('W'):
-				kbdelword();
-				break;
-			case Ctl('U'):
-				kbclear();
-				break;
-			default:
-				kbadd(e.kbdc);
-				break;
-			}
-			redraw(screen);
-			break;
-
-		case Emouse:
-			break;
-		}
-	}
-End:
-	print("%s\n", selected);
-	exits(nil);
-}
--- a/mkfile
+++ b/mkfile
@@ -1,6 +1,14 @@
 </$objtype/mkfile
 
-TARG=linesel
-OFILES=linesel.$O
+TARG=\
+	line\
+
 HFILES=
-</sys/src/cmd/mkone
+
+LIB= /$objtype/lib/libdraw.a
+BIN= /$objtype/bin/sel
+MAN= /sys/man/1
+
+</sys/src/cmd/mkmany
+
+install:V: $MAN/$TARG