ref: d525a8fd26307afc029ae75f7adfed741d5ee36f
parent: 8e41616af560b69d176f9b3d4a5380e3220e8915
author: aap <[email protected]>
date: Mon Jan 30 06:49:30 EST 2023
cosmetics
--- a/fs.c
+++ b/fs.c
@@ -636,6 +636,9 @@
data = r->ifcall.data;
r->ofcall.count = count;
+ /* custom emalloc9p allows us this */
+ data[count] = '\0';
+
if(w == nil || w->deleted){
respond(r, Edeleted);
return;
@@ -723,9 +726,7 @@
respond(r, "non-zero offset writing label");
return;
}
- w->label = realloc(w->label, count+1);
- memmove(w->label, data, count);
- w->label[count] = 0;
+ wsetlabel(w, data);
break;
case Qsnarf:
@@ -765,12 +766,7 @@
break;
case Qwctl:
- /* sucks that we have no space for '\0' */
- p = emalloc(count+1);
- memmove(p, data, count);
- p[count] = '\0';
- respond(r, writewctl(w, p));
- free(p);
+ respond(r, writewctl(w, data));
return;
case Qtap:
@@ -865,22 +861,6 @@
nil
};
-void
-post(char *name, int srvfd)
-{
- char buf[80];
- int fd;
-
- snprint(buf, sizeof buf, "/srv/%s", name);
- fd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600);
- if(fd < 0)
- panic(buf);
- if(fprint(fd, "%d", srvfd) < 0)
- panic("post");
- putenv("wsys", buf);
- /* leave fd open */
-}
-
static Ioproc *io9p;
/* copy & paste from /sys/src/libc/9sys/read9pmsg.c
@@ -911,6 +891,27 @@
if(m < len)
return 0;
return BIT32SZ+m;
+}
+
+/* +1 so we can always zero-terminate a write buffer */
+void *emalloc9p(ulong sz) { return emalloc(sz+1); }
+void *erealloc9p(void *v, ulong sz) { return erealloc(v, sz+1); }
+char *estrdup9p(char *s) { return estrdup(s); }
+
+void
+post(char *name, int srvfd)
+{
+ char buf[80];
+ int fd;
+
+ snprint(buf, sizeof buf, "/srv/%s", name);
+ fd = create(buf, OWRITE|ORCLOSE|OCEXEC, 0600);
+ if(fd < 0)
+ panic(buf);
+ if(fprint(fd, "%d", srvfd) < 0)
+ panic("post");
+ putenv("wsys", buf);
+ /* leave fd open */
}
/*
--- a/inc.h
+++ b/inc.h
@@ -77,6 +77,7 @@
void xpaste(Text *x);
void xsend(Text *x);
int xplumb(Text *w, char *dir, int maxsize);
+void freescrtemps(void);
enum
{
@@ -232,9 +233,9 @@
Window *wpointto(Point pt);
void wsetcursor(Window *w);
void wsetlabel(Window *w, char *label);
+void wsetname(Window *w);
+void wsetpid(Window *w, int pid, int dolabel);
void wmove(Window *w, Point pos);
-void wrmove(Window *w, Point delta);
-void wrmovescreen(Point delta);
void wraise(Window *w);
void wlower(Window *w);
void wfocus(Window *w);
@@ -243,9 +244,6 @@
void wsethold(Window *w, int hold);
void wmovemouse(Window *w, Point pt);
void wtype(Window *w, Rune r);
-void wsetname(Window *w);
-void wsetpid(Window *w, int pid, int dolabel);
-void winshell(void *args);
int wincmd(Window *w, int pid, char *dir, char **argv);
char *writewctl(Window *w, char *data);
--- a/main.c
+++ b/main.c
@@ -566,6 +566,7 @@
sysfatal("resize failed: %r");
nr = screen->clipr;
+ freescrtemps();
freescreen(wscreen);
wscreen = allocscreen(screen, background, 0);
draw(screen, screen->r, background, nil, ZP);
@@ -848,8 +849,8 @@
threadmain(int, char *[])
{
char buf[256];
-//rfork(RFENVG);
-//newwindow("-dx 1280 -dy 800");
+rfork(RFENVG);
+newwindow("-dx 1280 -dy 800");
if(getwd(buf, sizeof(buf)) == nil)
startdir = estrdup(".");
--- a/text.c
+++ b/text.c
@@ -275,7 +275,6 @@
return scrtmp;
}
-/*
void
freescrtemps(void)
{
@@ -284,7 +283,6 @@
scrtmp = nil;
}
}
-*/
static Rectangle
scrpos(Rectangle r, uint p0, uint p1, uint tot)
@@ -770,6 +768,8 @@
uint q0, q1;
int nb;
+ xsnarf(x);
+ xcut(x);
switch(r){
case CTRL('H'): /* erase character */
case CTRL('W'): /* erase word */
@@ -789,7 +789,6 @@
}
break;
default:
- xdelete(x, x->q0, x->q1);
xinsert(x, &r, 1, x->q0);
xshow(x, x->q0);
break;
@@ -943,7 +942,6 @@
plumbfree(m);
return 0; /* too large for 9P */
}
-// m->data = runetobyte(w->r+p0, p1-p0, &m->ndata);
m->data = smprint("%.*S", p1-p0, w->r+p0);
m->ndata = strlen(m->data);
if(plumbsend(fd, m) < 0){
--- a/wind.c
+++ b/wind.c
@@ -94,7 +94,6 @@
wcalcrects(w);
draw(w->img, w->img->r, colors[BACK], nil, ZP);
xinit(&w->text, w->textr, w->scrollr, font, w->img, colors);
- wdecor(w);
}
static int id = 1;
@@ -108,11 +107,12 @@
incref(w);
w->id = id++;
w->notefd = -1;
- w->label = estrdup("<unnamed>");
+ wsetlabel(w, "<unnamed>");
w->dir = estrdup(startdir);
w->hidden = hidden;
w->scrolling = scrolling;
wsetsize(w, r);
+ wdecor(w);
wlistpushfront(w);
// TMP - make dynamic
windows[nwindows++] = w;
@@ -230,31 +230,67 @@
void
wsetcursor(Window *w)
{
- if(w != cursorwin)
- return;
+ if(w == cursorwin)
+ setcursornormal(w->holdmode ? &whitearrow : w->cursorp);
+}
- if(w->holdmode)
- setcursornormal(&whitearrow);
- else
- setcursornormal(w->cursorp);
+void
+wsetlabel(Window *w, char *label)
+{
+ free(w->label);
+ w->label = estrdup(label);
}
void
-wrepaint(Window *w)
+wsetname(Window *w)
{
- wsetcolors(w);
- if(!w->mouseopen)
- xredraw(&w->text);
- wdecor(w);
+ int i, n;
+ char err[ERRMAX];
+
+ n = snprint(w->name, sizeof(w->name)-2, "%s.%d.%d", w->noborder ? "noborder" : "window", w->id, w->namecount++);
+ for(i='A'; i<='Z'; i++){
+ if(nameimage(w->img, w->name, 1) > 0)
+ return;
+ errstr(err, sizeof err);
+ if(strcmp(err, "image name in use") != 0)
+ break;
+ w->name[n] = i;
+ w->name[n+1] = 0;
+ }
+ w->name[0] = 0;
+ fprint(2, "lola: setname failed: %s\n", err);
}
void
-wsetlabel(Window *w, char *label)
+wsetpid(Window *w, int pid, int dolabel)
{
- free(w->label);
- w->label = estrdup(label);
+ char buf[32];
+ int ofd;
+
+ ofd = w->notefd;
+ if(pid <= 0)
+ w->notefd = -1;
+ else{
+ if(dolabel){
+ snprint(buf, sizeof(buf), "rc %lud", (ulong)pid);
+ wsetlabel(w, buf);
+ }
+ snprint(buf, sizeof(buf), "/proc/%lud/notepg", (ulong)pid);
+ w->notefd = open(buf, OWRITE|OCEXEC);
+ }
+ if(ofd >= 0)
+ close(ofd);
}
+void
+wrepaint(Window *w)
+{
+ wsetcolors(w);
+ wdecor(w);
+ if(!w->mouseopen)
+ xredraw(&w->text);
+}
+
/* restore window order after reshaping has disturbed it */
void
worder(void)
@@ -299,28 +335,6 @@
}
void
-wrmove(Window *w, Point delta)
-{
- wmove(w, addpt(w->img->r.min, delta));
-}
-
-/* currently UNUSED */
-void
-wrmovescreen(Point delta)
-{
- Point pos;
- Window *w;
-
- for(w = bottomwin; w; w = w->higher){
- pos = addpt(w->img->r.min, delta);
- originwindow(w->img, pos, pos);
- wcalcrects(w);
- xsetrects(&w->text, w->textr, w->scrollr);
- }
- flushimage(display, 1);
-}
-
-void
wraise(Window *w)
{
wlistremove(w);
@@ -411,10 +425,9 @@
void
wmovemouse(Window *w, Point pt)
{
- if(w != focused || wpointto(mctl->xy) != w)
- return;
// TODO? rio also checks menuing and such
- moveto(mctl, pt);
+ if(w == focused && wpointto(mctl->xy) == w)
+ moveto(mctl, pt);
}
/*
@@ -585,7 +598,6 @@
return;
case Kdown:
xscrolln(x, shiftdown ? 1 : nlines/3);
-// xtickupdn(x, 1);
return;
case Kpgdown:
xscrolln(x, nlines*2/3);
@@ -596,7 +608,6 @@
return;
case Kup:
xscrolln(x, -(shiftdown ? 1 : nlines/3));
-// xtickupdn(x, -1);
return;
case Kpgup:
xscrolln(x, -nlines*2/3);
@@ -784,7 +795,7 @@
alts[NALT].op = CHANEND;
for(;;){
- if(w->deleted){ // TODO? rio checks image here
+ if(w->deleted){
alts[Agone].op = CHANSND;
alts[AConsWrite].op = CHANNOP;
alts[AConsRead].op = CHANNOP;
@@ -958,51 +969,9 @@
}
}
-void
-wsetname(Window *w)
+static void
+shellproc(void *args)
{
- int i, n;
- char err[ERRMAX];
-
- n = snprint(w->name, sizeof(w->name)-2, "%s.%d.%d", w->noborder ? "noborder" : "window", w->id, w->namecount++);
- for(i='A'; i<='Z'; i++){
- if(nameimage(w->img, w->name, 1) > 0)
- return;
- errstr(err, sizeof err);
- if(strcmp(err, "image name in use") != 0)
- break;
- w->name[n] = i;
- w->name[n+1] = 0;
- }
- w->name[0] = 0;
- fprint(2, "lola: setname failed: %s\n", err);
-}
-
-void
-wsetpid(Window *w, int pid, int dolabel)
-{
- char buf[32];
- int ofd;
-
- ofd = w->notefd;
- if(pid <= 0)
- w->notefd = -1;
- else {
- if(dolabel){
- snprint(buf, sizeof(buf), "rc %lud", (ulong)pid);
- free(w->label);
- w->label = estrdup(buf);
- }
- snprint(buf, sizeof(buf), "/proc/%lud/notepg", (ulong)pid);
- w->notefd = open(buf, OWRITE|OCEXEC);
- }
- if(ofd >= 0)
- close(ofd);
-}
-
-void
-winshell(void *args)
-{
Window *w;
Channel *pidc;
void **arg;
@@ -1057,7 +1026,7 @@
args[2] = "/bin/rc";
args[3] = argv;
args[4] = dir;
- proccreate(winshell, args, mainstacksize);
+ proccreate(shellproc, args, mainstacksize);
pid = recvul(cpid);
chanfree(cpid);
if(pid == 0){