< prev index next >
modules/graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java
Print this page
rev 9808 : 8131888: Need to deliver javafx.swt as a modular jar in JDK 9
*** 23,60 ****
* questions.
*/
package com.sun.javafx.application;
import com.sun.javafx.PlatformUtil;
import com.sun.javafx.css.StyleManager;
import com.sun.javafx.runtime.SystemProperties;
! import static com.sun.javafx.FXPermissions.CREATE_TRANSPARENT_WINDOW_PERMISSION;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessControlContext;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import javafx.application.Application;
import javafx.application.ConditionalFeature;
-
- import com.sun.javafx.tk.TKListener;
- import com.sun.javafx.tk.TKStage;
- import com.sun.javafx.tk.Toolkit;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.Scene;
!
! import java.security.AccessController;
! import java.security.PrivilegedAction;
public class PlatformImpl {
private static AtomicBoolean initialized = new AtomicBoolean(false);
private static AtomicBoolean platformExit = new AtomicBoolean(false);
--- 23,64 ----
* questions.
*/
package com.sun.javafx.application;
+ import static com.sun.javafx.FXPermissions.CREATE_TRANSPARENT_WINDOW_PERMISSION;
import com.sun.javafx.PlatformUtil;
import com.sun.javafx.css.StyleManager;
import com.sun.javafx.runtime.SystemProperties;
! import com.sun.javafx.tk.TKListener;
! import com.sun.javafx.tk.TKStage;
! import com.sun.javafx.tk.Toolkit;
! import com.sun.javafx.util.ModuleHelper;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessControlContext;
+ import java.security.AccessController;
+ import java.security.PrivilegedAction;
import java.util.ArrayList;
+ import java.util.HashMap;
import java.util.List;
+ import java.util.Map;
+ import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+ import java.util.function.Predicate;
import javafx.application.Application;
import javafx.application.ConditionalFeature;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.scene.Scene;
! import javafx.util.FXPermission;
public class PlatformImpl {
private static AtomicBoolean initialized = new AtomicBoolean(false);
private static AtomicBoolean platformExit = new AtomicBoolean(false);
*** 84,95 ****
--- 88,104 ----
private static Boolean hasVirtualKeyboard;
private static Boolean hasTouch;
private static Boolean hasMultiTouch;
private static Boolean hasPointer;
private static boolean isThreadMerged = false;
+ private static String applicationType = "";
private static BooleanProperty accessibilityActive = new SimpleBooleanProperty();
+ // Internal permission used by FXCanvas (SWT interop)
+ private static final FXPermission FXCANVAS_PERMISSION =
+ new FXPermission("accessFXCanvasInternals");
+
/**
* Set a flag indicating whether this application should show up in the
* task bar. The default value is true.
*
* @param taskbarApplication the new value of this attribute
*** 169,178 ****
--- 178,190 ----
runLater(r);
return;
}
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
+ applicationType = System.getProperty("com.sun.javafx.application.type");
+ if (applicationType == null) applicationType = "";
+
contextual2DNavigation = Boolean.getBoolean(
"com.sun.javafx.isContextual2DNavigation");
String s = System.getProperty("com.sun.javafx.twoLevelFocus");
if (s != null) {
hasTwoLevelFocus = Boolean.valueOf(s);
*** 204,213 ****
--- 216,230 ----
isThreadMerged = Boolean.valueOf(s);
}
return null;
});
+ System.err.println("PlatformImpl::startup : applicationType = " + applicationType);
+ if ("FXCanvas".equals(applicationType)) {
+ initFXCanvas();
+ }
+
if (!taskbarApplication) {
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
System.setProperty("glass.taskbarApplication", "false");
return null;
});
*** 237,246 ****
--- 254,341 ----
if (isThreadMerged) {
installFwEventQueue();
}
}
+ // Pass certain system properties to glass via the device details Map
+ private static void initDeviceDetailsFXCanvas() {
+ // Read the javafx.embed.eventProc system property and store
+ // it in an entry in the glass Application device details map
+ final String eventProcProperty = "javafx.embed.eventProc";
+ final long eventProc = AccessController.doPrivileged((PrivilegedAction<Long>) () ->
+ Long.getLong(eventProcProperty, 0));
+ System.err.println("PlatformImpl.initSWT: "
+ + eventProcProperty + " = " + eventProc);
+ if (eventProc != 0L) {
+ // Set the value for the javafx.embed.eventProc
+ // key in the glass Application map
+ Map map = com.sun.glass.ui.Application.getDeviceDetails();
+ if (map == null) {
+ map = new HashMap();
+ com.sun.glass.ui.Application.setDeviceDetails(map);
+ }
+ if (map.get(eventProcProperty) == null) {
+ map.put(eventProcProperty, eventProc);
+ }
+ }
+ }
+
+ // Add the necessary qualified exports to the calling module
+ private static void addExportsToFXCanvas(Class<?> fxCanvasClass) {
+ final String[] swtNeededPackages = {
+ "com.sun.glass.ui",
+ "com.sun.javafx.cursor",
+ "com.sun.javafx.embed",
+ "com.sun.javafx.stage"
+ };
+
+ System.err.println("addExportsToFXCanvas: class = " + fxCanvasClass);
+ Object thisModule = ModuleHelper.getModule(PlatformImpl.class);
+ Object javafxSwtModule = ModuleHelper.getModule(fxCanvasClass);
+ for (String pkg : swtNeededPackages) {
+ System.err.println("add export of " + pkg + " from " + thisModule + " to " + javafxSwtModule);
+ ModuleHelper.addExports(thisModule, pkg, javafxSwtModule);
+ }
+ }
+
+ // FXCanvas-specific initialization
+ private static void initFXCanvas() {
+ // Verify that we have the appropriate permission
+ final SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ try {
+ sm.checkPermission(FXCANVAS_PERMISSION);
+ } catch (SecurityException ex) {
+ System.err.println("FXCanvas: no permission to access JavaFX internals");
+ ex.printStackTrace();
+ return;
+ }
+ }
+
+ // Find the calling class, ignoring any stack frames from FX application classes
+ Predicate<StackWalker.StackFrame> classFilter = f ->
+ !f.getClassName().startsWith("javafx.application.")
+ && !f.getClassName().startsWith("com.sun.javafx.application.");
+
+ final StackWalker walker = AccessController.doPrivileged((PrivilegedAction<StackWalker>) () ->
+ StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE));
+ Optional<StackWalker.StackFrame> frame = walker.walk(
+ s -> s.filter(classFilter).findFirst());
+ System.err.println("frame = " + frame);
+
+ if (frame.isPresent()) {
+ Class<?> caller = frame.get().getDeclaringClass();
+ System.err.println("callerClassName = " + caller);
+
+ // Verify that the caller is javafx.embed.swt.FXCanvas
+ if ("javafx.embed.swt.FXCanvas".equals(caller.getName())) {
+ initDeviceDetailsFXCanvas();
+ addExportsToFXCanvas(caller);
+ }
+ }
+ }
+
private static void installFwEventQueue() {
invokeSwingFXUtilsMethod("installFwEventQueue");
}
private static void removeFwEventQueue() {
< prev index next >