diff src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java @ 410:da1d6d6b4981

Enable retina scale to fit screen
author innparusu
date Thu, 19 Nov 2015 15:19:29 +0900
parents bbd844c15ab1
children 4a925e55afd6
line wrap: on
line diff
--- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Thu Nov 19 14:43:30 2015 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Thu Nov 19 15:19:29 2015 +0900
@@ -41,6 +41,7 @@
 
 import java.awt.*;
 import java.awt.event.*;
+import java.lang.reflect.Field;
 import java.net.Socket;
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -916,22 +917,45 @@
         int leftScreenNumber = 0;
         int singleWidth = (int) (rectangles.get(leftScreenNumber).getWidth() * scaleFactor);
         int singleHeight = (int) (rectangles.get(leftScreenNumber).getHeight() * scaleFactor);
+        int scale = retinaScale();
         viewer.getRfb().setSingleDisplaySize(singleWidth, singleHeight);
         if (viewer.getRfb().hasParent()) {
             String adr = viewer.getRfb().getMyAddress();
                 if (scanPort(adr, ConnectionParams.DEFAULT_RFB_PORT)) {
                     // -1 means request to reverse direct connection socket
                     short id = viewer.getRfb().isTreeManager()? (short)-1 : viewer.getRfb().getId();
-                    context.sendMessage(new ScreenChangeRequest(adr, ConnectionParams.DEFAULT_VNC_ROOT, id, singleWidth, singleHeight, shareScreenNumber));
+                    context.sendMessage(new ScreenChangeRequest(adr, ConnectionParams.DEFAULT_VNC_ROOT, id, singleWidth, singleHeight, shareScreenNumber, scale));
                 }
         }
 
         if (viewer.getRfb().isTreeManager()) {
-            changeVncServer(viewer, singleWidth, singleHeight, shareScreenNumber, viewer.getRfb().getId());
+            changeVncServer(viewer, singleWidth, singleHeight, shareScreenNumber, scale, viewer.getRfb().getId());
             return;
         }
     }
 
+    private int retinaScale() {
+        int scale = 1;
+        GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        final GraphicsDevice device = env.getDefaultScreenDevice();
+
+        try {
+            Field field = device.getClass().getDeclaredField("scale");
+
+            if (field != null) {
+                field.setAccessible(true);
+                Object retinaScale = field.get(device);
+
+                if (retinaScale instanceof Integer) {
+                    scale = (int)retinaScale;
+                    return scale;
+                }
+            }
+        } catch (Exception ignore) {}
+        //...
+        return scale;
+    }
+
     private boolean scanPort(String adr, int port) {
         try {
             Socket socket = new Socket(adr, port);
@@ -958,8 +982,8 @@
     public void fitScreen() {
         ArrayList<Rectangle> rectangles = viewer.getScreenRectangles();
         int leftScreenNumber = 0;
-        int thisScreenWidth = (int) rectangles.get(leftScreenNumber).getWidth();
-        int thisScreenHeight = (int) rectangles.get(leftScreenNumber).getHeight();
+        int thisScreenWidth = (int) rectangles.get(leftScreenNumber).getWidth() * viewer.getRfb().getRetinaScale();
+        int thisScreenHeight = (int) rectangles.get(leftScreenNumber).getHeight() * viewer.getRfb().getRetinaScale();
 
         int singleWidth = viewer.getRfb().getSingleWidth();
         int singleHeight = viewer.getRfb().getSingleHeight();
@@ -1038,10 +1062,10 @@
         frame.setVisible(b);
     }
 
-    private void changeVncServer(ViewerInterface viewer, int width, int height, int shareScreenNumber, short id) {
+    private void changeVncServer(ViewerInterface viewer, int width, int height, int shareScreenNumber, int scale, short id) {
         String localhost = "127.0.0.1"; // InetAddress.getLocalHost().getHostName()
         try {
-            viewer.getRfb().changeVNCServer(viewer, localhost, ConnectionParams.DEFAULT_RFB_PORT, width, height, shareScreenNumber, id, null, null);
+            viewer.getRfb().changeVNCServer(viewer, localhost, ConnectionParams.DEFAULT_RFB_PORT, width, height, shareScreenNumber, scale, id, null, null);
         } catch (Exception e1) {
             System.out.println("can't change server :" + e1.getMessage());
         }