# HG changeset patch # User innparusu # Date 1466675832 -32400 # Node ID 4ea47640942ae0dcdeb9cfb42a6cc14ce59950c9 # Parent effba48b76f3124dde452c647f573c0e3640fa04 intoroduce retina scaled frame buffer postion diff -r effba48b76f3 -r 4ea47640942a java/util/annotations.xml --- /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 @@ + + + + + \ No newline at end of file diff -r effba48b76f3 -r 4ea47640942a src/viewer_swing/java/com/glavsoft/viewer/CuiViewer.java --- 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 getScreenRectangles() { + public java.util.ArrayList getScreenRectangles() { return null; } diff -r effba48b76f3 -r 4ea47640942a src/viewer_swing/java/com/glavsoft/viewer/FbRectangle.java --- /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; + } +} diff -r effba48b76f3 -r 4ea47640942a src/viewer_swing/java/com/glavsoft/viewer/Viewer.java --- 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 getScreenRectangles() { + public ArrayList 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 fbRectangles = new ArrayList(); + 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() { + @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 rectangles) { diff -r effba48b76f3 -r 4ea47640942a src/viewer_swing/java/com/glavsoft/viewer/ViewerInterface.java --- 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 getScreenRectangles(); + public ArrayList getScreenRectangles(); public Point getScreenOffset(ArrayList rectangles); diff -r effba48b76f3 -r 4ea47640942a src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java --- 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 rectangles = viewer.getScreenRectangles(); + ArrayList 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 rectangles = viewer.getScreenRectangles(); - Point offset = viewer.getScreenOffset(rectangles); - Rectangle rectangle1 = rectangles.get(shareScreenNumber); + ArrayList 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 rectangles = viewer.getScreenRectangles(); + ArrayList 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 rectangles) { + private int getThisScreenNumber(ArrayList rectangles) { // find which screen we are on Point thisScreenLocation = frame.getLocation(); Point mouse = frame.getMousePosition();