summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-04-03 04:23:25 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-04-03 04:23:25 +0000
commit90a08cf1fda8eaf4afe98f74a7572fb36b7ef369 (patch)
treeeffd76b7118c88004646555256a1d1b6cf62c1ef /sys/src/cmd/vnc
parent1a4e03cf93872eb78f498af8afd5d8c7d6143178 (diff)
vncv: some fixes to work with intel amt kvm
Diffstat (limited to 'sys/src/cmd/vnc')
-rw-r--r--sys/src/cmd/vnc/auth.c2
-rw-r--r--sys/src/cmd/vnc/color.c31
-rw-r--r--sys/src/cmd/vnc/draw.c10
-rw-r--r--sys/src/cmd/vnc/vncv.c6
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());