So the approach to creating a full screen application is to use GameWindow, call DisplayDevice.SetResolution and then set GameWindow.FullScreen = true (or WindowState to FullScreen). This approach is (apparently) less than ideal on the Mac. The DisplayDevice.SetResolution also has the side-effect of repositioning/resizing all other windows; not a major issue but something that is not necessary.
The simplest approach on the Mac is to call aglSetFullScreen on a context to make the graphics context a full-screen context and set the resolution with one function call. The full screen context does not reposition windows but it will resize the display and restore the resolution when the context is destroyed, so there is no need for DisplayDevice.RestoreResolution to be called since the resolution will switch back when the context is destroyed. Also, in order for aglSetFullScreen to work, a fullscreen flag must be passed in the context attributes when creating it, and a display device identifier has to passed too.
There's a catch to aglSetFullScreen though... it doesn't seem like there is a straightforward way to make a context not full screen after making it full screen. What I've seen people recommend on some mac developer forums is to create a separate context for doing full screen rendering, then enable/disable each context when switching between fullscreen and windowed. I think emulating this approach on other platforms would make a simpler interface, so here is what I am proposing:
* Remove DisplayDevice.SetResolution, make GameWindow.FullScreen a readonly property (change name to IsFullScreen maybe), and maybe replace WindowState with Minimize/Maximize properties and are read/write.
* Add GameWindow.SwitchToFullscreenContext method that takes a DisplayDevice, width, height, etc. for the new resolution. This would create a second context for doing full screen rendering, and store the windowed context. If necessary it would create a window to cover the screen area on other platforms. Also the full screen context will share must share with the old context; so maybe an exception should be thrown if sharing is disabled. The object returned from GameWindow.Context would be dependent on whether the app was running in windowed or fullscreen mode.
(Above where I say remove, I really mean deprecate for now.)
The above would require changing the public API so it's probably something that should be done after 0.9.2 is released, unless we are still fairly far from that release. Aside from this I think the Mac OS stuff is about ready to be merged into the trunk. There are a couple of minor issues to resolve, and I want to do some more testing first which will take a couple of weeks at least. If we want to get this out there for more testing sooner, the macos branch could be merged into the trunk before 0.9.2 is released if we want, without fullscreen support.