winemac.drv: add fullscreen mode support for Mac OS X 10.7+

Ken Thomases ken at codeweavers.com
Tue Oct 8 03:22:35 CDT 2013


Hi,

I finally got around to working on support for Cocoa full-screen mode in the Mac driver, based on the work of Kevin Eaves.  I've attached a new patch.  This patch can only be applied on top of the other Mac driver patches I just submitted to wine-patches.

Some changes from Kevin's original, in no particular oder:

* I have not used the user32 hack to increase the max tracking size and let windows grow so their non-frame area covers the screen.  Instead, the call to SetWindowPos() that results from a WINDOW_FRAME_CHANGED event uses SWP_NOSENDCHANGING for Cocoa-full-screen windows.  That prevents any immediate modification of the new window rect to be within the max tracking size.  However, some programs (e.g. Guild Wars) end up moving the window again shortly afterward and then it gets constrained.  This results in a window that doesn't quite fill the screen, showing a plain background around the edges.  This isn't ideal.  As previously discussed, this may require a new driver entry point to allow it to override the size limits.  (Although I got slapped down for trying to add a similar entry point for some other work.)

* Cocoa understandably refuses to minimize a window that's in full-screen mode.  So, if Win32-land tries to programmatically minimize a full-screen window, Cocoa just immediately tells it that it's been unminimized.  This shouldn't come up much.  (One can access a window's system menu using the keyboard to test.)

* We can't distinguish the program trying to make a window Win32 full-screen vs. it merely echoing back the frame set by Cocoa full-screen.  So, we never consider a window to be in Win32 full-screen mode if it's in Cocoa full-screen mode.  That means that the menu and Dock auto-unhide.  Many (most?) apps will modify the window style in addition to just setting the frame such that it becomes incompatible with Cocoa full-screen mode.  In that case, the window is first taken out of Cocoa full-screen and then put into Win32 full-screen mode.  The menu and Dock are properly hidden, but the window went back to its original space, which may not be what the user wants.

* I have added the standard menu item for controlling Cocoa full-screen, Enter Full Screen, to the Window menu.  Cocoa automatically renames that to Exit Full Screen and back as the window enters and exits full-screen mode.  As with other items in the Mac menus, I don't allow keyboard shortcuts that don't include Option among the modifiers.  So, I've used Command-Option-Control-F instead of just Command-Control-F.

* The menu item and the window widget are properly disabled when the window is disabled.

* The maximum tracking size set by the app for the window is respected in full-screen mode.  If the app leaves the default max tracking size alone, then the full-screen size is unconstrained (and so fills the screen) even though the Win32 default is slightly too small to allow that.

* If the app programmatically changes the window rect while the window is in Cocoa full-screen mode, that change is honored.  This may end up looking a bit odd, but is necessary for correctness.  Furthermore, the changed rect is maintained as the window exits full-screen mode, which is not what Cocoa would normally do.  (Cocoa restores the window to the size and position it had before entering full-screen.)  This is necessary when, for example, a game switches from windowed (in Cocoa full-screen mode) to Win32 full-screen.  It will often change the window style in such a way that forces it out of Cocoa full-screen and changes its size to fill the screen.  We don't want Cocoa negating that size change as it transitions out of Cocoa full-screen mode.

Programmatic changes of the window rect that occur during and shortly after the transition into full-screen are not interpreted as setting the frame that should be restored when exiting full-screen mode.  Those are probably just responses from Wine and the app to the changes that Cocoa has initiated.

* I set NSWindowCollectionBehaviorFullScreenAuxiliary on any windows which don't get NSWindowCollectionBehaviorFullScreenPrimary.  I'm not certain that this is right.  That flag is not as clearly documented as I would like.  My intent is to allow other Wine windows to share the space with a full-screen-primary window.

* WS_EX_TOOLWINDOW windows (utility windows, in Cocoa parlance) are not eligible for Cocoa full-screen.  This means that they get NSWindowCollectionBehaviorFullScreenAuxiliary as per the previous point, so they can share a space with a full-screen primary window.

* I have left out any attempt to reconcile Cocoa full-screen with changes to the display mode which result in the displays being captured.  I don't know of an app which does that while leaving its window eligible for Cocoa full-screen, although I haven't tested many yet.


I invite everybody who's interested to test and/or review.  Cocoa full-screen was introduced in Mac OS X 10.7, so you have to be running that or later.


Kevin, first, thanks again for your original work on this.  Second, you seem to have tested with a variety of apps, including some games or other full-screen apps or ones which changed the display mode.  Can you run some new tests and let me know about failures and rough edges?  I'd welcome your review and feedback.

Thanks,
Ken




-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-winemac-Implement-support-for-Cocoa-style-full-scree.patch
Type: application/octet-stream
Size: 16621 bytes
Desc: not available
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20131008/2ad841a1/attachment-0001.obj>


More information about the wine-devel mailing list