# HG changeset patch # User Shinji KONO # Date 1466326393 -32400 # Node ID d5bcae14c2cd297be6559bd5ce2da926862cec3d # Parent 344a35b7c47fa7cfbdd2bdb71df321c1ff1e1bce reuse FrameUpdateRequest for all code diff -r 344a35b7c47f -r d5bcae14c2cd src/main/java/com/glavsoft/rfb/client/FramebufferUpdateRequestMessage.java --- 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() { diff -r 344a35b7c47f -r d5bcae14c2cd src/main/java/com/glavsoft/rfb/protocol/Protocol.java --- 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 diff -r 344a35b7c47f -r d5bcae14c2cd src/main/java/com/glavsoft/rfb/protocol/ReceiverTask.java --- 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); } } diff -r 344a35b7c47f -r d5bcae14c2cd src/main/java/jp/ac/u_ryukyu/treevnc/TreeRFBProto.java --- 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; diff -r 344a35b7c47f -r d5bcae14c2cd src/viewer_swing/java/com/glavsoft/viewer/Viewer.java --- 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 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(); } diff -r 344a35b7c47f -r d5bcae14c2cd src/viewer_swing/java/com/glavsoft/viewer/swing/SwingRfbConnectionWorker.java --- 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) diff -r 344a35b7c47f -r d5bcae14c2cd src/viewer_swing/java/com/glavsoft/viewer/swing/SwingViewerWindow.java --- 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 } });