]> source.dussan.org Git - tigervnc.git/commitdiff
Minimal client side support for the extended desktop size protocol.
authorPierre Ossman <ossman@cendio.se>
Fri, 20 Mar 2009 13:02:50 +0000 (13:02 +0000)
committerPierre Ossman <ossman@cendio.se>
Fri, 20 Mar 2009 13:02:50 +0000 (13:02 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3699 3789f03b-4d11-0410-bbf8-ca57d06f2519

common/rfb/CMsgHandler.cxx
common/rfb/CMsgHandler.h
common/rfb/CMsgReaderV3.cxx
common/rfb/CMsgReaderV3.h
common/rfb/CMsgWriter.cxx
unix/vncviewer/CConn.cxx
unix/vncviewer/CConn.h

index 4b338524fb2e8fe33b70d09f8d278644a8ac0850..fa675dcc7fc5eab0add63895584e76c7f6c858e5 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -17,6 +18,7 @@
  */
 #include <rfb/Exception.h>
 #include <rfb/CMsgHandler.h>
+#include <rfb/screenTypes.h>
 
 using namespace rfb;
 
@@ -34,6 +36,15 @@ void CMsgHandler::setDesktopSize(int width, int height)
   cp.height = height;
 }
 
+void CMsgHandler::setExtendedDesktopSize(int reason, int result, int width, int height)
+{
+  if ((reason == reasonClient) && (result != resultSuccess))
+    return;
+
+  cp.width = width;
+  cp.height = height;
+}
+
 void CMsgHandler::setCursor(int w, int h, const Point& hotspot, void* data, void* mask)
 {
 }
index 188963a42f6a585584b4adab39a620f61bb3cbce..49d407ad14719b5277fa416b648afd34570de990 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -38,11 +39,12 @@ namespace rfb {
 
     // The following methods are called as corresponding messages are read.  A
     // derived class should override these methods as desired.  Note that for
-    // the setDesktopSize(), setPixelFormat() and setName() methods, a derived
-    // class should call on to CMsgHandler's methods to set the members of cp
-    // appropriately.
+    // the setDesktopSize(), setExtendedDesktopSize(), setPixelFormat() and
+    // setName() methods, a derived class should call on to CMsgHandler's
+    // methods to set the members of cp appropriately.
 
     virtual void setDesktopSize(int w, int h);
+    virtual void setExtendedDesktopSize(int reason, int result, int w, int h);
     virtual void setCursor(int width, int height, const Point& hotspot,
                            void* data, void* mask);
     virtual void setPixelFormat(const PixelFormat& pf);
index 83f758e7607e8feb29857dce8b7094cddd204039..05fd94887f01b39a57a708bc410af704193199c3 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -76,6 +77,9 @@ void CMsgReaderV3::readMsg()
     case pseudoEncodingDesktopSize:
       handler->setDesktopSize(w, h);
       break;
+    case pseudoEncodingExtendedDesktopSize:
+      readExtendedDesktopSize(x, y, w, h);
+      break;
     case pseudoEncodingDesktopName:
       readSetDesktopName(x, y, w, h);
       break;
@@ -115,3 +119,16 @@ void CMsgReaderV3::readSetDesktopName(int x, int y, int w, int h)
   delete [] name;
 }
 
+void CMsgReaderV3::readExtendedDesktopSize(int x, int y, int w, int h)
+{
+  unsigned int screens;
+
+  screens = is->readU8();
+  is->skip(3);
+
+  // XXX: We just ignore screen info right now
+  is->skip(16 * screens);
+
+  handler->setExtendedDesktopSize(x, y, w, h);
+}
+
index a3b604e6ee5a169c799083ca22e857b0cbd4a1de..8aecdea5ca4566d452ea76ce8ba9bf9386cb37ee 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,6 +31,7 @@ namespace rfb {
   private:
     virtual void readFramebufferUpdate();
     virtual void readSetDesktopName(int x, int y, int w, int h);
+    virtual void readExtendedDesktopSize(int x, int y, int w, int h);
     int nUpdateRectsLeft;
   };
 }
index 82f7189d01ff84933fb75f7ebeb23c12093e0999..3f968dea69e83edfc390b2675c90fa4e799dc82f 100644 (file)
@@ -64,6 +64,8 @@ void CMsgWriter::writeSetEncodings(int preferredEncoding, bool useCopyRect)
     encodings[nEncodings++] = pseudoEncodingCursor;
   if (cp->supportsDesktopResize)
     encodings[nEncodings++] = pseudoEncodingDesktopSize;
+  if (cp->supportsExtendedDesktopSize)
+    encodings[nEncodings++] = pseudoEncodingExtendedDesktopSize;
   if (cp->supportsDesktopRename)
     encodings[nEncodings++] = pseudoEncodingDesktopName;
   if (Decoder::supported(preferredEncoding)) {
index 4a1aeb0e7b382b8d14e03f5d13c2af878ce27414..79195a8b6eef4e0f7c5b7c0a31936cae4b83b8bd 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,6 +31,7 @@
 #include <rfb/LogWriter.h>
 #include <rfb/util.h>
 #include <rfb/Password.h>
+#include <rfb/screenTypes.h>
 #include <network/TcpSocket.h>
 
 #include "TXViewport.h"
@@ -74,6 +76,7 @@ CConn::CConn(Display* dpy_, int argc_, char** argv_, network::Socket* sock_,
     currentEncoding = encNum;
   }
   cp.supportsDesktopResize = true;
+  cp.supportsExtendedDesktopSize = true;
   cp.supportsDesktopRename = true;
   cp.supportsLocalCursor = useLocalCursor;
   cp.customCompressLevel = customCompressLevel;
@@ -266,10 +269,17 @@ void CConn::serverInit() {
 // it is set initially).
 void CConn::setDesktopSize(int w, int h) {
   CConnection::setDesktopSize(w,h);
-  if (desktop) {
-    desktop->resize(w, h);
-    recreateViewport();
-  }
+  resizeFramebuffer();
+}
+
+// setExtendedDesktopSize() is a more advanced version of setDesktopSize()
+void CConn::setExtendedDesktopSize(int reason, int result, int w, int h) {
+  CConnection::setExtendedDesktopSize(reason, result, w,h);
+
+  if ((reason == reasonClient) && (result != resultSuccess))
+    return;
+
+  resizeFramebuffer();
 }
 
 // setName() is called when the desktop name changes
@@ -617,6 +627,17 @@ void CConn::getOptions() {
   checkEncodings();
 }
 
+void CConn::resizeFramebuffer()
+{
+  if (!desktop)
+    return;
+  if ((desktop->width() == cp.width) && (desktop->height() == cp.height))
+    return;
+
+  desktop->resize(cp.width, cp.height);
+  recreateViewport();
+}
+
 void CConn::recreateViewport()
 {
   TXViewport* oldViewport = viewport;
index d969a68cd1f0c17004267a4be8b7c49ba0f65057..27ab8e31e21b5d33347c160eb60b45049a31310f 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2009 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -74,6 +75,7 @@ public:
   rfb::CSecurity* getCSecurity(int secType);
   void serverInit();
   void setDesktopSize(int w, int h);
+  void setExtendedDesktopSize(int reason, int result, int w, int h);
   void setName(const char* name);
   void setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs);
   void bell();
@@ -89,6 +91,7 @@ public:
 
 private:
 
+  void resizeFramebuffer();
   void recreateViewport();
   void reconfigureViewport();
   void initMenu();