diff options
author | cinap_lenrek <cinap_lenrek@vmi> | 2011-11-29 13:41:02 -0500 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@vmi> | 2011-11-29 13:41:02 -0500 |
commit | 25f4840c7eb70b7af3da3e9c13fcff704fab9d11 (patch) | |
tree | 93d6528203a36f0b43d9f8bf176b5513f3079a45 /sys/src/cmd/rio/xfid.c | |
parent | c389d96769438345bd929285fb7500e22ba50bc3 (diff) |
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.
Diffstat (limited to 'sys/src/cmd/rio/xfid.c')
-rw-r--r-- | sys/src/cmd/rio/xfid.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/sys/src/cmd/rio/xfid.c b/sys/src/cmd/rio/xfid.c index 2bed90fbd..c9e4eb974 100644 --- a/sys/src/cmd/rio/xfid.c +++ b/sys/src/cmd/rio/xfid.c @@ -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 */ |