# 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();