changeset 449:d5bcae14c2cd

reuse FrameUpdateRequest for all code
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 19 Jun 2016 17:53:13 +0900
parents 344a35b7c47f
children aa3822daf75a
files src/main/java/com/glavsoft/rfb/client/FramebufferUpdateRequestMessage.java src/main/java/com/glavsoft/rfb/protocol/Protocol.java src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java src/viewer_swing/java/com/glavsoft/viewer/Viewer.java src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java
diffstat 7 files changed, 28 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/com/glavsoft/rfb/client/FramebufferUpdateRequestMessage.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/main/java/com/glavsoft/rfb/client/FramebufferUpdateRequestMessage.java	Sun Jun 19 17:53:13 2016 +0900
@@ -78,7 +78,7 @@
      *    there is no way to stop this
      */
 	public void sendFullScreenRequest() {
-		int sendFullScreenTimer = 5 * 1000;
+		int sendFullScreenTimer = 50 * 1000;
 		TimerTask tt = new TimerTask() {
 			@Override
 			public void run() {
--- a/src/main/java/com/glavsoft/rfb/protocol/Protocol.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/Protocol.java	Sun Jun 19 17:53:13 2016 +0900
@@ -28,7 +28,6 @@
 import com.glavsoft.exceptions.*;
 import com.glavsoft.rfb.*;
 import com.glavsoft.rfb.client.ClientToServerMessage;
-import com.glavsoft.rfb.client.FramebufferUpdateRequestMessage;
 import com.glavsoft.rfb.client.SetEncodingsMessage;
 import com.glavsoft.rfb.client.SetPixelFormatMessage;
 import com.glavsoft.rfb.encoding.PixelFormat;
@@ -208,9 +207,6 @@
         sendSupportedEncodingsMessage(settings);
         settings.addListener(this); // to support pixel format (color depth), and encodings changes
         settings.addListener(repaintController);
-        if (rfb.isTreeManager()) {
-            sendRefreshMessage();
-        }
         senderTask = new SenderTask(messageQueue, writer, this);
         senderThread = new Thread(senderTask, "RfbSenderTask");
         senderThread.start();
@@ -284,9 +280,10 @@
 
     @Override
     public void sendRefreshMessage() {
-        sendMessage(new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.frameSizeWidth * rfb.getRetinaScale(), rfb.frameSizeHeight * rfb.getRetinaScale(), false));
-        // sendMessage(new FramebufferUpdateRequestMessage(0, 0, 1920, 1080, false));
-        logger.fine("sent: full FB Refresh");
+        if (receiverTask!=null) {
+            sendMessage(receiverTask.fullscreenFbUpdateIncrementalRequest);
+            logger.fine("sent: full FB Refresh");
+        }
     }
 
     @Override
--- a/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java	Sun Jun 19 17:53:13 2016 +0900
@@ -92,10 +92,14 @@
             context.setFbHeight(rfb.fixingSizeHeight);
         }
         if(!rfb.getCuiVersion()) {
+            if (rfb.getSingleWidth()==0) {
+                // request full screen for the first time
+                rfb.setSingleDisplaySize(context.getFbWidth(),context.getFbHeight());
+            }
             renderer = repaintController.createRenderer(reader, context.getFbWidth(), context.getFbHeight(), context.getPixelFormat());
-            fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.frameSizeWidth, rfb.frameSizeHeight, false);
         }
         if(rfb.isTreeManager()) {
+            fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.getSingleWidth(), rfb.getSingleHeight(), false);
             fullscreenFbUpdateIncrementalRequest.sendFullScreenRequest();
             connectionFinished();
         }
@@ -278,7 +282,6 @@
                         setScreenParameter(rect,rect.width,rect.height);
                     }
                 } else if (rect.getEncodingType() == EncodingType.INIT_DATA) {
-                    fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rect.x, rect.y, rect.width, rect.height, false);
                     rfb.setCuiVersion(false);
                     // VNCServer is changed, initiarize new screen.
                     int length = reader.readInt32() - 6;
@@ -296,10 +299,13 @@
                     context.setY(rect.y);
                     repaintController.updateRemoteDesktopName(context);
                     reader.reset();
+                    // request one screen
+                    fullscreenFbUpdateIncrementalRequest = new FramebufferUpdateRequestMessage(rect.x, rect.y, singleWidth, singleHeight, false);
                     // All children multicastqueue should be discarded here.
                     //                        rfb.clearChildrenTransmission();
                     rfb.readSendData(length + 16 + 10, reader, null, rect); // size of UpdateRectangleMessage with initData.
                     if (!(rfb.getCuiVersion())) {
+                        // keep full frame buffer for multi screen
                         renderer = repaintController.createRenderer(reader, rect.width, rect.height, context.getPixelFormat());
                     }
                     repaintController.setVisible(id != rfb.getId());
@@ -363,10 +369,10 @@
             context.setPixelFormat(pixelFormat);
             context.sendMessage(new SetPixelFormatMessage(pixelFormat));
             logger.fine("sent: " + pixelFormat);
-            context.sendRefreshMessage();
+            context.sendMessage(fullscreenFbUpdateIncrementalRequest);
             logger.fine("sent: nonincremental fb update");
         } else {
-            context.sendMessage(new FramebufferUpdateRequestMessage(rfb.getX(), rfb.getY(), rfb.frameSizeWidth, rfb.frameSizeHeight, false));
+            context.sendMessage(fullscreenFbUpdateIncrementalRequest);
         }
     }
 
