func scalerValueCallback(r *gtk.Scale, v *ScaledView) { oldScale := v.scale oldX := v.scene.hadj.GetValue() oldY := v.scene.vadj.GetValue() visMx := float64(v.layoutBox.GetAllocatedWidth()) / 2.0 visMy := float64(v.layoutBox.GetAllocatedHeight()) / 2.0 v.scale = math.Exp2(r.GetValue()) newW, newH := v.guest.Update() v.scene.hadj.SetUpper(float64(newW)) v.scene.vadj.SetUpper(float64(newH)) v.scene.hadj.SetValue((oldX+visMx)*v.scale/oldScale - visMx) v.scene.vadj.SetValue((oldY+visMy)*v.scale/oldScale - visMy) }