From ec1c5d00f7a9cc0e1cedfa0a281ce7f57fe240c2 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Wed, 10 Apr 2013 12:16:21 +0400 Subject: [PATCH] IDEA-101990 workaround. JDK Application class is used instead of custom native method invocation. Prevents crashes with JDK7 because of non-AppKit thread invocations. --- .../ui/mac/MacMainFrameDecorator.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/platform/platform-impl/src/com/intellij/ui/mac/MacMainFrameDecorator.java b/platform/platform-impl/src/com/intellij/ui/mac/MacMainFrameDecorator.java index c6c38c8e6155..49a2a2c8738e 100644 --- a/platform/platform-impl/src/com/intellij/ui/mac/MacMainFrameDecorator.java +++ b/platform/platform-impl/src/com/intellij/ui/mac/MacMainFrameDecorator.java @@ -38,6 +38,8 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicInteger; import static com.intellij.ui.mac.foundation.Foundation.invoke; @@ -251,7 +253,34 @@ public class MacMainFrameDecorator implements UISettingsListener, Disposable { if (myInFullScreen != state) { final ID window = MacUtil.findWindowForTitle(myFrame.getTitle()); if (window == null) return; - invoke(window, "toggleFullScreen:", window); + if (SystemInfo.isJavaVersionAtLeast("1.7")) { + requestToggleFullScreen(myFrame); + } else { + invoke(window, "toggleFullScreen:", window); + } } } + + private static void requestToggleFullScreen(final Window window) { + try { + //Load Application class from the jdk not from our eawtstub.jar + Class applicationClass = window.getClass().getClassLoader().loadClass("com.apple.eawt.Application"); + Method requestToggleFullScreenMethod = applicationClass.getDeclaredMethod("requestToggleFullScreen", Window.class); + Object theApplicationInstance = applicationClass.getDeclaredMethod("getApplication").invoke(null); + requestToggleFullScreenMethod.invoke(theApplicationInstance, window); + } + catch (ClassNotFoundException e) { + LOG.warn("Looks like the com.apple.eawt.Application class does not exist anymore"); + } + catch (NoSuchMethodException e) { + LOG.warn("Looks like the com.apple.eawt.Application.requestToggleFullScreen class is removed"); + } + catch (InvocationTargetException e) { + LOG.warn("com.apple.eawt.Application method invocation has failed"); + } + catch (IllegalAccessException e) { + LOG.warn("com.apple.eawt.Application method invocation has failed"); + } + } + }