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




Attachment: 0001-winemac-Implement-support-for-Cocoa-style-full-scree.patch
Description: Binary data



Reply via email to