Mercurial > hg > Applications > TreeVNC
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()); }