--- a/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java	Sun Jun 19 17:53:13 2016 +0900
@@ -65,11 +65,11 @@
     public boolean addSerialNum = false;
     public boolean fixingSize = false;
     public int frameSizeWidth;     // contains all screens
-    public int frameSizeHeight;
+    public int frameSizeHeight;    // aquired from VNC Server
     public int fixingSizeWidth;
     public int fixingSizeHeight;
     private int singleWidth = 0;     //  only one screen
-    private int singleHeight = 0;
+    private int singleHeight = 0;    //  specified in SeverChangeRequest
     private int x;
     private int y;
     private DatagramSocket socket = null;
@@ -850,20 +850,6 @@
         this.fixingSize = fixingSize;
     }
 
-    private DatagramSocket createSocket() {
-
-        try {
-            if (socket == null) {
-                this.socket = new DatagramSocket(ConnectionParams.DEFAULT_RTP_PORT, InetAddress.getLocalHost());
-            }
-        } catch (SocketException e) {
-            e.printStackTrace();
-        } catch (UnknownHostException e) {
-            e.printStackTrace();
-        }
-        return socket;
-    }
-
     public void setSingleDisplaySize(int singleWidth, int singleHeight) {
         this.singleWidth = singleWidth;
         this.singleHeight = singleHeight;
--- a/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/Viewer.java	Sun Jun 19 17:53:13 2016 +0900
@@ -433,13 +433,10 @@
         }
         connectionParams.setConnectionParam(hostName, vncport);
         isApplet = true;
-        settings.setViewOnly(true); // too avoid unnecessary upward traffic
+        settings.setViewOnly(true); // to avoid unnecessary upward traffic
 
-        ArrayList<Rectangle> rectangles = getScreenRectangles();
-        int leftScreenNumber = 0;
-        int singleWidth = (int) rectangles.get(leftScreenNumber).getWidth();
-        int singleHeight = (int) rectangles.get(leftScreenNumber).getHeight();
-        getRfb().setSingleDisplaySize(singleWidth, singleHeight);
+        // single display size = 0 means, request all screen
+        getRfb().setSingleDisplaySize(0,0);
 
         run();
     }
--- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java	Sun Jun 19 17:53:13 2016 +0900
@@ -34,9 +34,9 @@
 import com.glavsoft.utils.Strings;
 import com.glavsoft.viewer.*;
 import com.glavsoft.viewer.swing.gui.PasswordDialog;
+import jp.ac.u_ryukyu.treevnc.TreeRFBProto;
 
 import javax.swing.*;
-
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.Socket;
@@ -46,8 +46,6 @@
 import java.util.concurrent.ExecutionException;
 import java.util.logging.Logger;
 
-import jp.ac.u_ryukyu.treevnc.TreeRFBProto;
-
 /**
  * @author dime at tightvnc.com
  */
@@ -184,8 +182,8 @@
 
         if(!myRfb.getCuiVersion())
             presenter.successfulRfbConnection();
-        // hide VNC server's view to prevent video feed back.
         if (myRfb.hasViewer()) {
+            // hide VNC server's view to prevent video feed back.
             boolean visibility = presenter.getReconnectingId() != myRfb.getId();
             viewerWindow.setVisible(visibility);
             if (previousViewerWindow != null)
--- a/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Sat Jun 18 20:09:46 2016 +0900
+++ b/src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java	Sun Jun 19 17:53:13 2016 +0900
@@ -1000,14 +1000,16 @@
         showScreenInfo("that", 0, thatScreenX, thatScreenY, thatScreenWidth, thatScreenHeight, 1);
 
         frame.setSize(thisScreenWidth, thisScreenHeight);
-        final double scale = uiSettings.fitScreen(thisScreenWidth, thisScreenHeight, thatScreenWidth, thatScreenHeight);
-        // final Rectangle visible = new Rectangle(thatScreenX,thatScreenY,thatScreenWidth,thatScreenHeight);
+        double scale = uiSettings.fitScreen(thisScreenWidth, thisScreenHeight, thatScreenWidth, thatScreenHeight);
+        // final Rectangle visible = new Rectangle((int)(thatScreenX*scale),(int)(thatScreenY*scale),(int)(thatScreenWidth*scale)-1,(int)(thatScreenHeight*scale)-1);
         showScreenInfo("this", thisScreenNumber, 0, 0,thisScreenWidth, thisScreenHeight, 1);
         System.out.println("thisScrollScale: " + scale);
+        final int scrollx = (int)(thatScreenX * scale);
+        final int scrolly =  (thatScreenY!=0) ? (int)((thatScreenHeight - thatScreenY) * scale) : 0;
         SwingUtilities.invokeLater(new Runnable() {
             public void run() {
-                scroller.getHorizontalScrollBar().setValue((int) (thatScreenX * scale));
-                scroller.getVerticalScrollBar().setValue((int) (thatScreenY * scale));
+                scroller.getHorizontalScrollBar().setValue(scrollx);
+                scroller.getVerticalScrollBar().setValue(scrolly);
                 // scroller.scrollRectToVisible(visible); // this does not work
             }
         });