Added support for new `Geometry' option which allows serving an arbitrary
regtangular screen area instead of the whole screen.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@569 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/x0vncserver/x0vncserver.cxx b/x0vncserver/x0vncserver.cxx
index 4ee44e0..70a5361 100644
--- a/x0vncserver/x0vncserver.cxx
+++ b/x0vncserver/x0vncserver.cxx
@@ -44,6 +44,7 @@
 #include <X11/extensions/XTest.h>
 #endif
 
+#include <x0vncserver/Geometry.h>
 #include <x0vncserver/Image.h>
 #include <x0vncserver/PollingManager.h>
 #include <x0vncserver/PollingScheduler.h>
@@ -130,8 +131,8 @@
 class XDesktop : public SDesktop, public ColourMap
 {
 public:
-  XDesktop(Display* dpy_)
-    : dpy(dpy_), pb(0), server(0), image(0), pollmgr(0),
+  XDesktop(Display* dpy_, Geometry *geometry_)
+    : dpy(dpy_), geometry(geometry_), pb(0), server(0), image(0), pollmgr(0),
       oldButtonMask(0), haveXtest(false), maxButtons(0), running(false)
   {
 #ifdef HAVE_XTEST
@@ -168,14 +169,15 @@
     vlog.info("Enabling %d button%s of X pointer device",
               maxButtons, (maxButtons != 1) ? "s" : "");
 
-    int dpyWidth = DisplayWidth(dpy, DefaultScreen(dpy));
-    int dpyHeight = DisplayHeight(dpy, DefaultScreen(dpy));
-
     ImageFactory factory((bool)useShm, (bool)useOverlay);
-    image = factory.newImage(dpy, dpyWidth, dpyHeight);
-    image->get(DefaultRootWindow(dpy));
+    image = factory.newImage(dpy, geometry->width(), geometry->height());
+    image->get(DefaultRootWindow(dpy),
+               geometry->offsetLeft(), geometry->offsetTop());
 
-    pollmgr = new PollingManager(dpy, image, &factory);
+    // FIXME: Duplication in using offsets above and here:
+    pollmgr = new PollingManager(dpy, image, &factory,
+                                 geometry->offsetLeft(),
+                                 geometry->offsetTop());
     pollmgr->setVNCServer(vs);
 
     pf.bpp = image->xim->bits_per_pixel;
@@ -189,7 +191,7 @@
     pf.greenMax   = image->xim->green_mask >> pf.greenShift;
     pf.blueMax    = image->xim->blue_mask  >> pf.blueShift;
 
-    pb = new FullFramePixelBuffer(pf, dpyWidth, dpyHeight,
+    pb = new FullFramePixelBuffer(pf, geometry->width(), geometry->height(),
                                   (rdr::U8*)image->xim->data, this);
     server = vs;
     server->setPixelBuffer(pb);
@@ -222,7 +224,10 @@
     pollmgr->setPointerPos(pos);
 #ifdef HAVE_XTEST
     if (!haveXtest) return;
-    XTestFakeMotionEvent(dpy, DefaultScreen(dpy), pos.x, pos.y, CurrentTime);
+    XTestFakeMotionEvent(dpy, DefaultScreen(dpy),
+                         geometry->offsetLeft() + pos.x,
+                         geometry->offsetTop() + pos.y,
+                         CurrentTime);
     if (buttonMask != oldButtonMask) {
       for (int i = 0; i < maxButtons; i++) {
 	if ((buttonMask ^ oldButtonMask) & (1<<i)) {
@@ -270,6 +275,7 @@
 
 protected:
   Display* dpy;
+  Geometry* geometry;
   PixelFormat pf;
   PixelBuffer* pb;
   VNCServer* server;
@@ -435,7 +441,9 @@
 
   try {
     TXWindow::init(dpy,"x0vncserver");
-    XDesktop desktop(dpy);
+    Geometry geo(DisplayWidth(dpy, DefaultScreen(dpy)),
+                 DisplayHeight(dpy, DefaultScreen(dpy)));
+    XDesktop desktop(dpy, &geo);
     VNCServerST server("x0vncserver", &desktop);
     QueryConnHandler qcHandler(dpy, &server);
     server.setQueryConnectionHandler(&qcHandler);