more intelligent width/height adapter, always fill viewport