changeset 458:4ea47640942a

intoroduce retina scaled frame buffer postion
author innparusu
date Thu, 23 Jun 2016 18:57:12 +0900
parents effba48b76f3
children 9f5cd8ca0ebc
files java/util/annotations.xml src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java src/viewer_swing/java/com/glavsoft/viewer/FbRectangle.java src/viewer_swing/java/com/glavsoft/viewer/Viewer.java src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java
diffstat 6 files changed, 117 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/java/util/annotations.xml	Thu Jun 23 18:57:12 2016 +0900
@@ -0,0 +1,5 @@
+<root>
+  <item name='java.util.Comparator'>
+    <annotation name='org.jetbrains.annotations.NotNull'/>
+  </item>
+</root>
\ No newline at end of file
--- a/src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java	Wed Jun 22 19:52:32 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java	Thu Jun 23 18:57:12 2016 +0900
@@ -299,7 +299,7 @@
     }
 
     @Override
-    public java.util.ArrayList<Rectangle> getScreenRectangles() {
+    public java.util.ArrayList<FbRectangle> getScreenRectangles() {
         return null;
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/viewer_swing/java/com/glavsoft/viewer/FbRectangle.java	Thu Jun 23 18:57:12 2016 +0900
@@ -0,0 +1,53 @@
+package com.glavsoft.viewer;
+
+import java.awt.Rectangle;
+
+/**
+ * Created by one on 6/23/16.
+ */
+public class FbRectangle extends Rectangle {
+    int retinaScale;
+    int xfb;
+    int yfb;
+    int screenNumber;
+
+    public FbRectangle(int x, int y, int width, int height, int screenNumber, int scale) {
+        super(x, y, width, height);
+        this.screenNumber = screenNumber;
+        this.retinaScale = scale;
+        this.xfb = x;
+        this.yfb = y;
+    }
+
+    public int getRetinaScale() {
+        return retinaScale;
+    }
+
+    public void setRetinaScale(int retinaScale) {
+        this.retinaScale = retinaScale;
+    }
+
+    public int getXfb() {
+        return xfb;
+    }
+
+    public void setXfb(int xfb) {
+        this.xfb = xfb;
+    }
+
+    public int getYfb() {
+        return yfb;
+    }
+
+    public void setYfb(int yfb) {
+        this.yfb = yfb;
+    }
+
+    public int getScreenNumber() {
+        return screenNumber;
+    }
+
+    public void setScreenNumber(int screenNumber) {
+        this.screenNumber = screenNumber;
+    }
+}
--- a/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Wed Jun 22 19:52:32 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Thu Jun 23 18:57:12 2016 +0900
@@ -43,6 +43,7 @@
 import java.lang.reflect.Field;
 import java.net.Socket;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
 import java.util.logging.ConsoleHandler;
@@ -479,7 +480,7 @@
     }
 
     @Override
-    public ArrayList<Rectangle> getScreenRectangles() {
+    public ArrayList<FbRectangle> getScreenRectangles() {
         // New screen server has one or more screens.
         // Screens are numbered in the order from left.
         // put screens in an ArrayList.
@@ -496,7 +497,52 @@
                 screenNumber++;
             }
         }
-        return rectangles;
+        Point offset = getScreenOffset(rectangles);
+        ArrayList<FbRectangle> fbRectangles = new ArrayList<FbRectangle>();
+        int screenNumber = 0;
+        for (Rectangle rect : rectangles) {
+            fbRectangles.add(new FbRectangle(rect.x + offset.x, rect.y + offset.y, rect.width, rect.height, screenNumber, retinaScale(screenNumber)));
+            screenNumber++;
+        }
+        fbRectangles.sort(new Comparator<FbRectangle>() {
+            @Override
+            public int compare(FbRectangle t0, FbRectangle t1) {
+                return t0.getX() < t1.getX() ? -1 : t0.getX() == t1.getX() ? 0 : 1;
+            }
+        });
+
+        int retinaOffsetX = 0;
+        FbRectangle fbRectanglesPrev = fbRectangles.get(0);
+        for (int i = 1; i < fbRectangles.size(); i++) {
+            FbRectangle fbRect = fbRectangles.get(i);
+            if (fbRectanglesPrev.getRetinaScale() != 1) {
+                if (fbRectanglesPrev.getX() + fbRectanglesPrev.getWidth() + 1 == fbRect.getX() &&
+                        (fbRectanglesPrev.getY() >= fbRect.getY() && fbRectanglesPrev.getY() <= fbRectanglesPrev.getY() + fbRectanglesPrev.getHeight()) ||
+                                fbRectanglesPrev.getY() > fbRect.getY() + fbRect.getHeight() && fbRectanglesPrev.getY() + fbRectanglesPrev.getHeight() < fbRectanglesPrev.getY() + fbRectanglesPrev.getHeight()) {
+                    // previous screen is touch with this screen, fix retina scale offset
+                    retinaOffsetX += fbRectanglesPrev.getWidth() * (fbRectanglesPrev.retinaScale - 1);
+                }
+            }
+            fbRect.setXfb((int) (fbRect.getX() + retinaOffsetX));
+            fbRectanglesPrev = fbRect;
+        }
+
+        int retinaOffsetY = 0;
+        fbRectanglesPrev = fbRectangles.get(0);
+        for (int i = 1; i < fbRectangles.size(); i++) {
+            FbRectangle fbRect = fbRectangles.get(i);
+            if (fbRectanglesPrev.getRetinaScale() != 1) {
+                if (fbRectanglesPrev.getY() + fbRectanglesPrev.getHeight() + 1 == fbRect.getY() &&
+                        (fbRectanglesPrev.getX() >= fbRect.getX() && fbRectanglesPrev.getX() <= fbRectanglesPrev.getX() + fbRectanglesPrev.getWidth()) ||
+                        fbRectanglesPrev.getX() > fbRect.getX() + fbRect.getWidth() && fbRectanglesPrev.getX() + fbRectanglesPrev.getWidth() < fbRectanglesPrev.getX() + fbRectanglesPrev.getWidth()) {
+                    // previous screen is touch with this screen, fix retina scale offset
+                    retinaOffsetY += fbRectanglesPrev.getHeight() * (fbRectanglesPrev.retinaScale - 1);
+                }
+            }
+            fbRect.setYfb((int) (fbRect.getY() + retinaOffsetY));
+            fbRectanglesPrev = fbRect;
+        }
+        return fbRectangles;
     }
 
     public Point getScreenOffset(ArrayList<Rectangle> rectangles) {
--- a/src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java	Wed Jun 22 19:52:32 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java	Thu Jun 23 18:57:12 2016 +0900
@@ -49,7 +49,7 @@
     
     public void setFitScreen();
 
-    public ArrayList<Rectangle> getScreenRectangles();
+    public ArrayList<FbRectangle> getScreenRectangles();
 
     public Point getScreenOffset(ArrayList<Rectangle> rectangles);
 
--- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Wed Jun 22 19:52:32 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Thu Jun 23 18:57:12 2016 +0900
@@ -31,10 +31,7 @@
 import com.glavsoft.rfb.protocol.ProtocolContext;
 import com.glavsoft.rfb.protocol.ProtocolSettings;
 import com.glavsoft.utils.Keymap;
-import com.glavsoft.viewer.ConnectionPresenter;
-import com.glavsoft.viewer.UiSettings;
-import com.glavsoft.viewer.Viewer;
-import com.glavsoft.viewer.ViewerInterface;
+import com.glavsoft.viewer.*;
 import com.glavsoft.viewer.swing.gui.OptionsDialog;
 import jp.ac.u_ryukyu.treevnc.ScreenChangeRequest;
 import jp.ac.u_ryukyu.treevnc.ScreenChangeSelectionPanel;
@@ -854,7 +851,7 @@
         JButton screenButton = buttonsBar.createButton("share", "Share my screen", new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                ArrayList<Rectangle> rectangles = viewer.getScreenRectangles();
+                ArrayList<FbRectangle> rectangles = viewer.getScreenRectangles();
                 if (rectangles.size() == 1) { // single display
                     screenChangeRequest(context, 0);
                 } else if (rectangles.size() > 1){ // dual display
@@ -916,14 +913,13 @@
     }
 
     public void screenChangeRequest(ProtocolContext context, int shareScreenNumber) {
-        ArrayList<Rectangle> rectangles = viewer.getScreenRectangles();
-        Point offset = viewer.getScreenOffset(rectangles);
-        Rectangle rectangle1 = rectangles.get(shareScreenNumber);
+        ArrayList<FbRectangle> rectangles = viewer.getScreenRectangles();
+        FbRectangle rectangle1 = rectangles.get(shareScreenNumber);
         int singleWidth = (int) (rectangle1.getWidth());
         int singleHeight = (int) (rectangle1.getHeight());
-        int x = (int) (rectangle1.getX()) + offset.x; // convert double to int
-        int y = (int) (rectangle1.getY()) + offset.y;
-        int scale = viewer.retinaScale(shareScreenNumber);
+        int x = rectangle1.getXfb();
+        int y = rectangle1.getYfb();
+        int scale = rectangle1.getRetinaScale();
         showScreenInfo("request screen change", 0, x, y, singleWidth, singleHeight, scale);
         if (viewer.getRfb().isTreeManager()) {
             changeVncServer(viewer, x, y, singleWidth * scale, singleHeight * scale, scale, viewer.getRfb().getId());
@@ -956,7 +952,7 @@
      * change screen viewer scale to fit the selected server screen size in multi screens
      */
     public void fitScreen() {
-        ArrayList<Rectangle> rectangles = viewer.getScreenRectangles();
+        ArrayList<FbRectangle> rectangles = viewer.getScreenRectangles();
         if (rectangles.size()<=0) return; // no screens, nothing to do
         int thisScreenNumber = getThisScreenNumber(rectangles);
 
@@ -990,7 +986,7 @@
         });
     }
 
-    private int getThisScreenNumber(ArrayList<Rectangle> rectangles) {
+    private int getThisScreenNumber(ArrayList<FbRectangle> rectangles) {
         // find which screen we are on
         Point thisScreenLocation = frame.getLocation();
         Point mouse = frame.getMousePosition();