ref: fc299fdf45602f63cf16c939706abbfc276e69db
author: glenda <glenda@9front.local>
date: Sat Sep 4 20:04:59 EDT 2021
"initial
--- /dev/null
+++ b/linesel.c
@@ -1,0 +1,143 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <draw.h>
+#include <thread.h>
+#include <keyboard.h>
+#include <mouse.h>
+
+int bflag;
+Image *fgcolor, *bgcolor;
+Font *font;
+char **lines, **matches, *buffer, *selected;
+usize nlines, nmatches;
+Rune kbdin[512];
+Keyboardctl *keyboard;
+Mousectl *mouse;
+
+enum
+{
+ Ckeyboard,
+ Cmouse,
+ Cresize,
+ Cnum
+};
+
+static void
+redraw(void)
+{
+ draw(screen, screen->r, bgcolor, nil, ZP);
+ string(screen,
+ Pt(10, 10), fgcolor, ZP, font, "test");
+ flushimage(display, 1);
+}
+
+static void
+resetmatches(void)
+{
+ memmove(matches, lines, nlines * sizeof *lines);
+ nmatches = nlines;
+}
+
+static void
+initgraphics(Alt *a)
+{
+ if(initdraw(nil, nil, "linesel") == -1)
+ sysfatal("initdraw: %r");
+ if(bflag){
+ fgcolor = display->white;
+ bgcolor = display->black;
+ }else{
+ fgcolor = display->black;
+ bgcolor = display->white;
+ }
+ font = display->defaultfont;
+
+ if((keyboard = initkeyboard(nil)) == nil)
+ sysfatal("initkeyboard: %r");
+ if((mouse = initmouse(nil, screen)) == nil)
+ sysfatal("initmouse: %r");
+
+ a[Ckeyboard].c = keyboard->c;
+ a[Cmouse].c = mouse->c;
+}
+
+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");
+}
+
+static void
+linesel(void)
+{
+ Rune r;
+ Mouse m;
+ Alt a[] = {
+ [Ckeyboard] = {nil, &r, CHANRCV},
+ [Cmouse] = {nil, &m, CHANRCV},
+ [Cnum] = {nil, nil, CHANEND},
+ };
+
+ initgraphics(a);
+ redraw();
+
+ for(;;){
+ switch(alt(a)){
+ case -1:
+ sysfatal("watching channels: %r\n");
+
+ case Ckeyboard:
+ switch(r){
+ case '\n':
+ return;
+ }
+ break;
+
+ case Cmouse:
+ break;
+ }
+ }
+
+}
+
+static void
+usage(void)
+{
+ print("usage: %s [-b] <choices\n", argv0);
+ threadexitsall("usage");
+}
+
+void
+threadmain(int argc, char **argv)
+{
+ ARGBEGIN{
+ case 'b':
+ bflag = 1;
+ break;
+ default:
+ usage();
+ }ARGEND;
+
+ readbuffer();
+ resetmatches();
+ selected = matches[0];
+ linesel();
+ print("%s\n", selected);
+ threadexitsall(nil);
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,6 @@
+</$objtype/mkfile
+
+TARG=linesel
+OFILES=linesel.$O
+HFILES=
+</sys/src/cmd/mkone