Thanks Jeff, got it working! My apologies, I didn't see that you had set the y value of the viewport to 60, I completely missed that. I was already doing everything else. My bad!
One last issue - if I hit ESCAPE which jumps me back to windowed mode, I now get an error when I try to set Starling's viewport back to 720p, even though I've set it back with:
Starling.current.viewPort = new Rectangle(0, 0, 1280, 720);
Error #3723: Invalid Context3D bounds. Context3D instance bounds must be contained within Stage bounds in constrained mode. Requested Context3D bounds were (0,60,1280,780), stage bounds are (0,0,1280,720).
Somehow it looks like it still thinks Starling is positioned at (0, 60), even though I thought that's what I was setting with this call? This error is thrown by mContext.configureBackBuffer in Starling's updateViewPort function.
It looks like maybe it's actually a bug in the order that things are done in updateViewPort:
private function updateViewPort():void
if (mShareContext) return;
if (mContext && mContext.driverInfo != "Disposed")
mContext.configureBackBuffer(mViewPort.width, mViewPort.height, mAntiAliasing, false);
mStage3D.x = mViewPort.x;
mStage3D.y = mViewPort.y;
You can see that mStage3D.x and y are set after the back buffer has been configured, which means that when configureBackBuffer is called, mStage3D.y will still be 60, so it'll think it needs a total height of 60 + 720 which is incorrect.