in vncgl/vncgl.go [215:320]
func connect(imgs chan *image.RGBA) (*vncclient.ClientConn, error) {
tcp, err := net.Dial("tcp", "172.16.163.128:5900")
if err != nil {
return nil, errors.Annotate(err, "could not connect to server")
}
errCh := make(chan error)
serverMessageCh := make(chan vncclient.ServerMessage)
conn, err, _ := vncclient.Client(tcp, &vncclient.ClientConfig{
Auth: []vncclient.ClientAuth{
&vncclient.PasswordAuth{
Password: "openai",
},
},
ServerMessageCh: serverMessageCh,
ErrorCh: errCh,
})
if err != nil {
return nil, errors.Annotate(err, "could not establish VNC connection to server")
}
go func() {
err := <-errCh
panic(errors.ErrorStack(err))
}()
updates := make(chan *vncclient.FramebufferUpdateMessage)
// Message thread
go func() {
// Ensure standard format
conn.SetPixelFormat(&vncclient.PixelFormat{
BPP: 32,
Depth: 24,
BigEndian: false,
TrueColor: true,
RedMax: 255,
GreenMax: 255,
BlueMax: 255,
RedShift: 0,
GreenShift: 8,
BlueShift: 16,
})
conn.SetEncodings([]vncclient.Encoding{
&vncclient.ZRLEEncoding{},
&vncclient.TightEncoding{},
&vncclient.RawEncoding{},
})
conn.FramebufferUpdateRequest(true, 0, 0, conn.FramebufferWidth, conn.FramebufferHeight)
for {
select {
case msg := <-serverMessageCh:
switch msg := msg.(type) {
case *vncclient.FramebufferUpdateMessage:
updates <- msg
// Keep re-requesting!
conn.FramebufferUpdateRequest(true, 0, 0, conn.FramebufferWidth, conn.FramebufferHeight)
}
}
}
}()
vncgl := &VNCGL{}
if err := vncgl.Init(conn.FramebufferWidth, conn.FramebufferHeight, conn.DesktopName, nil); err != nil {
return nil, err
}
// Apply those updates
var frames int
target := time.Now().UnixNano()
printTarget := time.Now().UnixNano()
for {
target += int64(1000 * 1000 * 1000 / 60)
frames += 1
if time.Now().UnixNano() > printTarget {
printTarget = time.Now().UnixNano() + 1000*1000*1000
log.Infof("effective framerate: %v", frames)
frames = 0
}
var done bool
for !done {
select {
case msg := <-updates:
msgs := []*vncclient.FramebufferUpdateMessage{msg}
vncgl.Apply(msgs)
default:
done = true
}
}
vncgl.Render()
delta := time.Duration(target-time.Now().UnixNano()) * time.Nanosecond
if delta > 0 {
log.Infof("sleeping: %v", delta)
time.Sleep(delta)
} else {
log.Infof("fell behind by: %v", delta)
}
}
}