Implement server side support for SetDesktopSize.

It has some warts, but should be feature complete. Most of the magic happens
in the desktop class though.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3713 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/common/rfb/ScreenSet.h b/common/rfb/ScreenSet.h
index 55abb50..6f5188c 100644
--- a/common/rfb/ScreenSet.h
+++ b/common/rfb/ScreenSet.h
@@ -21,6 +21,8 @@
 #ifndef __RFB_SCREENSET_INCLUDED__
 #define __RFB_SCREENSET_INCLUDED__
 
+#include <stdio.h>
+
 #include <rfb/Rect.h>
 #include <list>
 #include <set>
@@ -36,6 +38,17 @@
     Screen(void) : id(0), flags(0) {};
     Screen(rdr::U32 id_, int x_, int y_, int w_, int h_, rdr::U32 flags_) :
       id(id_), dimensions(x_, y_, x_+w_, y_+h_), flags(flags_) {};
+
+    inline bool operator==(const Screen& r) const {
+      if (id != r.id)
+        return false;
+      if (!dimensions.equals(r.dimensions))
+        return false;
+      if (flags != r.flags)
+        return false;
+      return true;
+    }
+
     rdr::U32 id;
     Rect dimensions;
     rdr::U32 flags;
@@ -93,6 +106,22 @@
       return true;
     };
 
+    inline void debug_print(void) const {
+      std::list<Screen>::const_iterator iter;
+      fprintf(stderr, "%d screens\n", num_screens());
+      for (iter = screens.begin();iter != screens.end();++iter) {
+        fprintf(stderr, "    %10d (0x%08x): %dx%d+%d+%d (flags 0x%08x)\n",
+                (int)iter->id, (unsigned)iter->id,
+                iter->dimensions.width(), iter->dimensions.height(),
+                iter->dimensions.tl.x, iter->dimensions.tl.y,
+                (unsigned)iter->flags);
+      }
+    };
+
+    // FIXME: List order shouldn't matter
+    inline bool operator==(const ScreenSet& r) const { return screens == r.screens; }
+    inline bool operator!=(const ScreenSet& r) const { return screens != r.screens; }
+
     std::list<Screen> screens;
   };