< prev index next >

modules/javafx.graphics/src/main/java/com/sun/glass/ui/gtk/GtkApplication.java

Print this page

        

@@ -43,10 +43,11 @@
 import java.nio.IntBuffer;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
+import java.lang.annotation.Native;
 
 final class GtkApplication extends Application implements InvokeLaterDispatcher.InvokeLaterSubmitter {
 
     static {
         AccessController.doPrivileged((PrivilegedAction<Void>) () -> {

@@ -86,21 +87,14 @@
         return val;
     }
 
     GtkApplication() {
 
-        // Check whether the Display is valid and throw an exception if not.
-        // We use UnsupportedOperationException rather than HeadlessException
-        // so as not to introduce a dependency on AWT.
-        if (!isDisplayValid()) {
-            throw new UnsupportedOperationException("Unable to open DISPLAY");
-        }
-
         int gtkVersion =
                 AccessController.doPrivileged((PrivilegedAction<Integer>) () -> {
             String v = System.getProperty("jdk.gtk.version","2");
-            int ret = 0;
+            int ret = 0; // start with "no preference
             if ("3".equals(v) || v.startsWith("3.")) {
                 ret = 3;
             } else if ("2".equals(v) || v.startsWith("2.")) {
                 ret = 2;
             }

@@ -114,10 +108,30 @@
             overrideUIScale = AccessController.doPrivileged((PrivilegedAction<Float>) () ->
                     getFloat("glass.gtk.uiScale", -1.0f, "Forcing UI scaling factor: "));
         } else {
             overrideUIScale = -1.0f;
         }
+
+        int libraryToLoad = _queryLibrary(gtkVersion, gtkVersionVerbose);
+
+        if (libraryToLoad ==  QUERY_NO_DISPLAY) {
+            throw new UnsupportedOperationException("Unable to open DISPLAY");
+        } else if (libraryToLoad == QUERY_USE_CURRENT) {
+            if (gtkVersionVerbose)
+                System.out.println("Glass GTK library to load is already loaded");
+        } else if (libraryToLoad == QUERY_LOAD_GTK2) {
+            if (gtkVersionVerbose)
+                System.out.println("Glass GTK library to load is glassgtk2");
+            com.sun.glass.utils.NativeLibLoader.loadLibrary("glassgtk2");
+        } else if (libraryToLoad == QUERY_LOAD_GTK3) {
+            if (gtkVersionVerbose)
+                System.out.println("Glass GTK library to load is glassgtk3");
+            com.sun.glass.utils.NativeLibLoader.loadLibrary("glassgtk3");
+        } else {
+            throw new UnsupportedOperationException("Internal Error");
+        }
+
         int version = _initGTK(gtkVersion, gtkVersionVerbose, overrideUIScale);
 
         if (version == -1) {
             throw new RuntimeException("Error loading GTK libraries");
         }

@@ -131,15 +145,22 @@
         } else {
             invokeLaterDispatcher = null;
         }
     }
 
-    private static native int _initGTK(int version, boolean verbose, float overrideUIScale);
+    @Native private static final int QUERY_ERROR = -2;
+    @Native private static final int QUERY_NO_DISPLAY = -1;
+    @Native private static final int QUERY_USE_CURRENT = 1;
+    @Native private static final int QUERY_LOAD_GTK2 = 2;
+    @Native private static final int QUERY_LOAD_GTK3 = 3;
+    /*
+     * check the system and return an indication of which library to load
+     *  return values are the QUERY_ constants
+     */
+    private static native int _queryLibrary(int version, boolean verbose);
 
-    private static boolean isDisplayValid() {
-        return _isDisplayValid();
-    }
+    private static native int _initGTK(int version, boolean verbose, float overrideUIScale);
 
     private void initDisplay() {
         Map ds = getDeviceDetails();
         if (ds != null) {
             Object value;

@@ -210,12 +231,10 @@
 
     @Override public boolean shouldUpdateWindow() {
         return true;
     }
 
-    private static native boolean _isDisplayValid();
-
     private native void _terminateLoop();
 
     private native void _init(long eventProc, boolean disableGrab);
 
     private native void _runLoop(Runnable launchable, boolean noErrorTrap);
< prev index next >