<AWT Dev> RFR: 8256465: [macos11] Java frame and dialog presented full screen freeze application [v3]

Phil Race prr at openjdk.java.net
Thu May 13 20:53:48 UTC 2021

On Tue, 11 May 2021 11:43:35 GMT, Tejpal Rebari <trebari at openjdk.org> wrote:

>> Hi All,
>> Please review the following fix for jdk17.
>> Issue : On MacOS 11 Java Frame and JDialog application is freezing  in Full Screen  when the System Preference -> General -> Prefer Tabs is set to "Full Screen". It is also freezing in normal screen when Prefer Tabs is set to "Always".
>> It doesn't freeze when the Prefer tabs is set to "never".
>> Fix : The default value of allowsAutomaticWindowTabbing is 0/NO in MacOS prior to bigSur(11)  
>> (in the AWTWindow.m file),  so the issue is not seen in mac os 10.13 10.14 and 10.15.
>> From MacOS 11 onwards  this value is set to 1/YES and the issue is seen.
>> This issue can also be reproduced in MacOS 10.15 by setting setAllowsAutomaticWindowTabbing to true in the AWTWindow.m file.
>> Fix is to set allowsAutomaticWindowTabbing to No for all the MacOS release staring from 10.12.
>> The allowsAutomaticTabbing was introduced in MacOS 10.12 but the default value changed in macos11.
>> Test : Added a manual test and tested on MacOS 10.15 and 11.
>> All the internal tests run are green.
> Tejpal Rebari has updated the pull request incrementally with one additional commit since the last revision:
>   code cleanup

src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java line 325:

> 323:         responder = createPlatformResponder();
> 324:         contentView.initialize(peer, responder);
> 325:         setAllowAutomaticWindowTabbing();

This is in the initialize() method that is being called for every window.
That means the value could be changed by the app (back and forth!) during the execution of the program.
We don't want that. So add it in a static initializer block for the class, so it is only ever read ONCE and guaranteed to be read before the first window is created. This then means the Java method isn't needed and the native method will be static.

src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java line 607:

> 605:         nativeSetAllowAutomaticTabbingProperty(allowAutomaticWindowTabbing);
> 606:     }
> 607: 

So we need a doPrivilged around the call to getProperty - in the new location of the static block

src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m line 1106:

> 1104: {
> 1105:     JNI_COCOA_ENTER(env);
> 1106:     if (@available(macOS 10.12, *)) {

@kevinrushforth said that since we set MIN_SDK (not sure of the exact variable name) to 10.12, that this is compiled down to a no-op .. which means it is useless and doesn't protect you from making the call on 10.11
So you might as well remove it. It won't prevent the crash that will happen on 10.11.
@mrserb also pointed out people might then copy this pattern not realising it does not work, and there's a better way ... apparently ...


PR: https://git.openjdk.java.net/jdk/pull/3407

More information about the awt-dev mailing list