From 90a08cf1fda8eaf4afe98f74a7572fb36b7ef369 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 3 Apr 2022 04:23:25 +0000 Subject: [PATCH] vncv: some fixes to work with intel amt kvm --- sys/src/cmd/vnc/auth.c | 2 ++ sys/src/cmd/vnc/color.c | 31 ++++++++++++++++++++++++++++--- sys/src/cmd/vnc/draw.c | 10 +++++----- sys/src/cmd/vnc/vncv.c | 6 +++++- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/sys/src/cmd/vnc/auth.c b/sys/src/cmd/vnc/auth.c index edde1ba85..cdf937402 100644 --- a/sys/src/cmd/vnc/auth.c +++ b/sys/src/cmd/vnc/auth.c @@ -35,6 +35,8 @@ vnchandshake(Vnc *v) v->vers = 38; else if(strncmp(msg, "RFB 003.889\n", VerLen) == 0) v->vers = 38; /* Darwin */ + else if(strncmp(msg, "RFB 004.000\n", VerLen) == 0) + v->vers = 38; else /* RFC6143: Any other should be treated as 3.3. */ v->vers = 33; diff --git a/sys/src/cmd/vnc/color.c b/sys/src/cmd/vnc/color.c index 485ad4c65..40141a63f 100644 --- a/sys/src/cmd/vnc/color.c +++ b/sys/src/cmd/vnc/color.c @@ -108,18 +108,42 @@ cvtbgr332tocmap8(uchar *dst, uchar *src, int npixel) *dst++ = bgr8[*src++]; } +static void +cvt16to32(uchar *dst, uchar *src, int npixel) +{ + uchar *ed; + int w, r, g, b; + + ed = dst+npixel*4; + while(dst < ed){ + w = src[1]<<8 | src[0]; + b = (w >> 11) & 0x1F; + g = (w >> 5) & 0x3F; + r = (w >> 0) & 0x1F; + dst[0] = b<<(8-5); + dst[1] = g<<(8-6); + dst[2] = r<<(8-5); + dst += 4; + src += 2; + } +} + void choosecolor(Vnc *v) { int bpp, depth; ulong chan; - bpp = screen->depth; + chan = screen->chan; + depth = screen->depth; + bpp = depth; if((bpp / 8) * 8 != bpp) sysfatal("screen not supported"); - depth = screen->depth; - chan = screen->chan; + if(bpp == 32 && v->Pixfmt.bpp == 16){ + cvtpixels = cvt16to32; + goto Done; + } if(bpp == 24){ if(verbose) @@ -156,6 +180,7 @@ choosecolor(Vnc *v) if(v->red.max == 0 || v->green.max == 0 || v->blue.max == 0) sysfatal("screen not supported"); +Done: if(verbose) fprint(2, "%d bpp, %d depth, 0x%lx chan, %d truecolor, %d bigendian\n", v->bpp, v->depth, screen->chan, v->truecolor, v->bigendian); diff --git a/sys/src/cmd/vnc/draw.c b/sys/src/cmd/vnc/draw.c index b83060f69..61b2c1760 100644 --- a/sys/src/cmd/vnc/draw.c +++ b/sys/src/cmd/vnc/draw.c @@ -171,17 +171,17 @@ loadbuf(Vnc *v, Rectangle r, int stride) if(cvtpixels){ y = r.min.y; - off = y * stride; + off = y * stride + r.min.x * pixb; for(; y < r.max.y; y++){ vncrdbytes(v, linebuf, Dx(r) * vpixb); - (*cvtpixels)(&pixbuf[off + r.min.x * pixb], linebuf, Dx(r)); + (*cvtpixels)(&pixbuf[off], linebuf, Dx(r)); off += stride; } }else{ y = r.min.y; - off = y * stride; + off = y * stride + r.min.x * pixb; for(; y < r.max.y; y++){ - vncrdbytes(v, &pixbuf[off + r.min.x * pixb], Dx(r) * pixb); + vncrdbytes(v, &pixbuf[off], Dx(r) * pixb); off += stride; } } @@ -396,7 +396,7 @@ readfromserver(Vnc *v) type = vncrdchar(v); switch(type){ default: - sysfatal("bad message from server"); + sysfatal("bad message from server: %x", type); break; case MFrameUpdate: vncrdchar(v); diff --git a/sys/src/cmd/vnc/vncv.c b/sys/src/cmd/vnc/vncv.c index 942b03f27..8633f9a2d 100644 --- a/sys/src/cmd/vnc/vncv.c +++ b/sys/src/cmd/vnc/vncv.c @@ -48,6 +48,10 @@ netmkvncaddr(char *server) char *p, portstr[NETPATHLEN]; int port; + /* leave execnet dial strings alone */ + if(strncmp(server, "exec!", 5) == 0) + return server; + port = 5900; if(tls) port = 35729; @@ -96,7 +100,7 @@ main(int argc, char **argv) tls = 1; break; case 'v': - verbose = 1; + verbose++; break; case 'k': keypattern = EARGF(usage());