diff -r a75d8598f30a sys/src/cmd/rio/rio.c --- a/sys/src/cmd/rio/rio.c Mon Nov 02 19:12:15 2015 -0500 +++ b/sys/src/cmd/rio/rio.c Tue Nov 03 09:31:20 2015 -0600 @@ -24,6 +24,7 @@ void move(void); void delete(void); void hide(void); +void label(void); void unhide(int); void newtile(int); Image *sweep(void); @@ -53,6 +54,7 @@ Move, Delete, Hide, + Label, Exit, }; @@ -91,6 +93,7 @@ [Move] "Move", [Delete] "Delete", [Hide] "Hide", + [Label] "Label", [Exit] "Exit", nil }; @@ -777,6 +780,9 @@ case Hide: hide(); break; + case Label: + label(); + break; case Exit: if(Hidden > Exit){ send(exitchan, nil); @@ -1250,6 +1256,54 @@ } } +void +labelthread(void *a) +{ + Channel *c; + Rune r; + char *s; + + c = a; + while((s = recvp(input->ck)) != nil){ + if(*s == 'c'){ + chartorune(&r, s+1); + if(r) + send(c, &r); + } + free(s); + } + threadexits(0); +} + + +void +label(void) +{ + Window *w, enterw; + Keyboardctl kbdctl; + char buf[1024]; + int n; + + w = pointto(TRUE); + riosetcursor(nil, 0); + if(w == nil) + return; + enterw.ck = chancreate(sizeof(char*), 0); + kbdctl.c = chancreate(sizeof(Rune), 20); + input = &enterw; + threadcreate(labelthread, kbdctl.c, STACK); + strecpy(buf, buf+sizeof(buf), w->label); + n = enter("Label", buf, sizeof(buf), mousectl, &kbdctl, wscreen); + sendp(enterw.ck, nil); + input = w; + chanfree(enterw.ck); + chanfree(kbdctl.c); + if(n<=0) + return; + free(w->label); + w->label = estrdup(buf); +} + Window* new(Image *i, int hideit, int scrollit, int pid, char *dir, char *cmd, char **argv) {