rio: dont serve /dev/screen from display->image, as its not updated on resize. instead, use screen and omit the file if provided by the enviroment. allow unaligned reads.

cinap_lenrek 2011-11-29 13:41:02 -05:00
parent c389d96769
commit 25f4840c7e
2 changed files with 28 additions and 18 deletions

View File

@ -430,9 +430,13 @@ filsyswalk(Filsys *fs, Xfid *x, Fid *f)
dir = dirtab;
goto Accept;
}
/* don't serve these if it's provided in the environment */
if(snarffd>=0 && strcmp(x->wname[i], "snarf")==0)
break; /* don't serve /dev/snarf if it's provided in the environment */
break;
if(strcmp(x->wname[i], "screen")==0 && access("/dev/screen", AEXIST)==0)
break;
id = WIN(f->qid);
d = dirtab;
d++; /* skip '.' */

View File

@ -567,19 +567,29 @@ xfidwrite(Xfid *x)
int
readwindow(Image *i, char *t, Rectangle r, int offset, int n)
{
int ww, y;
int ww, oo, y, m;
uchar *tt;
offset -= 5*12;
ww = bytesperline(r, i->depth);
r.min.y += offset/ww;
if(r.min.y >= r.max.y)
return 0;
y = r.min.y + n/ww;
y = r.min.y + (n + ww-1)/ww;
if(y < r.max.y)
r.max.y = y;
if(r.max.y <= r.min.y)
return 0;
return unloadimage(i, r, (uchar*)t, n);
m = ww * Dy(r);
oo = offset % ww;
if(oo == 0 && n >= m)
return unloadimage(i, r, (uchar*)t, n);
if((tt = malloc(m)) == nil)
return -1;
m = unloadimage(i, r, tt, m) - oo;
if(m > 0){
if(n < m) m = n;
memmove(t, tt + oo, m);
}
free(tt);
return m;
}
void
@ -798,30 +808,26 @@ xfidread(Xfid *x)
case Qwindow:
i = w->i;
if(i == nil || Dx(w->screenr)<=0){
r = w->screenr;
if(i == nil || Dx(r)<=0){
filsysrespond(x->fs, x, &fc, Enowindow);
return;
}
r = w->screenr;
goto caseImage;
case Qscreen:
i = display->image;
if(i == nil){
filsysrespond(x->fs, x, &fc, "no top-level screen");
break;
}
r = i->r;
/* fall through */
i = screen;
r = screen->r;
caseImage:
if(off < 5*12){
n = sprint(buf, "%11s %11d %11d %11d %11d ",
chantostr(cbuf, i->chan),
i->r.min.x, i->r.min.y, i->r.max.x, i->r.max.y);
r.min.x, r.min.y, r.max.x, r.max.y);
t = estrdup(buf);
goto Text;
}
off -= 5*12;
t = malloc(cnt);
fc.data = t;
n = readwindow(i, t, r, off, cnt); /* careful; fc.count is unsigned */